*d|a且d|b =>d|(ax+by). * gcd(a,b)=gcd(b,a%b). 設d=gcd(a,b),則d|a且d|b,則d|ax+by.又a%b=a-(a/b)*b,所以d|(a%b)->d=gcd(b,a%b). 所以可以得出歐幾里德算法,也就是輾轉相除法:
 GCD int gcd(int a,int b) { if(b==0) return a; else return gcd(b,a%b); }
*基于以下事實:gcd(a,b)=gcd(b,a%b). 可以得出:存在x,y,x',y'使得: ax+by=d (1) bx'+(a%b)y'=d 即 bx'+[a-(a/b)*b]y'=d 整理得:ay'+b(x'-(a/b)y')=d (2) 由(1)(2)得:x=y' y=x'-(a/b)y' 當b=0時,ax=gcd(a,0)=a,得x=1. 可以得到擴展歐幾里德算法:
 EXTEND-EUCLID int Extend_Euclid(int a,int b,int & x,int &y) { if(b==0) { x=1; y=0; return a; } else { int gcd,t; gcd=Extend_Euclid(b,a%b,x,y); t=x; x=y; y=t-(a/b)*y; return gcd; } }
*應用擴展歐幾里德算法可以求二元一次方程的整數解 對方程:ax+by=c 設d=gcd(a,b), a'=a/d, b'=b/d,則方程變形為d(a'x+b'y)=c 若方程有整數解,則d|c,否則無解. 設c'=c/d,則方程ax+by=c等價于a'x+b'y=c' 因為gcd(a',b')=1,則我們可以求得a'x+b'y=gcd(a',b')=1的解,即ax+by=gcd(a,b)=d的解x,y。 則c'x,c'y就是ax+by=c的一組解。 xx=c'x+b't, yy=c'y-a't t∈Z就是所有滿足條件的解。
*對于求解模線性方程ax≡b(modn),假設對整數x',y',有d=ax'+ny',則方程ax≡b(modn)有一個解的值為x0,滿足x0=x'*(b/d)modn. ax0≡ax'(b/d) (mod n) ≡d(b/d) (mod n) ≡b (mod n)
 Modular_Linear int Modular_Linear(int a,int b,int n)//ax=b(mod n) { int d,x,y,x0,i; d=Extend_Euclid(a,n,x,y); if(b%d==0) { x0=(x*(b/d))%n; if(x0<n) x0+=n; for(i=0;i<d;i++) cout<<(x0+i*n/d)%n<<endl; } return 0; }
|