Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download

Palestra de divulgação de matemática

220 views
%html <div id="insert_new_cell_before96" class="insert_new_cell">&nbsp;</div> <h1 style="text-align: center;">O n&uacute;mero perdido e o n&uacute;mero escondido</h1> <address style="text-align: center;"><span style="font-size: medium;">Pedro Patr&iacute;cio</span></address><address style="text-align: center;"><span style="font-size: medium;">Departamento de Matem&aacute;tica e Aplica&ccedil;&otilde;es - Universidade do Minho</span></address><address style="text-align: center;"><span style="font-size: medium;">[email protected]</span></address><address style="text-align: center;"><span style="font-size: medium;">http://w3.math.uminho.pt/~pedro/npne/npne.html<br /></span></address> <p>&nbsp;</p> <div id="cell_text_0" class="text_cell"><br style="text-align: center;" /> <p>&nbsp;</p> <h2>Oppps... a mensagem chegou errada!</h2> <p>Uma mesnsagem pode conter err0z e m3smo assim ser intendida.</p> <p><br />O contexto ou a palavra podem induzir o que se quereria escrever.</p> <p><br />Podemos at&eacute; poupar simb!</p> <h3>ISBN</h3> <p>10 s&iacute;mbolos</p> <p>$$x_1 x_2 \dots x_9 x_{10}$$</p> <p>0+1 L&iacute;ngua inglesa<br />2 L&iacute;ngua francesa<br />3 L&iacute;ngua alem&atilde;<br />.<br />.<br />.<br />.<br />.<br />.<br />85 Brasil<br />.<br />.<br />.<br />.<br />.<br />.<br />972 + 989 Portugal</p> <p>9&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; 7&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &ndash;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6 &nbsp; &nbsp; &nbsp;&nbsp;&nbsp; 6&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &ndash;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; 9&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &ndash;&nbsp;&nbsp;&nbsp; &nbsp; &nbsp;&nbsp; 3</p> <p>x10&nbsp;&nbsp;&nbsp;&nbsp; x9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x1</p> <p>$=319=11 \times 29 $, m&uacute;ltiplo de 11.</p> <p>&nbsp;</p> <p>&nbsp;</p> <p>972-987-655-?</p> </div>
 

O número perdido e o número escondido

Pedro Patrício
Departamento de Matemática e Aplicações - Universidade do Minho
[email protected]
http://w3.math.uminho.pt/~pedro/npne/npne.html

 


 

Oppps... a mensagem chegou errada!

Uma mesnsagem pode conter err0z e m3smo assim ser intendida.


O contexto ou a palavra podem induzir o que se quereria escrever.


Podemos até poupar simb!

ISBN

10 símbolos

x1x2x9x10x_1 x_2 \dots x_9 x_{10}

0+1 Língua inglesa
2 Língua francesa
3 Língua alemã
.
.
.
.
.
.
85 Brasil
.
.
.
.
.
.
972 + 989 Portugal

9         7         2      –      6         6         2      –      7         9         2      –         3

x10     x9        x8            x7       x6        x5            x4       x3       x2                x1

=319=11×29=319=11 \times 29 , múltiplo de 11.

 

 

972-987-655-?

def IntegerToList(n): x = str(n) return [Integer(x[p]) for p in range(0,len(x))]
a=972987655 L=IntegerToList(a) L
[9, 7, 2, 9, 8, 7, 6, 5, 5]
soma=0 for k in xrange(0,len(L)): soma=soma+(10-k)*L[k]
soma
364
[(10-k,L[k]) for k in xrange(0,len(L))]
[(10, 9), (9, 7), (8, 2), (7, 9), (6, 8), (5, 7), (4, 6), (3, 5), (2, 5)]
 

Portanto, soma+X10=364+X10soma+X_{10}=364+X_{10} tem que ser um múltiplo de 11.

O múltiplo de 11 mais próximo (e maior) que 364 é 374.

Logo, X10=10X_{10}=10.

Tomamos X10=XX_{10}=X

def ISBN_check(n): L=[int(k) for k in n[:-1]] if n[-1]!='X': L=L+[int(n[-1])] else: L=L+[10] pesos=matrix([10,9,8,7,6,5,4,3,2,1]) check=(matrix(L)*transpose(pesos))[0][0] return check%11 == 0
ISBN_check('0100784429')
True

European Article Number; EAN-13

O EAN é um código de barras para identificação de produtos.

 

 

Está dividido em 4 partes:

  • identificação da origem
  • identificação da empresa
  • identificação do produto
  • dígito de controlo

 

 

 

 

 

560−1493−11550−6

 

5+6*3+3+4+9*3+3+3+1+15+5+6
90
not(90%10 == 0)
False
def digitos(n): return [int(d) for d in str(n)]
a=5601493115506; a
5601493115506
digitos(a)
[5, 6, 0, 1, 4, 9, 3, 1, 1, 5, 5, 0, 6]
dig=digitos(a) impar = dig[0::2] par = dig[1::2] soma=0 soma=sum(impar) for k in par: soma=soma+3*k
soma
90
soma%10 == 0
True
def EAN(n): def digitos(n): return [int(d) for d in str(n)] dig=digitos(n) impar = dig[0::2] par = dig[1::2] soma=0 soma=sum(impar) for k in par: soma=soma+3*k return soma%10 == 0
EAN(5601493115509)
False
EAN(5601493115506)
True

Algoritmo the Luhn

5∗2,1∗2,3∗2,5∗2,7∗2,9∗2,1∗2,3∗2

1,2,6,1,5,9,2,6

 

1+4+2+2+6+4+1+6+5+8+9+0+2+2+6+4

1+4+2+2+6+4+1+6+5+8+9+0+2+2+6+4
62
def luhn_controlo(card_number): def dig(n): return [int(d) for d in str(n)] digitos = dig(card_number) impar = digitos[-1::-2] par = digitos[-2::-2] soma = 0 soma += sum(impar) for d in par: soma += sum(dig(d*2)) return soma % 10 def luhn_valido(card_number): return luhn_controlo(card_number) == 0
luhn_valido(5412345678901234)
False

Cartão de Cidadão

DDDDDDDDDd1LLd2DDDDDDDDD\, d_1 \, LL\, d_2 d1d_1 segue o algoritmo ISBN

LLLL indica a versão. ZZZZ, ZYZY, etc.

A10A \sim 10, B11B\sim 11, ..., Z35Z\sim 35.

1+3+5+7+9+35+1+4+8+3+7+8+61
152

Número de Identificação na Segurança Social - NISS

11 algarismos, sendo o último o de controlo. NISS de Pessoa Singular começa por 1. NISS de Pessoa Colectiva começa por 2.

Por exemplo, 1226587093912265870939.

Brincando aos espiões (ou a arte de esconder mensagens)

A necessidade de transmissão de informação entre dois agentes, de forma a que um terceiro não possa compreender a mensagem, leva a que, de alguma forma, esta esteja ou dissimulada ou cifrada. O primeiro método é denominado por esteganografia, e foi usado por várias civilizações antigas. Por exemplo, uma mensagem poderia ser tatuada numa cabeça rapada de um escravo, ficando escondida assim que o cabelo crescesse, é um exemplo de esteganografia usada pelos gregos antes da nossa era. Outros exemplos incluem o uso de tinta invisível, ou na era actual a inserção de ruído em fotografias digitais.

Nesta figura, está escondida a seguinte:


 

 

Figura: Apenas mantendo os últimos 2 bits da componente de cor, e aumentado o brilho. (fonte: wikipedia)

Corre o rumor que a al-Qaeda fez uso da esteganografia para comunicar com os seus membros, nomeadamente no planeamento dos ataques do 11 de Setembro.

No segundo método é aplicado, de alguma forma, um algoritmo que transforme a mensagem numa outra de tal maneira que uma terceira pessoa não a consiga interpretar. De uma forma mais ampla, a criptologia (do gregos cryptos+logos, ou esconder+ciência) divide-se em dois ramos: a criptografia, que estuda a forma de cifrar textos de forma eficiente, e a criptanálise que tenta, por seu turno, quebrar as cifras.

Um sistema criptográfico é um 5-uplo (P,C,K,E,D)(P,C,K,E,D) ondeP,CP,C conjuntos finitos de símbolos

  • KK conjunto finito de chaves
  • E,DE,D conjuntos de funções de cifração/decifração, onde ek:PC,dk:CPe_k:P\rightarrow C,\, d_k:C\rightarrow P com dk(ek(x))=xd_k(e_k(x))=x.

Ou seja, se decifrarmos e que foi cifrado, obtemos a mensagem original.


Por exemplo, considere-se
P=C=A={A,B,C,,J,K,L,V,W,X,Y,Z}P=C={\cal{A}}=\left\{ A,B,C,\dots ,J,K,L,\dots V,W,X,Y,Z\right\}, e()=e(\star)= letra que sucede a \star. Aplicando a função de cifração a cada letra da palavra que queremos ``esconder'',
BIBABRAGACJCBCSBHBBIBABRAGA\mapsto CJCBCSBHB

Como é óbvio, a (única) função de decifração para esta chave está definida por d()=d(\star)= letra que antecede a \star.

A cifra por substituição

Neste caso, consideramos P=C=AP=C= \cal{A}. O conjunto KK das chaves é constituído por \textbf{todas} as trocas possíveis (permutações) de letras do alfabeto.

#K=26!=403291461126605635584000000>4×1026\# K=26!=403291461126605635584000000 > 4 \times 10^{26}


Como o número de chaves cresce de forma desmesurada em relação ao número de caracteres do alfabeto, a busca, por uma terceira pessoa, de uma função de decifração por ``força bruta'' é inviável. No entando, existem outras formas de quebrar esta cifra, fazendo uso da análise frequencista do texto cifrado. Como exemplo, considere-se a seguinte permutação πK\pi \in K:

a b c d e f g h i j k l m
X N Y A H P O G Z Q W B T
 

 

n o p q r s t u v w x y z
S F L R C V M U E K J D I


Para cifrar ``zacarias'' basta-nos procurar a correspondência de cada letra na tabela apresentada. O resultado final é ``IXYXCZXV''.

Uma técnica criptanalítica aplicável é a do estudo  frequencista das letras. Por exemplo, em ``IXYXCZXV'' a letra ``X'' surge 3 vezes, pelo que ``X'' deve ser a correspondência das letras mais usadas em português. Torna-se, portanto, essencial  a existência de uma tabela com as frequências das letras. Essa tabela existe: a tabela de Beker e Piper.

 

O gráfico seguinte apresenta a frequência relativa das letras em português. Provavelmente ``X'' é a letra ``a'' cifrada. 

Além do estudo de frequência de letras isoladas, poder-se-ia também estudar os digramas e trigramas. Por exemplo, o digrama ``qu'' surge com mais frequência (seguramente!) que o digrama ``hn'', e a letra ``q'' surge mais vezes sucedida de ``u'' do que de outra letra. Os trigramas ``sim'' e ``nao'' são garantidamente mais frequentes que ``dsa'' e ``pot''. Estes exemplos mostram como um criptanalista pode quebrar uma cifra que tem um número demasiado alto de chaves fazendo uso da análise frequencista.

O filósofo árabe do século VIII, Abu'Abd Al-Rahman al-Khalil ibn Ahmad ibn'Amr ibn Tammam al Farahidi al Zadi al Yahmadi cuja obra Kitab al-muamma - O livro da linguagem secreta - foi inspirada pela decifração que Al-Khali l fez de um criptograma grego que o imperador bizantino lhe tinha enviado. Nessa decifração ele utilizou um método criptanalítico que se baseava na suposição do início do texto original ser ``Em nome de Deus'' ou algo semelhante (era comum na época iniciarem-se as mensagens dessa forma), demorando um mês para solucionar o problema.

 

Mais tarde, este método tornou-se padrão e chegou a ser utilizado na Segunda Guerra Mundial para decifrar mensagens da máquina Enigma (a que faremos referência mais adiante). A descrição mais antiga de análise de frequências explorada para quebrar cifras deve-se a Abu Yusuf Ya'qub ibn Is-haq ibn as-Sabba h ibn 'omran ibn Ismail Al-Kindi, referenciada no seu tratado, redescoberto em 1987, intitulado Risalah fi Istikhraj al Mu'amma - Um Manuscrito sobre a Decifração de Mensagens Criptográficas.

Apesar dos gregos terem escrito vários trabalhos teóricos realacionados com cifras de transposição (as letras da mensagem são reordenadas segundo um certo algoritmo) e de de substituição (as letras mantêm as sua posição mas perdem a sua identidade segundo um certo algoritmo), não se conhecem referências que as tivessem aplicado para fins militares. A primeira alusão à utilização de cifras com esses fins deve-se aos romanos - a Cifra de César. Foi esta a primeira cifra de substituição documentada, utilizada para fins militares, que surgiu na obra De Bello Gallico (Guerras Gálicas), de Júlio César (101 a.C. - 44 a.C.).

