Referat Rezolvarea Ecuatiilor Diofantice.rtf
Mai jos puteti citi fragmente din
Referat Rezolvarea Ecuatiilor Diofantice.rtf si de asemenea puteti face
Download Referat Rezolvarea ecuatiilor diofantice.rtfCiteste fragmente din Referat Rezolvarea Ecuatiilor Diofantice.rtf
Rezolvarea ecuaÑŽiilor diofantice
Orice congruenюó ax1+c0 (mod b) se poate scrie ca o ecuaюie
ax1+bx2+c=0 (þn care a 0), b1 Ñâ€i c, x1, x2 sunt numere þntregi. Dacó
a, b, c sunt numere þntregi date Ñâ€i x1 Ñâ€i x2 sunt considerate
necunoscute, problema se reduce la gósirea soluюiilor þntregi ale
unei ecuaÑŽii liniare cu coeficienÑŽi þntregi. Daca f(x1,…, xn) este
un polinom þn x1,…, xn cu coeficienÑŽi þntregi, atunci ecuaÑŽia
f(x1,…, xn) = A se numeÑâ€te diofanticó dacó soluÑŽiile ei sunt
numere þntregi. Denumirea acestor ecuaюii derivó de la numele
matematicianului grec Diofantos din Alexandria. Dacó o astfel de
ecuaÑŽie admite soluÑŽii, atunci ea admite o infinitate de n-upluri care
o satisfac.
Þn continuare se va trata cazul n=2: ax+by=c
Dacó a Ñâ€i b sunt numere prime þntre ele Ñâ€i x0, y0 constituie o
soluÑŽie pentru ax+by=c, atunci totalitatea soluÑŽiilor se poate
reprezenta sub forma: x= x0+bt, y= y0 –at, unde t este un numór
þntreg oarecare. O soluюie a ecuaюiei se poate obюine cu ajutorul
penultimei fracюii de aproximare pentru reprezentarea sub formó de
fracюie continuó a lui a/b. Considerònd có penultima fracюie este
m/n, x0=nc, y0=-mc.
Exemplu:
Fie ecuaÑŽia: 43x+19y=2.
FracÑŽiile de aproximare ale lui 43/19 sunt: 7/3, 9/4, 43/19.
Din fracÑŽia 9/4 se obÑŽine x0=4*2=8, y0=-9*2=-18. Astfel, soluÑŽia
generaló se poate scrie de forma: x=8+19t Ñâ€i y=-18-43t, unde t este un
numór oarecare.
Implementare
Algoritmul de mai sus este valabil, dupó cum am precizat, þn cazul
cònd cele 2 numere a Ñâ€i b sunt prime þntre ele. Dacó dorim
rezolvarea unei ecuaюii þn care cele 2 numere nu sunt neapórat prime
þntre ele, se poate proceda þn felul urmótor: se calculeazó cel mai
mare divizor comun al lor (sigur este diferit de 1), iar apoi se
evalueazó dacó ecuaюie poate sau nu avea soluюii, þn funcюie de
valoarea lui c. Dacó c este divizibil cu cmmdc-ul celor 2 numere,
atunci se simplificó þntreaga ecuaÑŽie cu cmmdc Ñâ€i problema se reduce
la cea prezentató mai sus. Dacó c nu se þmparte exact la cmmdc,
atunci putem spune có ecuaюia nu are soluюii þntregi.
Pe lòngó aceasta, intervin o serie de cazuri critice þn care
algoritmul de mai sus nu poate fi aplicat, cum ar fi de exemplu cazurile
þn care nu existó penultima fracюie. Dar se poate calcula soluюia
Ñâ€i þn aceste cazuri:
· a=0, b=0
Þn acest caz soluюia depinde valoarea lui c:
§ c=0 => x Ñâ€i y poate fi orice numór þntreg
§ c 0 => nu existó soluÑŽii
· a=0, b 0
Ecuaюia devine: by=c. Deci y se poate calcula, юinònd þnsó cont có
vorbim numai de numere þntregi.
· a0, b= 0
Analog cu cazul anterior.
Dacó unul dintre numerele a sau b are valoarea 1 nu se mai poate vorbi
de penultima fracÑŽie de aproximare, deci Ñâ€i aceste cazuri trebuie
tratate separat.
O altó observaюie este aceea có fracюia de aproximare (m/n)
aproximeazó fracюia (a/b) þn plus sau þn minus. De aceea þn la
sfòrÑâ€it trebuie só corectez rezultatul þn funcÑŽie de aceasta,
ÑŽinònd seama Ñâ€i de semnul fracÑŽiei a/b.
Sursa programului
#include
#include
#include
long int v[100];
//obtine penultima fractie de aproximare
void get_mn(long int &a,long int &b,int k)
if (k>0) long int aux=v[k-1]*b+a;
a=b;b=aux;
get_mn(a,b,k-1);
else a=a+b-(b=a);
long int _cmmdc(long int a,long int b)
while (a!=b)
if (a>b) a-=b;
else b-=a;
return a;
void stop()
printf("Nu exista solutii...n");
int solutii(long int a,long int b,long int c,
long int &x0,long int &n1,long int &y0,long int &n2)
long int m,n,cmmdc=1,_a,_b;
int nr=-1;
_a=labs(a);_b=labs(b);
if ((_a>1)&&(_b>1)) cmmdc=_cmmdc(_a,_b);
if (cmmdc!=1)
if (c%cmmdc) stop();return 0;
else a/=cmmdc,b/=cmmdc,c/=cmmdc;
m=a;n=b;
if (!(a*b))
if (!a) if (!b)
//0=c
if (!c) printf("x,yZn");
else stop();
return 0;
else
// by=c
if (c%b) stop();
else printf("xZn");
printf("y=%ldn",c/b);
return 0;
else
//ax=c
if (c%a) stop();
else printf("x=%ldn",c/a);
printf("yZn");
return 0;
if (labs(m)==1)
// inseamna ca este de forma x+b*y=c, deci nu exista
// penultima fractie de aproximare
x0=c*m;n1=-b*m;
y0=0;n2=1;
return 1;
else
if (labs(n)==1)
// inseamna ca este de forma a*xy=c, deci nu exista
// penultima fractie de aproximare
x0=0;n1=1;
y0=c*n;n2=-a*n;
return 1;
// m si n sunt diferite de 1, si diferite intre ele
m=labs(m);n=labs(n);
while (m!=1)
if (m>n) v[++nr]=m/n;
m-=m/n*n;
else if (m0) if (_a*n<_b*m) c=-c;
if (a*b<0) if (_a*n>_b*m) c=-c;
if (a<0) m=-m;
if (b<0) n=-n;
x0=n*c;n1=b;
y0=-m*c;n2=-a;
return 1;
void main(void)
long int a,b,c,x0,y0,n1,n2;
do
clrscr();
puts("Se rezolva ecuatia: ax+by=c, a,b,x,y,cþZ");
printf("a=");scanf("%ld",&a);fflush(stdin);
printf("b=");scanf("%ld",&b);fflush(stdin);
printf("c=");scanf("%ld",&c);fflush(stdin);
printf("----------------------------------------n");
if (solutii(a,b,c,x0,n1,y0,n2))
if (!x0) if (labs(n1)!=1) printf("x=%ldtn",n1);
else printf("x=%stn",n1<0?"-":"");
else if (labs(n1)!=1) printf("x=%ld%+ldtn",x0,n1);
else printf("x=%ld%stn",x0,n1<0?"-":"");
if (!y0) if (labs(n2)!=1) printf("y=%ldtn",n2);
else printf("y=%stn",n2<0?"-":"");
else if (labs(n2)!=1) printf("y=%ld%+ldtn",y0,n2);
else printf("y=%ld%stn",y0,n2<0?"-":"");
printf("unde t este un numar intregn");
puts("Apasati o tasta (x pentru a termina)...");
c=getch();
while (c!= x );