gcd与exgcd(裴蜀定理)

gcd(欧几里得算法)与最大公因数

  1. 公式: g c d ( a , b ) = g c d ( b , a gcd(a,b)=gcd(b,a gcd(a,b)=gcd(b,a%b ) ) )

  2. 证明:
    a > b a>b a>b,证明 a , b a,b a,b的公因数和 b , a − b b,a-b b,ab的公因数是同样的一堆数
    首先,有结论:若 x ∣ a , x ∣ b , 那么 x ∣ ( a − b ) x|a,x|b,那么x|(a-b) xa,xb,那么x(ab).
    a a a b b b的公因子集合为 S 1 S1 S1 b b b ( a – b ) (a – b) (ab)的公因子集合为 S 2 S2 S2。那么,
    对于任意的 x ∈ S 1 x∈S1 xS1,有 x ∣ a x|a xa,且 x ∣ b x|b xb,所以 x ∣ ( a – b ) x|(a – b) x(ab),则 x x x ∈ \in S2 ,于是 ,于是 ,于是S1$ ⊂ \subset S 2 S2 S2
    对于任意的 x ∈ S 2 x∈S2 xS2,有 x ∣ b x|b xb,且 x ∣ ( a – b ) x|(a – b) x(ab),所以 x ∣ a x|a xa,则 x ∈ S 1 x∈S1 xS1,于是 S 2 S2 S2 ⊂ \subset S 1 S1 S1
    所以 S 1 = S 2 S1=S2 S1=S2 g c d ( a , b ) = m a x ( S 1 ) = m a x ( S 2 ) = g c d ( b , a – b ) gcd(a, b) = max(S1) = max(S2) = gcd(b, a – b) gcd(a,b)=max(S1)=max(S2)=gcd(b,ab)
    证明了 g c d ( a , b ) = g c d ( b , a – b ) gcd(a, b) = gcd(b, a – b) gcd(a,b)=gcd(b,ab),也就可以进一步证明 g c d ( a , b ) = g c d ( b , a m o d b ) gcd(a, b) = gcd(b, a mod b) gcd(a,b)=gcd(b,amodb)

  3. 代码:

#define ll long long
ll gcd(ll a,ll b)
{
	if(b==0)return a;
	else rteutn gcd(b,a%b);
}
  1. 复杂度: O ( l o g 2 m a x ( a , b ) ) O(log_2max(a,b)) O(log2max(a,b))