Para melhor explicarmos o funcionamento desta (e de outras) cifra, façamos uma curta referência à aritmética modular.

Em primeiro lugar, considere-se o conjunto Z26={0,1,25}\mathbb{Z}_{26}=\{0,1,\dots 25\} identificado com A\cal{A}, onde definimos as operação de soma e multiplicação como as operações usuais, após as quais tomamos o resto da divisão inteira por 26. Por exemplo,

4+7=11;13+15 =2;4+7 = 11; \, \, 13+15  = 2;
25+1=025+1 =0

Como exemplo,
BIBABRAGA01 08 0100 01 1700 06 00 BIBABRAGA \equiv 01  \,08  \,01 \, 00  \,01  \,17 \, 00  \,06  \,00

Z26=IntegerModRing(26); Z26
Ring of integers modulo 26
Z26(13)+Z26(15)
2
Z26(5)*Z26(6)
4
Z26.multiplication_table()
* a b c d e f g h i j k l m n o p q r s t u v w x y z +---------------------------------------------------- a| a a a a a a a a a a a a a a a a a a a a a a a a a a b| a b c d e f g h i j k l m n o p q r s t u v w x y z c| a c e g i k m o q s u w y a c e g i k m o q s u w y d| a d g j m p s v y b e h k n q t w z c f i l o r u x e| a e i m q u y c g k o s w a e i m q u y c g k o s w f| a f k p u z e j o t y d i n s x c h m r w b g l q v g| a g m s y e k q w c i o u a g m s y e k q w c i o u h| a h o v c j q x e l s z g n u b i p w d k r y f m t i| a i q y g o w e m u c k s a i q y g o w e m u c k s j| a j s b k t c l u d m v e n w f o x g p y h q z i r k| a k u e o y i s c m w g q a k u e o y i s c m w g q l| a l w h s d o z k v g r c n y j u f q b m x i t e p m| a m y k w i u g s e q c o a m y k w i u g s e q c o n| a n a n a n a n a n a n a n a n a n a n a n a n a n o| a o c q e s g u i w k y m a o c q e s g u i w k y m p| a p e t i x m b q f u j y n c r g v k z o d s h w l q| a q g w m c s i y o e u k a q g w m c s i y o e u k r| a r i z q h y p g x o f w n e v m d u l c t k b s j s| a s k c u m e w o g y q i a s k c u m e w o g y q i t| a t m f y r k d w p i b u n g z s l e x q j c v o h u| a u o i c w q k e y s m g a u o i c w q k e y s m g v| a v q l g b w r m h c x s n i d y t o j e z u p k f w| a w s o k g c y u q m i e a w s o k g c y u q m i e x| a x u r o l i f c z w t q n k h e b y v s p m j g d y| a y w u s q o m k i g e c a y w u s q o m k i g e c z| a z y x w v u t s r q p o n m l k j i h g f e d c b

Cifra shift

Nesta cifra, a chave kk é um elemento de Z26Z_{26}, conhecido pelo emissor e pelo receptor.

ek(x)=x+kmod26;dk(y)=ykmod26e_k(x)=x+k \mod 26; \, \, \, d_k(y)=y-k\mod 26

O símbolo mod26 \mod 26 indica se que tomou o resto da divisão por 26 (para sermos mais correctos, dever-se-ia dizer que indica qualquer número que tenha o mesmo resto na divisão inteira por 26, mas preferimos cometer esta incorrecção a forçar a apresentação de mais noções modulares).


Para k=3k=3 obtemos a cifra de César. Ou seja, a cada letra da mensagem fazemos corresponder, no alfabeto, aquela que está 3 posições depois.

Como decifrar? Se a cifração envia a letra 3 mais adiante, a decifração recua esse número de letras:
Partindo do princípio que o Intruso conhece a cifra usada (denominado o Princípio de Kerckoff), a existência 26 chaves possíveis (repare que apesar de k=0k=0 ser uma chave, esta deixa a mensagem invariante! ou seja, é a pior escolha possível para a chave...) torna o trabalho do Intruso facilitado.
cesar = AffineCryptosystem(AlphabeticStrings()) a, b = (1, 3)
P = cesar.encoding("topsecret"); P
TOPSECRET
C = cesar.enciphering(a, b, P); C
WRSVHFUHW
cesar.deciphering(a, b, C) == P
True

Cifra afim

Nesta cifra, a função de cifração é dada por
ek(x)=ax+bmod26e_k(x)=ax+b \mod 26
A chave, neste caso, é o par (a,b)(a,b).

Claro que quando a=1a=1 obtemos cifra Shift. Para a implementação desta cifra, precisamos de ter algumas cautelas. Vejamos o seguinte exemplo:

e(x)=13x+7mod26e(x)=13x+7 \mod 26.

e(5)=135+7mod26=20mod16=137+7mod26=e(7)e(5)=13*5+7\mod 26=20 \mod 16=13*7+7\mod 26=e(7).
Ou seja ``f'' e ``h'' são cifrados no mesmo caracter: o ``U''.
Para que a função de cifração seja injectiva (e, portanto, bijectiva), é necessário e suficiente que mdc(a,26)=1mdc(a,26)=1

Este facto permite garantir a existência de um certo elemento a1a^{-1} tal que aa1=1mod26aa^{-1}=1\mod 26.

O conjunto das chaves é {(a,b)Z26× Z26:mdc(a,26)=1}\left\{ (a,b)\in Z_{26}\times  Z_{26}: mdc(a,26)=1 \right\}, e são em número 1226=31212\cdot 26=312.

As função de cifração e decifração são, respectivamente,

e(x)=ax+bd(x)=a1(xb)\begin{array}{l} e(x) = ax+b \\ d(x) = a^{-1} (x-b)\end{array}

Por exemplo,
e(x)=7x+10mod26,mdc(7,26)=1,a1=15,e(x)=7x+10 \mod 26,\, mdc(7,26)=1,\, a^{-1}=15,
d(x)=15x+6mod26d(x)=15x+6 \mod 26

