扩展欧几里得算法

拉梅定理:用欧几里得算法计算两个正整数的最大公因子时,所需的除法次数不会超过两个整数中较小的那个十进制整数的五倍,

拉梅定理推论:求两个正整数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.
代码:
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)嘛~】
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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值