Sunteți pe pagina 1din 12

Divizibilitate i numere prime

Consideraii teoretice Probleme propuse Soluiile problemelor propuse

Capitolul

7.1. Consideraii teoretice


Un capitol deosebit de interesant n teoria numerelor este cel de divizibilitate. Un numr dat a este divizibil cu un alt numr dat b, dac restul mpririi ntregii a numrului a la numrul b este egal cu zero. n matematic exist criterii de divizibilitate care ne permit verificarea rapid a divizibilitii unui numr cu altul. De exemplu, un numr este divizibil cu 2 dac are ultima cifr par. Orice numr este divizibil cu 1 i cu el nsui. Aceti divizori se numesc divizori triviali (improprii). Dac un numr nu are ali divizori n afar de cei triviali, atunci spunem c numrul respectiv este numr prim (de exemplu 5, 13, 29). n programare, vom verifica divizibilitatea cu ajutorul operatorului mod:
... dac a mod b = 0 atunci b este divizor al lui a altfel b nu este divizor al lui a sfrit dac ...

i acum s rezolvm cteva probleme uoare legate de divizibilitate i stabilirea primalitii unui numr. Relativ la divizibilitatea numerelor ntregi, exist multe probleme interesante. Vom rezolva cteva dintre ele, care pun n eviden anumite proprieti interesante ale divizorilor, proprieti care sunt n acelai timp utile pentru rezolvarea eficient a problemelor de informatic.

7. Divizibilitate i numere prime

69

7.2. Probleme propuse


7.2.1. Divizori
Un numr este divizor al unui numr dat n, dac restul mpririi ntregi a numrului n la acel numr este egal cu 0. Determinai toi divizorii numrului dat. Date de intrare Se d un numr natural n. Date de ieire Se vor afia divizorii numrului pe o singur linie, separai prin cte-un spaiu. Restricii i precizri 2 n 10000; Datele de intrare sunt considerate corecte. Exemplu
Intrare n=20 Ieire 1 2 4 5 10 20

Explicaie
Numerele de la ieire mpart exact numrul n = 20.

7.2.2. Numere prime


Un numr n este prim, dac nu are ali divizori dect pe cei triviali (pe 1 i pe el nsui). Precizai dac un numr natural dat este sau nu numr prim. Date de intrare Se d un numr natural n. Date de ieire n funcie de proprietatea numrului se va afia textul 'Numarul este prim.' sau 'Numarul nu este prim.', dup caz. Restricii i precizri 2 n 10000. Exemple
Intrare n=147 n=13 Ieire 'Numarul nu este prim.' 'Numarul este prim.'

70

7. Divizibilitate i numere prime

7.2.3. Numr perfect


Un numr n este perfect dac este egal cu suma divizorilor si, mai puin el nsui. Determinai toate numerele perfecte mai mici sau egale cu un numr natural n dat. Date de intrare Se d un numr natural n, citit de la tastatur. Date de ieire Numerele perfecte mai mici sau egale cu n, se vor scrie pe o singur linie, separate prin spaiu. Restricii i precizri 1 n 10000. Exemplu
Intrare n=50 Ieire 6 28

Explicaie 6=1+2+3 28 = 1 + 2 + 4 + 7 + 14

7.2.4. Din nou numere prime


S se determine toate numerele prime din intervalul [a, b]. Date de intrare Se dau a i b, dou numere naturale. Date de ieire Numerele prime din intervalul [a, b] se vor scrie n ordine cresctoare, separate prin cte un spaiu. Restricii i precizri 1 a < b 10000. Exemplu
Intrare a=3 b=10 Ieire 3 5 7

Explicaie Numerele prime din intervalul [3, 10] sunt: 3 5 7

Timp de execuie: 1 secund

7. Divizibilitate i numere prime

71

7.2.5. Descompunerea n factori primi


