一、欧几里得算法
(1).gcd(a,b)=gcd(b,a%b)
reason:用例子来证明,假设a=38,b=8,则38=4*8+6;此时求a与b的最大公约数,肯定为6与8的最大公约数,因为4*8可以被8整除。
(2)根据上述等式求解 ax+by=gcd(a,b) {gcd(a,b)为a,b的最大公约数}
(3)递推过程
∵ax+by=gcd(a,b);
∴bx+(a%b)y=gcd(b,a%b);
∴ax1+by1=bx2+(a%b)y2;
又∵a%b=(a-(a/b)*b);
∴ax1+by1=ax2+(a-(a/b)*b)y2;
∴ax1+by1=ay2+b(x2-a/b*y2)
得:
{
x1=y2;
y1=x2-a/b*y2;
}
PS:该递推过程一直递推下去的话,会得到b==0,因为a%b==0,绝对存在。当b==0时,x=1,y=0;所以可以根据这一组特解,根据上一组解和这一组解的关系,求出上一组解(x1,y1表示上一组解)
所以实现代码如下:
int x,y;
int exgcd(int a,int b)
{
if(!b) //递归终止条件
{
x=1,y=0; return a;//a为最大公约数
}
int gcd=exgcd(b,a%b);
int ans;
ans=x;
x=y;
y=ans-(a/b)*y;
return gcd;
}
二、拓展欧几里得算法
1.求ax+by=c的解
只有当c为gcd(a,b)的倍数时,此方程才有解,否则无解。
特殊情况 ax+by=1
只有当a与b互质的时候才存在解。
2.有解的情况下,求解。
因为此时 c=t*gcd(a,b) //假设c为gcd(a,b)的t倍
a(x/t)+b(y/t)=gcd(a,b); m=x/t,n=y/t;
求解之后应该得到的是m与n的值。
要求解得x的值,所以x=tm,y=tn;
3.有解的情况下,求最优解(最小正整数)。
a{x/t-b/(gcd(a,b)}+b{y/t+a*gcd(a,b)}=gcd(a,b)
同理 m=x/t-b/gcd(a,b) n=y/t+a*gcd(a,b);
可得 x=tm+tb/gcd(a,b) y=tn-atgcd(a,b);
所以求解出 x之后,最优解x1={x%(tb/gcd(a,b))+tb/gcd(a,b)}%(tb/gcd(a,b));
三、同余方程
ax=1(mod n) 意思是 ax%n=1%n;
ax=1+kn; k为倍数
所以只要满足 ax+bn=1的线性解 x,n都满足要求;
然后根据欧几里得算法,ax+bn=1 (a与b互质时 存在解) 或者 ax+bn=c c=t*gcd(a,b) 存在解。
完结,简单总结一下:
1.欧几里得算法,就是从一个特解出发,向上推到一个可以符合当前a与b的解。
2.计算题目时,可以根据题目给出的信息,列出 ax%n=b%n(同余方程) 然后化成 ax+by=c的形式 求出解。
2019.10.12 补充: