欧几里得算法:
欧几里得定理:
gcd(a,b)=gcd(b,amodb)
证明:
a 可以表示成 a = kb + r(a,b,k,r皆为正整数,且 r < b),则 r = a mod b
假设 d 是 a , b 的一个公约数,记作 d | a , d | b,即 a 和 b 都可以被 d 整除。
而 r = a - kb,两边同时除以 d,r / d = a / d - kb / d = m,由等式右边可知m为整数,因此 d | r
因此 d 也是 b , a mod b 的公约数
假设 d 是 b , a mod b 的公约数, 则 d | b , d | (a - k * b) , k 是一个整数,
进而 d | a .因此 d 也是 a , b 的公约数
因此(a , b)和(b,a mod b)的公约数是一样的,其最大公约数也必然相等,得证。
代码:
int gcd(int a,int b)
{
return b==0?a:gcd(b,a%b);
}
扩展欧几里得算法:
描述:
求形如 ax+by=gcd(a,b) 的不定方程的一组解,且保证求出的 |x|+|y| 最小。
代码
int exgcd(int a,int b,int &x,int &y)
{
if(b==0)//递归边界
{
x=1,y=0;
return a;
}
else
{
exgcd(b,a%b,x,y);
int t=x;
x=y;
y=t-a/b*y;
}
}
证明(字写的丑请见谅):
用途:
1.解不定方程
ax+by=gcd(a,b)
(废话- -||)
2.在
O(logn)
时间内求乘法逆元
3.求解线性同余方程(转化成上述的不定方程来解)