Z26
Ring of integers modulo 26
a=Z26(7);a
7
1/a
15
aa=Z26(13); aa
13
1/aa
Error in lines 1-1 Traceback (most recent call last): File "/cocalc/lib/python2.7/site-packages/smc_sagews/sage_server.py", line 1044, in execute exec compile(block+'\n', '', 'single', flags=compile_flags) in namespace, locals File "", line 1, in <module> File "sage/rings/integer.pyx", line 1927, in sage.rings.integer.Integer.__div__ (build/cythonized/sage/rings/integer.c:13369) return coercion_model.bin_op(left, right, operator.div) File "sage/structure/coerce.pyx", line 1123, in sage.structure.coerce.CoercionModel_cache_maps.bin_op (build/cythonized/sage/structure/coerce.c:9767) return PyObject_CallObject(op, xy) File "sage/structure/element.pyx", line 1662, in sage.structure.element.Element.__div__ (build/cythonized/sage/structure/element.c:12773) return (<Element>left)._div_(right) File "sage/rings/finite_rings/integer_mod.pyx", line 2492, in sage.rings.finite_rings.integer_mod.IntegerMod_int._div_ (build/cythonized/sage/rings/finite_rings/integer_mod.c:28711) raise ZeroDivisionError("Inverse does not exist.") ZeroDivisionError: Inverse does not exist.
afim = AffineCryptosystem(AlphabeticStrings()) n = afim.alphabet_size() L = [i for i in xrange(n) if gcd(i, n) == 1]; L
[1, 3, 5, 7, 9, 11, 15, 17, 19, 21, 23, 25]
afim=AffineCryptosystem(AlphabeticStrings()) (a,b)=(7,10) P = afim.encoding("topsecret"); P
TOPSECRET
C=afim.enciphering(a,b,P); C
NELGMYZMN
afim.deciphering(a,b,C)
TOPSECRET
L = afim.brute_force(C, ranking="chisquare"); L
[((23, 11), ILATRNERI), ((7, 10), TOPSECRET), ((7, 9), IDEHTRGTI), ((15, 11), ODARHNUHO), ((5, 25), IBSRNFANI), ((19, 8), DIHESUFSD), ((9, 2), HGBMEOREH), ((25, 4), RATYSGFSR), ((3, 25), WTELNRANW), ((19, 0), NSROCEPCN), ((19, 1), CHGDRTERC), ((11, 14), HSVEOIBOH), ((25, 17), ENGLFTSFE), ((17, 8), LMRGOEBOL), ((1, 19), ULSNTFGTU), ((9, 17), ONITLVYLO), ((1, 20), TKRMSEFST), ((25, 0), NWPUOCBON), ((15, 3), SHEVLRYLS), ((3, 4), DALSUYHUD), ((15, 12), HWTKAGNAH), ((11, 21), EPSBLFYLE), ((5, 24), DWNMIAVID), ((11, 25), GRUDNHANG), ((25, 6), TCVAUIHUT), ((23, 18), TWLECYPCT), ((25, 16), DMFKESRED), ((9, 19), IHCNFPSFI), ((3, 0), NKVCEIREN), ((3, 6), LITACGPCL), ((21, 21), MTCDHPUHM), ((1, 6), HYFAGSTGH), ((11, 8), RCFOYSLYR), ((23, 19), CFUNLHYLC), ((1, 24), PGNIOABOP), ((25, 25), MVOTNBANM), ((3, 18), HEPWYCLYH), ((19, 13), AFEBPRCPA), ((21, 16), LSBCGOTGL), ((21, 12), FMVWAINAF), ((17, 22), BCHWEUREB), ((1, 10), DUBWCOPCD), ((19, 2), RWVSGITGR), ((7, 15), WRSVHFUHW), ((15, 22), PEBSIOVIP), ((21, 3), YFOPTBGTY), ((11, 0), NYBKUOHUN), ((7, 23), GBCFRPERG), ((17, 6), FGLAIYVIF), ((15, 16), FURIYELYF), ((25, 19), GPINHVUHG), ((7, 12), PKLOAYNAP), ((25, 18), FOHMGUTGF), ((17, 17), MNSHPFCPM), ((23, 6), PSHAYULYP), ((21, 2), DKTUYGLYD), ((5, 12), VOFEASNAV), ((15, 15), MBYPFLSFM), ((1, 11), CTAVBNOBC), ((23, 24), VYNGEAREV), ((17, 19), STYNVLIVS), ((11, 1), UFIRBVOBU), ((11, 2), BMPYICVIB), ((5, 7), WPGFBTOBW), ((3, 19), YVGNPTCPY), ((9, 6), VUPASCFSV), ((9, 4), BAVGYILYB), ((1, 18), VMTOUGHUV), ((15, 9), CROFVBIVC), ((1, 17), WNUPVHIVW), ((5, 8), BULKGYTGB), ((23, 25), EHWPNJANE), ((17, 9), OPUJRHERO), ((23, 12), RUJCAWNAR), ((15, 10), VKHYOUBOV), ((11, 7), KVYHRLERK), ((19, 15), EJIFTVGTE), ((23, 17), KNCVTPGTK), ((21, 11), KRABFNSFK), ((17, 7), IJODLBYLI), ((5, 15), KDUTPHCPK), ((3, 23), OLWDFJSFO), ((21, 4), TAJKOWBOT), ((19, 10), HMLIWYJWH), ((7, 0), NIJMYWLYN), ((3, 5), URCJLPYLU), ((11, 3), ITWFPJCPI), ((17, 14), DEJYGWTGD), ((9, 3), EDYJBLOBE), ((15, 20), DSPGWCJWD), ((5, 5), MFWVRJERM), ((25, 13), AJCHBPOBA), ((3, 24), FCNUWAJWF), ((5, 6), RKBAWOJWR), ((21, 18), BIRSWEJWB), ((7, 14), LGHKWUJWL), ((23, 5), GJYRPLCPG), ((19, 22), FKJGUWHUF), ((11, 12), TEHQAUNAT), ((9, 1), KJEPHRUHK), ((25, 7), UDWBVJIVU), ((11, 16), VGJSCWPCV), ((1, 25), OFMHNZANO), ((5, 21), OHYXTLGTO), ((11, 13), ALOXHBUHA), ((15, 13), APMDTZGTA), ((7, 17), SNORDBQDS), ((19, 7), OTSPDFQDO), ((25, 5), SBUZTHGTS), ((7, 16), HCDGSQFSH), ((21, 0), NUDEIQVIN), ((1, 5), IZGBHTUHI), ((3, 13), AXIPRVERA), ((19, 12), LQPMACNAL), ((15, 4), LAXOEKREL), ((9, 16), RQLWOYBOR), ((11, 22), LWZISMFSL), ((9, 15), UTOZRBERU), ((7, 11), EZADPNCPE), ((21, 19), WDMNRZERW), ((3, 14), ROZGIMVIR), ((15, 14), TIFWMSZMT), ((7, 24), RMNQCAPCR), ((9, 12), DCXIAKNAD), ((23, 20), LODWUQHUL), ((7, 18), DYZCOMBOD), ((25, 24), LUNSMAZML), ((1, 8), FWDYEQREF), ((21, 20), RYHIMUZMR), ((19, 14), PUTQEGREP), ((7, 25), CXYBNLANC), ((1, 0), NELGMYZMN), ((17, 13), ABGVDTQDA), ((5, 22), TMDCYQLYT), ((19, 25), YDCZNPANY), ((5, 0), NGXWSKFSN), ((9, 11), GFALDNQDG), ((17, 10), RSXMUKHUR), ((5, 3), CVMLHZUHC), ((19, 16), TYXUIKVIT), ((15, 23), IXULBHOBI), ((19, 11), WBAXLNYLW), ((1, 12), BSZUAMNAB), ((7, 3), UPQTFDSFU), ((23, 22), DGVOMIZMD), ((5, 23), YRIHDVQDY), ((9, 18), LKFQISVIL), ((21, 22), HOXYCKPCH), ((9, 23), WVQBTDGTW), ((15, 24), BQNEUAHUB), ((23, 1), WZOHFBSFW), ((5, 16), PIZYUMHUP), ((17, 5), CDIXFVSFC), ((15, 17), YNKBRXERY), ((19, 19), MRQNBDOBM), ((1, 1), MDKFLXYLM), ((17, 21), YZETBROBY), ((21, 13), AHQRVDIVA), ((7, 21), KFGJVTIVK), ((9, 20), FEZKCMPCF), ((17, 18), PQVKSIFSP), ((15, 21), WLIZPVCPW), ((3, 1), EBMTVZIVE), ((11, 15), OZCLVPIVO), ((23, 15), SVKDBXOBS), ((3, 20), PMXEGKTGP), ((21, 9), UBKLPXCPU), ((25, 14), BKDICQPCB), ((17, 24), HINCKAXKH), ((11, 6), DORAKEXKD), ((23, 23), MPEXVRIVM), ((17, 25), KLQFNDANK), ((9, 0), NMHSKUXKN), ((7, 22), VQRUGETGV), ((1, 21), SJQLRDERS), ((9, 5), YXSDVFIVY), ((19, 9), SXWTHJUHS), ((25, 23), KTMRLZYLK), ((17, 20), VWBQYOLYV), ((21, 25), SZIJNVANS), ((15, 25), UJGXNTANU), ((25, 20), HQJOIWVIH), ((19, 3), GLKHVXIVG), ((25, 15), CLEJDRQDC), ((11, 11), MXAJTNGTM), ((17, 2), TUZOWMJWT), ((5, 14), FYPOKCXKF), ((7, 13), AVWZLJYLA), ((23, 0), NQFYWSJWN), ((3, 9), KHSZBFOBK), ((21, 10), PWFGKSXKP), ((23, 16), BETMKGXKB), ((3, 3), MJUBDHQDM), ((5, 13), ATKJFXSFA), ((23, 7), YBQJHDUHY), ((11, 4), PADMWQJWP), ((3, 10), BYJQSWFSB), ((9, 8), POJUMWZMP), ((21, 17), GNWXBJOBG), ((11, 9), YJMVFZSFY), ((1, 2), LCJEKWXKL), ((3, 12), JGRYAENAJ), ((23, 13), ADSLJFWJA), ((3, 11), SPAHJNWJS), ((5, 20), JCTSOGBOJ), ((25, 8), VEXCWKJWV), ((7, 2), JEFIUSHUJ), ((1, 4), JAHCIUVIJ), ((23, 14), JMBUSOFSJ), ((21, 5), OVEFJRWJO), ((5, 4), HARQMEZMH), ((21, 1), IPYZDLQDI), ((17, 23), EFKZHXUHE), ((9, 9), MLGRJTWJM), ((1, 9), EVCXDPQDE), ((15, 0), NCZQGMTGN), ((9, 7), SRMXPZCPS), ((3, 7), CZKRTXGTC), ((19, 24), JONKYALYJ), ((15, 8), JYVMCIPCJ), ((11, 5), WHKTDXQDW), ((1, 7), GXEZFRSFG), ((25, 1), OXQVPDCPO), ((5, 9), GZQPLDYLG), ((23, 2), FIXQOKBOF), ((11, 10), FQTCMGZMF), ((7, 6), BWXAMKZMB), ((3, 8), TQBIKOXKT), ((15, 18), RGDUKQXKR), ((3, 2), VSDKMQZMV), ((1, 3), KBIDJVWJK), ((19, 4), VAZWKMXKV), ((15, 19), KZWNDJQDK), ((5, 19), EXONJBWJE), ((9, 10), JIDOGQTGJ), ((25, 21), IRKPJXWJI), ((7, 1), YTUXJHWJY), ((23, 21), UXMFDZQDU), ((19, 23), UZYVJLWJU), ((17, 15), GHMBJZWJG), ((17, 16), JKPEMCZMJ), ((21, 6), JQZAEMREJ), ((21, 24), XENOSAFSX), ((9, 24), TSNYQADQT), ((17, 0), NOTIQGDQN), ((11, 20), XILUEYREX), ((1, 13), ARYTZLMZA), ((25, 12), ZIBGAONAZ), ((11, 17), CNQZJDWJC), ((15, 2), ZOLCSYFSZ), ((3, 17), QNYFHLUHQ), ((11, 23), SDGPZTMZS), ((5, 17), UNEDZRMZU), ((21, 7), ELUVZHMZE), ((3, 22), XUFMOSBOX), ((9, 14), XWRCUEHUX), ((7, 8), XSTWIGVIX), ((5, 10), LEVUQIDQL), ((17, 4), ZAFUCSPCZ), ((7, 4), FABEQODQF), ((1, 22), RIPKQCDQR), ((23, 4), XAPIGCTGX), ((25, 11), YHAFZNMZY), ((23, 10), ZCRKIEVIZ), ((25, 2), PYRWQEDQP), ((19, 21), QVURFHSFQ), ((5, 1), SLCBXPKXS), ((11, 24), ZKNWGATGZ), ((19, 20), BGFCQSDQB), ((25, 9), WFYDXLKXW), ((7, 7), MHILXVKXM), ((17, 11), UVAPXNKXU), ((3, 21), GDOVXBKXG), ((21, 14), VCLMQYDQV), ((25, 22), JSLQKYXKJ), ((5, 18), ZSJIEWREZ), ((17, 1), QRWLTJGTQ), ((19, 5), KPOLZBMZK), ((9, 22), ZYTEWGJWZ), ((9, 21), CBWHZJMZC), ((21, 23), CJSTXFKXC), ((1, 23), QHOJPBCPQ), ((15, 1), GVSJZFMZG), ((1, 15), YPWRXJKXY), ((17, 12), XYDSAQNAX), ((19, 6), ZEDAOQBOZ), ((15, 5), ETQHXDKXE), ((21, 15), QXGHLTYLQ), ((23, 3), ORGZXTKXO), ((9, 13), AZUFXHKXA), ((23, 8), HKZSQMDQH), ((5, 2), XQHGCUPCX), ((21, 8), ZGPQUCHUZ), ((17, 3), WXCRZPMZW), ((25, 10), XGZEYMLYX), ((19, 18), XCBYMOZMX), ((9, 25), QPKVNXANQ), ((7, 5), QLMPBZOBQ), ((7, 20), ZUVYKIXKZ), ((7, 19), OJKNZXMZO), ((19, 17), INMJXZKXI), ((1, 16), XOVQWIJWX), ((5, 11), QJAZVNIVQ), ((25, 3), QZSXRFERQ), ((3, 15), IFQXZDMZI), ((15, 7), QFCTJPWJQ), ((1, 14), ZQXSYKLYZ), ((11, 18), JUXGQKDQJ), ((3, 16), ZWHOQUDQZ), ((11, 19), QBENXRKXQ), ((23, 9), QTIBZVMZQ), ((15, 6), XMJAQWDQX)]

 Cifra de Vigenère

Nas cifras descritas atrás, uma vez escolhida a chave de cifração cada letra do alfabeto é aplicada numa outra única letra do alfabeto. Daí chamarem-se monoalfabéticas. Apresentamos, de seguida, uma cifra que não é monoalfabética: por exemplo, a letra ``a'' não é garantidamente aplicada numa mesma letra.

Esta cifra foi criada por Blaise Vigenère (1523-1596), usando as ideias de Leon Battista Alberti (1404-1472), Johannes Trithemius (1462-1516) e Giambattista Della Porta (1535-1615). Deve-se, aliás, a Alberti a idealização da primeira cifra polialfabética. Alberti propunha a utilização de dois ou mais alfabetos de cifra e a alternância entre eles durante a cifragem, com o objectivo de confundir os potenciais criptanalistas. Não conseguiu, contudo, transformar a sua ideia num sistema de cifra plenamente elaborado.

Façamos a descrição da cifra de Vigenère. A mensagem é cifrada por blocos e não letra a letra. Suponha que cada bloco tem comprimento mm. Dada uma chave k=k,k2,,km)k=k_,k_2,\dots,k_m),

ek(x1,x2,xm)=(x1+k1,x2+k2,xm+km)e_k(x_1, x_2, \dots x_m)=(x_1+k_1,x_2+k_2,\dots x_m+k_m)
dk(x1,x2,xm)=(x1k1,x2k2,xmkm)d_k(x_1, x_2, \dots x_m)=(x_1-k_1,x_2-k_2,\dots x_m-k_m)

Como exemplo, suponha que a chave é "BLAISE", i.e., k=(1,11,0,8,18,4)k=(1,11,0,8,18,4), e portanto m=6m=6. repare que o número total de chaves possíveis de comprimento 6 é 266=30891577626^6=308915776 (ou seja, mais de 300 milhões de chaves)

bibabraga01080100011700060001+1,08+11,01+0,00+8,01+18,17+4,00+1,06+11,00+0=021901081921011700CTBITVBRA \begin{array}{lll} bibabraga & \equiv & 01 \,08 \,01 \, 00 \,01 \,17 \, 00 \,06 \,00\\ & \mapsto& 01+1,08+11,01+0,00+8 ,01+18,17+4, 00+1 ,06+11 ,00+0 \\ & = & 02 \,19 \,01 \, 08 \,19 \,21 \, 01 \,17 \,00\\ & \equiv & CTBITVBRA \end{array}

 

Para comunicações militares e governamentais, onde a segurança era fundamental, a cifra monoalfabética simples era obviamente inadequada e existia alguma relutância em adoptar a cifra polialfabética, dada a sua complexidade de implementação. Por conseguinte, os criptógrafos da época sentiram necessidade de criar uma cifra intermédia. Um exemplo marcante de uma cifra monoalfabética melhorada, bastante segura, foi a denominada Grande Cifra de Luís XIV(1638-1715), elaborada por Antoine e Bonaventure Rossignol. Após a morte dos seus criadores, ela caiu em desuso e os seus pormenores exactos perderam-se rapidamente. A Grande Cifra de Luís XIV era tão forte que só no século XIX foi decifrada pelo comandante do exértico francês Etienne Bazeries.

Entretanto, a cifra polialfabética de Vigenére continuava a ser, incontestavelmente, a melhor maneira de garantir as comunicações importantes sigilosas. Essa era considerada inquebrável e tornou-se conhecida como "Le Chiffre Indéchiffrable". Porém, por volta de 1854, o matemático Charles Babbage (1791-1871) foi o autor da maior descoberta no domínio da Criptanálise desde o século IX, altura em que os árabes fizeram uso da análise frequencista. Babbage conseguiu quebrar cifras polialfabéticas, e em particular "Le Chiffre Indéchiffrable". Por acasos do destino, acabou por ser o prussiano Friedrich Wilhelm Kasiski (1805-1881) a receber os créditos da quebra da cifra de Vigenère, sendo a técnica por ele desenvolvida conhecida por Teste de Kasiski.