Se d n numr natural. S se realizeze descompunerea n factori primi a acestui numr. Pentru fiecare factor prim care apare n descompunerea numrului se va preciza i factorul de multiplicitate (puterea la care apare factorul n descompunere). Date de intrare Se d un numr natural n. Date de ieire Pe fiecare linie se vor afia cte dou valori, prima reprezentnd factorul care apare n descompunere, iar cea de a doua reprezentnd multiplicitatea factorului respectiv. Restricii i precizri 2 n 2000000000; Datele de intrare sunt considerate corecte. Exemplu
Intrare n=20 Ieire 2 2 5 1

Explicaie 20 = 22 * 5.

Timp de execuie: 1 secund/test

7.2.6. Zerouri n coad


Se d un numr natural n. Numrai cte zerouri are factorialul acestui numr la sfritul su. Date de intrare Se d un numr natural n. Date de ieire Se va afia un numr natural, reprezentnd numrul zerourilor de la sfritul factorialului numrului dat. Restricii i precizri 2 n 2000000000; datele de intrare se consider corecte. Exemple
Intrare n=120 Ieire 28 Explicaie

120! are 28 de zerouri la sfrit

Timp de execuie: 1 secund/test

72

7. Divizibilitate i numere prime

7.2.7. Conjectura lui Goldbach


O conjcetur este o afirmaie pe care o face cineva, fr s poat s demonstreze riguros valabilitatea afirmaiei sale i pentru care nu putem demonstra nici noi contrariul, chiar dac am dori s o facem. Conjectura lui Goldbach afirm c orice numr natural par i mai mare dect 2 se poate descompune ca o sum de dou numere prime. Scriei un program pentru testarea valabilitii acestei afirmaii. Date de intrare Se d numrul natural n, citit de la tastatur. Date de ieire Se va afia o pereche de numere prime a cror sum este egal cu numrul dat. Restricii i precizri 4 n 10.000; datele de intrare sunt ntotdeauna corecte; numrul 1 nu este numr prim. Exemplu
Intrare n=50 Ieire 3 + 47 7 + 43 13 + 37 19 + 31 23 + 27 sau sau sau sau Explicaie Oricare dintre perechile de numere prime date pe coloana de ieire este o soluie a problemei, deoarece nsumnd cele dou valori obinem valoarea dat pentru n (50).

Timp de execuie: 1 secund/test

7.3. Soluiile problemelor rezolvate


7.3.1. Divizori
Orice numr natural dat are ca i divizori triviali pe numrul 1 i pe el nsui. Toi ceilali divizori se afl ntre 2 i [n/2] (n Pascal (n div 2)). Prin urmare, vom proceda astfel: afim 1; parcurgem mulimea numerelor naturale ncepnd cu 2 i terminnd cu n div 2: dac o valoare din acestea mparte exact numrul n, atunci o vom afia; la sfrit afim i numrul n.

7. Divizibilitate i numere prime

73

7.3.2. Numere prime


Pornim de la definiia numrului prim. Un numr prim are exact doi divizori: pe 1 i pe el nsui. Prima idee de a rezolva problema ar putea s se bazeze pe aceast definiie. Vom numra divizorii numrului, mprindu-l pe rnd cu toate numerele ncepnd cu 1 i terminnd cu el nsui. La sfrit, vom afia rspunsul solicitat, testnd numrul divizorilor.
Algoritm Prim_varianta1: citete n nr_divizori 0

{ nc nu am gsit nici un divizor } { generm toi divizorii posibili ai lui n, ncepnd cu 1 } { restul mpririi ntregi al lui n la divizor }

pentru divizor=1,n execut dac rest[n/divizor] = 0 atunci nr_divizori nr_divizori + 1 sfrit dac sfrit pentru dac nr_divizori=2 atunci scrie Numarul este prim. altfel scrie Numrul nu este prim. sfrit dac sfrit algoritm

{ mrim contorul (divizorul) }

{ dac numrul divizorilor este 2 (1 i n ) atunci numrul este prim }

