拉梅定理:用欧几里得算法计算两个正整数的最大公因子时,所需的除法次数不会超过两个整数中较小的那个十进制整数的五倍,
拉梅定理推论:求两个正整数a,b,a>b的最大公因子需要O(log2a)^3次位运算。
由扩展欧几里得算法知:如果gcd(a,b)==1,则称a,b互素。
整数a,b互素的充分必要条件是:存在整数x和y,使得xa+yb==1;
应用于以下三方面:
1.求解不定方程。
2.求解模的逆元。
3.求解同余方程。
扩展欧几里德算法是用来在已知a, b求解一组x,y [x,y都是整数],使它们满足贝祖等式: ax+by = gcd(a, b) =d(解一定存在,根据数论中的相关定理)。扩展欧几里德常用在求解模线性方程及方程组中。 ——百度百科
用到的几个欧几里得重要结论:1) gcd(a,b) = gcd(b,a %b);
2) gcd(a,0) = a.
代码:
2) gcd(a,0) = a.
代码:
ll ex_gcd(ll a,ll b,ll& x,ll& y)
{
if(b==0)
{
x=1,y=0;
return a;
}
ll r,tx,ty;
r=ex_gcd(b,a%b,tx,ty);
x=ty;
y=tx-a/b*ty;
return r;
}
设如下两个方程:
ax+by = gcd(a,b) = d;
bx’+(a%b)y’ = gcd(b,a%b);
那么由重要结论(1)有gcd(a,b) = gcd(b,a %b),
那么ax+by = bx’+(a%b)y’ = bx’ +(a – [a/b]*b)y’ = ay’ + b(x’ – [a/b]y’),
由恒等关系有: x = y’ , y = (x’ – [a/b]y’),[a/b]表示a/b的值向下取整。
……..
那么现在就可以用exgcd(a,b,d,x,y)表示方程ax+by = d,那么由上面一直递归下去,直到 b = 0,递归结束,此时 d = gcd(a,0) =a , x = 1,y =0;【因为 ax+0*y = gcd(a,0)嘛~】
ax+by = gcd(a,b) = d;
bx’+(a%b)y’ = gcd(b,a%b);
那么由重要结论(1)有gcd(a,b) = gcd(b,a %b),
那么ax+by = bx’+(a%b)y’ = bx’ +(a – [a/b]*b)y’ = ay’ + b(x’ – [a/b]y’),
由恒等关系有: x = y’ , y = (x’ – [a/b]y’),[a/b]表示a/b的值向下取整。
……..
那么现在就可以用exgcd(a,b,d,x,y)表示方程ax+by = d,那么由上面一直递归下去,直到 b = 0,递归结束,此时 d = gcd(a,0) =a , x = 1,y =0;【因为 ax+0*y = gcd(a,0)嘛~】
void exgcd(ll a, ll b, ll& d, ll& x, ll &y) {
if(!b)
{
d = a,x = 1, y = 0;
}
else
{
exgcd(b, a % b, d, y, x);
y -= x * (a / b);
}
}
void exgcd(int a,int b,int &x,int &y)
{
if(b==0)
{
x=1;
y=0;
return;
}
int tx,ty;
exgcd(b,a%b,tx,ty);
int tmp=tx;
x=ty;
y=tmp-(a/b)*ty;
}