S = AlphabeticStrings() vigenere=VigenereCryptosystem(S,6) vigenere
Vigenere cryptosystem on Free alphabetic string monoid on A-Z of period 6
K = S('BLAISE') K
BLAISE
E=vigenere(K) E
Cipher on Free alphabetic string monoid on A-Z
E(S("BIBABRAGA"))
CTBITVBRA
E(S("PALESTRAMUITOINTERESSANTE"))
QLLMKXSLMCAXPTNBWVFDSIFXF
V = VigenereCryptosystem(AlphabeticStrings(), 24) K=V.random_key() M = V.encoding("Saudacoes da Universidade do Minho. Espero que se divirtam!") cifrado=V.enciphering(K, M) cifrado
AQKJYARHCWNZGCLUYXYIOYHOWCYTFMHVZXETJOUILIYAWMWLU
V.deciphering(K,cifrado)
SAUDACOESDAUNIVERSIDADEDOMINHOESPEROQUESEDIVIRTAM
M
SAUDACOESDAUNIVERSIDADEDOMINHOESPEROQUESEDIVIRTAM

Tempos modernos

Em 1918, o inventor alemão Arthur Scherbius (1878-1929), construiu uma máquina criptográfica baseada em cifradores rotativos - a famosa máquina Enigma.


 

Esta invenção forneceu ao exército alemão o sistema criptográfico mais seguro do mundo e, por altura da Segunda Guerra Mundial, as comunicações dos alemães estavam protegidas por um nível de cifras sem paralelo.

Ao avanço da criptografia assistiu-se a uma reacção da criptanálise. O British Tabulating Machine Company construiu uma máquina, designada por "Bombe", instalada em Bletchley Park, para determinar as chaves Enigma. Nesta equipa destacou-se Alan Turing (1912-1954) que identificou a maior fraqueza da Enigma e explorou-a.


 
Para fazer face a uma cifra alemã ainda mais poderosa que a Enigma, a Cifra Lorentz, os aliados, também em Bletchley Park, contruiram um primeiro computador digital programável - o Colossus.
 

Se no início desta nova era digital a criptografia foi exclusiva dos militares e dos governos, a democratização dos computadores permitiu que as empresas comçassem a investir nesta nova forma de comunicar de uma forma segura. Tal obrigou a que os protocolos fossem standards. N início dos anos setenta, Horst Feistel (1915-1990), ao serviço do Laboratório Thomas J. Watson da IBM, desenvolveu o sistema Lucifer, um algoritmo de cifra candidato a padrão. Este sistema foi submetido a algumas alterações e, em 23 de Novembro de 1976, foi considerado pela NSA - National Security Agency, como padrão e designada por Data Encryption Standard, ou seja, DES.

O problema de troca de chaves continuava em aberto: a única maneira segura de transmitir a chave de uma cifra era enviá-la por mão própria ou, de uma forma menos segura, por correio. Esta problema foi resolvido por Martin Hellman e Whitfield Diffie, e a solução é conhecida por troca de chaves de Diffie-Hellman. Abriram-se, assim, as portas à ciptografia de chaves públicas. O primeiro sistema funcional para este novo tipo de cifra foi proposto em 1977 por Ronald Rivest, Adi Shamir e Leonard Adleman. Esse sistema foi baptizado de RSA.

(Para fazer jus à verdade, o primeiro algoritmo de chave assimétrica (ou de chave pública) foi proposto por James H. Ellis, Clifford Cocks e Malcolm Williamson do Government Communications Headquarters, pertencendo os serviços secretos britânicos, no ínicio da década de 70 do século passado. O seu contributo apenas pôde ser conhecido em 1997.)

O RSA tem, no entanto, um inconveniente: é demasiado lento. Com efeito, o RSA pode ser 100 a 1000 vezes mais lento que o DES. A solução para este problema passa pelo desenvolvimento de esquemas híbridos: é usado um sistema de chave pública (como o RSA) para abrir um canal seguro, e depois de efectuada a troca de chaves é usado um outro de chave privada (como o DES). Um exemplo de software faz uso desta solução é o PGP, ou o ssh.

Actualmente o DES é considerado inseguro (pode ser quebrado em menos de 24 horas), e foi substituído pelo AES.

É importante referir que não são usadas apenas o DES (ou o AES) e o RSA como cifras de chave privada e pública, respectivamente. A cifras RC5, Blowfish, IDEA, NewDES, SAFER, CAST5, FEAL são outros exemplos de chave privada (por exemplo, o PGP usa o IDEA), enquanto que o ElGamal, o ``knapsack'' (que apesar de tomar partido de não se conhecer uma solução ``fácil'' de um certo problema, pode ser quebrada em tempo útil pela forma como está definida), a cifra de McEliece são outros exemplos de cifras assimétricas (ou de chave pública).

RSA com 8 Bits

  1. Alice escolhe dois primos p = 11 e q = 7, e calcula

    n = p*q = 77.

    Calcula ainda

    m = (p-1)*(q-1) = 60 e escolhe a = 13 primo relativo com

    m = 60.

    Calcula b = a-1 mod m = 37.

    Publica n = 77 e a = 13 (chave publica de Alice)

  2. Bob pretende enviar a mensagem mens = 28 a Alice. Com a chave publica de Alice, calcula

    cifrado = mensa mod n = 7.

  3. Alice recebe o texto cifrado = 7 de Bob. Usando o inverso b = 37 = a-1 mod m, calcula

    decifrado = cifradob mod n = 28.

Questões práticas:

  • como encontrar primos?
  • onde está a segurança?
  • como calcular abmodna^b \mod n?
lista=[n for n in range(0,100)]; lista
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99]
for p in prime_range(sqrt(99)): for k in range(2,floor(99/p)): lista[k*p]=0 lista
[0, 1, 2, 3, 0, 5, 0, 7, 0, 0, 0, 11, 0, 13, 0, 0, 0, 17, 0, 19, 0, 0, 0, 23, 0, 0, 0, 0, 0, 29, 0, 31, 0, 0, 0, 0, 0, 37, 0, 0, 0, 41, 0, 43, 0, 0, 0, 47, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 59, 0, 61, 0, 0, 0, 0, 0, 67, 0, 0, 0, 71, 0, 73, 0, 0, 0, 0, 0, 79, 0, 0, 0, 83, 0, 0, 0, 0, 0, 89, 0, 0, 0, 0, 0, 95, 0, 97, 98, 99]
def eratostenes(m): lista=[n for n in range(0,m+1)] lista[1]=0 for p in prime_range(sqrt(m)+1): for k in range(2, floor(m/p)+1): lista[k*p]=0 return lista
eratostenes(1000)
[0, 0, 2, 3, 0, 5, 0, 7, 0, 0, 0, 11, 0, 13, 0, 0, 0, 17, 0, 19, 0, 0, 0, 23, 0, 0, 0, 0, 0, 29, 0, 31, 0, 0, 0, 0, 0, 37, 0, 0, 0, 41, 0, 43, 0, 0, 0, 47, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 59, 0, 61, 0, 0, 0, 0, 0, 67, 0, 0, 0, 71, 0, 73, 0, 0, 0, 0, 0, 79, 0, 0, 0, 83, 0, 0, 0, 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, 97, 0, 0, 0, 101, 0, 103, 0, 0, 0, 107, 0, 109, 0, 0, 0, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127, 0, 0, 0, 131, 0, 0, 0, 0, 0, 137, 0, 139, 0, 0, 0, 0, 0, 0, 0, 0, 0, 149, 0, 151, 0, 0, 0, 0, 0, 157, 0, 0, 0, 0, 0, 163, 0, 0, 0, 167, 0, 0, 0, 0, 0, 173, 0, 0, 0, 0, 0, 179, 0, 181, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 0, 193, 0, 0, 0, 197, 0, 199, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 211, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 223, 0, 0, 0, 227, 0, 229, 0, 0, 0, 233, 0, 0, 0, 0, 0, 239, 0, 241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 251, 0, 0, 0, 0, 0, 257, 0, 0, 0, 0, 0, 263, 0, 0, 0, 0, 0, 269, 0, 271, 0, 0, 0, 0, 0, 277, 0, 0, 0, 281, 0, 283, 0, 0, 0, 0, 0, 0, 0, 0, 0, 293, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 307, 0, 0, 0, 311, 0, 313, 0, 0, 0, 317, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 331, 0, 0, 0, 0, 0, 337, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 0, 349, 0, 0, 0, 353, 0, 0, 0, 0, 0, 359, 0, 0, 0, 0, 0, 0, 0, 367, 0, 0, 0, 0, 0, 373, 0, 0, 0, 0, 0, 379, 0, 0, 0, 383, 0, 0, 0, 0, 0, 389, 0, 0, 0, 0, 0, 0, 0, 397, 0, 0, 0, 401, 0, 0, 0, 0, 0, 0, 0, 409, 0, 0, 0, 0, 0, 0, 0, 0, 0, 419, 0, 421, 0, 0, 0, 0, 0, 0, 0, 0, 0, 431, 0, 433, 0, 0, 0, 0, 0, 439, 0, 0, 0, 443, 0, 0, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 457, 0, 0, 0, 461, 0, 463, 0, 0, 0, 467, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 479, 0, 0, 0, 0, 0, 0, 0, 487, 0, 0, 0, 491, 0, 0, 0, 0, 0, 0, 0, 499, 0, 0, 0, 503, 0, 0, 0, 0, 0, 509, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 521, 0, 523, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 541, 0, 0, 0, 0, 0, 547, 0, 0, 0, 0, 0, 0, 0, 0, 0, 557, 0, 0, 0, 0, 0, 563, 0, 0, 0, 0, 0, 569, 0, 571, 0, 0, 0, 0, 0, 577, 0, 0, 0, 0, 0, 0, 0, 0, 0, 587, 0, 0, 0, 0, 0, 593, 0, 0, 0, 0, 0, 599, 0, 601, 0, 0, 0, 0, 0, 607, 0, 0, 0, 0, 0, 613, 0, 0, 0, 617, 0, 619, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 631, 0, 0, 0, 0, 0, 0, 0, 0, 0, 641, 0, 643, 0, 0, 0, 647, 0, 0, 0, 0, 0, 653, 0, 0, 0, 0, 0, 659, 0, 661, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 673, 0, 0, 0, 677, 0, 0, 0, 0, 0, 683, 0, 0, 0, 0, 0, 0, 0, 691, 0, 0, 0, 0, 0, 0, 0, 0, 0, 701, 0, 0, 0, 0, 0, 0, 0, 709, 0, 0, 0, 0, 0, 0, 0, 0, 0, 719, 0, 0, 0, 0, 0, 0, 0, 727, 0, 0, 0, 0, 0, 733, 0, 0, 0, 0, 0, 739, 0, 0, 0, 743, 0, 0, 0, 0, 0, 0, 0, 751, 0, 0, 0, 0, 0, 757, 0, 0, 0, 761, 0, 0, 0, 0, 0, 0, 0, 769, 0, 0, 0, 773, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 787, 0, 0, 0, 0, 0, 0, 0, 0, 0, 797, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 809, 0, 811, 0, 0, 0, 0, 0, 0, 0, 0, 0, 821, 0, 823, 0, 0, 0, 827, 0, 829, 0, 0, 0, 0, 0, 0, 0, 0, 0, 839, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 853, 0, 0, 0, 857, 0, 859, 0, 0, 0, 863, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 877, 0, 0, 0, 881, 0, 883, 0, 0, 0, 887, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 907, 0, 0, 0, 911, 0, 0, 0, 0, 0, 0, 0, 919, 0, 0, 0, 0, 0, 0, 0, 0, 0, 929, 0, 0, 0, 0, 0, 0, 0, 937, 0, 0, 0, 941, 0, 0, 0, 0, 0, 947, 0, 0, 0, 0, 0, 953, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 967, 0, 0, 0, 971, 0, 0, 0, 0, 0, 977, 0, 0, 0, 0, 0, 983, 0, 0, 0, 0, 0, 0, 0, 991, 0, 0, 0, 0, 0, 997, 0, 0, 0]

A divisão trivial...

def divtriv(n): r""" Teste de primalidade 'a custa da divisao trivial Pedro Patricio, 2014 """ primo=true upperbound=floor(sqrt(n)) p=2 while p<=upperbound and primo: print "testando a divisibilidade pelo primo ",p if n%p==0: primo=false p=next_prime(p) return primo
divtriv(41)
testando a divisibilidade pelo primo 2 testando a divisibilidade pelo primo 3 testando a divisibilidade pelo primo 5 True

O teste de Miller-Rabin

def decomp(n): r""" Decompõe n=2^s *t +1, com t ímpar funcao auxiliar para o teste de primalidade de Miller Pedro Patricio """ m=n-1 #pretende-se decompor m=n-1 s=1 t=m//2 while t%2!=1: s+=1 t=t//2 return [s,t] def testeMiller(n,base=3): r""" o teste de Miller base b teste probabilístico de primalidade de Miller-Rabin a probabilidade de fornecer "primo" sendo composto é <1/4 para k bases distintas, a probabilidade é <1/4^k testeMiller(n,b) é False se não passa o teste de Miller Pedro Patricio """ primo=False [s,t]=decomp(n) if Mod(base,n)^t==Mod(1,n): primo=not primo else: j=0 while Mod(base,n)^(2^j*t)!=Mod(n-1,n) and j<s: j+=1 if j<s: primo= not primo return(primo)
testeMiller(123433323213341*1212432432118271)
False
testeMiller(2047,2)
True
factor(2047)
23 * 89
testeMiller(2047,3)
False

