Uma das razões dos números primos serem tão legais se deve ao fato deles se comportarem de forma estranha. Eles parecem aleatórios.
Algumas vezes você tem longos espaços entre dois números primos e, de repente, como os ônibus, vêm dois de uma vez só. No entanto, no fundo no fundo, eles não são completamente aleatórios.
Um matemático Polonês chamado Stanislaw Ulam, que foi para os EUA pouco antes da Segunda Guerra Mundial, estava, depois da guerra, em 1963, assistindo uma apresentação de um trabalho chatíssimo e longo com um papel e uma caneta na mão e resolveu fazer a seguinte brincadeira para se distrair:
No centro do papel colocou o número 1 e foi fazendo uma espiral quadrada com a sequência, conforme a figura abaixo:
Depois disso, começou a circular os números primos nesta espiral, conforme a figura a seguir:
Ele ficou surpreso pelo fato dos números primos caírem em diagonais. Como todos os números primos, exceto o 2, são números ímpares e como as diagonais nesta espiral alternam entre pares e ímpares, não é surpresa que os números caiam em diagonais alternadas, mas que algumas diagonais tenham mais primos do que outras.
Pouco tempo depois ele resolveu fazer um programa usando o computador MANIAC II para imprimir pixels nos pontos primos (exatamente como eu fiz em vermelho no excel) e conseguiu fazer uma imagem com os números até 65.025 (255 x 255).
Aqui abro um parêntese para falar do MANIAC II.
Ele era um computador criado em 1957 com 4096 words de 48bits (24kbytes) de memória RAM em Magnetic-core Memory e 12288 words de 48bits (576kbytes) em Williams tubes. Em média, uma multiplicação neste computador demorava 180 microsegundos e uma divisão 300 microsegundos. Uma verdadeira eternidade para os tempos de hoje.
Voltando à espiral do Ulam, o que ele conseguiu com a impressão da matriz de 255 x 255 de pixels foi a confirmação do que ele havia visto com 100 números. Realmente há um padrão no qual os números primos aparecem em diagonais, com intervalos, é claro, e algumas diagonais parecem ter mais primos do que outras.
Todas as linhas nesta espiral obedecem à seguinte equação quadrática:
Por exemplo, a diagonal que começa no número 3 tem a seguinte equação:
3, 13, 31, 57, 91, … (Confira na imagem acima)
Na prática, há uma hipótese de que estas diagonais podem servir para procurarmos números primos grandes, já que algumas diagonais têm mais primos do que outras diagonais. Melhor dizendo, algumas equações quadráticas têm mais chance de retornar números primos do que outras.
Um exemplo de diagonal com 40 números primos em sequência é a seguinte: que gera a seguinte sequência de 40 números primos:
41, 43, 47, 53, 61, 71, 83, 97, 113, 131, 151, 173, 197, 223, 251, 281, 313, 347, 383, 421, 461, 503, 547, 593, 641, 691, 743, 797, 853, 911, 971, 1033, 1097, 1163, 1231, 1301, 1373, 1447, 1523, 1601 (O 41o número é igual a e, portanto, não é primo)
As diagonais com as maiores densidades de números primos conhecidas são a belezuras abaixo:
e (desculpe, não cabe na tela)
O que interessa nisto tudo, é que, parece que, há fórmulas com mais densidade de primos do que outras (isso ainda não foi provado) e isto pode ajudar a resolver outros problemas, como a hipótese de Goldbach (que diz que todos os números pares maiores do que 2 podem ser expressados pela soma de dois números primos) ou a hipótese da existência de infinitos números primos gêmeos.
Como não poderia faltar, eu fiz uma implementação em javascript para mostrar esse grid, só que em vez de 255 x 255, o grid que eu fiz é de 1000×1000. O resultado está neste link. Obviamente você pode aumentar o tamanho do canvas para gerar coisas grandes, como essa de 25.000.000 de números (5000 x 5000) que eu fiz usando o mesmo código (Clica que aumenta).
Edição das 11:50 (Não podia faltar o código Python. O @jbvsmo depois dirá que está lento….)
#!/usr/bin/env python import sys,math import Image size = int(sys.argv[1]) def sieveGen(siz): l = [2,3,5,7,11,13,17,19,23,29] if (siz < 31): return l for i in xrange(31,siz,2): isP = True rT = math.sqrt(i) for j in l: if i%j == 0: isP = False break if j>rT: break if isP: l.append(i) return l mySieve = sieveGen(size) def isPrime(n): if (n == 1): return False if (n < size): return (n in mySieve) isP = True sqrtN = math.sqrt(n) for j in mySieve: if (n%j)==0: return False if (j>sqrtN): return True return True def spiral(N): im = Image.new("RGB", (N, N), "white") pix = im.load() red = (255,0,0) if(N%2): x = y = ((N-1)/2) else: x = y = (N/2) N2 = N*N dx = 1 dy = 0 val = 1 amp = 1 c = 0 while (val <= N2): mvd = 0 while ((mvd < amp) and (val <= N2)): if isPrime(val): pix[x-1,y-1] = red x += dx y += dy mvd += 1 val += 1 c += 1 if (c == 2): c = 0 amp += 1 if (dx == 1): dx,dy = 0,1 else: if (dy == 1): dx,dy = -1,0 else: if (dx == -1): dx,dy = 0,-1 else: if (dy == -1): dy,dx = 0,1 im.transpose(Image.FLIP_TOP_BOTTOM).save("ulam.png") spiral(size) |
4 comentários em “Primos na Espiral de Ulam”