拓展欧几里得(求解 ax+by=c 求x,y)

int extend_Euclid(int a, int b, int &x, int &y)
{
    if(b==0)
    {
        x = 1;
        y = 0;
        return a;
    }
    int r = extend_Euclid(b, a%b, y, x);
    y -= a/b*x; //这里已经是递归,回溯的过程了,x,y已经颠倒了
    return r;
}

以上是求 a*x +b*y == gcd(a,b)某一组特解X1,Y1的过程

所以a*x + b*y == gcd(a,b)的通解为 X = X1 - b/gcd(a,b)*t

                                                              Y = Y1 + a/gcd(a,b)*t        t为任意整数。

### 扩展欧几里得算法求解过程中的x值含义及应用 #### x值的定义与意义 在扩展欧几里得算法中,\( x \) 是指满足 \( ax + by = gcd(a, b) \) 方程的一个特定整数解。这里 \( a \) \( b \) 是给定的两个正整数,而 \( gcd(a,b) \) 表示这两个数的最大公约数[^1]。 对于任意一对互质的整数 \( (a, b) \),存在无穷多组整系数 \( (x,y) \),使得上述线性组合等于它们的最大公因数。特别地,在实际编程实现时通常只关心其中一个特解——即最小绝对值的那个 \( x_0 \)[^3]。 #### 计算方法概述 为了找到这样的 \( x \),可以采用递归方式来逐步缩小问题规模直到可以直接得出结果为止: - 如果 \( b=0 \),则显然此时 \( gcd=a \), 并且对应的 \( x=1 \); 同理可设 \( y=0 \). - 对于一般情况 (\( b>0\)), 则先计算 \( d=gcd(b,a \% b)\),并假设已经找到了一组解 \( (x',y')\) 使 \( bx'+(a \% b)y'=d \). 接下来利用关系式 \( a \% b=a-b[a/b]\)(其中[]表示取整运算),重新整理得到原方程的一组新解\[ x=y'\quad and\quad y=x'-[a/b]*y'.\] 此过程不仅能够获得最大公约数值本身,同时也得到了相应的贝祖等式的具体表达形式,从而实现了对未知量 \( x \) 的有效求解[^4]. #### 应用实例分析 考虑如下场景:已知模反元素的存在前提是两数之间必须互素(即其最大公约数为1)。因此如果想要寻找某个整数 \( A \) 关于另一个整数 \( M \) 下面的乘法逆元的话,就可以借助该算法完成验证以及最终确定操作对象之间的倍率关系了。一旦确认两者确实具备这种性质之后,便可通过调整参数设置让程序输出符合条件的结果出来,比如下面这段Python代码片段展示了如何做这件事: ```python def extended_gcd(a, b): if b == 0: return (1, 0, a) else: q, r = divmod(a, b) x, y, g = extended_gcd(b, r) return (y, x-q*y, g) # 寻找A关于M下的乘法逆元 def mod_inverse(A,M): x,_ ,g=extended_gcd(A,M) if g!=1:# 只有当gcd==1的时候才有解 raise ValueError('No modular inverse exists') else : return x%M # 确保返回正值 print(mod_inverse(3,11)) # 输出7因为3*7%11=1 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值