一、扩展欧几里得算法
1、裴蜀定理
对于任意正整数 a a a, b b b,那么一定存在非零整数 x x x, y y y,使得 a x + b y = e x g c d ( a , b ) ax+by=exgcd(a,b) ax+by=exgcd(a,b)
2、过程模拟
例如求 g c d ( a , b ) gcd(a,b) gcd(a,b)
∙ \bullet ∙当 b = 0 b=0 b=0 时,则可以直接返回 a a a 的值,即最大公约数,推理如下:
根据公式 a x + b y = e x g c d ( a , b ) ax+by=exgcd(a,b) ax+by=exgcd(a,b),得:
a × x + 0 × y = a a\times x+0\times y=a a×x+0×y=a
⇔ a × x = a \Lrarr a\times x=a ⇔a×x=a
⇔ x = 1 \Lrarr x=1 ⇔x=1
⇒ y = 0 \Rarr y=0 ⇒y=0
∙ \bullet ∙当 b ≠ 0 b\not =0 b=0 时,求得扩展欧几里得算法 e x g c d ( b , a % b , y , x ) exgcd(b,a\%b,y,x) exgcd(b,a%b,y,x),推理如下:
b y + ( a by+(a by+(a m o d mod mod b ) x = e x g c d ( a , b ) b)x=exgcd(a,b) b)x=exgcd(a,b)
⇒ a \rArr a ⇒a m o d mod mod b = a − ⌊ a b ⌋ b b=a-⌊\frac{a}{b}⌋b b=a−⌊ba⌋b
⇒ b y + ( a − ⌊ a b ⌋ b ) x = e x g c d ( a , b ) \rArr by+(a-⌊\frac{a}{b}⌋b)x=exgcd(a,b) ⇒by+(a−⌊ba⌋b)x=exgcd(a,b)
⇒ a x + b ( y − ⌊ a b ⌋ x ) = e x g c d ( a , b ) \rArr ax+b(y-⌊\frac{a}{b}⌋x)=exgcd(a,b) ⇒ax+b(y−⌊ba⌋x)=exgcd(a,b)
3、代码模板
// 求x, y,使得ax + by = gcd(a, b)
int exgcd(int a, int b, int &x, int &y)
{
if (!b)
{
x = 1; y = 0;
return a;
}
int d = exgcd(b, a % b, y, x);
y -= (a/b) * x;
return d;
}
二、线性同余方程
1、定义
给定 n n n 组数据 a i a_i ai, b i b_i bi, m i m_i mi,对于每组数求出一个 x i x_i xi,使其满足 a i × x i ≡ b i ( m o d a_i\times x_i\equiv b_i(mod ai×xi≡bi(mod m i ) m_i) mi)。
2、模拟过程
设 a = 2 a=2 a=2, b = 3 b=3 b=3, m = 6 m=6 m=6,此时以上并不满足条件。
设 a = 4 a=4 a=4, b = 3 b=3 b=3, m = 5 m=5 m=5,要使 4 x % 5 = 3 4x\%5=3 4x%5=3,所以 x = − 3 x=-3 x=−3或 x = 2 x=2 x=2
3、结论证明
a × x ≡ b ( m o d a\times x\equiv b(mod a×x≡b(mod m ) m) m)
⇔ \Lrarr ⇔ ∃ y ∈ Z \exist y\in Z ∃y∈Z,使得 a x = m y + b ax=my+b ax=my+b
⇔ a x − m y = b \Lrarr ax-my=b ⇔ax−my=b
⇔ y ′ = − y \Lrarr y'=-y ⇔y′=−y
⇔ a x + m y ′ = g c d ( a , m ) \Lrarr ax+my'=gcd(a,m) ⇔ax+my′=gcd(a,m)(条件: g c d ( a , m ) ∣ b gcd(a,m)|b gcd(a,m)∣b)