扩展欧几里得

扩展欧几里得算法

a x + b y = d ax+by=d ax+by=d 的一组解, d = gcd ⁡ ( a , b ) d = \gcd(a,b) d=gcd(a,b)

辗转相除递归求解。

假设已经求出 b x + ( b   m o d   a ) y = d bx + (b \bmod a)y = d bx+(bmoda)y=d 的一组解。

a x + b y = b x ′ + ( b   m o d   a ) y ′ = b x ′ + ( b − b × ⌊ a b ⌋ ) y ′ = a y ′ + b ( x ′ − ⌊ a b ⌋ y ′ ) ax+by=bx'+(b\bmod a)y'\\ =bx'+(b-b \times \lfloor\frac{a}{b} \rfloor)y'\\ =ay'+b(x'- \lfloor\frac{a}{b}\rfloor y') ax+by=bx+(bmoda)y=bx+(bb×ba⌋)y=ay+b(xbay)

x = y ′ , y = x ′ − ⌊ a b ⌋ y ′ x = y', y = x' - \lfloor\frac{a}{b} \rfloor y' x=y,y=xbay。递归计算即可。 b = 0 b = 0 b=0 时,由辗转相除得 a = d a = d a=d,则 x = 1 , y = 0 x=1,y=0 x=1,y=0 显然是一组解。

void exgcd(int a, int b, int &x, int &y)
{
	if(b == 0) return x = 1, y = 0, void();
	exgcd(b, b%a, y, x), y -= (a / b) * x;
}

扩欧求逆元

a a a 在模 p p p 下得逆元,等价于求 a x ≡ 1 ( m o d p ) ax \equiv 1 \pmod p ax1(modp),等价于 a x + p y ≡ 1 ( m o d p ) ax +py \equiv 1 \pmod p ax+py1(modp) gcd ⁡ ( a , p ) = 1 \gcd(a,p)=1 gcd(a,p)=1 时才有解,即 a a a 有逆元。

裴属定理

我们对问题加以扩展,求解 a x + b y = c ax + by = c ax+by=c

裴属定理:方程有解当且仅当 gcd ⁡ ( a , b ) ∣ c \gcd(a,b) \mid c gcd(a,b)c

若方程有解,则用扩欧求出 a x + b y = d ax + by = d ax+by=d 对一组特解后乘以 c d \frac c d dc 即可(由裴属定理得 c d \frac c d dc 为整数)。

再找出特解后,加上 a x + b y = 0 ax+by=0 ax+by=0 的解即可得到该不定方程的通解。

你可能感兴趣的:(学习笔记,c++)