标签:spl floor 最大公约数 rac lin 表示 return 模的逆元 公约数
\(gcd(a,b)\)表示a,b的最大公约数
朴素的欧几里得算法其实就是所谓的辗转相除法
辗转相除法
\(gcd(a,b)=gcd(b,a\) \(mod\) \(b)\)
证明如下:
\(设r=a\) \(mod\) \(b\) \(=a-\lfloor\frac{a}{b}\rfloor*b\),\(p=gcd(a,b)\);
则\[a=xp,b=yp\]
代入可得\[r=xp-\lfloor\frac{xp}{yp}\rfloor*yp\]
提公因式得\[r=p(x-\lfloor\frac{xp}{yp}\rfloor*y)\]
所以\[p|r\]
即\[a,b的最大公约数也是r的约数\]
设\(p`=gcd(b,r)\)
则\[b=x`p`,r=y`p`\]
\[a=r+\lfloor\frac{a}{b}\rfloor*b\]
代入得\[a=y`p`+\lfloor\frac{a}{b}\rfloor*x`p`\]
提公因式\[a=p`(y`+\lfloor\frac{a}{b}\rfloor*x`)\]
所以\[p`|a\]
得出结论:a,b与b,a mod b的公约数相同,所以最大公约数也相同
得证;
int gcd(int a,int b)
{
if(!b) return a;
else return gcd(b,a%b);
}
扩展欧几里得算法就是在朴素的欧几里得算法上求一组未知数(x,y)的解,满足贝祖定理:\(ax+by=gcd(a,b)\)
int exgcd(int a,int b,int &x,int &y)
{
if(b==0)
{
x=1;y=0;
return a;
}
int r=exgcd(b,a%b,x,y);
int z=x;
x=y;y=z-a/b*y;
return r;
}
①解不定方程
②解线性同余方程
③求模的逆元
用扩展欧几里得算法求出解\(ax`+by`=gcd(a,b)\)
再分别乘上\(\frac{c}{gcd(a,b)}\)
当\(c\) \(mod\) \(gcd(a,b)\neq0\)时无解
即\[ax-my=b\]
\[ax+m(-y)=b\]
得出:
\[ax+my=b\]
同上解除即可。
由上式子可得\(x\equiv \frac{1}{a} (mod\) \(m)\)
所以 x是a的逆元
同②得:\(ax+my=1\)
解出x即可.
标签:spl floor 最大公约数 rac lin 表示 return 模的逆元 公约数
原文地址:https://www.cnblogs.com/Chandery/p/11332796.html