exgcd(扩展欧几里得算法)

  1. 前置知识:裴蜀定理 q w q qwq qwq
    (1) 对任何 a , b ∈ Z a,b∈Z a,bZ和它们的最大公约数 d d d,关于未知数 x x x y y y的线性不定方程(称为裴蜀等式): a x + b y = c ax+by=c ax+by=c有整数解 ( x , y ) (x,y) (x,y)当且仅当 d ∣ c d∣c dc,可知有无穷多解。特别地,一定存在整数 x x x, y y y,使 a x + b y = d ax+by=d ax+by=d成立。
    ( 2 )推论:
    a a a, b b b互质的充要条件是存在整数 x x x, y y y使 a x + b y = 1 ax+by=1 ax+by=1
    ( 3 )证明:
    A : A: A:对于 ( a , b ∈ Z ) (a,b∈Z) (a,bZ) a x + b y = g c d ( a , b ) ax+by=gcd(a,b) ax+by=gcd(a,b)一定有整数解 x , y x,y x,y
    d = g c d ( a , b ) d=gcd(a,b) d=gcd(a,b),可得 d ∣ a , d ∣ b , d ∣ ( a x + b y ) d|a,d|b,d|(ax+by) da,db,d(ax+by)
    满足对于某个 x , y x,y x,y ∈ \in Z Z Z,有 n = a x + b y n=ax+by n=ax+by n n n的集合叫 a a a b b b的线性组合集,设 s s s a a a b b b的线性组合集中最小的元素。
    q = q= q= ⌊ \lfloor a s \frac {a}{s} sa ⌋ \rfloor 则有 r = r= r= a a a m o d mod mod s s s = a − q s = a − q ( a x + b y ) = a ( 1 − q x ) + b ( − q y ) =a-qs=a-q(ax+by)=a(1-qx)+b(-qy) =aqs=aq(ax+by)=a(1qx)+b(qy)所以 r r r也是 a a a b b b的线性组合集中的元素。已知 s s s是这个线性组合集中的最小正整数, 0 0 0 ≤ \leq r r r ≤ \leq s s s,所以 r = 0 r=0 r=0。所以 s ∣ a s|a sa。同理 s ∣ b s|b sb。所以 s s s a 与 b a与b ab的公因数。
    因为 d d d是最大公约数,所以 d d d ≤ \leq s s s
    因为对于任意 x , y ∈ Z x,y∈Z x,yZ,有 d ∣ ( a x + b y ) d∣(ax+by) d(ax+by),而对于某个 x , y ∈ Z x,y∈Z x,yZ,有 s = a x + b y s=ax+by s=ax+by,所以有 d ∣ s d∣s ds,故 d d d ≥ \geq s s s
    显然, s = d s=d s=d 所以 s = g c d ( a , b ) s=gcd(a,b) s=gcd(a,b)
    根据 s s s的定义, s s s a a a b b b的线性组合集中的最小正元素,故 a x + b y = g c d ( a , b ) ax+by=gcd(a,b) ax+by=gcd(a,b)一定有整数解 x , y x,y x,y,亦可知对于 a , b ∈ Z a,b∈Z a,bZ g c d ( a , b ) gcd(a,b) gcd(a,b) a x + b y ( x , y ∈ Z ) ax+by(x,y∈Z) ax+by(x,yZ)的最小正元素
    B : B: B:对于 ( a , b ∈ Z ) , a x + b y = c (a,b∈Z),ax+by=c (a,bZ)ax+by=c有整数解的条件是 g c d ( a , b ) ∣ c gcd(a,b)∣c gcd(a,b)c
    充分性:设 d = g c d ( a , b ) d=gcd(a,b) d=gcd(a,b),已知 a x + b y = d ax+by=d ax+by=d一定有整数解,设其解为 ( x 0 , y 0 ) (x0,y0) (x0,y0) d ∣ c d∣c dc,则存在 k ∈ Z k∈Z kZ,使得 c = k d = k ( a x + b y ) = a ( k x ) + b ( k y ) c=kd=k(ax+by)=a(kx)+b(ky) c=kd=k(ax+by)=a(kx)+b(ky),即解为 ( k x 0 , k y 0 ) (kx0,ky0) (kx0,ky0)
    必要性:因 a x 1 + b y 1 = c , x 1 , y 1 ∈ Z ax1+by1=c,x1,y1∈Z ax1+by1=cx1,y1Z,设 d = g c d ( a , b ) d=gcd(a,b) d=gcd(a,b),有 d ∣ a d∣a da d ∣ b d∣b db d ∣ ( a x 1 , b y 1 ) d∣(ax1,by1) d(ax1,by1),即 d ∣ c d∣c dc
    是不是简单易懂!!!
    是不是简单易懂!!!
    是不是简单易懂!!!

  2. exgcd
    exgcd可以用来判断并求解形如 a x + b y = c ax +by = c ax+by=c 的方程,当且仅当 g c d ( a , b ) ∣ c gcd(a, b) | c gcd(a,b)c时,存在整数解 x , y x, y x,y(证明:裴蜀定理)。
    于是它也可以用来求逆元(链接在下面噻qwq)

  3. 怎么求解?
    a x + b y = g c d ( a , b ) ax+by=gcd(a,b) ax+by=gcd(a,b)可以化成 a y + b ( x − ay+b(x- ay+b(x ⌊ \lfloor a b \frac{a}{b} ba ⌋ \rfloor ) x = g c d ( a , b ) )x=gcd(a,b) )x=gcd(a,b)然后可以在gcd的循环过程中完成计算
    可以背代码,但是如果理解的话,就可以当场现推了!!!
    个人认为,还是重在理解,背代码没有灵魂

  4. 怎么现推呢 q w q qwq qwq
    g c d ( a , b ) = g c d ( b , a gcd(a,b)=gcd(b,a gcd(a,b)=gcd(b,a m o d mod mod b ) b) b),在gcd递归中我们会使 a = b , b = a a=b,b=a a=b,b=a m o d mod mod b b b.
    则有方程 b ∗ x 1 + ( a b *x_1 +(a bx1+(a m o d mod mod b ) ∗ y 1 = g c d ( b , a b) * y_1 = gcd(b, a b)y1=gcd(b,a m o d mod mod b ) = g c d ( a , b ) b)=gcd(a,b) b)=gcd(a,b)
    a a a m o d mod mod b b b拆开写
    可以得到 b ∗ x 1 + ( a − b ∗ ⌊ a / b ⌋ ) ∗ y 1 = g c d ( a , b ) b * x_1 + (a - b * ⌊a / b⌋) * y_1 =gcd(a, b) bx1+(aba/b⌋)y1=gcd(a,b)
    前置知识乘法分配律hhhh
    即: a ∗ y 1 + b ∗ ( x 1 − ⌊ a / b ⌋ ∗ y 1 ) = g c d ( a , b ) a * y_1 +b * (x_1 - ⌊a / b⌋ *y_1) = gcd(a, b) ay1+b(x1a/by1)=gcd(a,b)
    所以原方程中: x = y 1 , y = x 1 − ⌊ a / b ⌋ ∗ y 1 x = y_1, y = x_1 - ⌊a / b⌋ *y_1 x=y1,y=x1a/by1

  5. 代码

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

