欧几里得扩展

源网址
欧几里得扩展证明(自我感觉最好懂得一种写法)
欧几里得扩展公式
一定存在 x,y 使得
a ∗ x + b ∗ y = g c d ( a , b ) a*x +b*y = gcd(a,b) ax+by=gcd(a,b)

① 当b = 0 时, g c d ( a , b ) = a gcd(a, b) = a gcd(a,b)=a, 此时 x = 1, y = 0;

② 当 a ∗ b ≠ 0 a * b \not = 0 ab=0 时,

a ∗ x + b ∗ y = g c d ( a , b ) a * x + b * y = gcd(a, b) ax+by=gcd(a,b); (1)

同时有 b ∗ x 0 + ( a % b ) ∗ y 0 = g c d ( b , a % b ) b * x_0 + (a \% b) * y_0 = gcd( b, a \% b) bx0+(a%b)y0=gcd(b,a%b); (2)

由朴素的欧几里德公式: g c d ( a , b ) = g c d ( b , a % b ) gcd(a, b) = gcd (b, a \% b) gcd(a,b)=gcd(b,a%b)

得(1),(2)

a * x + b * y        = b * x0 + (a % b) * y0

                     = b * x0 + (a – a / b * b) * y0               

                     = a * y0 + ( x0 – a / b * y0 ) * b

          所以 x = y0, y = x0 – a / b * y0;

由此可以得出扩展欧几里德的递归程序

long long ext_gcd(long long a,long long b,LL &x,LL &y)
{
    
    if(b==0)
    {
        x = 1,y = 0;
        return a;
    }
    LL m;
    m = ext_gcd(b,a%b,y,x);
    y -= a / b * x; 
    return m;

}

实际问题

在实际问题中,一般直接把a,b 先除以最大公约数

转化成 a 1 ∗ x + b 1 ∗ y = 1 a_1*x+b_1*y = 1 a1x+b1y=1 这种形式思考比较容易
x = x + t ∗ b 1 ; x = x +t*b_1; x=x+tb1;
y = y − t ∗ a 1 ; y = y - t*a_1; y=yta1;

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值