RSA: um exemplo "mais real"

bits=1024
maxp = 2 ^ ((bits/2).floor()) maxq = 2 ^ ((bits/2).floor()) p = random_prime(maxp) q = random_prime(maxq)
n=p*q; RDF(log(n,2))
1023.3708261121295
n
116229226386285467552159046129438684158714861781020030409271997420364496797825115882096644103814753345976657694928988057677474113555311136015204314717380270944603845149662183987748645505220328903013975263599093065829127647840270510743461506447150530031418498744753116280786622704127393528423347561452124696179
m=(p-1)*(q-1) a=randint(2,m); gcd(a,m)
1
while gcd(a, m) != 1: a = ZZ.random_element(m)
a
23421664505425158020443533619018875103884547278173552142750451653836776983535365855533330588480259919294630263699920060523680052480563319941891810465761008730797374642946843799041804499463571257024253426800309739651083955856209735963205673451513727405243748360974597443087665089146586755017255694724455910025L
b=1/Mod(a,m)
mens=randint(2,n); mens
21616681920062652869857846277354052355744001940108407645085696362805115283294859440582836400155203858083209624827924633935176463031386497689571202200692320926909940104649836473364685567049748408245293240368972903463114469451193464137707202989140493138956762751742672728264866037038447662080413151305613595643L
cifrado=Mod(mens,n)^a; cifrado
114363106156107644379284067251326707628449599753902599424894410033117593535590679780957485953762157593173420967529960265161832617551482980908339863771149176610996845953713818451865827675686045102146914780765605586958697566140783672983997930899049492920893256356812245992958661251377788280178727482093081322431
cifrado^b
21616681920062652869857846277354052355744001940108407645085696362805115283294859440582836400155203858083209624827924633935176463031386497689571202200692320926909940104649836473364685567049748408245293240368972903463114469451193464137707202989140493138956762751742672728264866037038447662080413151305613595643
cifrado^b==mens
True

Factorização de Fermat

def FFermat(n,ntent=10): r""" Factorizacao de Fermat Pedro Patricio, 2014, tnc-lcc """ contador=1 t=ceil(sqrt(n)) print t dif=t**2-n print dif, is_square(dif) while not is_square(dif) and contador<=ntent: t+=1 contador+=1 dif=t**2-n if is_square(dif): s=sqrt(dif) print "tentativas=",contador return [t-s,t+s] else: print "Atingido o limite de tentativas" return []
p=next_prime(10^120); q=next_prime(p+10^50) n=p*q n
1000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000730000000000000000000000000000000000000000000000000000000000000000000007900000000000000000000000000000000000000000000051429
p, q
(1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000079, 1000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000651)
FFermat(1643)
41 38 False tentativas= 2 [31, 53]

Teorema dos Números Primos

π(n)\pi(n) indica o número de primos não superiores a nn.

