扩展欧几里得算法求逆元(公式推导)

本文介绍了如何使用贝祖定理和扩展欧几里得算法求解两个数的模逆问题,通过递归计算最大公约数和逆元,并提供了C++代码实现。

1.公式推导

假设现在有两个数x,y,求x mod y的逆元。

1.贝祖定理:任意两个整数a,b,最大公约数为d=gcd(a,b),那么对于任意的整数x,y,ax+by=m,构成的m一定是d的整数倍(即m%d=0)。

2.设第一个等式为ax0+by0=gcd(x0,y0),第二个等式为bx1+(a%b)y1=gcd(b,a%b),则x0=y1,y0=x1-(a/b)y1,详细推导见下图。

3.最后返回的gcd一定等于1,否则逆元不存在。

4.当y=0时,x=1,a=1(此时a是最大公约数)。

2.代码

int extendedGCD(int a, int m, int& x, int& y) {
    if (m == 0) {
        x = 1;
        y = 0;
        return a;
    }

    int x1, y1;
    int gcd = extendedGCD(m, a % m, x1, y1);
    //得到上一个x0和y0
    x = y1;
    y = x1 - (a / m) * y1;

    return gcd;
}

// 计算逆元
int modInverse(int a, int m) {
    int x, y;
    int gcd = extendedGCD(a, m, x, y);

    if (gcd != 1) {
        // 如果最大公约数不是 1,则没有逆元
        std::cerr << "逆元不存在,因为最大公约数不是1。" << std::endl;
        return -1;
    }

    // 确保逆元为正数
    retu
### 扩展欧几里得算法的实现与原理 #### 1. 原理 扩展欧几里得算法是基于欧几里得算法的一种扩展,用于求解两个整数 \(a\) 和 \(b\) 的线性组合形式 \(ax + by = \gcd(a, b)\) 中的 \(x\) 和 \(y\)。其核心思想是通过递归地计算最大公约数,并在回溯过程中逐步确定系数 \(x\) 和 \(y\)。 在递归边界时,当 \(b = 0\),此时 \(\gcd(a, b) = a\),并且可以得到一个特解 \(x = 1\) 和 \(y = 0\)。对于其他情况,假设已经求得 \(\gcd(b, a \% b)\) 的解为 \(x_1\) 和 \(y_1\),则可以通过以下公式推导出当前问题的解: \[ x = y_1 \] \[ y = x_1 - \left\lfloor \frac{a}{b} \right\rfloor \cdot y_1 \] 这一过程保证了从递归边界逐步向上回溯时,能够正确计算出所有中间状态下的 \(x\) 和 \(y\) 值[^4]。 #### 2. 实现 以下是扩展欧几里得算法在 C 语言中的实现代码: ```c #include <stdio.h> // 扩展欧几里得算法函数 void extended_gcd(int a, int b, int *x, int *y) { if (b == 0) { *x = 1; *y = 0; return; } int x1, y1; extended_gcd(b, a % b, &x1, &y1); *x = y1; *y = x1 - (a / b) * y1; } int main() { int a = 765, b = 12348; int x, y; extended_gcd(a, b, &x, &y); printf("对于方程 %dx + %dy = gcd(%d, %d),解为 x = %d, y = %d\n", a, b, a, b, x, y); return 0; } ``` #### 3. 应用场景 扩展欧几里得算法不仅用于求解线性不定方程 \(ax + by = \gcd(a, b)\),还广泛应用于模逆元的计算。例如,在模数 \(m\) 下,如果 \(\gcd(a, m) = 1\),则可以通过扩展欧几里得算法求解 \(ax + my = 1\) 中的 \(x\),从而得到 \(a\) 在模 \(m\) 下的乘法逆元 \((x \% m + m) \% m\) [^2]。 此外,扩展欧几里得算法还可用于解决更复杂的线性同余方程组。例如,对于形如 \(ax + by + c = 0\) 的方程,首先通过扩展欧几里得算法求解 \(ax + by = \gcd(a, b)\) 的特解 \(x_1, y_1\),然后将结果缩放至满足原方程的形式 [^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值