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