拓展欧几里德算法

拓展欧几里德算法

定义

已知整数a,b,必存在整数x,y,使得
ax + by = gcd(a,b).

例子

用类似辗转相除法,求二元一次不定方程 47x+30y=1的整数解。

  • 47 = 30 × 1 + 17
  • 30 = 17 × 1 + 13
  • 17 = 13 × 1 + 4
  • 13 = 4 × 3 + 1

然后把它们改写成“余数等于”的形式

  • 17 = 47 × 1 + 30 × (-1) //式1
  • 13 = 30 × 1 + 17 × (-1) //式2
  • 4 = 17 × 1 + 13 × (-1) //式3
  • 1 = 13 × 1 + 4 × (-3)

然后把它们“倒回去”

  • 1 = 13 × 1 + 4 × (-3)
  • 1 = 13 ×1 + [17 × 1 + 13 × (-1)] * (-3) //应用式3
  • 1 = 17 × (-3) + 13 × 4
  • 1 = 17 × (-3) + [30 × 1 + 17 × (-1)] × 4 //应用式2
  • 1 = 30 × 4 + 17 × (-7)
  • 1 = 30 × 4 + [47 × 1 + 30 × (-1)] × (-7) //应用式1
  • 1 = 47 × (-7) + 30 × 11
    得解 x=-7, y=11 。

这个过程可以用矩阵表示(其中q表示商,r表示余数)

(a b)=Ni=0(qi110)(rN10)

(47 30)=(1110)(1110)(1110)(3110)(4110)(10)= (4730117)(10)(10)=(7301147)(4730)

或者用[[初等变换]]
471030011711300117111312
423131242317111=47(7)+30(11)

代码

int gcdEx(int a, int b, int *x, int *y) 
 {
     if(b==0)
     {
         *x = 1,*y = 0;
         return a;
     }
     else
     {
         int r = gcdEx(b, a%b, x, y); /* r = GCD(a, b) = GCD(b, a%b) */
         int t = *x;
         *x = *y;
         *y = t - a/b * *y;
         return r;
     }
 }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值