Loading

扩展欧几里得算法

要使用扩展欧几里得算法求解形如 $ ax + by = c $ 的二元一次方程的正整数解,需满足 $ c $ 是 $ \gcd(a,b) $ 的倍数(贝祖定理)。


一、判断方程是否有解

  1. 必要条件
    方程 $ ax + by = c $ 有整数解当且仅当 $ \gcd(a,b) \mid c $(即 $ c $ 是 $ a $ 和 $ b $ 最大公约数的倍数)。
    • 若 $ \gcd(a,b) \nmid c $,方程无解。

  2. 转化为标准形式
    若 $ \gcd(a,b) \mid c $,令 $ g = \gcd(a,b) $,将方程两边除以 \(g\),得到简化方程:
    \(a'x + b'y = \frac{c}{g} \quad (其中\ a' = \frac{a}{g},\ b' = \frac{b}{g},\ \gcd(a',b') = 1)\)


二、扩展欧几里得算法求特解

  1. 递归求解
    使用扩展欧几里得算法,找到方程 $ a'x + b'y = 1 $ 的一组整数解 $ (x_0', y_0') $ 。
    • 递归终止条件:当 $ b = 0 $ 时,\(x = 1\)\(y = 0\),返回 \(a\) 作为最大公约数。
    • 递归过程:通过 \(\gcd(b, a \% b)\) 回溯计算 \(x\)\(y\),公式为:
    $
    x = y', \quad y = x' - \left\lfloor \frac{a}{b} \right\rfloor \cdot y'
    $

  2. 调整解为原方程特解
    原方程 \(ax + by = c\)的特解为:
    \(x_0 = x_0' \cdot \frac{c}{g}, \quad y_0 = y_0' \cdot \frac{c}{g}\)


三、求通解并筛选正整数解

  1. 通解公式
    方程的所有整数解可表示为:
    \(x = x_0 + \frac{b}{g} \cdot t, \quad y = y_0 - \frac{a}{g} \cdot t \quad (t \in \mathbb{Z})\)
    其中 \(t\)是任意整数。

  2. 筛选正整数解
    解以下不等式组,找到使 \(x > 0\)\(y > 0\)的整数 \(t\)
    \( \begin{cases} x_0 + \frac{b}{g} \cdot t > 0 \\ y_0 - \frac{a}{g} \cdot t > 0 \end{cases} \)
    • 联立解出 \(t\)的范围,并取整数值。


四、代码实现

void exgcd(int &x,int &y,int a,int b)
{
    if(!b)
    {
        x=1;
        y=0;
        return;
    }
    exgcd(x,y,b,a%b);
    int t=x;
    x=y;
    y=t-a/b*y;
}
posted @ 2025-04-02 21:39  C_noized  阅读(28)  评论(0)    收藏  举报