裴蜀定理与扩展欧几里得算法
前言
在算法竞赛的数论版图中,裴蜀定理和扩展欧几里得算法是解决线性不定方程、同余方程、乘法逆元等核心问题的底层支撑。它们不仅是判定方程是否有解的工具,还能精准求出解的具体形式,更是后续学习中国剩余定理、模运算优化等高级内容的基础。
一、裴蜀定理:不定方程有解的判定准则
1.1 定理的核心表述
裴蜀定理(又称贝祖定理)是数论中关于线性不定方程的基础定理,其核心表述为:
对于任意整数 a、b,一定存在整数 x、y,使得 ax+by=gcd(a,b)。
其中 gcd(a,b) 表示 a 和 b 的最大公约数。这个定理揭示了线性不定方程有解的本质条件 —— 方程 ax+by=c 有整数解的充要条件是 gcd(a,b)∣c(即 c 能被 a 和 b 的最大公约数整除)。
直观示例验证
取 a=6,b=8:gcd(6,8)=2,根据裴蜀定理,存在整数 x、y 使得 6x+8y=2。例如 x=-1,y=1(6×(-1)+8×1=2);取 a=5,b=7:gcd(5,7)=1,存在整数 x=3,y=-2 使得 5×3+7×(-2)=1;反例:方程 6x+8y=3 无解,因为 gcd(6,8)=2 不能整除 3。
1.2 定理的重要推论
裴蜀定理可以推广到多个整数的情况,其核心推论有两个,是解决复杂问题的关键:
- 二元推广:对于整数 a、b 和任意整数 n,一定存在整数 x、y 使得 ax+by=gcd(a,b)×n。这意味着,线性不定方程 ax+by=c 有解的充要条件是 gcd(a,b)∣c。
- 多元推广:对于整数 a1,a2,...,ak,一定存在整数 x1,x2,...,xk 使得 a1x1+a2x2+...+akxk=gcd(a1,a2,...,ak)×n(n 为整数)。
推论的实际意义
以二元推广为例,当我们遇到方程 ax+by=c 时,无需盲目求解,先计算 gcd(a,b) 并判断是否能整除 c:若不能整除,直接判定无解;若能整除,再进一步求解,可大幅节省时间。
1.3 定理的关键注意点
- 正负性不影响:a、b 的正负对定理结果无影响。若 ax+by=d 有解,则 a(-x)+(-b)y=-d 也有解,只需在解的基础上调整符号即可。
- 解的存在性≠唯一性:裴蜀定理仅保证解的存在性,若方程有解,则一定有无穷多组解(后续扩展欧几里得算法会给出通解形式)。
- gcd 的核心地位:无论 a、b 多大,方程 ax+by=c 的有解性完全由 gcd(a,b) 和 c 的整除关系决定。
1.4 实战例题:洛谷 P4549【模板】裴蜀定理
题目分析
题目描述:给定包含 n 个元素的整数序列 A,求另一个整数序列 X,使得 ∑Ai×Xi 且 S 尽可能小。
输入描述:第一行一个整数 n,第二行 n 个整数表示序列 A。
输出描述:一行一个整数,表示满足条件的最小 S。
示例输入:2 4059 -1782 → 输出:99。
核心思路:根据裴蜀定理的多元推广,∑Ai×Xi 的所有可能结果都是 gcd(A1,A2,...,An) 的倍数。因此,最小的正结果就是所有元素的最大公约数的绝对值(因为序列中可能有负数,gcd 本身非负)。
C++ 实现
#include <iostream>
#include <cmath>
using namespace std;
// 欧几里得算法求 gcd
{
b == ? a : (b, a % b);
}
{
ios::();
cin.();
n;
cin >> n;
ret;
cin >> ret;
ret = (ret);
( i = ; i <= n; ++i) {
x;
cin >> x;
ret = (ret, (x));
(ret == ) ;
}
cout << ret << endl;
;
}