Numrul mpririlor n varianta 1 de rezolvare este n, indiferent de proprietatea numrului. Vom ncerca s reducem acest numr, utiliznd o structur cu numr necunoscut de pai. Interpretarea definiiei se va oglindi n algoritm i n felul urmtor: mprim numrul, pornind de la 2, pn cnd gsim un divizor. Dac primul divizor astfel gsit este numrul dat, rezult c numrul este prim.
Algoritm Prim_varianta2: citete n divizor 2

{ pornim de la valoarea 2 i ne oprim cnd ajungem la primul divizor }


ct timp rest[n/divizor] 0 execut: divizor divizor + 1 sfrit ct timp dac divizor = n atunci

{ dac primul divizor mai mare dect 2 este chiar numrul dat }
scrie Numarul este prim.

74
altfel scrie Numrul nu este prim. sfrit algoritm

7. Divizibilitate i numere prime

Ne dm seama c numrul se mparte de multe ori inutil. Numrul mpririlor se poate reduce observnd c dac ntre 2 i n/2 nu exist nici un divizor, atunci numrul cu siguran nu mai are alt divizor, deci este prim. Dar numrul mpririlor se poate reduce n continuare. Dac numrul nu are divizori pn la radicalul lui, nu va avea nici n continuare. Avnd n vedere c n nu se modific n corpul ciclului, trebuie evitat (re)calcularea radicalului la fiecare reluare a structurii repetitive.
Algoritm Prim_varianta3: citete n prim adevrat { variabil boolean; presupunem c numrul este prim } divizor 2 { generm divizorii posibili ncepnd cu 2 } radical [ n ] ct timp (divizor radical) i prim execut: dac rest[n/divizor] = 0 atunci prim fals altfel divizor divizor + 1 sfrit dac sfrit ct timp dac prim atunci scrie Numrul este prim. altfel scrie Numrul nu este prim. sfrit dac sfrit algoritm

{ cutm divizori pn la rdcina ptrat a lui n } { dac am gsit un divizor } { rezult c n nu este prim }

Numerele pare se mpart toate cu 2, deci nu sunt prime. Rezult imediat o posibil mbuntire a algoritmului n sensul c numerele pare se pot pune deoparte de la nceput. Da, dar 2 este prim... Dac am rezolvat cazul numerelor pare la nceputul algoritmului, nu mai are sens s efectum mpriri cu numere pare (un numr impar nu va avea nici un divizor numr par). Rezult urmtoarea variant n care divizori vor fi numerele impare mai mari dect 3. Pentru ca algoritmul s funcioneze corect i pentru n = 1, trebuie tratat separat i acest caz.

7. Divizibilitate i numere prime


Algoritm Prim_varianta4: citete n dac n = 1 atunci prim fals altfel dac n este par atunci prim n = 2 altfel prim adevrat divizor 3

75

{ 1 nu este prim prin definiie } { singurul numr prim par este 2 }

radical [ n ] ct timp (divizor radical) i prim execut: dac rest[n/divizor] = 0 atunci prim fals altfel divizor divizor + 2 { divizorii posibili sunt numere impare } sfrit dac sfrit ct timp sfrit dac sfrit dac dac prim atunci scrie Numrul este prim. altfel scrie Numrul nu este prim. sfrit dac sfrit algoritm

{ primul divizor posibil este 3 } { cutm divizori pn la rdcina ptrat }

7.3.3. Numr perfect


Pentru fiecare numr avnd valoarea ntre 1 i n se va calcula suma divizorilor si. Dac aceast sum este egal cu numrul, atunci se va afia numrul respectiv. Atenie De fiecare dat (pentru fiecare numr analizat) este necesar reiniializarea variabilei de nsumare s, pentru a se efectua corect suma divizorilor numrului.

7.3.4. Din nou numere prime


