欧几里得算法

欧几里得算法

定理1:gcd(a,b) = gcd(b,a-b)(a>b)
证明:
令c = gcd(a,b) , a = mc , b = nc
有:a-b = (m-n)c , gcd(b,a-b) = gcd(nc,(m-n)c)
假设: n与m-n 存在除1之外的公因数 L ,则有n = k1L, (m-n) = k2L
n/k1 = (m-n)/k2 整理得到 k1*m = (k1+k2)*n 但是由gcd(a,b) = gcd(mc,nc) = c可知,n与m互质,所以假设不成立,则n与(m-n)也互为质数
所以 gcd(b,a-b) = gcd(nc,(m-n)c) = c = gcd(a,b)

定理2:gcd(a,b)=gcd(b,a%b)(a>b)
由定理1 容易证明

应用

  • 辗转相除法求最大公约数
int gcd(int a,int b)//a>b
{
    if(b==0)
        return a;
    return gcd(b,a%b);
}
  • 对于任何a 和 b,求ax + by = gcd(a,b)
    由定理gcd(a,b) = gcd(b,a%b) 可知
    b * x1+(a%b) * y1= gcd(a,b)
    b * x1+(a-a/b * b) * y1 = gcd(a,b)
    b * x1+a * y1 -(a/b) * b * y1 = gcd(a,b)
    a * y1 + b(x1 - (a/b) * y1) = gcd(a,b)
    因为ax+by = gcd(a,b)
    x = y1,y = x1 - (a/b) * y1

然后对gcd(b,a%b) 再进行 定理二的转换直到 (a%b)==0
即a(n) * xn + b(n)yn = gcd(a,b)
即 a(n) * xn = gcd(a,b)
得:xn = 1 yn = 0
然后通过逆推,我们就可以得到a
x + 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;
}

通解:
X = x+b/gcd(a,b) * t
Y = y+a/gcd(a,b) * t
(x和y是特解)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值