prime_pi(100)
25
prime_pi(100100)-prime_pi(100000)
6
prime_pi(10000100)-prime_pi(10000000)
2
prime_pi(1000000100)-prime_pi(1000000000)
7
plot(prime_pi, 1, 100, rgbcolor='blue')
plot(prime_pi, 1, 1000, rgbcolor='blue')
Q=plot(prime_pi, 2, 10000, rgbcolor='blue') R=plot(x/(ln(x)),2,10000, rgbcolor='green') R2=plot(x/(ln(x)-1),2,10000, rgbcolor='red') show(Q+R+R2,xmin=0, figsize=[10,5])
def TNP(x): aprox=x/(numerical_approx(log(x))-1) return prime_pi(x)/aprox
L=(TNP(k) for k in range (100,10000) if k%5==0)
for k in L: print k
0.901292546497023 0.939589804326220 0.975581187345273 0.976938816094761 0.946872935695511 0.918795296952552 0.922258215108639 0.925694762296517 0.957256016919402 0.932475498222755 0.935814901955793 0.939118091671567 0.942383944772822 0.945611684898315 0.948800817911531 0.951951079753946 0.955062393813881 0.958134835963728 0.938815847530213 0.964164002957974 0.988612994306048 0.970041263611545 0.952223554347636 0.955441801497675 0.938638612175277 0.942101419136943 0.964799849765912 0.967824941367456 0.970805100057431 0.973741572077023 0.958549714586796 0.961679338974725 0.964759575791746 0.967791963227277 0.970777969121879 0.973718995144222 0.976616380667806 0.995795929811887 0.982285297592454 0.985059227434132 0.972115044762281 0.959538787375933 0.962593724971578 0.980689592138623 0.983466205382466 0.971484498565424 0.959818530892105 0.962826106365013 0.965789123522041 0.954669624226471 0.971586630896692 0.974423557895083 0.977220806290031 0.966555094405313 0.969420863274578 0.972246735791494 0.975033799879032 0.977783099755511 0.980495638237242 0.970567604803510 0.973335586686056 0.976066860003498 0.978762372624069 0.969306702695074 0.972049122889215 0.974756027886593 0.965652063052055 0.980066819796436 0.982672390426241 0.985245816328757 0.987787866001111 0.979045880107105 0.981625937118514 0.995233046242714 0.997656755783135 0.989182415088742 0.991642336581204 0.983384944260306 0.985876941577009 0.988340261982741 0.990775538700216 0.993183384575118 0.995564392930749 0.987736290027927 0.980041143697732 0.992526529517278 0.984933629524662 0.977466183070476 0.970121008919025 0.972621246727201 0.975094083819778 0.967956359438540 0.970445628464960 0.972908053642626 0.975344178116095 0.977754529189081 0.980139618922913 0.973317702233465 0.975717138047923 0.978091818149459 0.980442220697600 0.982768810551062 0.985072039746847 0.987352347958260 0.998367774994293 0.991845900911920 0.985415967317390 0.987664369878204 0.981357562938559 0.992096569093187 0.994281136647665 0.996445180214649 0.998589060912813 1.00071313070580 0.994597915221771 0.996733256720665 0.998849138492542 1.00094589188980 0.994999649422205 0.997106447044027 0.991264345543465 0.993380032843044 0.995476973513367 0.989762074016977 0.991866882135129 0.986248236995032 0.988359924526540 0.990453285575059 0.992528614043197 0.994586197082016 0.989132884349343 0.991196636622676 0.993242986920488 0.995272205969389 0.997284558466612 0.999280303253430 0.994004188457254 0.988788113804064 0.990810818321047 0.985674480279620 0.987701287682302 0.982642331131901 0.984672586016429 0.986686532474800 0.981721843873683 0.990666453631345 0.999526176644149 0.994583952219610 0.996519852628874 0.991648695377689 0.986828831793785 0.988785866589127 0.997422006974285 0.999317255537320 0.994567795111833 0.989866951947019 0.991782054577625 1.00022023693357 1.00207652276386 0.997442293423830 0.992854215057715 0.988311581579877 0.990202102114493 0.992078857030581 0.993942028474744 0.989489315448055 0.991353940442230 0.986958664842366 0.988824361879770 0.990676813120634 0.992516188968135 0.994342656709820 0.990044991752943 0.985787308204058 0.987628102736166 0.989456148967843 0.991271606453737 0.993074631913266 0.988908101575105 0.990711595080889 0.992502886868999 0.988398799843636 0.990190344616006 0.991969912858030 0.993737648993718 0.995493694976070 0.991473807738324 0.998971272262519 1.00069307559971 0.996708257195990 0.998430474280644 1.00014161149393 0.996213472752625 1.00353115867389 1.00520981957203 1.00131504121034 0.997452720019711 0.993622440438176 0.995322815151741 1.00249065254051 1.00414913128792 1.00579738785619 1.00743553580269 1.00366762439850 1.00530598332328 1.00693440280182 1.00855299142700 1.00484521476126 1.00116674501968 0.997517226307246 0.993896308553504 1.00078305106890 0.997180585571706 0.998808122121856 0.995242507124809 0.996869379854982 0.993339877516715 0.994965926069562 0.996582499403855 0.998189696247414 0.994712549843428 0.996318891823383 0.992876033720979 0.994481376496609 0.996077558530929 0.997664673139400 0.999242812294032 1.00081206664821 1.00237252556098 0.999003079683902 1.00056268910436 0.997225285832223 0.998783916657804 0.995477958291014 0.992195509281725 0.988936312789387 0.995316702250881 0.996864522524902 0.998403935618097 0.999935022832482 1.00145786435990 1.00770354184536 1.00919499012654 1.00597770049197 1.00746833965893 1.00895111811229 1.01042610977731 1.00725167480978 1.00409865803661 1.00096683745115 0.997855994148776 0.994765912272395 0.991696378959141 0.993203162095938 0.994702159213179 0.996193441616107 0.993162703763243 0.994652453079666 0.991647514225588 0.988662066258393 0.990156077474245 0.987195696193923 0.988687894533336 0.985752164415015 0.982835147593488 0.984330995624853 0.990200781437338 0.991668898327509 0.993129745490257 0.990240227629487 0.991699319524102 0.997469300679651 0.998901697130790 0.996033884625714 0.993183742658017 0.994619858728355 0.991792423280170 0.997471354909527 1.00311942385816 1.00451624991726 1.00590644834305 1.00309303278853 1.00029650213533 1.00169041076332 0.998915623237946 1.00030798364525 0.997554605534080 0.998945361384465 0.996213066421206 0.997602163758989 0.998984833044415 1.00036112670757 1.00173109657687 0.999033681362087 1.00040205852902 1.00176420108725 1.00312015910078 1.00446998206804 1.00180649295822 0.999158152855634 1.00051092872825 1.00185764296708 1.00716355424009 1.00848793194580 1.00980644791726 1.01111914791034 1.01242607717829 1.00981327553486 1.01111886822678 1.00852484909949 1.00594510110649 1.00337950365141 1.00469213804286 1.00599909010823 1.01114506115152 1.00859611990457 1.00606095597648 1.00353945498685 1.00103150383562 1.00233370928085 1.00741765823046 1.00492153880639 1.00620724527229 1.00372825190275 1.00126235182477 1.00629115746447 1.00383284909555 1.00511004434747 1.00266833672202 1.00394393420430 1.00521424582947 1.00647931002888 1.00773916484138 1.00532477938055 1.00292279220655 1.00053310553420 1.00179852635039 1.00305878969355 1.00793961445591 1.00556399089494 1.00320036688879 1.00444882434570 1.00210050423674 1.00334733282408 1.00101412001090 1.00225929301406 0.999940994579107 1.00118448635303 0.998880912972856 0.996588696436772 0.997833664764584 0.995555856030595 0.993289188160296 0.994535462900873 0.995776848827198 1.00049944017178 1.00520149953890 1.00294239568484 1.00415677848443 1.00191160637456 0.999677188365692 1.00089293998960 1.00210402520622 1.00331047528622 1.00109561263094 0.998891223527019 0.996697231915226 1.00130205096219 0.999113793482951 0.996935779195630 0.998140029159542 0.999339746960911 0.997177462454436 0.995025198329821 0.992882883276352 0.994086306757416 0.995285244940851 0.993158127830361 0.994355263977669 0.995547968985721 1.00003672262063 1.00121366547689 0.999099781253805 1.00027504450925 1.00144601676284 0.999346885797252 1.00377519713647 1.00168124724620 1.00284209403580 1.00076004799969 0.998687257214111 0.999848977785111 0.997787859782973 0.998947889674521 1.00010377416084 0.998056639513936 0.996018475904305 1.00036094875258 1.00468636985981 1.00264896946280 1.00378693415074 1.00176077269308 0.999743366251671 1.00402951261572 1.00201682371956 1.00001277127217 1.00114587924184 1.00227505299191 1.00340031625286 1.00763166683512 1.00563920522950 1.00675287741290 1.00477112857427 1.00588326040754 1.00391210947938 1.00194922555790 1.00306202336747 1.00110954332367 0.999165196830616 0.997228931864024 0.995300696848307 0.996418301326508 0.997532137735014 0.998642228089457 0.996728205723373 0.997836645578747 0.995932521136470 0.994036171737261 0.998142397872654 0.999241829513988 0.997351535731683 0.998449338979522 0.996568686243018 0.994695612672071 0.998757415079395 0.999846392091493 0.997979203516925 0.999066574104287 1.00015039861416 1.00123069706783 1.00230748932856 1.00045548666261 1.00153071930993 1.00260248314600 1.00076160682895 0.998927961031992 0.997101502153027 0.998175449115861 0.999245960722096 1.00031305597676 1.00137675373791 1.00243707271814 1.00349403148597 1.00168568935480 0.999884317276461 1.00094155936022 1.00199547473372 1.00588757181390 1.00692981964375 1.00796881398949 1.00900457242999 1.00721577969511 1.00543376906848 1.00646986942403 1.00750276532029 1.00853247390259 1.00676244982735 1.00499906890596 1.00602907700889 1.00705592862620 1.00807964048350 1.00632797580570 1.00735026541838 1.00560679086310 1.00662765255548 1.00764542103072 1.00866011248845 1.00692806979508 1.00520238639814 1.00348302645456 1.00176995439370 1.00278810258482 1.00108286686148 0.999383830764395 0.997690959692862 0.998710752511204 0.997025541760971 0.998043826007635 0.999059087623885 1.00007134207555 1.00108060471799 1.00208689079708 1.00309021545024 1.00142014000071 0.999756008446877 0.998097788315219 0.999102635231120 0.997451750828004 0.995806697360922 0.999455567913987 0.997813392952161 0.996176985290926 0.997177388743312 0.995548123783224 0.996547040750746 0.997543079118019 0.995922283912722 0.996916847093976 0.995303054138492 0.993694844430887 0.994689288290356 0.993087975366449 0.996669676572805 0.997655648753313 0.996058362561123 0.997042879686262 0.998024613626829 0.999003577914642 1.00254383672304 1.00351323394081 1.00447991534556 1.00289200597903 1.00385732179567 1.00736379521832 1.00831974346991 1.00673717861198 1.00769181007152 1.00864380227699 1.00706918487353 1.00801986942712 1.00896793907451 1.00991340619890 1.00834795485576 1.00678768803273 1.00773315793144 1.00617932560388 1.00712349190669 1.00557604077343 1.00651890118288 1.00745920520544 1.00839696476374 1.01180604511384 1.01026489779077 1.00872876522014 1.00966020823127 1.00813029871434 1.00660534139975 1.00753673927426 1.00846564944928 1.00939208334955 1.00787567538859 1.00880085062883 1.00972357170726 1.01064384981707 1.00913588865558 1.00763273340671 1.00855295277611 1.00705574856808 1.00797471436073 1.00648341382486 1.00740112437701 1.00831643411364 1.00922935382464 1.00774619780045 1.00865788143860 1.00718051233471 1.00809095834495 1.00661933074852 1.00752853768064 1.00606260670300 1.00460123068392 1.00551029447786 1.00641701930997 1.00732141550806 1.00822349333637 1.00912326299607 1.00767184919640 1.00622489315901 1.00478237387259 1.00334427045935 1.00424601802987 1.00514547655367 1.00371385355056 1.00461207534251 1.00550802774495 1.00640172058902 1.00497754717838 1.00355767687520 1.00445117288293 1.00534242842128 1.00623145311995 1.00481889980088 1.00341058012797 1.00429939562356 1.00518599902774 1.00378387613842 1.00466926799537 1.00555246642649 1.00643348074180 1.00503847748706 1.00364760212554 1.00226083591319 1.00314259044751 1.00176086774676 1.00264140919127 1.00351979365308 1.00214402114144 1.00077227483726 1.00165038955109 1.00028357692655 0.998920745521135 0.997561877540092 0.996206955295920 0.997086579954657 1.00019167294171 0.998839447932513 0.997491125038562 0.998365276484402 0.999237324230809 1.00010727693235 0.998765485041279 0.999634233484465 1.00050090408733 0.999164702037002 1.00003017718478 1.00089359148181 1.00175495331611 1.00042515689932 0.999099127844251 0.997776849773853 0.996458306407067 0.999498595262975 1.00253111063813 1.00121223100415 0.999897054022596 1.00075169294902 0.999441036596562 0.998134043252494 0.996830697208769 0.995530982848168 0.996386908203475 0.997240839050107 0.998092783321017 0.998942748905250 0.999790743648259 1.00063677535221 1.00148085177629 1.00232298063699 1.00103331149888 1.00187430465676 1.00271336564616 1.00142883079569 1.00226676418118 1.00310278060783 1.00182333622142 1.00476909249599 1.00349122796304 1.00221683079021 1.00304871403500 1.00387871019633 1.00260931754966 1.00134334933420 1.00217301060497 1.00300079957902 1.00173976562199 1.00048211396620 0.999227830692943 1.00005602050648 0.998805833408936 0.997558980330442 0.998386789516593 0.997143985195153 0.997970672910117 1.00085914491707 1.00374066516491 1.00249822507783 1.00125906549950 1.00002317314083 0.998790534785296 0.999609517447193 1.00042669229043 0.999198714961538 0.997973952635013 0.998790740847777 0.999605735192824 0.998385570549211 1.00123036909750 1.00204002197888 1.00284790763652 1.00365403264520 1.00445840354572 1.00324243040561 1.00606190901663 1.00484733438748 1.00363588697817 1.00443642729064 1.00322878203837 1.00603233027139 1.00482606008471 1.00562212319556 1.00441961933206 1.00322018197190 1.00401589414647 1.00480990400260 1.00560221774553 1.00639284154908 1.00519914025352 1.00598875106012 1.00677668432996 1.00756294613602 1.00637425965864 1.00518856356054 1.00597448521532 1.00479242207856 1.00361332067462 1.00636060276867 1.00714221957005 1.00596506474259 1.00479084358693 1.00557211209523 1.00635174564710 1.00712975006923 1.00790613115945 1.00673738621929 1.00751278861066 1.00634756668249 1.00712199103799 1.00789480959367 1.00866602801959 1.00750556466932 1.00634794775985 1.00519316658095 1.00404121047671 1.00481331801922 1.00750289051249 1.00635277414136 1.00712013381237 1.00597342490051 1.00482949941642 1.00559649974711 1.00636193435191 1.00712580866924 1.00598645239787 1.00484984383411 1.00371597281328 1.00637532006912 1.00524262758088 1.00600363696019 1.00487424673164 1.00374755921767 1.00450819525746 1.00714982179212 1.00602487497811 1.00678092913520 1.00565923651389 1.00454020768983 1.00529589234936 1.00605006573677 1.00680273299078 1.00568805867171 1.00457601474653 1.00346659169413 1.00421944568002 1.00497080438260 1.00757624604643 1.00832259027714 1.00906745907137 1.00981085738880 1.00870534448006 1.00944783665504 1.01018886838647 1.00908704484211 1.00798778250712 1.00689107224963 1.00763230079370 1.00653867543938 1.00544757963691 1.00435900441208 1.00510039609929 1.00401486157953 1.00293182551403 1.00549437464304 1.00623197649033 1.00696814819801 1.00770289447643 1.00843622001443 1.00916812947940 1.00808877334626 1.00701187718367 1.00593743239243 1.00666949761386 1.00740015667107 1.00812941415114 1.00705895505778 1.00599091791757 1.00671980378004 1.00744729761711 1.00638268741721 1.00532047431753 1.00783453135677 1.00855838360273 1.00749768023530 1.00643935370608 1.00716283548504 1.00610737338992 1.00505426790379 1.00755122654297 1.00827111091741 1.00898963963455 1.00793850386358 1.00688970109352 1.00760786061669 1.01008747894598 1.00904014424642 1.00799512311182 1.00695240770402 1.00766750852818 1.00662756946192 1.00558991680522 1.00455454284847 1.00352143991710 1.00423709967516 1.00320672395224 1.00392151966100 1.00637612683966 1.00534714414186 1.00605798120836 1.00676750699173 1.00574168820073 1.00818264110008 1.00715774598507 1.00786382465508 1.00856860857508 1.00927210177177 1.00825080260896 1.01067523201513 1.00965485172757 1.01035495651033 1.01105378671844 1.01003651349765 1.01073452976562 1.00971988988350 1.00870741949599 1.00769711148907 1.00668895878021 1.00568295431813 1.00638193699976 1.00537851015591 1.00777612185876 1.00677356855139 1.00746921556440 1.00646922026091 1.00716405163398 1.00785763736337 1.00686061778065 1.00755339288655 1.00655890182927 1.00556650129290 1.00457618453834 1.00526899668972 1.00596057548271 1.00497317309507 1.00566394128448 1.00467901875942 1.00369615046223 1.00605771425539 1.00507567213309 1.00409567139475 1.00311770553302 1.00380645539092 1.00449399159479 1.00518031776486 1.00586543750640 1.00654935440975 1.00557544035298 1.00460353292521 1.00363362578645 1.00596938877730 1.00500028068339 1.00568181926863 1.00471509604725 1.00375035154848 1.00443149362650 1.00511145184958 1.00743099679543 1.00810702906573 1.00714425813762 1.00618344497636 1.00522458347726 1.00426766756130 1.00657549667474 1.00561935446350 1.00466514601923 1.00533962849769 1.00601295219405 1.00506143479831 1.00411183352183 1.00478476303340 1.00383744834289 1.00450960296071 1.00518060963061 1.00585047166851 1.00490618085080 1.00396377736549 1.00302325542840 1.00369309179819 1.00275481204710 1.00181839962718 1.00409180989395 1.00475861148169 1.00542428582992 1.00608883616076 1.00675226568356 1.00741457759498 1.00648071847287 1.00714228174734 1.00780273401306 1.00687144423217 1.00594198641615 1.00660205544223 1.00567478242567 1.00633410585173 1.00540900716595 1.00448571874187 1.00356423514789 1.00580248656805 1.00645922773532 1.00711487784399 1.00619480020809 1.00527651177179 1.00436000720028 1.00501561808346 1.00567014478393 1.00475610810338 1.00384383967895 1.00293333426564 1.00202458663937 1.00267939751212 1.00489352497303 1.00554477514490 1.00619495691558 1.00684407324634 1.00593735528598 1.00658574830789 1.00723308202738 1.00632877573860 1.00542619742726 1.00607314687214 1.00517262392809 1.00427381647289 1.00337671949598 1.00248132800649 1.00158763703322 1.00223517338082 1.00134349890470 1.00199030769182 1.00263607084984 1.00174672274379 1.00239176256333 1.00150441040794 1.00061872991848 1.00126336262174 1.00190695903000 1.00102357138826 1.00166644773019 1.00078502877549 0.999905260333293 1.00206831616631 1.00270842160326 1.00334750522175 1.00246897525797 1.00310735010249 1.00374470888582 1.00286843226702 1.00501638917410 1.00565071610628 1.00477536611093 1.00390163740736 1.00453557573012 1.00516851204068 1.00580044901149 1.00643138930510 1.00706133557424 1.00769029046184 1.00682001253483 1.00894523661552 1.00807557203285 1.00720750241766 1.00783411085698 1.00696793451570 1.00610334208551 1.00672957405802 1.00735482866889 1.00649241364151 1.00563156950458 1.00477229187134 1.00539746348586 1.00602166361057 1.00664489479181 1.00578805947922 1.00641061814572 1.00703221317696 1.00765284708886 1.00827252238824 1.00889124157285 1.00803741965747 1.00718513501811 1.00633438341157 1.00548516061045 1.00463746240305 1.00525667332995 1.00587493430880 1.00502932301797 1.00418522403241 1.00480310283205 1.00542003708097 1.00603602921331 1.00519427835254 1.00580961127679 1.00496963721685 1.00558431191579 1.00474610699058 1.00536012444913 1.00452368104168 1.00368871797846 1.00285523124312 1.00346913778182 1.00552683817001 1.00613769347111 1.00530529514181 1.00447436168442 1.00364488914706 1.00281687359221 1.00342788686582 1.00260158971380 1.00321195011993 1.00382139463830 1.00442992558398 1.00360586784905 1.00278324813652 1.00339139507118 1.00399863353191 1.00460496580454 1.00378456382057 1.00296558683540 1.00357153678070 1.00275423913653 1.00335954631631 1.00254392096623 1.00172970577402 1.00233462631818 1.00293865095805 1.00212634923095 1.00131544674480 1.00050593980485 0.999697824729502 0.998891097850247 0.999495481154997 1.00009897428036 1.00070157943266 1.00130329881061 1.00049893946572 1.00110002164922 1.00170022268452 1.00370136229050 1.00289798999827 1.00209598520376 1.00269380152367 1.00329074559049 1.00528304599895 1.00587713944971 1.00507636565548 1.00427694753861 1.00347888158102 1.00268216427696 1.00327637159495 1.00525819618213 1.00584958435994 1.00505383652370 1.00425942738077 1.00346635347907 1.00544061030644 1.00602992536533 1.00523757139956 1.00582627871896 1.00641414013787 1.00700115770189 1.00758733344977 1.00679726331600 1.00600851048552 1.00522107159172 1.00443494327956 1.00502122892991 1.00560667772918 1.00619129168711 1.00677507280675 1.00599118723231 1.00657437195666 1.00579201703970 1.00637460627535 1.00559377589674 1.00481423364917 1.00403597627546 1.00325900052953 1.00248330317636 1.00306621009896 1.00229201224118 1.00151908485611 1.00210161612130 1.00268332650993 1.00326421796677 1.00519536146443 1.00712361514366 1.00635099406933 1.00692759512367 1.00615645889606 1.00538657821325 1.00596282002218 1.00653825655767 1.00711288971220 1.00634492813456 1.00691898246879 1.00615248709110 1.00672596348629 1.00729864257579 1.00653382791303 1.00577024776801 1.00500789908654 1.00558043988545 1.00748483966124 1.00805478891828 1.00729331209645 1.00653305808043 1.00577402386059 1.00501620643728 1.00425960282082 1.00482984306975 1.00539929861322 1.00464432919868 1.00521321387198 1.00445966023556 1.00502797492411 1.00559551077154 1.00616226957162 1.00541054597484 1.00597673969502 1.00654216015413 1.00579204827957 1.00635690652052 1.00692099525852 1.00748431625530 1.00804687126703 1.00860866204432 1.00916969033223 1.01103789823024 1.01028946639260 1.01084821762771 1.01140621329875 1.01065937850600 1.00991371586987 1.01047137640637 1.01102828520688 1.01028420690032 1.00954129252282 1.00879953928399 1.00935631756128 1.00991234810482 1.00917216127836 1.00972765010744 1.00898881936374 1.00825113762369 1.00880628753611 1.00806995278631 1.00733476031341 1.00660070740167 1.00586779134403 1.00513600944211 1.00569140940180 1.00624606997308 1.00551580914469 1.00478667464143 1.00405866380092 1.00461316831663 1.00516693737338 1.00444043065909 1.00371503988576 1.00426845766516 1.00354436966957 1.00409724535778 1.00464939111373 1.00520080855515 1.00575149929478 1.00502927598351 1.00430815480441 1.00485849790549 1.00540811792944 1.00595701647096 1.00523755633514 1.00578592256140 1.00633357068461 1.00561557702923 1.00616269544466 1.00544597602682 1.00599256555236 1.00527711573179 1.00582317718523 1.00510899234688 1.00691316800587 1.00619935128875 1.00674346812402 1.00603090991890 1.00657450381350 1.00586319956739 1.00640627132612 1.00569621651057 1.00623876693813 1.00552995704906 1.00482220808417 1.00411551760996 1.00340988320046 1.00519959423431 1.00574058549467 1.00503548360169 1.00557595674777 1.00611573557205 1.00665482157103 1.00719321623672 1.00648987312439 1.00578757358426 1.00508631524354 1.00562454961554 1.00492450445973 1.00546222560839 1.00599926065551 1.00653561106953 1.00707127831458 1.00760626385042 1.00690812344899 1.00744260318761 1.00674566389505 1.00727963860935 1.00781293635007 1.00711736664642 1.00765016176693 1.00818228297940 1.00871373171372 1.00924450939556 1.00855064821315 1.00908092888498 1.00961054152918 1.00891803714936 1.00944715513087 1.00997560808879 1.01050339742529 1.01103052453845 1.01155699082229 1.01208279766676 1.01139233067568 1.01191765148052 1.01122835618026 1.01175319166188 1.01106506397376 1.01037793051933 1.00969178909735 1.00900663751316 1.00953149333112 1.01005569629948 1.00937186516632 1.00868901751029 1.00800715116401 1.00853119968900 1.00905459862886 1.00837403902459 1.00769445445175 1.00821753231967 1.00873996366284 1.00806167639675 1.00858362503735 1.00790646809802 1.00842793476615 1.00775190428525 1.00707683646073 1.00640272919210 1.00572958038505 1.00505738795142 1.00557900746926 1.00609998707447 1.00542906142207 1.00475908610349 1.00409005905612 1.00461086682317 1.00631913601518 1.00565057347585 1.00616947496617 1.00668774362943 1.00720538075879 1.00772238764374 1.00823876557010 1.00757191967027 1.00690601053965 1.00742207024188 1.00675724921481 1.00727283640700 1.00660909982961 1.00712421523203 1.00646155946876 1.00579982973135 1.00513902403695 1.00565396981246 1.00499423556089 1.00433542051193 1.00485004317365 1.00536404611299 1.00587743057981 1.00521997666018 1.00573289222635 1.00624519198846 1.00558894577270 1.00610077877300 1.00661199862018 1.00595695537942 1.00763260377243 1.00814199152762 1.00748739067119 1.00799631798503 1.00734276673242 1.00669011536817 1.00719872919332 1.00770673771434 1.00705527530760 1.00640470728593 1.00575503176797 1.00510624687769 1.00677010759303 1.00612160926210 1.00547399799947 1.00598091978980 1.00648724194411 1.00584079978535 1.00749809209155 1.00685193452480 1.00735660743791 1.00671147160789 1.00606721312670 1.00542383016623 1.00592833154383 1.00757851805337 1.00808110303717 1.00743828206763 1.00794041825180 1.00729860780099 1.00665766514206 1.00715949266399 1.00766073328076 1.00816138814138 1.00866145839175 1.00802193733586 1.00852156344084 1.00788304187385 1.00724537870072 1.00774469921003 1.00710802974701 1.00760690681395 1.00810520448357 1.00860292388214 1.00796751835948 1.00733296277687 1.00669925539244 1.00606639446913 1.00543437827469 1.00706118981216 1.00642944142156 1.00692611131068 1.00742220822329 1.00791773326547 1.00841268754034 1.00890707214807 1.00940088818591 1.00877078398206 1.00926416690529 1.00975698360482 1.01024923516813 1.00962036733321 1.01011218891917 1.01060344769358 1.00997567776005 1.01046650843008 1.00983969928526 1.01033010248333 1.01081994640816 1.01019422746107 1.00956933083543 1.01005888098470 1.00943493611785 1.00992406068921 1.00930106459935 1.00978976422305 1.00916771394233 1.00854647717197 1.00792605228204 1.00730643764700 1.00779509878725 1.00828320721074 1.00766465566934 1.00704690969296 1.00753472065752 1.00912605796006 1.00850869268936 1.00789212921218 1.00727636593319 1.00666140126138 1.00714794174303 1.00763393549141 1.00702001670345 1.00640689193470 1.00579455961186 1.00628037953938 1.00566896064531 1.00615435907600 1.00663921447622 1.00602882837483 1.00541922793206 1.00590378527832 1.00748051399220 1.00796333019828 1.00735421722922 1.00783661787015 1.00722840780879 1.00771039350501 1.00819184368570 1.00867275934562 1.00915314147696 1.00854619559998 1.00794002457427 1.00733462688440 1.00673000101895 1.00612614547047 1.00660659651429 1.00600362804218 1.00540142621370 1.00588158263520 1.00528026303790 1.00684030795585 1.00623922298556 1.00563889968339 1.00611770495767 1.00551825806599 1.00707373765366 1.00647452366540 1.00587606641912 1.00635352847696 1.00683046745810 1.00623299638375 1.00563627782434 1.00611292538698 1.00551707226754 1.00492196811703 1.00432761149325 1.00373400095776 1.00421058191495 1.00361782799480 1.00302581666078 1.00243454648778 1.00291094258904 1.00338682079891 1.00279651095142 1.00220693816781 1.00268251984914 1.00209379199102 1.00150579775705 1.00091853574684 1.00139392813528 1.00293010791849 1.00234317092093 1.00175696289557 1.00117148245547 1.00164555015190 1.00211910662932 1.00364973946718 1.00306468960631 1.00353671793976 1.00295249924906 1.00342412759854 1.00284073764204 1.00331196661311 1.00378269015350 1.00425290916832 1.00367055898498 1.00414038133381 1.00460970110922 1.00612875799588 1.00554683652801 1.00601465395998 1.00648197239571 1.00590097920399 1.00636790677133 1.00683433726230 1.00730027156054 1.00776571054752 1.00823065510254 1.00765090827037 1.00811546663167 1.00857953245434 1.00800070670695 1.00742258586276 1.00788637353815 1.00730906216272 1.00673245248040 1.00719596110126 1.00765898035478 1.00812151110363 1.00754591680694 1.00697101985840 1.00639681896387 1.00685917618242 1.00732104703571 1.00674774815571 1.00720923733473 1.00767024199443 1.00813076298407 1.00859080115083 1.00905035733986 1.00847826852051 1.00790686791597 1.00836615032583 1.00882495271594 1.00928327592386 1.00871287117130 1.00814315041585 1.00860120120073 1.00803226530905 1.00848994111222 1.00997249342521 1.00940386471977 1.00883591527816 1.00826864385746 1.00770204921785 1.00713613012255 1.00759278471382 1.00804896604650 1.00748392121960 1.00691954838196 1.00635584630946 1.00579281378099 1.00624892014538 1.00670455542989 1.00715972044636 1.00659765070099 1.00603624645549 1.00649113832768 1.00593049572987 1.00638501671346 1.00582513363103 1.00526591137552 1.00572015857961 1.00617393941736 1.00763894037062 1.00809122979061 1.00753249171082 1.00697441062820 1.00641698535946 1.00686910159953 1.00732075571440 1.00676417654363 1.00721546525359 1.00665963391110 1.00711055774824 1.00756102208273 1.00801102769571 1.00745613256233 1.00790577565773 1.00835496171914 1.00780090455184 1.00824972952645 1.00769641285006 1.00714374034094 1.00659171085044 1.00604032323269 1.00548957634454 1.00593841483989 1.00538839980083 1.00483902271191 1.00528759155841 1.00573570750206 1.00618337130538 1.00563490560476 1.00508707409841 1.00453987566314 1.00498736195982 1.00444088577752 1.00389503993629 1.00434225638217 1.00478902361814 1.00424398604297 1.00469039453800 1.00414607333302 1.00360237767777 1.00404851683258 1.00548288482366 1.00592759724543 1.00538425787561 1.00582861522751 1.00528598728786 1.00572999008597 1.00617355015419 1.00661666822847 1.00607492730600 1.00553380480461 1.00499329964306 1.00445341074266 1.00489644048814 1.00435725381991 1.00381868079181 1.00426144440101 1.00470376897802 1.00514565524836 1.00558710393593 1.00504948919120 1.00451248408083 1.00495366893605 1.00441735821749 1.00388165455489 1.00432257494731 1.00378756230737 1.00422813293087 1.00466826948063 1.00413403083535 1.00554724320801 1.00598608180610 1.00642448917143 1.00589059104306 1.00535729361922 1.00482459586478 1.00526282766174 1.00570063000900 1.00613800360780 1.00560615709900 1.00507490684313 1.00551202084516 1.00691596611599 1.00735171652092 1.00682080300703 1.00629048292890 1.00672597672483 1.00716104631047 1.00663148597021 1.00706621587553 1.00653732945030 1.00600903209157 1.00548132279452 1.00495420055664 1.00538883917616 1.00486238475579 1.00529668371210 1.00573056192721 1.00520485514204 1.00563839498287 1.00511335221180 1.00650421754872 1.00597933764821 1.00545503822117 1.00493131828444 1.00440817685711 1.00388561296052 1.00431830080910 1.00475057201748 1.00518242725382 1.00561386718482 1.00509219844875 1.00552330369206 1.00595399507825 1.00543305940019 1.00491269579178 1.00534313309535 1.00577315810121 1.00525352356948 1.00473445834721 1.00421596147917 1.00369803201230 1.00318066899568 1.00266387148055 1.00309395357081 1.00257779728102 1.00300754589262 1.00249202918223 1.00292144479591 1.00335045168069 1.00283564912102 1.00420724185287 1.00463502643136 1.00412045321851 1.00360643888063 1.00309298248817 1.00352058975820 1.00300776585396 1.00343504356064 1.00292285053273 1.00334979914868 1.00283823539136 1.00232722468253 1.00369107249776 1.00318021115160 1.00360610086366 1.00309586531483 1.00258617979595 1.00301181676037 1.00437135201429 1.00386188938904 1.00335297470289 1.00377748575758 1.00420159816419 1.00369337811858 1.00318570342683 1.00360956536842 1.00403303013688 1.00352604640870 1.00394918804916 1.00437193386850 1.00479428448294 1.00521624050740 1.00563780255548 1.00513172794799 1.00555297023921 1.00597381988964 1.00639427750844 1.00588896287287 1.00538418617207 1.00580439910179 1.00622422143700 1.00664365378198 1.00706269673973 1.00748135091196 1.00697747635297 1.00739581568846 1.00689254838145 1.00638981411158 1.00680791175083 1.00722562272968 1.00672356539178 1.00622203861319 1.00572104153530 1.00613858295737 1.00655573923569 1.00605541395697 1.00647225732459 1.00688871683851 1.00638906145688 1.00680520919402 1.00813579813418 1.00763635754284 1.00805135932386 1.00755251472493 1.00705419346386 1.00838151962230 1.00879545245612 1.00829734506637 1.00779975907666 1.00730269365123 1.00771646092894 1.00812985013049 1.00763344536382 1.00713755877169 1.00664218952582 1.00614733679970 1.00565299976862 1.00606636098291 1.00647934580026 1.00689195479087 1.00639833943335 1.00681064231285 1.00631760872972 1.00672960592214 1.00623715269458 1.00664884462328 1.00706016330924 1.00747110931541 1.00697937193838 1.00648814334189 1.00599742271988 1.00550720926795 1.00591805550085 1.00632853059501 1.00673863510811 1.00804760921237 1.00755773461602 1.00706836465024 1.00747742849094 1.00698862975047 1.00650033370568 1.00780578829853 1.00821381671610 1.00772572243039 1.00813345180085 1.00764592550588 1.00805335623859 1.00756639656672 1.00707993551629 1.00659397230553 1.00610850615427 1.00651583755845 1.00603093331270 1.00643796618897 1.00684463545412 1.00636035726137 1.00587657279246 1.00539328127663 1.00579978325621 1.00620592300989 1.00661170107438 1.00612909583540 1.00564698101852 1.00605252740155 1.00645771336827 1.00686253945129 1.00638110732002 1.00678563859544 1.00630475859147 1.00670899546269 1.00711287424193 1.00663260914484 1.00703619455025 1.00743942301730 1.00784229507088 1.00736270728797 1.00688360319966 1.00728624736723 1.00768853636581 1.00721004235761 1.00761204042293 1.00801368445853 1.00753579889302 1.00705839350175 1.00745981088589 1.00698294788033 1.00650656325439 1.00603065627327 1.00643190905126 1.00770907860580 1.00723335915813 1.00763355751254 1.00715837641846 1.00668367024254 1.00620943825801 1.00660947268461 1.00700915746294 1.00740849310100 1.00693491951693 1.00646181773927 1.00686092811161 1.00813102246253 1.00852902872764 1.00805617364234 1.00758378840258 1.00711187229353 1.00664042460184 1.00703833014634 1.00743589005547 1.00696503152519 1.00649463937749 1.00689197558861 1.00728896735276 1.00768561516618 1.00721586976513 1.00761223467129 1.00800825671120 1.00840393637779 1.00793483605320 1.00919427055787 1.01045256071963 1.00998324113549 1.00951438348896 1.00904598708390 1.00857805122555 1.00983384116113 1.01022725980879 1.01062034017541 1.01101308274448 1.01054544931826 1.01007827425023 1.01047080073067 1.01086299056019 1.01039639358694 1.00993025300420 1.01032222706487 1.00985660194656 1.01024830034583 1.00978318951189 1.01017461261465 1.01056570134239 1.01010116305969 1.01049197742065 1.01088245844540 1.01041849122926 1.00995497524907 1.00949190983289 1.00902929431016 1.00856712801164 1.00810541026944 1.00849591061178 1.00803469844660 1.00757393321956 1.00796421698232 1.00750395523702 1.00789396509778 1.00828364431644 1.00867299335868 1.00906201268929 1.00945070277215 1.00899117232878 1.00937959109173 1.00976768162124 1.00930870888413 1.00885017818118 1.00923805537811 1.00878002285602 1.00832243078577 1.00955491016771 1.00909743140218 1.00948444241922 1.00902745940602 1.00941420143261 1.00895771305893 1.00850166208636 1.00804604787323 1.00843263324593 1.00881889429465 1.00836382744511 1.00874982037674 1.00913548997541 1.00952083669101 1.00990586097254 1.00945145150465 1.00899747523840 1.00854393154151 1.00976678124559 1.00931334820957 1.00886034656951 1.00924462862291 1.00962859037570 1.01001223227130 1.00955982641915 1.00994320407998 1.00949128247139 1.00987439624246 1.01025719165306 1.00980580802942 1.01018834041985 1.01057055541317 1.01095245344677 1.01050166126591 1.01005129495205 1.01043298597646 1.01164562289302 1.01119542070571 1.01074564297511 1.01112644216091 1.01067714262385 1.01105768170988 1.01143790677780 1.01098913863615 1.01054079233027 1.01092081222625 1.01130051913118 1.01085270176961 1.01040530451017 1.01078480655861 1.01116399663807 1.01154287517441 1.01109605805553 1.01147467918745 1.01185298970827 1.01140669770401 1.01096082270683 1.01051536412019 1.01089352454462 1.01127137545069 1.01082643846458 1.01038191618924 1.00993780803291 1.00949411340495