Practic, problema este o extindere a problemei 2. Pentru fiecare numr natural, avnd valoarea ntre a i b se verific dac este sau nu numr prim. Dac da, atunci acesta va fi afiat pe ecran, urmat de un spaiu.1
1

n clasa a 9-a vom nva i alte modaliti de a genera numere prime.

76

7. Divizibilitate i numere prime

7.3.5. Descompunerea n factori primi


Rezolvarea problemei presupune dou etape de calcul: se determin un divizor prim al numrului (determinarea factorului prim); se efectueaz numrul maxim de mpriri posibile ale numrului de descompus cu acel divizor, numrndu-se cte mpriri s-au efectuat pentru factorul respectiv (determinarea factorului de multiplicitate). Execuia algoritmului se ncheie atunci cnd numrul a devenit egal cu 1. De fiecare dat, contorul pentru factorul de multiplicitate trebuie s fie readus la zero. Nu va trebui s efectum pentru fiecare divizor gsit verificarea faptului c acesta este prim din urmtorul motiv: dac am efectuat numrul maxim de mpriri la 2, nseamn c valoarea rmas nu va mai fi divizibil cu nici un numr multiplu de 2. La fel se ntmpl cu mprirea de numrul maxim de ori la numrul 3 .a.m.d. Deci, atunci cnd pentru valoarea rmas gsim un divizor, cu siguran acesta este i numr prim. n pseudocod, algoritmul descris mai sus se scrie astfel:
Algoritmul DescompunereFactoriPrimi; citete n d 2 { primul factor prim posibil s apar n descompunere } ct timp n > 1 execut: { ct timp n mai conine factori primi } { cutm un nou factor prim } ct timp rest[n/d] 0 execut: d d + 1 sfrit ct timp fm 0 {apoi stabilim multiplicitatea acestui nou factor prim} ct timp rest[n/d] = 0 execut: n [n/d] fm fm + 1 sfrit ct timp scrie d,' ',fm { afim rezultatul obinut conform cerinei din enun } sfrit ct timp sfrit algoritm

Observaie Timpul de execuie al acestui algoritm poate fi mbuntit dac verificai mai nti dac nu cumva numrul dat este prim (caz n care nu poate fi descompus), iar atunci cnd cutai divizori noi ai numrului inei cont de faptul c singurul numr prim par este 2 deci, ncepnd cu d = 3 am putea parcurge din 2 n 2 mulimea numerelor naturale.

7. Divizibilitate i numere prime

77

7.3.6. Zerouri n coad


Cu siguran c avei deja prima idee: calculm n! i apoi determinm numrul de cifre egale cu zero de la sfritul numrului. Matematic este corect i posibil, dei ar lua destul de mult timp. V reamintesc ns c a calcula n! nseamn a calcula 1 2 ... n. Cum procedai dac n = 1000000? Dar dac n = 2000000000 (limita maxim din enun)? Nici nu vreau s m gndesc ce efort de calcul va trebui s depunei . Este necesar o alt idee de rezolvare. Faptul c numrul are un zero la sfrit se poate traduce prin aceea c numrul este divizibil cu 10. Dar 10 = 2 5. i numerele 2 i 5 sunt prime ntre ele (adic, au cel mai mare divizor comun egal cu 1). Deci, ar fi o idee mai bun s determinm factorul de multiplicitate al numrului 2, respectiv al numrului 5, n descompunerea lui n!. Numrul de zerouri de la sfritul factorialului va fi egal cu numrul maxim de perechi (2 5) care se pot forma. Iar acest numr este egal cu minimul dintre factorul de multiplicitate al lui 2 i factorul de multiplicitate al lui 5. Apare acum o alt problem. Cum s determinm factorul de multiplicitate al lui 2 sau 5 ntr-un numr pe care nu-l cunoatem? Iat o prim soluie: parcurgem mulimea valorilor de la 2 la n i, pentru fiecare multiplu de 2 determinm factorul de multiplicitate al lui 2 n descompunerea acelui multiplu. Procedm la fel cu valoarea 5. n plus, atenie; nu reiniializm factorul de multiplicitate al lui 2 pentru fiecare nou valoare contorizat. V dm n cele ce urmeaz descrierea n pseudocod a algoritmului care determin factorul de multiplicitate al lui 2 n n! conform celor de mai sus:
Algoritmul MultiplicitatenFactorial1: citete n fm2 0 { iniializm cu zero factorul de multiplicitate } k 2 ct timp k n execut: aux k { determinm contribuia factorului k la multiplicitatea lui 2 } ct timp rest[aux/2] = 0 execut: fm2 fm2 + 1 aux [aux/2] sfrit ct timp

