gcd
定義:求出兩個數的最大公因數。
算法定律:gcd(a,b)=gcd(b,amodb)
證明:
設gcd(a,b)=k,a=t1×k,b=t2×k
可知,gcd(t1,t2)=1,如果還有一個t,那麼就可以說明a,b還有一個公共素因數t,與原意不符。
所以gcd(t2×k,(t1×k)mod(t2×k))
=gcd(t2×k,(t1modt2)×k)
由於t1,t2互質,所以t2和t1modt2互質,所以gcd(t2×k,(t1modt2)×k)=k,命題得證
代碼
int gcd(int x,int y){
if(!y)return x;
return gcd(y,x%y);
}
擴展歐幾里得,exgcd
定義:求出方程ax+by=c的解
爲了使原方程有解,則gcd(a,b)∣c,(c能被gcd(x,y)整除)
證明:反正就是一個裴蜀定理,我就不說了。
然後,只要我求出方程ax+by=gcd(a,b),就可以求出上面方程了。
當b=0時,x=1,y=0
當b=0時,因爲ax+by=gcd(a,b)=gcd(b,amodb)=bx′+amodb×y′
所以ax+by=bx′+amodb×y′=bx′+(a−⌊ba⌋×b)y′=bx′+ay′−⌊ba⌋×b×y′=ay′+b(x′−⌊ba⌋y′)
所以,左右a,b的係數對應得
⎩⎨⎧x=y′y=x′−⌊ba⌋×y′
所以代碼就是:
int x,y;
void exgcd(int a,int b,int x,int y){
if(b==0){x=1;y=0;return;}
exgcd(b,a%b,x,y);
int t=x;
x=y;
y=t-a/b*y;
}
謝謝–zhengjun