You are on page 1of 14

Teoria dos Nmeros I

por Daniel K. O. O algoritmo de Euclides para calcular o mximo divisor comum (gcd) a ferramenta mais importante dessa rea, pois permite encontrar propriedades no intuitivas. Este e-mail s focado nisso. ! uma "oa idia verificar no papel as deriva#$es, e implementar o algoritmo de fato. Propriedades bsicas da divisibilidade: %rimeiro, assumimos &ue x ' ( (x divide () se o resultado da diviso ()x inteiro. *sso + significa &ue &ual&uer n,mero divide o -ero. E o . divide &ual&uer n,mero, mas no divis/vel por nen0um alm dele mesmo. 1e 2 ' a e 2 ' ", ento 2 ' (ax 3 "() %rova4 como 2 ' a, podemos reescrever a como um m,ltiplo de 25 o mesmo vale para "4
a = pk b = qk

6ssim, reescrevendo4
Se k | pk e k | qk, ento k | (pkx + qky),

! fcil ver &ue p2x 3 &2( m,ltiplo de 25 "asta fatorar 24


pkx + qky = k(px + qy)

Ento, 2 ' 2(px 3 &(), &ue o mesmo &ue 2 ' (ax 3 "() 6pesar de gcd ser normalmente uma fun#o "inria, ela associativa4
gcd(a,b,c) = gcd(a, bcd(b,c))

E tam"m comutativa4
gcd(a,b) = gcd(b,a)

%ela divisi"ilidade do -ero4


gcd(a, 0) = a

7amos assumir &ue gcd(0,0) = 0, mas isso no fa- muito sentido tam"m. 8en0um divisor pode ser maior &ue o n,mero &ue ele divide (com exce#o do -ero), ento4 gcd(a, b) <= a,b, se a e " no forem nulos *sso implica tam"m em outra propriedade4 gcd(a, k*a) = a, para &ual&uer inteiro 2 8otem &ue isso vlido se 2 for diferente de -ero, e tam"m funciona &uando for -ero. Outra coisa importante para lem"rar4 a mod b = resto da diviso de a por "
a mod b = a - b (a div b)

div -9 diviso inteira Espero &ue isso se+a "em intuitivo para todos. E, o"viamente4 : ;< a mod " ; " = uma outra forma de definir o gcd, &ue est intimamente ligada ao algoritmo extendido de Euclides4 1e a e " forem &ual&uer inteiros, no am"os -ero, ento gcd(a,") o >E8O? inteiro positivo &ue com"ina#o linear de a e ". *sto 4 gcd(a,") < min( @ax3"(A ), para todos x e ( inteiros.

Bom isso, sa"emos &ue gcd(a,") uma com"ina#o linear de a e ". Ento &ual&uer n,mero &ue divide a e ", tam"m divide essa com"ina#o linear (gcd(a,")), conforme di- o teorema mais acima. *sto , se d ' a e d ' ", d ' gcd(a,"). Diretamente disso, vem &ue gcd(an, "n) < n gcd(a,"). 8,meros ortogonais4 dois n,meros so ortogonais se no possuem fatores primos em comum (. no primo). ! o mesmo &ue di-er gcd(a,") < .. %ara todos os inteiros positivos a, " e n, se n ' a", e gcd(a,n) < ., ento n ' ". *sto , n era capa- de dividir o produto de a", mas no a so-in0o5 logo, os fatores de a" &ue so divis/veis por n devem estar sendo contri"u/dos por ". 1e gcd(a,p)=1, e gcd(b,p)=1, gcd(ab,p) = 1. %rova4 sa"emos &ue existem inteiros x, (, xC e (C tal &ue4
ax + py = 1 bx + py = 1

%odemos multiplicar as e&ua#$es4


(ax + py)(bx + py ) = 1 + y ax + pyy ) = 1

?eorgani-ando e fatorando as e&ua#$es, temos4


ab(xx ) + p(ybx

Bom isso, desco"rimos &ue 0 uma com"ina#o linear de a" e de p &ue d .5 essa a menor poss/vel (positiva, lem"rem &ue o -ero no positivo), logo ela deve ser o gcd(a",p). Outro &ue "astante "vio4 se p um primo, e p ' a", ento p ' a ou p ' ", ou am"os. D gico, por p ser primo, p tem &ue estar contido completamente em a ou ". 1e p pudesse ser fatorado para ca"er uma parte em a e outra em ", deixaria de ser primo. TEOREMA FUNDAMENTAL DA ARITMTI A: Em inteiro positivo pode ser escrito de uma ,nica forma como produto de potFncias de primos. *sso um teorema e no axioma, pois 0 vrios sistemas numricos (&ue no incluem os inteiros, claro) tal &ue os n,meros possuem m,ltiplas fatora#$es primas. Al!ori"mo de E#clides: Ele parte do fato Gse 2 ' a e 2 ' ", ento 2 ' (ax 3 "()G mais acima. Hentamos transformar a e " em n,meros menores, &ue preservem os divisores comuns. Bomo estamos tra"al0ando com inteiros positivos, no podemos ir diminuindo os n,meros indefinidamente (isso no verdade se estivssemos usando n,meros reais, por exemplo). Dogo, por indu#o fcil ver &ue uma 0ora o algoritmo pra. Eis o algoritmo4
gcd(a,0) = a gcd(a,b) = gcd(a-b, b) !e a"b

8ovamente, todos os divisores de a e " tam"m dividem a-". Dogo, no estamos perdendo o maior divisor comum ao fa-ermos isso. Os parImetros esto sempre diminuindo, ento eventualmente um deles ser -ero. Esando um pouco de l gica, podemos otimi-ar4 vamos sempre su"trair, a-", at &ue o resultado se+a menor &ue ". Juantas ve-es podemos su"trair " de aK a div " ve-es. Ento a verso otimi-ada 4
gcd(a,b) = gcd(a - b (a div b), b)

isto , fa-emos todas as su"tra#$es de uma ve- s . >as essa exatamente a defini#o do operador mod (&ue mundo pe&ueno)5
gcd(a,b) = gcd(a mod b, b)

Lica mais fcil de programar isso se sempre garantirmos &ue " 9< a5 como a mod " sempre menor &ue ", podemos + trocar os parmetros4
gcd(a,b) = a !e b=0 gcd(a,b) = gcd(b, a mod b)

O pior caso de performance do algoritmo &uando usamos em dois n,meros consecutivos da se&MFncia de Li"onacci5 lem"rem &ue #(k+1) = #(k) + #(k-1)4 O"tendo o resto da diviso por L(2) dos dois lados4
#(k+1) mod #(k) = #(k-1) mod #(k) = #(k-1)

(pois L(2) maior &ue L(2-.))


gcd(#(k+1), #(k)) = gcd(#(k), #(k+1) mod #(k)) = gcd(#(k), #(k-1)

*sto , a cada c0amada recursiva, o algoritmo volta uma posi#o na se&MFncia. O milsimo elemento da se&MFncia de Li"onacci vai precisar de .::: recurs$es, at o"ter L(:)<:. Esse con0ecido como Heorema de Dam. Bomo L(n) exponencial, isso garante &ue o algoritmo de Euclides logar/tmico. Al!ori"mo E$TENDIDO de E#clides: >udamos a fun#o gcd(a,"), para retornar uma tripla de n,meros4 (d,x,(), tal &ue ax 3 "( < d. O clculo de d + sa"emos como fa-er5 mas como o"ter x e (K ! s usar indu#o4 sa"emos &ue o su"-pro"lema vai ser gcd(", a mod ")5 como o resultado disso pode nos a+udarK
(d, x , y ) = gcd(b, a mod b)

*sso nos d a e&ua#o4


bx + (a mod b)y = d

>as &ueremos o"ter x e ( para a e&ua#o4


ax + by = d

Esando a defini#o do operador mod4


bx + (a - b(a div b))y = d bx + ay - b(a div b)y = d b(x - (a div b)y ) + ay = d

E ala2a-amNN Encontramos os n,meros &ue precisam multiplicar a e "4 "asta fa-er


x = y y = (x - (a div b)y )

E pronto, a e&ua#o se torna


by + ax = d

Jue era exatamente o &ue &uer/amos5 o algoritmo extendido de Euclides (em nota#o &uasi%(t0on)4
de$ gcd(a,b)% i$ b == 0% &&& '()( && (d, x , y ) = gcd(b, a mod b) *et+*n (d, y , x - (a div b)*y )

Lalta s tratar o caso "<:5 nesse caso, d < a, e procuramos inteiros x e ( &ue satisfa#am4
ax + by = d ax + 0y = a

8otem &ue x precisa valer .5 mas ( pode valer JE6DJEE? coisa. 1e fi-ermos (<:, vamos o"ter uma solu#o5 se fi-ermos (<., podemos o"ter outra5 e assim por diante5 isso prova &ue a solu#o no ,nica, e todas esto certas. Hradicionalmente fa--se (<:5 podemos depois variar x e ( para encontrar as outras. Em c digo %(t0on ento fica4
de$ gcd(a,b)% i$ b==0% *et+*n (a, 1, 0) (d, xx, yy) = gcd(b, a , b) *et+*n (d, yy, xx - (a-b)*yy)

E como encontrar as outras solu#$es a partir da primeiraK 1upondo &ue vamos incrementar x em 2 unidades4
ax + by = d a(x+k) + by = d + ak a(x+k) + by - ak = d a(x+k) + b(y - ak-b) = d

*sto , ( precisa decrementar em a2)" unidades. Estamos interessados s em valores inteiros, ento 2 deve ser tal &ue a2)" se+a inteiro (do contrrio ( rece"eria um decremento fracionrio). =oras, &ueremos um m,ltiplo de a &ue "alanceie com um m,ltiplo de "4
ak = b. (com .=ak-b)

>as &ueremos o menor deles (para no pular nen0uma solu#o)5 logo, o menor m,ltiplo de a, &ue tam"m m,ltiplo de ", o &ue c0amamos de m/nimo m,ltiplo comum (lcm)4
ak = b. = /cm(a,b)

8este momento "om ver como calcular o lcm4


/cm(a,b) = ab - gcd(a,b)

(reparem &ue o lcm pode estourar a representa#o nativa de inteiros) 8ovamente, lcm associativo4
/cm(a,b,c) = /cm(a, /cm(b,c)) = /cm(/cm(a,b), c)

1eguindo o racioc/nio para ac0ar as outras solu#$es4


ak = b. = /cm(a,b) = ab - d

6ssim, o incremento 2 &ue aplicamos a x 4


k = ab-(ad) = b-d

&ue contra"alanceado com o decremento + de (4


. = ab-(bd) = a-d

6ssim, encontrando o x e o ( inicial (independente de como implementamos o gcd no caso "ase), "asta iterativamente incrementar x em ")d unidades, e decrementar ( em a)d unidades, &ue percorreremos todas as solu#$es. O algoritmo de Euclides pode ser implementado de forma "inria4 &ual&uer opera#o &ue redu-a os argumentos sem afetar os divisores aceitvel5 o algoritmo "inrio usa O fatos4

%& 1e a e " so pares, gcd(a,") < P gcd(a)P, ")P) '& 1e a /mpar e " par, gcd(a,") < gcd(a, ")P) (isto , P no era divisor comum, podemos descart-lo) (& 1e a e " so am"os /mpares, gcd(a,") < gcd( (a-"))P, ") (novamente, P no divisor comum de a e ", mas (a-") par... na verdade este fato apenas um atal0o, usando o algoritmo original e o PQ fato) 6ssim podemos implementar o gcd usando apenas teste de paridade, s0ift-rig0t e su"tra#o. Em cada situa#o poss/vel pelo menos um dos argumentos perde um "it. 1e cair um pro"lema cu+a entrada n,meros "inrios grandes e o o"+etivo o"ter o gcd, muito mais eficiente usar o algoritmo "inrio.

Teoria dos Nmeros II


por Daniel K. O. %rimeiro, lem"rando4 se d ' a, e d ' ", ento d ' gcd(a,"). *sto , o gcd m,ltiplo de todos os divisores comuns de a e ". 6 rela#o G'G transitiva (como &ual&uer um &ue fe- categorias sa"e)4 se a ' " e " ' c, a ' c. 1e p primo, e : ; 2 ; p, ento gcd(2, p) < .5 naturalmente, um n,mero primo no pode ter divisor comum com &ual&uer n,mero menor &ue ele. 1e p primo, e : ; 2 ; p, ento p ' "inom(p, 2) (coeficiente "inomial de p e 2). *sso vem direto da f rmula do coeficiente "inomial4
binom(p,k) = p(p-1)(p-0)&&&(p-k+1) - k1

Blaramente, isso m,ltiplo de p5 como o coeficiente "inomial sempre inteiro, 2N divide o produto de cima5 mas p primo, no pode ser Gparcialmente divididoG, s pode ser dividido pelo pr prio p5 2 menor &ue p, ento p um termo &ue fica so"rando no coeficiente5 e por isso, o resultado divis/vel por p. *sso implica diretamente em outra propriedade, esta sim importante5 para a," inteiros, e p primo4
(a + b)2p = a2p + b2p (mod p)

Dem"rem &ue o lado es&uerdo pode ser expandido pelo teorema "inomial5 o resultado um somat rio de coeficientes "inomiais4
(a+b)2p = !omat3*io de k=0 at4 p de binom(a2k y2(p-k))

>as o teorema anterior di- &ue sempre &ue 2 for menor &ue p (mas maior &ue -ero), "inom(p,2) divis/vel por p. Ento, aplicando o operador modular nos dois lados, m dulo p, todos os termos do somat rio se anulam, menos o primeiro e o ,ltimo5 o resultado +ustamente a proposi#o inicial. Bom a, ", x inteiros, se a ' ", temos4
(x mod b) mod a = x mod a

*sto , no preciso aplicar primeiro o mod ", e depois o mod a, pois " m,ltiplo de a. Disso, dedu-imos &ue4
x = y (mod b) imp/ica em x = y (mod a)

Em outras palavras, ao rece"ermos uma rela#o de e&uivalFncia x<( (mod "), podemos encontrar todos os divisores de ", e escrever x<( (mod a) para B6D6 divisor a de ". *sto , 1E>%?E podemos dividir o " sem preocupa#o, pois isso no afeta a e&uivalFncia. *sso *>%O?H68HE4 muitos pro"lemas assumem (mod ") para " primo5 se " no primo, podemos produ-ir novas e&ua#$es, uma para cada fator primo de ".

6 mero t/tulo de curiosidade, eis uma implementa#o iterativa do algoritmo de Euclides em %(t0on4
de$ gcd(a,b)% xo/d = 1 yo/d = 0 x = 0 y = 1 56i/e (a , b) q = a-b (a,b) = (b, (x, xo/d) = (y, yo/d) = *et+*n (b, x,

1= 0% a - q*b) (xo/d - q*x, x) (yo/d - q*y, y) y)

! educativo tentar codificar isso em B33. E agora mais uma propriedade do gdc4 n., nP, nO e nR so ortogonais, dois a dois (isto , nen0um par de n,meros compartil0a divisores em comum, tam"m c0amados de co-primos) 1E E 1O>E8HE 1E
gcd(n1 * n0, n7 * n8) = gcd(n1 * n7, n0 * n8) = 1

8otem &ue isso "em mais rpido &ue fatorar cada um dos R n,meros e comparar as potFncias. Em coordenadas Bartesianas, gcd(a,") o n,mero de coordenadas *8HE*?61 na lin0a &ue vai da origem at o ponto (a,") (excluindo a pr pria origem). *sso est intimamente ligado ao teorema de %ic2, da geometria. 1e a e " forem coprimos, gcd(a,"), indicando &ue o ,nico ponto com coordenadas inteiras o extremo da lin0a (o ponto (a,")). lcm e gcd so distri"utivos um so"re o outro4
gcd(a, /cm(b, c)) = /cm(gcd(a, b), gcd(a, c)) /cm(a, gcd(b, c)) = gcd(/cm(a, b), /cm(a, c))

E)#a*+es li,eares mod#lares: Jueremos as solu#$es da e&ua#o4 ax = n (mod b) com a, b " 0 Em dos usos desse pro"lema a criptografia ?16. Esta e&ua#o tem solu#o 1E E 1O>E8HE 1E gcd(a,") ' n. 8o dif/cil ver o por&uF4 gcd(a,") nos d uma e&ua#o4
ax + by = d

1e aplicarmos o operador modular (mod ") dos dois lados da igualdade, temos4
(ax + by) mod b = d mod b (ax mod b) + (by mod b) = d mod b ax mod b = d mod b ax = d (mod b)

*sto , o"temos um valor de x (no o correto) &ue produ- d5 para produ-ir n, precisamos multiplicar am"os os lados da igualdade por um inteiro5 mas de nada adianta se d no for divisor de n5 nunca vamos conseguir um x correto. 1e d ' n, temos4
ax = d (mod b) ax n-d = d n-d (mod b) axn-d = n (mod b)

*sto , fa-emos x
ax

= x*n-d, e escrevemos4 = n (mod b)

&ue era o pro"lema inicial5 encontramos a solu#o. E no apenas uma, encontramos uma fam/lia de solu#$es. Bada x (produ-ido pelo gcd, ve+am no artigo anterior como o"ter todos) produ- um xC diferente, &ue tam"m solu#o da e&ua#o linear. %ara &uem tem pregui#a de ir ol0ar e dedu-ir a resposta, o con+unto solu#o 4 9x 0 + k b-d:, para todo k inteiro, onde x 0 alguma solu#o &ual&uer de ax=n (mod b) = exatamente d solu#$es distintas m dulo " (isto , 2 s precisa variar de : a d-.)5 o operador modular distri"utivo, ento
ax = n (mod b)

o mesmo &ue4
ax mod b = n mod b (a mod b)(x mod b) mod b = n mod b

6plicando a fam/lia de solu#$es4


(a mod b)(x0 + kb-d mod b) = n mod b

! fcil ver &ue sempre &ue 2 m,ltiplo de d, 2")d cancela o denominador, e resulta em um n,mero m,ltiplo de " (&ue com o operador mod ", vira -ero). Exemplo4 7x = 0 (mod ;)
a n b d = = = = 7 0 ; gcd(a,b) = gcd(7,;) = 7

Bomo d no divide n (O e P so co-primos) no 0 solu#o. Exemplo4 <x = 8 (mod 70)


a = < n = 8 b = 70 d = gcd(a,b) = gcd(<,70) = 0 Bomo d | n (0 | 8), o gcd nos d x=84 ax = d (mod b) <*8 = 0 (mod 70) >ultiplicando os dois lados por por n-d = 8-0 = 0, < * 8*0 = 0*0 (mod 70) < * < = 8 (mod 70)

temos4

Ento x < S resolve a e&ua#o original. E sempre &ue somarmos um m,ltiplo de ")d (O:)P<.T, neste caso) em x, temos outra solu#o e&uivalente4
<*(< + 1=) = 8 (mod 70) <*(< + 70) = 8 (mod 70) <*(< + 8=) = 8 (mod 70)

... Bomo d<P, s 0 P solu#$es so distintas4


x = < x = <+1=

Ema conse&MFncia direta do ,ltimo teorema &ue se gcd(a,b)=1, a e&ua#o ax=n (mod b) 1E>%?E tem solu#o (pois . divide &ual&uer n,mero).

Juando n = 1, temos ax=1 (mod b), c0amamos x de Ginverso multiplicativo de a, m dulo "G. Ento, a possui inverso multiplicativo m dulo b 1E E 1O>E8HE 1E gcd(a,b) dividir 15 como o ,nico n,mero &ue divide . o pr prio ., a possui inverso multiplicativo m dulo "e 11E gcd(a,b)=1. 1ugesto4 implementem uma rotina &ue rece"e a, n, e ", e produ- uma lista com todas as solu#$es distintas de ax < n (mod "). 1e gcd(a,b)=1, e
ax = ay (mod b)

Ento4
x = y (mod b)

%rova4 a premissa garante &ue a possui inverso5 se+a aC o inverso de a (i.e. aa Ento, multiplicamos am"os os lados por aC4
ax = ay (mod b) aa x = aa y (mod b) 1 x = 1 y (mod b)

= 1 (mod b)).

= um "ocado de pro"lemas &ue podem ser resolvidos apenas aplicando o inverso dos dois lados (&uando ele existir), pois tudo fica mais fcil &uando multiplicamos por .. 1e gcd(a,") 9 ., no podemos afirmar nada so"re x e (, pois no podemos aplicar o tru&ue do inverso multiplicativo.

Teoria dos Nmeros III


por Daniel K. O. 8a ,ltima parte vimos como uma e&ua#o4
ax + by = n

pode ser resolvida pelo algoritmo de euclides, e ela pode ser transformada em
ax = n (mod b)

Em caso "em particular desta e&ua#o &uando a<.4


x = n (mod b)

B0amamos isto de congruFncia linear. Teorema -i,.s do Res"o 1e considerarmos um sistema de vrias congruFncias, temos o c0amado Heorema B0inFs do ?esto. *sto 4
x = x = x = x = &&& x = n1 n0 n7 n8 (mod (mod (mod (mod b1) b0) b7) b8)

nk (mod bk)

O teorema trata da seguinte condi#o4 se "., "P, "O, ... "2 forem relativamente primos (coprimos, ortogonais), ento o pro"lema possui solu#o. Ema forma de escrever o pro"lema usando um sistema numrico de res/duos4
x = (n1, n0, n7, &&&, nk)

*sto , cada n,mero corresponde a uma 2-upla de res/duos, &ue so os restos da diviso de x por cada um dos "s ("., "P, ..., "2). Este sistema numrico permite &ue fa#amos opera#$es aritmticas independente em cada res/duo. Ex4 considere m dulos O e T4
> = (> mod 7, > mod =) = (1, 0) 0 = (0, 0) ? = (? mod 7, ? mod =) = (0, 8) 18 = (18 mod 7, 18 mod =) = (0, 8) > + 0 = (1, 0) + (0, 0) = (7 mod 7, 8 mod =) = (0, 8) = ? > * 0 = (1, 0) * (0, 0) = (1*0, 0*0) = (0, 8) = 18

8otem &ue essa uma forma extremamente eficiente de operar n,meros grandes5 at mesmo o produto tem custo linear. 1e B = b1 * b2 * b3 * ... * bk (lem"rando &ue so todos coprimos), todos os valores entre 0 e B-1 so representados de forma ,nica neste sistema de res/duos. B m,ltiplo de todos os m dulos, ento vai ter valor (0, 0, 0, ...), e repete de novo todos os valores. Ou se+a, se &uisermos representar n,meros maiores "asta acrescentar mais um n,mero &ue se+a coprimo aos anteriores5 este n,mero aumenta o valor de B, o &ue aumenta a faixa de valores representvel. Bonverter um n,mero para o sistema de res/duos "em simples5 "asta calcular k restos de diviso. >as como o"ter de volta o valor, ap s termos reali-ado opera#$es no sistema de res/duosK *sto 4 &ual o x &ue corresponde aos res/duos n1, n2, ..., nkK
x = (n1, n0, n7, &&&, nk)

Este exatamente caso do Heorema B0inFs do ?esto. Lica clara a restri#o de &ue os m dulos "i precisam ser coprimos5 caso contrrio, algumas com"ina#$es de valores no vo existir no sistema numrico, e no vai 0aver solu#o. %or exemplo, com os m dulos P e R, no 0 solu#o para
x = (0, 1)

&ue o mesmo &ue4


x = 0 (mod 0) x = 1 (mod 8)

8otem &ue a primeira e&ua#o contradi- a segunda5 um n,mero com resto . da diviso por R no pode ser par (como di- a primeira e&ua#o). %rimeiro vamos ver como tratar o caso original do teorema (todos os m dulos so coprimos)5 garantido &ue 0 EU6H6>E8HE E>6 solu#o entre : e V-., pois as e&ua#$es correspondem exatamente ao sistema numrico de res/duos. %rimeiro definimos Pi = B / bi (*sso lem"ra "astante a f rmula de interpola#o de Dagrange, e 0 um "om motivo para isso5 o mtodo de Dagrange exatamente o Heorema B0inFs do ?esto extendido para os polinWmios). *sto , Pi o produto de todos os m dulos, menos o i-simo. Pi ento coprimo a bi (pois todos os seus fatores so coprimos a bi). 7amos usar um coeficiente ci, &ue corresponde a cada m dulo bi4
ci = @i (@i mod bi)

(%iC o inverso multiplicativo de %i mod "i) *sto , ci o produto de Pi pelo seu inverso (mod bi), mas 1E> aplicar o m dulo. 1empre 0aver o inverso de Pi mod bi, pois am"os so coprimos. 7imos no e-mail anterior &ue ac0ar o inverso trivial4 o inverso de a mod b a solu#o x de4
ax = 1 (mod b)

&ue e&uivale a encontrar o gcd de a e b (e usar o x retornado). 8ovamente, reparem &ue Pi 8XO m,ltiplo de bi5 e ci, &ue m,ltiplo de Pi, tam"m 8XO m,ltiplo de bi. Hudo &ue fi-emos foi encontrar um n,mero especial &ue 8XO se+a m,ltiplo de bi, para cada bi. Bom os coeficientes ci, podemos calcular um valor para x4
x = (c1*n1 + c0*n0 + c7*n7 + &&& + ck*nk)

! fcil ver &ue este valor satisfa- todas as outras e&ua#$es4 se aplicarmos mod b1 dos dois lados, temos4
x mod b1 = (c1 * n1 + c0*n0 + &&& + ck*nk) mod b1 x = c1 * n (mod b1)

>as c2 m,ltiplo de b1 (lem"rem, o ,nico n,mero &ue no m,ltiplo de b1 c1). Hodos os termos da soma se anulam, menos o c1*n1. *sso vai acontecer sempre, ento aplicando todos os m dulos originais, reconstru/mos o sistema de e&ua#$es. 6 nossa f rmula para x satisfa- todas as e&ua#$es iniciais. O valor de x encontrado pode ser maior &ue B5 de fato, &ual&uer x = x0 + nB solu#o5 a menor solu#o vale x mod B.

Eis um c digo em %(t0on &ue resolve o sistema de congruFncias lineares4 (ele usa a fun#o gcd, &ue no aparece a&ui)
de$ inve*!o(a, b)% *et+*n gcd(a,b)A1B C *eto*na apena! o x de$ p*od(x)% p = 1 $o* i in x% p *= i *et+*n p de$ c*t(n, b)% k = /en(n) D = p*od(b) C m+/tip/ica todo! o! b @ = A0B*k C a**ay de taman6o k $o* i in *ange(k)% C ca/c+/a cada @i @AiB = D - bAiB c = A0B*k C a**ay de taman6o k $o* i in *ange(k)% C ca/c+/a cada ci cAiB = @AiB * inve*!o(@AiB, bAiB) C ca/c+/a o x x = 0 $o* i in *ange(k)% x += cAiB * nAiB C *eto*na a meno* da! !o/+EFe! *et+*n x , D

Vasta agora c0amar crt() passando como argumentos duas listas, uma para os valores de n, e outra para os m dulos ". 6/ temos a &uesto4 e se os m dulos "i no forem coprimos, o &ue aconteceK 6 deriva#o da solu#o sempre assumiu &ue fossem coprimos. O fato 4 o algoritmo simplesmente no funciona caso essa condi#o se+a &ue"rada. *sto , o valor de x retornado precisa ser testado contra todas as e&ua#$es iniciais5 caso alguma se+a invlida, sinal &ue os m dulos no so coprimos. >esmo &ue exista uma solu#o, este mtodo no encontra. Hestem por exemplo4 crt(Y:,PZ, YP,RZ), &ue corresponde a4
x = 1 (mod 0) x = 1 (mod 8)

6 solu#o x<., mas a resposta dada x<P. O &ue fa-erK %recisamos decompor os m dulos " at isolarmos os fatores primos5 temos as seguintes propriedades da aritmtica modular4 1e a < " (mod 2d), ento a < " (mod d)5 isto , sempre podemos dividir o m dulo (mas perdemos informa#$es da e&ua#o original &uando fa-emos isso). 6/ temos outra, mais importante4
a = b (mod m) e a = b (mod n)

se e somente se
a = b (mod /cm(m,n))

! fcil entender por&ue isso vlido. 1e reescrevermos as duas primeiras e&ua#$es4


a - b = 0 (mod m) a - b = 0 (mod n)

6ca"amos de di-er &ue a-" m,ltiplo de m e de n. Bertamente mn m,ltiplo do m/nimo m,ltiplo comum de m e n (lcm(m,n))5 ou se+a4
a a a a = b b b b = 0 (mod mn) = 0 (mod mn - gcd(m,n)) = 0 (mod /cm(m,n)) (mod /cm(m,n))

8o caso particular em &ue m e n so coprimos, gcd(m,n) < ., e lcm(m,n) < mn. Explicitamente4
a = b (mod mn)

se e somente se
a = b (mod m) e a = b (mod n) !e m e n $o*em cop*imo!&

Ou se+a, sempre podemos &ue"rar uma congruFncia


x = n (mod b)

em diversas congruFncias, uma para cada fator primo de "4


x = n (mod p) x = n (mod q) x = n (mod *) &&&

E pela propriedade anterior, um m dulo maior possui sempre mais informa#o. %or exemplo4
x = 71 (mod 8=) x = 8; (mod >=)

Latorando o RT, temos4


8= = 720 * =

%odemos su"stituir a primeira e&ua#o por4


x = 71 (mod 720) x = 71 (mod =)

O mesmo fa-emos com a segunda e&ua#o4


>= = 7 * =20 x = 8; (mod 7) x = 8; (mod =20)

6s duas e&ua#$es, (mod O) e (mod O[P) podem ser transformadas em uma s 5 a menos &ue 0a+a contradi#o (podemos testar isso dividindo o O[P at &ue ele se iguale ao O), a e&ua#ao com m dulo menor redundante. 8o s redundante, ela impede &ue o algoritmo crt() funcione direito. Ento, ap s o teste de consistFncia, podemos descart-la. La-emos o teste4
x = 71 (mod 720) = 71 (mod ?) x = 8 (mod ?)

(dividimos o m dulo por O)4


x = 8 (mod 7) = 1 (mod 7)

*sso consistente com


x = 8; (mod 7) = 1 (mod 7)

Descartamos ento x < O. (mod O), e ficamos apenas com x < O. (mod \). O mesmo com as outras duas e&ua#$es em potFncias de T4
x = 8; (mod =20) = 8; (mod 0=) x = 01 (mod 0=)

(dividimos por T para comparar ] outra e&ua#o)


x = 01 (mod =) = 1 (mod =)

E testamos a consistFncia4
x = 71 (mod =) = 1 (mod =)

Hudo certo, ficamos apenas com x < R^ (mod PT) Ento o pro"lema original4
x = 71 (mod 8=) x = 8; (mod >=)

se transforma em
x = 71 (mod ?) x = 8; (mod 0=)

E a solu#o dada por crt(YO.,R^Z, Y\,PTZ) a correta4 x<.P.. 6gora s implementar esse pr-processamento - &ue vai alm do meu p(t0on-fu, ento fico devendo. De &ual&uer forma 0 vrios detal0es de implementa#o, "om fa-er direto em B33 para &uando precisar.

You might also like