Primos GRAAAANDEEEEES

Se Mp=2p1M_p=2^p-1 é primo então MpM_p chama-se um primo de Mersènne.

def LucasLehmer(p): Zn=IntegerModRing(2**p-1) r=Zn(4) print r, 1 for k in range(2,p): r=(r**2)-2 print r, k if r==0: return True else: return False
LucasLehmer(7)
4 1 14 2 67 3 42 4 111 5 0 6 True

Coisas inúteis...

Conjectura de Goldbach

Todo o número par maior que 4 é soma de dois primos

def goldBach(n): P=Primes() resto=(n/2)%2 a=n/2+resto-1 b=n/2-resto+1 while not (a in P and b in P): print a,b a-=2 b+=2 return a,b
goldBach(160000)
79999 80001 79997 80003 79995 80005 79993 80007 79991 80009 79989 80011 79987 80013 79985 80015 79983 80017 79981 80019 (79979, 80021)

Conjectura dos primos gémeos

Existe uma infinidade de primos gémeos.

def primosgemeos(n): P=primes(1,n) lista=[[m,m+2] for m in P if is_prime(m+2)] return lista
primosgemeos(10000)
[[3, 5], [5, 7], [11, 13], [17, 19], [29, 31], [41, 43], [59, 61], [71, 73], [101, 103], [107, 109], [137, 139], [149, 151], [179, 181], [191, 193], [197, 199], [227, 229], [239, 241], [269, 271], [281, 283], [311, 313], [347, 349], [419, 421], [431, 433], [461, 463], [521, 523], [569, 571], [599, 601], [617, 619], [641, 643], [659, 661], [809, 811], [821, 823], [827, 829], [857, 859], [881, 883], [1019, 1021], [1031, 1033], [1049, 1051], [1061, 1063], [1091, 1093], [1151, 1153], [1229, 1231], [1277, 1279], [1289, 1291], [1301, 1303], [1319, 1321], [1427, 1429], [1451, 1453], [1481, 1483], [1487, 1489], [1607, 1609], [1619, 1621], [1667, 1669], [1697, 1699], [1721, 1723], [1787, 1789], [1871, 1873], [1877, 1879], [1931, 1933], [1949, 1951], [1997, 1999], [2027, 2029], [2081, 2083], [2087, 2089], [2111, 2113], [2129, 2131], [2141, 2143], [2237, 2239], [2267, 2269], [2309, 2311], [2339, 2341], [2381, 2383], [2549, 2551], [2591, 2593], [2657, 2659], [2687, 2689], [2711, 2713], [2729, 2731], [2789, 2791], [2801, 2803], [2969, 2971], [2999, 3001], [3119, 3121], [3167, 3169], [3251, 3253], [3257, 3259], [3299, 3301], [3329, 3331], [3359, 3361], [3371, 3373], [3389, 3391], [3461, 3463], [3467, 3469], [3527, 3529], [3539, 3541], [3557, 3559], [3581, 3583], [3671, 3673], [3767, 3769], [3821, 3823], [3851, 3853], [3917, 3919], [3929, 3931], [4001, 4003], [4019, 4021], [4049, 4051], [4091, 4093], [4127, 4129], [4157, 4159], [4217, 4219], [4229, 4231], [4241, 4243], [4259, 4261], [4271, 4273], [4337, 4339], [4421, 4423], [4481, 4483], [4517, 4519], [4547, 4549], [4637, 4639], [4649, 4651], [4721, 4723], [4787, 4789], [4799, 4801], [4931, 4933], [4967, 4969], [5009, 5011], [5021, 5023], [5099, 5101], [5231, 5233], [5279, 5281], [5417, 5419], [5441, 5443], [5477, 5479], [5501, 5503], [5519, 5521], [5639, 5641], [5651, 5653], [5657, 5659], [5741, 5743], [5849, 5851], [5867, 5869], [5879, 5881], [6089, 6091], [6131, 6133], [6197, 6199], [6269, 6271], [6299, 6301], [6359, 6361], [6449, 6451], [6551, 6553], [6569, 6571], [6659, 6661], [6689, 6691], [6701, 6703], [6761, 6763], [6779, 6781], [6791, 6793], [6827, 6829], [6869, 6871], [6947, 6949], [6959, 6961], [7127, 7129], [7211, 7213], [7307, 7309], [7331, 7333], [7349, 7351], [7457, 7459], [7487, 7489], [7547, 7549], [7559, 7561], [7589, 7591], [7757, 7759], [7877, 7879], [7949, 7951], [8009, 8011], [8087, 8089], [8219, 8221], [8231, 8233], [8291, 8293], [8387, 8389], [8429, 8431], [8537, 8539], [8597, 8599], [8627, 8629], [8819, 8821], [8837, 8839], [8861, 8863], [8969, 8971], [8999, 9001], [9011, 9013], [9041, 9043], [9239, 9241], [9281, 9283], [9341, 9343], [9419, 9421], [9431, 9433], [9437, 9439], [9461, 9463], [9629, 9631], [9677, 9679], [9719, 9721], [9767, 9769], [9857, 9859], [9929, 9931]]

