Divizibilitate Si Numere Prime

Embed Size (px)

DESCRIPTION

mate

Citation preview

  • Divizibilitate i numere prime Consideraii teoretice Probleme propuse Soluiile problemelor propuse

    Capitolul

    7 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 divi-zorilor, proprieti care sunt n acelai timp utile pentru rezolvarea eficient a proble-melor 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 n-sui). 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 sfri-tul 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 factoria-lului 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 rigu-ros 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 testa-rea 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 sau 7 + 43 sau 13 + 37 sau 19 + 31 sau 23 + 27

    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 cei-lali 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 divi-zorilor. 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 } pentru divizor=1,n execut { restul mpririi ntregi al lui n la divizor } dac rest[n/divizor] = 0 atunci nr_divizori nr_divizori + 1 { mrim contorul (divizorul) } sfrit dac sfrit pentru dac nr_divizori=2 atunci { dac numrul divizorilor este 2 (1 i n ) atunci numrul este prim } scrie Numarul este prim. altfel scrie Numrul nu este prim. sfrit dac sfrit algoritm Numrul mpririlor n varianta 1 de rezolvare este n, indiferent de proprietatea numrului. Vom ncerca s reducem acest numr, utiliznd o structur cu numr necu-noscut de pai. Interpretarea definiiei se va oglindi n algoritm i n felul urmtor: m-prim numrul, pornind de la 2, pn cnd gsim un divizor. Dac primul divizor ast-fel 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 7. Divizibilitate i numere prime altfel scrie Numrul nu este prim. sfrit algoritm 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: { cutm divizori pn la rdcina ptrat a lui n } dac rest[n/divizor] = 0 atunci { dac am gsit un divizor } prim fals { rezult c n nu este prim } 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 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 n-ceput. 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 nu-mr 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 75 Algoritm Prim_varianta4: citete n dac n = 1 atunci { 1 nu este prim prin definiie } prim fals altfel dac n este par atunci { singurul numr prim par este 2 } prim n = 2 altfel prim adevrat divizor 3 { primul divizor posibil este 3 } radical [ n ] { cutm divizori pn la rdcina ptrat } 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 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 varia-bilei 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, n-seamn 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 } ct timp rest[n/d] 0 execut: { cutm un nou factor prim } 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 natu-rale.

  • 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 ci-fre 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 nu-mrului 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 multiplici-tate 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 exe-cuie pentru valori foarte mari ale numrului n. Ne putem gndi la o soluie mai eficient folosind o numrare direct pentru deter-minarea 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 ca-drul 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 am-bele 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.