Probleme clasice într-o abordare... clasică Numere prime și divizibilitateMihai Oltean Algoritmica este știința gândirii. De ce totuși trebuie să "convingem" cititorii de corectitudinea algoritmilor publicați, prezentând mereu și programele care codifică anumite raționamente? Să fie oare rezolvitorii de probleme prea comozi în sensul că le este "lene" să gândească? Vă punem la încercare... Iată câteva probleme rezolvate... doar algoritmic, respectiv matematic. Dacă sunteți curioși, implementați-le! Problema 1 Săritura calului pe tabla de șahToată lumea cunoaște această problemă celebră a cărei soluție a fost expusă pentru prima dată de către Euler. Având în vedere titlul articolului, propun în cele ce urmează o generalizare a problemei. În primul rând trebuie specificat faptul că nu este vorba despre un cal obișnuit, ci despre unul care poate face sărituri puțin mai complicate, în sensul că numărul pătrățelelor peste care sare nu este 1, respectiv 2, ci p respectiv q. Problema care se pune este următoarea:
Determinați o condiție necesară care trebuie să existe între p și q, astfel încât să existe un drum al calului care străbate toate pătrățele tablei, o singură dată. Rezolvare: Observăm că în cazul clasic, (p,qÎ{1,2}) avem întotdeauna soluție pentru o tablă de șah cu latura mai mare sau egală cu 5 pătrățele. Deducem de aici că s-ar putea ca p și q să fie prime sau să fie prime între ele. Ambele presupuneri sunt adevărate, dar cea de a doua este mai puternică decât prima, așa că o să o demonstrăm pe aceasta. Să presupunem că p și q nu sunt prime între ele și deci au un cel mai mare divizor comun, pe care-l vom nota cu d (d>1). Toate pătrățelele tablei care vor putea fi marcate de către săritura unui cal, vor avea coordonatele multiplu de d la care se adaugă coordonatele poziției de plecare. Problema 2 Problema lui JosephProblema este la fel de cunoscută și are următorul enunț: Se dau p obiecte aflate pe un cerc și un număr natural nenul q. Marcarea obiectelor începe cu un obiect oarecare. Următorul obiect care se marchează este cel aflat la distanță de q obiecte față de ultimul marcat. Operația de marcare are sensul acelor de ceasornic și se continuă până în momentul în care un obiect este marcat de două ori. Se cere să se determine relația dintre p și q, astfel încât în final toate obiectele să fie marcate. Rezolvare: Începem prin observația: Dacă se dau două numere naturale nenule (p și q) , prime între ele, acestea se vor bucura de următoarea proprietate: {,,...,(}={1,2,...,p-1} unde prin am notat restul împărțirii lui x la p. Într-o primă etapă vom demonstra că numerele , ,..., sunt distincte între ele. Presupunem, prin reducere la absurd, că ar exista două elemente ( și ) egale. Atunci ar fi multiplu de p. Astfel, am ajuns la o contradicție, deoarece j-i este mai mic decât p, iar p și q sunt prime între ele. Rezultă că toate cele p-1 numere sunt distincte, dar mai trebuie să demonstrăm că ele sunt și diferite de 0. Acest lucru se observă ușor, deoarece orice număr de forma i*q, (unde 1<=i<=p-1, iar p și q sunt prime între ele) nu se poate împărți exact la p. Să demonstrăm acum și proprietatea inversă: Dacă se dau două numere p și q, astfel încât {,, ...,}={1,2,...,p-1}, atunci p și q sunt prime între ele.
Vom presupune prin reducere la absurd că p și q ar avea un cel mai mare divizor comun pe care îl vom nota cu d (d>1). Vom avea p=d*x și q=d*y. În cazul în care p<q rezultă că q*x este 0. În caz contrar (p>q) avem q*y=0, ceea ce contravine ipotezei. Astfel am demonstrat propoziția enunțată.
Într-o primă fază vom numerota cele p numere în ordinea acelor de ceasornic, cu numere de la 0 la p-1. La pasul întâi vom marca numărul 0. La pasul w, numărul marcat are valoarea egală cu restul împărțirii lui q*(w-1) la p. Dorim ca toate aceste resturi să fie diferite. Vom avea de executat exact p pași pentru a marca toate numerele. Conform observațiilor de mai sus, acest lucru este posibil doar dacă p și q sunt prime între ele. În caz contrar se pot marca doar acele numere care sunt multipli ai cmmdc(p,q), la care se adaugă bineînțeles poziția de start. O altă problemă echivalentă cu aceasta ar fi următoarea: Problema 3 Problema paharelor de apăAvem la dispoziție două pahare de apă A și B, cu capacitățile p și q, (inițial goale). Operațiile posibile sunt următoarele: - umplerea paharului A cu apă; - golirea paharului A; - umplerea paharului B cu apă; - golirea paharului B; - turnarea conținutului paharului A în paharul B; - turnarea conținutului paharului B în paharul A. (Turnarea se face până când unul din pahare se golește sau celălalt se umple).
Problema cere să se determine ce relație trebuie să existe între p și q astfel încât în urma unor operații de tipul celor descrise mai sus, în paharul de capacitate mai mare să se poată obține orice cantitate de apă. Rezolvare: Să vedem de ce aceste probleme sunt echivalente. Marcarea elementului numerotat cu 0 de la problema lui Joseph este echivalentă cu faptul că paharul A (capacitatea p) este gol. Marcarea unui alt număr (după un salt de q unități) echivalează cu turnarea conținutului paharului B (de capacitate q) în paharul A. Dacă paharul A se umple, golirea lui și turnarea în el a apei care a rămas în B echivalează cu saltul peste obiectul cu numărul de ordine 0 de la problema lui Joseph. Astfel am arătat că cele două probleme sunt echivalente. Condiția ca în paharul A să se poată obține orice cantitate de apă este ca numerele p și q să fie prime între ele. Dacă nu cerem ca în paharul A să poată fi obținută orice cantitate, ci o valoare specificată x, atunci este necesar ca x să fie multiplu de cmmdc(p,q). Deoarece inițial putem turna fie din paharul A în paharul B, fie invers, vom avea întotdeauna două soluții ale problemei: una mai lungă, necesitând mai multe operații și alta de lungime mai scurtă.
Completare: Problema se poate generaliza la n pahare de apă, soluția rămânând aceeași. Problema 4 Șirul Fibonacci și numerele primeFie șirul definit astfel: F[0]=0, F[1]=1, F[n]=F[n-1]+F[n-2]. Există trei proprietăți extrem de interesante referitoare la acest șir: 1) oricare al k-lea termen din șir se divide prin F[k]; 2) dacă k este număr compus, atunci și F[k] este tot un număr compus; (un număr este compus dacă nu este prim) 3) dacă F[k] este prim, atunci și k este prim, (excepție face F[4]=3); 4) F[(m,n)]=(F[n],F[m]). Rezolvare: Se observă că numerele Fibonacci pare sunt F(3), F(6), F(9), F(12),...,F(3k) sau mai precis, fiecare al treilea număr Fibonacci este multiplu de 2. Dar 2=F(3). Se observă că numerele Fibonacci care sunt multiplu de 3 sunt: F(4), F(8), F(12), F(16), ..., F(4k) sau mai precis, fiecare al patrulea termen Fibonacci este multiplu de 3=F(4). Regula generală ar fi prima dintre cele trei proprietăți, care exprimată "mai matematic" este: F(nk) este multiplu de F(k) pentru toate valorile lui n și k=1,2,... Această formă sugerează și metoda de demonstrare a corectitudinii afirmației, și anume inducția matematică, pe care pentru un k fixat o vom aplica după n. Pentru n=1 avem că F[k] divide pe F[k], deci propoziția este adevărată. Să presupunem că am demonstrat toate propozițiile pentru toate valorile mai mici și egale cu n-1. Vom demonstra afirmația pentru n. Pentru aceasta ne folosim de următoarea proprietate a numerelor Fibonacci, și anume: F[m+n]=F[n-1]*F[m]+F[n]*F[m+1]. Deci F[n*k]=F[(n-1)*k+k]=F[(n-1)*k-1]* F[k]+F[(n-1)*k]*F[k+1]. În această relație F[k] și F[(n-1)*k] sunt multipli de F[k]. Rezultă că și F[n*k] este multiplu de F[k]. Proprietățile 2), 3) și 4) sunt consecințe directe ale proprietății 1), deci nu voi insista asupra lor. Proprietatea inversă proprietății 3) nu este valabilă, respectiv dacă k este prim, atunci și F[k] este prim. De exemplu: F[19]=4181=113*37. Problema 5 La cumpărăturiLa un magazin se găsesc n tipuri de produse, fiecare având un cost dat a[i], i=1..n. În magazin intră o persoană care are asupra ei doar bancnote de p lei, unde p este un număr prim, și care dorește să cumpere cel puțin o bucată din fiecare produs. Datorită faptului că la caserie nu există bani pentru a se da rest, clientul va fi obligat să cumpere (dacă se poate) astfel încât să poată plăti exact, folosindu-se doar de bancnotele din buzunar (se presupune că are suficiente). Se cere să se determine, în cazul în care există soluție, câte bucăți cumpără din fiecare produs.
Restricție: Se pot cumpăra maxim p-1 bucăți din fiecare produs, deoarece în caz contrar o soluție ar însemna să luăm exact p bucăți din fiecare. Rezolvare: Ne vom baza pe următoarea observație: Pentru xÎ{1,...,p-1} , vom avea {,,...,}={1,2,...,p-1}. Această remarcă reprezintă particularizarea observației făcute la problema 2, așa că nu am să reiau demonstrația. Într-o primă etapă voi elimina din problemă acele produse pentru care costul este multiplu de p, deoarece dintre acestea, persoana respectivă va cumpăra doar câte o singură bucată. Mai rămân de cumpărat doar acele produse al căror cost nu este multiplu de p. Lucrurile se mai pot simplifica, dacă vom lucra cu resturile împărțirii numerelor a[i] la p. Fiecare rest va fi cuprins între 1 și p-1. Deoarece se pot cumpăra oricâte bucăți din fiecare, adică putem cumpăra o bucată, două bucăți, sau... (p-1) bucăți, pe baza observației de mai sus rezultă că putem obține orice rest cuprins între 1 și p-1. Dacă am avea un singur produs de cumpărat, problema nu ar avea soluție, deoarece indiferent câte bucăți am cumpăra din el, restul care ar trebui luat de la casă va fi cuprins între 1 și p-1. Dacă, spre exemplu, am avea două produse de cumpărat, problema ar avea întotdeauna soluție, deoarece vom cumpăra din primul produs atâtea bucăți încât să avem restul 1, iar din celălalt produs vom cumpăra atâtea bucăți încât să avem restul p-1, deci suma lor va fi multiplu de p. Dacă, spre exemplu avem de cumpărat p produse, atunci din fiecare vom lua atâtea bucăți, astfel încât restul împărțirii la p să fie 1, deci aceste resturi însumate vor fi exact p.
Concluzionând, problema are soluție în toate situațiile, mai puțin în cazul în care există exact un singur produs al cărui cost nu este multiplu de p. Problema se poate generaliza, în sensul că p nu trebuie să fie neapărat prim, (în schimb trebuie să fie neapărat prim cu fiecare dintre numerele a[i]). În acest caz soluția este aceeași și se bazează pe observația făcută la problema 2. Aș mai dori să discut și o altă variantă a acestei probleme care, deși nu se încadrează în tematica propusă, o consider interesantă, și anume eliminarea celor două restricții: ca din fiecare produs să se cumpere cel puțin o bucată și ca p să fie prim. Rămâne și aici valabilă restricția ca din nici un produs să nu se poată cumpăra mai mult de p-1 bucăți. Mai mult, voi arăta că din nici un produs nu este nevoie să se cumpere mai mult de p div n bucăți (unde n este numărul de produse din magazin). Totodată problema are întotdeauna soluție dacă n>1. Dacă n=1 atunci problema are soluție doar dacă p și a[1] nu ar fi prime între ele. În acest caz (dacă notăm prin d cmmdc(p,a[1])) o soluție constă din a cumpăra p div d produse, pe care le-am putea plăti folosind a[1] div d bancnote. Dacă n>1 atunci soluția se aseamănă cu cazul în care se poate cumpăra maxim o bucată din fiecare produs și p=n. Reamintesc că în acea situație construiam sumele parțiale: a[1],a[1]+a[2],a[1]+a[2]+a[3],..., a[1]+a[2]+...+a[n]. Ajungeam la situația în care printre resturile împărțirii acestor sume la n existau două resturi egale sau exista unul egal cu 0. În situația noastră vom proceda asemănător, dar de data aceasta dispunem numerele pe cerc, iar sumele pe care le construim încep să zicem cu a[1] și se continuă în sensul acelor de ceasornic, până la suma de lungime p (care conține p termeni); evident, unii termeni vor fi luați de mai multe ori, dar nu mai mult de p div n+1 ori). Deci vom avea de a face cu p sume a căror p resturi rezultate în urma împărțirii la p sunt în intervalul 0..p-1, care este un interval de lungime p, deci fie că unul din resturi este 0, fie că două resturi sunt egale, din ambele situații rezultă imediat soluția. Problema 6Se dau 2p-1 numere întregi (p este prim). Se cere să se determine o submulțime formată din p numere cu proprietatea că suma elementelor din această submulțime este divizibilă prin p. Rezolvare: În primul rând trebuie să demonstrăm că dintr-o mulțime de p-1 numere naturale nedivizibile prin p se poate alege o submulțime a căror sumă să fie divizibilă prin x, oricare ar fi 1<=x<=p.
Algoritmul care determină această submuțime este dat și în [1], așa că doar am să îl schițez în continuare. Ne bazăm pe observația de la problema precedentă. Vom simplifica problema, în sensul că vom lucra doar cu resturile împărțirii numerelor date la p. Notăm aceste resturi cu yi, i=1..p-1. Ne interesează să obținem fiecare rest între 1 și p-1 din sume (modulo p) ale numerelor din șirul y.
Pentru aceasta construim un nou vector boolean (atins), care pe poziția i, 1<=i<=p-1 reține dacă restul i a fost obținut din vreo sumă (modulo p) a numerelor date. Inițial, toate elementele vectorului atins vor fi false. La fiecare pas vom marca un rest nou, și anume: la pasul i vom adăuga la sumele deja construite elementul yi. Resturile (modulo p) ale sumelor deja construite sunt marcate în vectorul atins. Dacă vom adăuga elementul yi la aceste resturi, vor rezulta noi resturi. Pe baza observației de la problema 5, avem garanția că toate resturile între 1 și p-1 vor fi atinse, deci există o submulțime de numere care, adunate vor da restul respectiv. Pentru a o reconstitui vom mai avea nevoie de încă un vector în care să fie reținută poziția de proveniență a fiecărui rest.
Să revenim la problema noastră. Fie: a[1]<=a[2]<=....<=a[2p-1] resturile împărțirii celor 2p-1 numere la p. Considerăm numerele: a[p+1]-a[2],a[p+2]-a[3],...,a[2p-1]-a[p]. Dacă unul dintre aceste numere este egal cu zero, de exemplu a[p+j]-a[j], atunci a[j]=a[j+1]=...=a[p+j] constituie soluția problemei. Dacă nu există nici un astfel de număr egal cu 0, procedăm în felul următor: Luăm suma elementelor a[1]+a[2]+...+a[p]. Dacă această sumă este egală cu 0 (evident modulo p) atunci ea este soluția problemei. În caz contrar, fie x restul împărțirii acestei sume la p. Aplicăm algoritmul de mai sus numerelor a[p+1]-a[2], a[p+2]-a[3],...,a[2p-1]-a[p]. Am amintit că fiecare rest va putea fi obținut, deci și restul p-x. Adunăm numerele care însumate dau acest rest la a[1]+a[2]+...+a[p]. După efectuarea reducerilor evidente, vom avea soluția problemei.
Completare: Se poate demonstra o proprietate și mai puternică, și anume că din 2p-1 numere se pot alege p, astfel încât suma lor să fie divizibilă cu p, fără restricția ca p să fie prim. De fapt se poate demonstra o proprietate chiar mai puternică, și anume: Din oricare a numere întregi se pot alege b numere a căror sumă se divide cu c, dacă și numai dacă b se divide cu c și a>=b+c-1. Pentru mai multe amănunte se poate consulta problema M45 din [2]. Problema 7Se dau două numere p și q. Să se determine dacă există o mulțime de p numere prime mai mari decât 3, astfel încât suma pătratelor lor să fie egală cu q (modulo 12). Rezolvare: De exemplu pentru p=13 și q=1 avem soluția: {5,7,13,17,19,29,31,37,41,43,47,53,59}. Suma pătratelor acestor numere este 16093=q(modulo 12). Soluția acestei probleme este banală dacă se demonstrează o propoziție ajutătoare: Pentru orice număr prim x, mai mare decât 3 este adevărată proprietatea: x*x=1(modulo 12).
Demonstrație: Deoarece x este un număr prim, strict mai mare decât 3, atunci el poate avea una din formele: 12*k+1, 12*k+5, 12*k+7, 12*k+11. Pentru x=12*k+1 avem (12*k+1)^2=1(modulo 12) Pentru x=12*k+5 avem (12*k+5)^2=1(modulo 12) Pentru x=12*k+7 avem (12*k+7)^2=1(modulo 12) Pentru x=12*k+11 avem (12*k+11)^2=1(modulo 12)
Cu aceasta propoziția este demonstrată. Acum este evident că avem soluție doar în cazul în care p=q(modulo 12) și ea constă în alegerea la întâmplare a 12 numere prime. Problema 8Există și un algoritm care testează dacă o mulțime este inclusă într-o alta, folosind numere prime. Pentru aceasta să presupunem că cele două mulțimi (notate cu A și B) sunt din domeniul 1..100. Asociem fiecărui număr x (din domeniul stabilit anterior) al x-lea număr prim. Astfel, avem următoarele asocieri: 1 - 2 2 - 3 3 - 5 4 - 7 5 - 11 ......
Calculăm produsul numerelor prime asociate mulțimii A și produsul numerelor prime asociate mulțimii B. Dacă un rezultat (să zicem cel atașat mulțimii A) se divide cu rezultatul atașat celeilalte mulțimi (B) rezultă că B este inclusă în A. Exemplu A={2,4,6,7}, B={4,7}. Mulțimea A are atașată mulțimea numerelor prime {3,7,13,17}, iar mulțimea B are atașată mulțimea {7,17}. Produsul elementelor mulțimii atașate lui A este 4641, iar cel al elementelor atașate mulțimii B este 119. Cel de al doilea produs divide pe primul, deci mulțimea B este inclusă în mulțimea A.
Inconvenientul acestui algoritm constă din faptul că trebuie efectuate înmulțiri și împărțiri cu numere mari.
Bibliografie: 1. Proba de baraj pentru selecționarea lotului național, problema "La shop la Slatina", Gazeta de informatică, Ediție specială, 1995 2. Problema M45 din "Probleme traduse din revista sovietică Kvant", E.D.P., Buc, 1983.
Mihai Oltean este student la Facultatea de Matematică, secția Informatică, Universitatea Babeș-Bolyai, Cluj. Poate fi contactat prin e-mail la adresa: om7280@scs.ubbcluj.ro [cuprins] |