8.12.9 ACM-ICPC数学 裴蜀定理
引入
裴蜀定理,又称贝祖定理或欧几里德定理,是一个重要的数论结论,它为我们寻找两个数的线性组合提供了一个数学依据。定理的核心在于,给定两个正整数 𝑎a 和 𝑏b,我们可以通过找到它们的最大公约数来构造它们的线性组合。
定理的定义
裴蜀定理: 对于任意两个正整数 𝑎a 和 𝑏b,存在整数 𝑥x 和 𝑦y,使得它们的线性组合 𝑎𝑥+𝑏𝑦ax+by 等于它们的最大公约数,即
gcd(𝑎,𝑏)=𝑎𝑥+𝑏𝑦。gcd(a,b)=ax+by。
其中,gcdgcd 表示两个数的最大公约数。
示例
假设我们给定两个数 𝑎=56a=56 和 𝑏=32b=32,我们想找到它们的线性组合,使得
56𝑥+32𝑦=gcd(56,32)。56x+32y=gcd(56,32)。
通过计算可得它们的最大公约数是 8。根据裴蜀定理,我们可以找到两个整数 𝑥=−1x=−1 和 𝑦=2y=2,使得:
56×−1+32×2=8。56×−1+32×2=8。
因此,我们证明了裴蜀定理的正确性。
扩展欧几里德算法
我们可以通过扩展欧几里德算法来找出符合裴蜀定理的整数 𝑥x 和 𝑦y。其算法流程如下:
- 使用欧几里德算法计算两个数 𝑎a 和 𝑏b 的最大公约数。
- 在计算最大公约数的过程中,通过递归或迭代的方式,求解对应的线性组合系数。
C++ 代码实现如下:
#include <iostream>
// 扩展欧几里德算法,返回 gcd,同时计算线性组合系数 x 和 y
int gcdExtended(int a, int b, int &x, int &y) {
// 基本情况
if (a == 0) {
x = 0;
y = 1;
return b;
}
// 递归计算 gcd,并更新 x 和 y
int x1, y1; // 用于存储递归调用的结果
int gcd = gcdExtended(b % a, a, x1, y1);
// 更新当前的 x 和 y
x = y1 - (b / a) * x1;
y = x1;
return gcd;
}
int main() {
int a = 56;
int b = 32;
int x, y;
int gcd = gcdExtended(a, b, x, y);
std::cout << "GCD(" << a << ", " << b << ") = " << gcd << std::endl;
std::cout << "Coefficients x and y: x = " << x << ", y = " << y << std::endl;
std::cout << "Linear combination: " << a << " * " << x << " + " << b << " * " << y << " = " << gcd << std::endl;
return 0;
}
应用
裴蜀定理在算法竞赛和实际工程中有广泛应用,例如:
-
求模逆元: 在模数 𝑚m 下,若 gcd(𝑎,𝑚)=1gcd(a,m)=1,则 𝑎a 存在唯一的逆元 𝑥x,使得 𝑎𝑥≡1(mod𝑚)ax≡1(modm)。该逆元可以使用扩展欧几里德算法快速求得。
-
同余方程: 裴蜀定理可以用于求解形如 𝑎𝑥≡𝑏(mod𝑚)ax≡b(modm) 的同余方程。
-
线性丢番图方程: 给定方程 𝑎𝑥+𝑏𝑦=𝑐ax+by=c,如果 gcd(𝑎,𝑏)∣𝑐gcd(a,b)∣c,则可以使用扩展欧几里德算法找到整数解。
通过理解裴蜀定理和扩展欧几里德算法,我们可以更好地掌握数论问题的求解技巧,在 ACM-ICPC 等竞赛中实现更快速高效的算法。