O problema de Siracusa

http://en.wikipedia.org/wiki/Collatz_conjecture

 

nNn\in \mathbb{N}

un+1=un2 u_{n+1}= \frac{u_n}{2}  se unu_n é par, e un+1=3un+1  u_{n+1}=3u_n + 1  se unu_n é ímpar.

 

Conjectura: existe um kk tal que uk=1u_k=1, independentemente da condição inicial.

u = 4 ; n = 0 while u != 1 : if u % 2 == 0 : u = u/2 else : u = 3*u+1 n = n+1 n
2
def siracusa(u): n = 0 while u != 1 : if u % 2 == 0 : u = u/2 else : u = 3*u+1 n = n+1 return n
siracusa(6)
8
[siracusa(k) for k in range(2,300)]
[1, 7, 2, 5, 8, 16, 3, 19, 6, 14, 9, 9, 17, 17, 4, 12, 20, 20, 7, 7, 15, 15, 10, 23, 10, 111, 18, 18, 18, 106, 5, 26, 13, 13, 21, 21, 21, 34, 8, 109, 8, 29, 16, 16, 16, 104, 11, 24, 24, 24, 11, 11, 112, 112, 19, 32, 19, 32, 19, 19, 107, 107, 6, 27, 27, 27, 14, 14, 14, 102, 22, 115, 22, 14, 22, 22, 35, 35, 9, 22, 110, 110, 9, 9, 30, 30, 17, 30, 17, 92, 17, 17, 105, 105, 12, 118, 25, 25, 25, 25, 25, 87, 12, 38, 12, 100, 113, 113, 113, 69, 20, 12, 33, 33, 20, 20, 33, 33, 20, 95, 20, 46, 108, 108, 108, 46, 7, 121, 28, 28, 28, 28, 28, 41, 15, 90, 15, 41, 15, 15, 103, 103, 23, 116, 116, 116, 23, 23, 15, 15, 23, 36, 23, 85, 36, 36, 36, 54, 10, 98, 23, 23, 111, 111, 111, 67, 10, 49, 10, 124, 31, 31, 31, 80, 18, 31, 31, 31, 18, 18, 93, 93, 18, 44, 18, 44, 106, 106, 106, 44, 13, 119, 119, 119, 26, 26, 26, 119, 26, 18, 26, 39, 26, 26, 88, 88, 13, 39, 39, 39, 13, 13, 101, 101, 114, 26, 114, 52, 114, 114, 70, 70, 21, 52, 13, 13, 34, 34, 34, 127, 21, 83, 21, 127, 34, 34, 34, 52, 21, 21, 96, 96, 21, 21, 47, 47, 109, 47, 109, 65, 109, 109, 47, 47, 8, 122, 122, 122, 29, 29, 29, 78, 29, 122, 29, 21, 29, 29, 42, 42, 16, 29, 91, 91, 16, 16, 42, 42, 16, 42, 16, 60, 104, 104, 104, 42, 24, 29, 117, 117, 117, 117, 117, 55, 24, 73, 24, 117]