Sunteți pe pagina 1din 11

Teoria numerelor Capitolul

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.

20.1. Algoritmul extins al lui Euclid


Algoritmul lui Euclid este, cu siguran, unul dintre cei mai cunoscui i mai des utili-
zai algoritmi. El poate fi utilizat pentru a determina cel mai mare divizor comun a do-
u numere naturale.

20.1.1. Algoritmul lui Euclid


Paii algoritmului sunt foarte simpli; unul dintre numere este considerat a fi dempri-
tul, iar cellalt mpritorul. La fiecare pas, se va calcula restul mpririi ntregi a de-
mpritului la mpritor. n cazul n care acesta este 0, se consider c mpritorul
este cel mai mare divizor comun al numerelor. n caz contrar, mpritorul devine de-
mprit, restul devine mpritor i se trece la pasul urmtor.
Pn la urm restul va deveni 0 (deoarece scade la fiecare pas), deci dup un numr
finit de pai vom determina cel mai mare divizor comun.

20.1.2. Implementarea iterativ


Algoritmul poate fi implementat folosind o simpl structur repetitiv, corpul su con-
innd operaiile care trebuie efectuate la fiecare pas.
274 IV. Noiuni avansate

Versiunea iterativ a algoritmului este prezentat n continuare:

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

20.1.3. Implementarea recursiv


O a doua variant de implementare a algoritmului lui Euclid este utilizarea unei funcii
recursive. Aceast variant este prezentat n cele ce urmeaz:

Algoritm Euclid(m,n):
dac n = 0 atunci
returneaz m
altfel
returneaz Euclid(n,rest[m/n])
sfrit dac
sfrit algoritm

Practic, n aceast variant, nlocuirea dempritului cu mpritorul se realizeaz


prin autoapelul recursiv.

20.1.4. Algoritmul extins


Forma extins a algoritmului lui Euclid este utilizat pentru a determina, pe lng cel
mai mare divizor comun, anumite informaii care se pot dovedi utile.
Mai exact, acest algoritm poate fi folosit pentru a identifica dou valori x i y astfel
nct s avem d = m x + n y, unde d este cel mai mare divizor comun al numerelor m
i n.
Dup cum vei vedea n momentul n care vom prezenta algoritmul, acesta nu este
mai lent dect cel clasic. Aadar, aceste informaii suplimentare se determin, practic,
fr a consuma timp suplimentar.

20.1.5. Implementarea algoritmului extins


Dup cum se poate vedea, algoritmul extins al lui Euclid va returna trei valori i anu-
me d, x i y, pe baza a doi parametri m i n.
Modul de calcul al acestor valori este urmtorul:
20. Teoria numerelor 275

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. Aritmetic modular


n cadrul acestei seciuni vom introduce aritmetica modular. Aceasta este foarte ase-
mntoare cu aritmetica numerelor naturale, singura diferen fiind faptul c rezultate-
le tuturor operaiilor trebuie s fie numere cuprinse ntre 0 i o valoare dat.
Practic, se efectueaz operaiile obinuite i rezultatele sunt nlocuite cu restul m-
pririi lor la un numr n. Aritmetica modular mai poart i denumirea de aritmetic
modulo n.

20.2.1. Adunare, scdere i nmulire


Avnd n vedere cele amintite anterior, este foarte uor s observm c, n aritmetica
modular, calculele se efectueaz pe baza urmtoarelor formule:
a + b (mod n) = rest[(a + b) / n]
a b (mod n) = rest[(a b) / n].
De asemenea, se observ foarte uor c, n aritmetica modular, scderea unei va-
lori k este echivalent cu adunarea valorii n k. Aceasta se datoreaz faptului c
avem:
(n k) + k (mod n) = rest[(n - k + k) / n] = rest[n / n] = 0.

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).

Cu alte cuvinte, se poate spune c restul mpririi la o valoare n a sumei a dou


numere naturale este egal cu restul mpririi la n a sumei resturilor mpririi la n ale
celor dou numere.
Similar, restul mpririi la o valoare n a produsului a dou numere naturale este
egal cu restul mpririi la n a produsului resturilor mpririi la n ale celor dou nume-
re.
276 IV. Noiuni avansate

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.

20.3. Ridicarea la putere


