gcd(欧几里得算法)与最大公因数
-
公式: g c d ( a , b ) = g c d ( b , a gcd(a,b)=gcd(b,a gcd(a,b)=gcd(b,a%b ) ) )
-
证明:
设 a > b a>b a>b,证明 a , b a,b a,b的公因数和 b , a − b b,a-b b,a−b的公因数是同样的一堆数
首先,有结论:若 x ∣ a , x ∣ b , 那么 x ∣ ( a − b ) x|a,x|b,那么x|(a-b) x∣a,x∣b,那么x∣(a−b).
设 a a a和 b b b的公因子集合为 S 1 S1 S1, b b b 和 ( a – b ) (a – b) (a–b)的公因子集合为 S 2 S2 S2。那么,
对于任意的 x ∈ S 1 x∈S1 x∈S1,有 x ∣ a x|a x∣a,且 x ∣ b x|b x∣b,所以 x ∣ ( a – b ) x|(a – b) x∣(a–b),则 x x x ∈ \in ∈ S2 ,于是 ,于是 ,于是S1$ ⊂ \subset ⊂ S 2 S2 S2;
对于任意的 x ∈ S 2 x∈S2 x∈S2,有 x ∣ b x|b x∣b,且 x ∣ ( a – b ) x|(a – b) x∣(a–b),所以 x ∣ a x|a x∣a,则 x ∈ S 1 x∈S1 x∈S1,于是 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,a–b)。
证明了 g c d ( a , b ) = g c d ( b , a – b ) gcd(a, b) = gcd(b, a – b) gcd(a,b)=gcd(b,a–b),也就可以进一步证明 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)。 -
代码:
#define ll long long
ll gcd(ll a,ll b)
{
if(b==0)return a;
else rteutn gcd(b,a%b);
}
- 复杂度: O ( l o g 2 m a x ( a , b ) ) O(log_2max(a,b)) O(log2max(a,b))
exgcd(扩展欧几里得算法)
-
前置知识:裴蜀定理 q w q qwq qwq
(1) 对任何 a , b ∈ Z a,b∈Z a,b∈Z和它们的最大公约数 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 d∣c,可知有无穷多解。特别地,一定存在整数 x x x, y y y,使 a x + b y = d ax+by=d ax+by=d成立。
( 2 )推论:
a a a, b b