Documente Academic
Documente Profesional
Documente Cultură
20
Algoritmul extins al lui Euclid
Aritmetic modular
Ridicarea la putere
Rezumat
Implementri sugerate
Probleme propuse
Soluiile problemelor
n cadrul acestui capitol vom prezenta cteva detalii referitoare la teoria numerelor.
Pentru nceput vom prezenta cunoscutul algoritm al lui Euclid, n varianta sa extins.
n continuare, vom descrie modul n care se realizeaz operaiile modulo, iar n fi-
nal vom arta modul n care poate fi efectuat eficient operaia de ridicare la putere.
Algoritm Euclid(m,n):
{ m, n numerele al cror cmmdc este cutat }
repet
r rest[m/n]
m n
n r
ct timp r > 0
returneaz m
sfrit algoritm
Algoritm Euclid(m,n):
dac n = 0 atunci
returneaz m
altfel
returneaz Euclid(n,rest[m/n])
sfrit dac
sfrit algoritm
Algoritm EuclidExtins(m,n):
dac n = 0 atunci
returneaz (a,1,0)
altfel
(d',x',y') EuclidExtins(n,rest[m/n])
(d,x,y) (d',y',[m/n]y')
returneaz (d,x,y)
sfrit dac
sfrit algoritm
20.2.2. Proprieti
Pe baza modului de efectuare a operaiilor n aritmetica modular se observ foarte
uor c urmtoarele relaii sunt respectate ntotdeauna:
(a + b) (mod n) = ((a (mod n)) + ((b mod n)) (mod n)
(a b) (mod n) = ((a (mod n)) ((b mod n)) (mod n).
20.2.3. Inversul
n cazul n care valoarea n este un numr prim, pentru orice numr mai mic dect n
(dar mai mare dect 0), va exista un alt numr (cuprins tot ntre 1 i n 1), astfel nct
produsul celor dou numere s fie 1. Acest al doilea numr este numit inversul primu-
lui numr.
Proprietatea nu este respectat n cazul n care valoarea n nu este numr prim. De
exemplu, pentru n = 4, nu exist nici un invers al valorii k = 2.
Algoritm Ridicare_la_putere(x,n):
dac n = 0 atunci
returneaz 1
altfel
returneaz x Ridicare_la_putere(x,n-1)
sfrit dac
sfrit algoritm
Este foarte uor de observat c formula este corect i pe baza acesteia poate fi im-
plementat foarte uor urmtorul algoritm:
20. Teoria numerelor 277
Algoritm Ridicare_rapid_la_putere(x,n):
dac n = 0 atunci
returneaz 1
altfel
dac k este par atunci
returneaz Ridicare_rapid_la_putere(x,[n/2])
Ridicare_rapid_la_putere(x,[n/2])
altfel
returneaz Ridicare_rapid_la_putere(x,[n/2])
Ridicare_rapid_la_putere(x,[n/2])x
sfrit dac
sfrit dac
sfrit algoritm
Algoritm Ridicare_la_putere_modulo_n(x,k,n):
dac k = 0 atunci
returneaz 1
altfel
dac k este par atunci
returneaz rest[(Ridicare_la_putere(x,[k/2],n)
Ridicare_la_putere(x,[k/2],n)) / n]
altfel
returneaz rest[
(rest[(Ridicare_la_putere(x,[k/2],n)
Ridicare_la_putere(x,[k/2],n)) / n])
x / n
]
sfrit dac
sfrit dac
sfrit algoritm
Pentru o mai mare claritate, putem rescrie secvena corespunztoare unei puteri
impare astfel:
278 IV. Noiuni avansate
a Ridicare_la_putere_modulo_n (x,[k/2],n)
b rest[(aa)/n]
returneaz rest[(bx)/n]
Algoritm Ridicare_la_putere_modulo_n_eficient(x,k,n):
dac k = 0 atunci
returneaz 1
altfel
dac k este par atunci
a Ridicare_la_putere_modulo_n_eficient (x,[k/2],n)
returneaz rest[(aa)/n]
altfel
a Ridicare_la_putere_modulo_n_eficient (x,[k/2],n)
b rest[(aa)/n]
returneaz rest[(bx)/n]
sfrit dac
sfrit dac
sfrit algoritm
Agoritm Ridicare_la_putere_eficient(x,n):
dac n = 0 atunci
returneaz 1
altfel
dac n este par atunci
a Ridicare_la_putere_eficient(x,[n/2])
returneaz aa
altfel
a Ridicare_la_putere_eficient(x,[k/2],n)
returneaz aax
sfrit dac
sfrit dac
sfrit algoritm
20. Teoria numerelor 279
20.4. Rezumat
n cadrul acestui capitol am realizat o scurt introducere n teoria numerelor. Pentru
nceput am descris algoritmul extins al lui Euclid i am prezentat modul n care poate
fi implementat acesta.
n continuare am realizat o scurt prezentare a aritmeticii modulare i am descris
modul n care trebuie efectuate operaiile, precum i cteva proprieti utile.
n final am descris mai multe modaliti prin care se realizeaz rapid ridicarea la
putere, att pentru aritmetica modular, ct i pentru cea clasic.
20.6.1. Pluto
Descrierea problemei
Pluto are n fa M bileele roii i N bileele galbene. El dorete s formeze mai multe
grupuri de bileele, astfel nct toate grupurile s conin acelai numr de bileele,
toate bileelele dintr-un grup s aib aceeai culoare i numrul de bileele dintr-un
grup s fie ct mai mare posibil.
Dup ce a reuit s fac mpreala, Pluto a descoperit ntr-o ascunztoare o
mulime de alte bileele roii i galbene. Imediat a nceput s le mpart n grmezi de
M bileele roii sau N bileele galbene. Fiecare grmad conine bileele de aceeai
culoare.
Numrul total al grmezilor formate este foarte mare, aa c Pluto i imagineaz
c acum poate face orice. A observat acum grupurile de bileele pe care le-a construit
anterior i i-a venit o idee nstrunic. El dorete s aleag un numr X de grmezi cu
280 IV. Noiuni avansate
bileele roii i un numr Y de grmezi cu bileele galbene, astfel nct diferena dintre
numrul total de bileele roii i numrul total de bileele galbene s fie egal cu
numrul de bileele dintr-unul din grupurile construite la nceput. Nu s-a gndit dac
s aleag mai multe bileele roii sau mai multe bileele galbene. El dorete doar ca
diferena s fie egal cu numrul de bileele dintr-un grup, indiferent dac are mai
multe bileele galbene sau mai multe bileele roii.
Date de intrare
Fiierul de intrare PLUTO.IN conine o singur linie pe care se vor afla numerele M i
N, separate printr-un spaiu.
Date de ieire
Fiierul de ieire PLUTO.OUT va conine o singur linie pe care se vor afla trei numere
ntregi, separate prin cte un spaiu. Primul dintre ele reprezint numrul de bileele
din fiecare dintre grupurile construite iniial, al doilea reprezint numrul de grmezi
cu bileele roii, iar al treilea reprezint numrul de grmezi cu bileele galbene.
Restricii i precizri
1 M, N 1000000000;
exist posibilitatea ca Pluto s nu aleag nici o grmad galben sau nici o grma-
d roie.
Exemple
PLUTO.IN PLUTO.OUT
4 6 2 1 1
PLUTO.IN PLUTO.OUT
10 5 5 0 1
PLUTO.IN PLUTO.OUT
24 63 3 8 3
20.6.2. Hoii
Descrierea problemei
Regula ghildei hoilor este simpl. La nceputul sptmnii, fiecare ho i ascunde
toate proprietile. n timpul sptmnii, fiecare ho trebuie s predea ghildei toi gal-
benii pe care reuete s i obin n momentul n care are asupra sa N galbeni. Num-
20. Teoria numerelor 281
Date de intrare
Prima linie a fiierului de intrare HOTI.IN conine numrul K al hoilor i numrul N,
separate printr-un spaiu. Primul numr de pe fiecare dintre urmtoarele K linii repre-
zint numrul Ji al jafurilor efectuate de un ho n timpul sptmnii. Linia va mai con-
ine Ji numere, reprezentnd "valorile" jafurilor. Numerele de pe o linie vor fi separate
prin spaii.
Date de ieire
Fiierul de ieire HOTI.OUT va conine K linii; fiecare dintre acestea va conine un
numr ntreg, reprezentnd numrul de galbeni rmai n posesia unui ho la sfritul
sptmnii.
Restricii i precizri
1 N 1000000000;
1 K 1000;
0 Ji 1000;
valoarea unui jaf este un numr ntreg cuprins ntre 1 i 1000000000;
ordinea n care sunt prezentate sumele n fiierul de ieire trebuie s respecte ordi-
nea hoilor din fiierul de intrare.
Exemplu
HOTI.IN HOTI.OUT
3 50 10
4 1 2 3 4 0
5 10 20 30 40 50 44
3 874 9735 835
20.6.3. Virui
Descrierea problemei
Un virus se afl ntr-un lan format din K celule. Dup un timp acesta se nmulete
dnd natere la ali N virui. Acetia vor ocupa urmtoarele celule din lan. n
momentul n care toate celulele vor conine un virus, ei vor "locui" cte doi n celul,
apoi cte trei i aa mai departe. n orice moment numrul viruilor din oricare dou
celule va diferi prin cel mult 1.
Aadar, la a doua generaie vom avea N + 1 virui. Dup un timp, fiecare va da
natere la ali N virui care vor ocupa celulele n acelai mod. Dup a doua generaie
vom avea (N + 1)2 = N2 + 2 N + 1 virui.
Va trebui s determinai numrul celulelor aglomerate dup cea de-a G-a generaie.
O celul este aglomerat dac exist cel puin o alt celul care conine mai puini
virui (datorit regulii de ocupare a celulelor, o astfel de celul va conin cu exact un
virus mai puin)
Date de intrare
Prima linie a fiierului de intrare VIRUSI.IN conine trei numere naturale, separate
prin cte un spaiu, reprezentnd numrul N al viruilor care apar dup nmulirea unui
virus, numrul K al celulelor i numrul G al generaiilor.
Date de ieire
Fiierul de ieire VIRUSI.OUT va conine o singur linie pe care se va afla numrul
celulelor aglomerate dup cea de-a G-a generaie.
Restricii i precizri
1 N 10000;
1 K 1000000000;
1 G 2000000000.
Exemple
VIRUSI.IN VIRUSI.OUT
1 2 3 0
VIRUSI.IN VIRUSI.OUT
3 3 3 1
VIRUSI.IN VIRUSI.OUT
534 65 2 30
20.7.1. Pluto
Problema se reduce la a determina cel mai mare divizor comun a dou numere M i N
i apoi a determina o pereche de numere X i Y, astfel nct |M X N Y| =
cmmdc(M, N). Aadar, va trebui doar s aplicm algoritmul extins al lui Euclid i s
afim valorile absolute ale numerelor returnate de acest algoritm.
20.7.2. Hoii
Problema se reduce la efectuarea unor nsumri modulo N. Folosind adunrile modula-
re vom determina foarte simplu numrul de galbeni rmai n posesia fiecruia dintre
hoi.
20.7.3. Virui
Se observ foarte uor c, dup cea de-a G-a generaie, numrul total al viruilor este
(N + 1)G. Aadar, problema se reduce la determinarea valorii (N + 1)G modulo K. Pen-
tru aceasta vom folosi un algoritm de ridicare la putere n aritmetica modular.