这段代码的返回值为 g c d ( a , b ) gcd(a,b) gcd(a,b) x , y x,y x,y是方程 a x + b y = g c d ( a , b ) ax +by = gcd(a,b) ax+by=gcd(a,b)的一组解。
那么对于方程 a x + b y = c ( g c d ( a , b ) ∣ c ) ax + by = c (gcd(a, b) | c) ax+by=c(gcd(a,b)c)的一组解是 x ′ = x ∗ c / g c d ( a , b ) , y ′ = y ∗ c / g c d ( a , b ) x' = x * c / gcd(a, b), y' = y * c / gcd(a, b) x=xc/gcd(a,b)y=yc/gcd(a,b)
6. 求多组解
a x + b y = c ax+by=c ax+by=c
a x 1 + b y 1 = c ax_1+by_1=c ax1+by1=c
可得 a ( x − x 0 ) + b ( y − y 0 ) = 0 a(x-x_0)+b(y-y_0)=0 a(xx0)+b(yy0)=0
两边同时除以gcd(a,b)得 a ( x − x 0 ) g c d ( a , b ) + b ( y − y 0 ) g c d ( a , b ) = 0 \frac{a(x-x_0) }{gcd(a,b)}+\frac {b(y-y_0)}{gcd(a,b)}=0 gcd(a,b)a(xx0)+gcd(a,b)b(yy0)=0
因为 a g c d ( a , b ) \frac{a}{gcd(a,b)} gcd(a,b)a b g c d ( a , b ) \frac{b}{gcd(a,b)} gcd(a,b)b互质
所以 ( x − x 0 ) 是 g c d ( a , b ) (x-x_0)是gcd(a,b) (xx0)gcd(a,b)的倍数
所以 ( x − x 0 ) = t g c d ( a , b ) (x-x_0)=tgcd(a,b) (xx0)=tgcd(a,b)
x = t ( g c d ( a , b ) ) + x 0 x=t(gcd(a,b))+x_0 x=tgcd(a,b)+x0


em。。。exgcd的性质使它可以被用来求逆元
关于逆元。。。

链接在这里啦关于逆元

在这里插入图片描述