Exist multe variante prin care se pot efectua operaiile de ridicare la putere. n cadrul
acestei seciuni vom prezenta abordarea clasic, ineficient, precum i o metod mult
mai rapid care permite realizarea acestei operaii.

20.3.1. nmuliri succesive


Practic, pentru a ridica un numr x la puterea n, va trebui s efectum un numr de n
1 nmuliri. De exemplu, am putea utiliza formula recursiv xn = xn-1 x.
Un algoritm simplu care utilizeaz aceast formul este:

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

Evident, exist i variante iterative dar, toate acestea au ordinul de complexitate


O(n).

20.3.2. Algoritmul rapid


O variant mult mai rapid de determinare a puterii unui numr se bazeaz tot pe o
formul recursiv i anume:
1 n=0
n [n / 2 ] [ n / 2 ]
x = x x n par
x x [n / 2] x [n / 2] n impar

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

20.3.3. Ridicare la putere n aritmetica modular


Este foarte uor s adaptm algoritmul prezentat anterior pentru a determina restul m-
pririi ntregi a unei valori de forma xk la o valoare n.
Tot ce trebuie s facem este s calculm un rest la final. Totui, dac utilizm pro-
prietatea potrivit creia pentru nmulirea modular avem:
(a b) (mod n) = ((a (mod n)) ((b mod n)) (mod n),
nu vom ajunge niciodat s lucrm cu numere foarte mari. Aadar, o simpl transfor-
mare a algoritmului poate duce la eliminarea operaiilor costisitoare cu numere mari.
Prezentm acum o variant a algoritmului de ridicare la putere n aritmetica modu-
lar:

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]

Un avantaj principal al acestei abordri const n faptul c nu se mai realizeaz do-


u autoapeluri recursive care furnizeaz aceeai valoare. Aadar, un algoritm eficient
poate fi scris astfel:

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

Evident, vom putea rescrie i algoritmul pentru aritmetica clasic astfel:

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.5. Implementri sugerate


Pentru a v nsui noiunile prezentate n cadrul acestui capitol v sugerm s realizai
implementri pentru:
1. algoritmul extins al lui Euclid;
2. determinarea restului mpririi ntregi la o valoare n a sumei elementelor unui ir
de numere;
3. determinarea restului mpririi ntregi la o valoare n a produsului elementelor unui
ir de numere;
4. efectuarea de operaii de ridicare la putere prin diverse metode; de asemenea, este
indicat s comparai timpii de execuie ai algoritmilor.

20.6. Probleme propuse


n continuare vom prezenta enunurile ctorva probleme pe care vi le propunem spre
rezolvare. Toate aceste probleme pot fi rezolvate folosind informaiile prezentate n
cadrul acestui capitol. Cunotinele suplimentare necesare sunt minime.

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

Timp de execuie: 1 secund/test

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

rul de galbeni pe care i deine la sfritul sptmnii vor rmne n proprietatea sa i i


va ascunde pentru a ncepe o nou sptmn de la 0.
Din ghild fac parte K hoi i, pentru fiecare dintre acetia se cunoate numrul ja-
furilor pe care le-a efectuat, precum i valoarea fiecrui jaf.
n nici un moment un ho nu poate avea asupra sa dect cel mult N 1 galbeni (de-
ct imediat dup un jaf) deoarece imediat ce are mai mult de N galbeni, trebuie s i
predea ghildei. Mai mult, dac dup ce pred N galbeni, numrul de galbeni va fi din
nou mai mare sau egal cu N, el va preda din nou N galbeni i "depunerile" vor conti-
nua pn n momentul n care houl va avea mai puin de N galbeni.
Va trebui s determinai, pentru fiecare ho n parte, numrul de galbeni pe care
acesta i va avea asupra sa la sfritul sptmnii.

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

Timp de execuie: 1 secund/test


282 IV. Noiuni avansate

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

Timp de execuie: 1 secund/test


20. Teoria numerelor 283

20.7. Soluiile problemelor


Vom prezenta acum soluiile problemelor propuse n cadrul seciunii precedente. Pen-
tru fiecare dintre acestea va fi descris doar metoda de rezolvare. Datorit faptului c
toate problemele reprezint simple "transformri" ale elementelor teoretice prezentate
n cadrul acestui capitol nu vom mai efectua i o analiz a complexitii algoritmilor.

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.

S-ar putea să vă placă și