{ ne vom deplasa din 2 n 2, deoarece ne intereseaz numai numerele pare }


k k + 2 sfrit ct timp scrie fm2 sfrit algoritm

78

7. Divizibilitate i numere prime

Evident, soluia anterioar este ineficient din punct de vedere al timpului de execuie pentru valori foarte mari ale numrului n. Ne putem gndi la o soluie mai eficient folosind o numrare direct pentru determinarea factorului de multiplicitate al unui anumit factor prim n numrul n!. S observm c exist [n/2] multipli de 2, [n/4] multipli de 4 etc. La ce ne folosete aceast observaie? Vom determina foarte rapid factorul de multiplicitate al lui 2 n cadrul lui n!. Fiecare multiplu de 2 va trebui s-l numrm o singur dat, multiplii de 4 i vom numra de dou ori, multiplii de 8 de trei ori .a.m.d. Numrarea se oprete pentru o valoare a puterii lui 2 care depete numrul n dat, deoarece contribuia lui 2nr pentru 2nr > n este nul n calculul factorului de multiplicitate. Iat un exemplu: determinarea multiplicitii lui 2 n cadrul lui 20!
fm2 = [20/2] + [20/4] + [20/8] + [20/16] = 10 + 5 + 2 + 1 = 18

Dac nu credei, calculai manual! S realizm descrierea n pseudocod a acestei variante de abordare a problemei:
Algoritmul MultiplicitatenFactorial2: citete n fm2 0 { iniializm cu zero factorul de multiplicitate } factor 2 { ncepem prin a contabiliza multiplii de 2 } ct timp factor n execut: { adunm la multiplicitate numrul de multiplii ai lui factor } fm2 fm2 + [n/factor]

{ apoi trecem la urmtorul factor, n cazul nostru nmulim cu 2 }


factor factor*2 sfrit ct timp scrie fm2 sfrit algoritm

n aceast variant putei remarca dou aspecte: simplitatea implementrii, care este aspectul cel mai evident; eficiena implementrii: pentru n = 100, de exemplu, n prima variant, numrul de reluri ale structurii repetitive externe este egal cu 50, n timp ce n aceast a doua variant structura repetitiv din algoritm se reia doar de 6 ori. Pentru valori i mai mari ale numrului n, mbuntirea vitezei de execuie este i mai dramatic.

7.3.7. Conjectura lui Goldbach


Conform enunului, numrul n este numr par deci, se poate scrie sub forma 2 + (n 2) numai dac este egal cu 4 (4 = 2 + 2 i 2 este numr prim). Orice alt numr par va trebui s fie scris ca o pereche de numere prime impare, deoarece (n 2) va fi numr par mai mare dect 2 deci, neprim.

7. Divizibilitate i numere prime

79

O soluie a problemei va fi orice pereche k, n k (k + (n k) = n) pentru care ambele valori sunt numere prime. Deoarece nu ne intereseaz toate soluiile problemei, vom utiliza urmtoarea strategie pentru gsirea rapid a perechii de numere: pornim de la k = 3 i testm dac numrul k este prim, respectiv dac este prim numrul n k; dac nu am gsit o soluie a problemei, k k + 2 i relum verificarea.