扩展欧几里得算法
要使用扩展欧几里得算法求解形如 $ ax + by = c $ 的二元一次方程的正整数解,需满足 $ c $ 是 $ \gcd(a,b) $ 的倍数(贝祖定理)。
一、判断方程是否有解
-
必要条件
方程 $ ax + by = c $ 有整数解当且仅当 $ \gcd(a,b) \mid c $(即 $ c $ 是 $ a $ 和 $ b $ 最大公约数的倍数)。
• 若 $ \gcd(a,b) \nmid c $,方程无解。 -
转化为标准形式
若 $ \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)\)
二、扩展欧几里得算法求特解
-
递归求解
使用扩展欧几里得算法,找到方程 $ 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'
$ -
调整解为原方程特解
原方程 \(ax + by = c\)的特解为:
\(x_0 = x_0' \cdot \frac{c}{g}, \quad y_0 = y_0' \cdot \frac{c}{g}\)
三、求通解并筛选正整数解
-
通解公式
方程的所有整数解可表示为:
\(x = x_0 + \frac{b}{g} \cdot t, \quad y = y_0 - \frac{a}{g} \cdot t \quad (t \in \mathbb{Z})\)
其中 \(t\)是任意整数。 -
筛选正整数解
解以下不等式组,找到使 \(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;
}