最大公约数
记
a
,
b
a,b
a,b 的最大公约数为
gcd
(
a
,
b
)
\gcd(a,b)
gcd(a,b)。
若
k
∣
a
k|a
k∣a 且
k
∣
b
k|b
k∣b 且
∀
k
′
>
k
\forall k'>k
∀k′>k 有
k
′
∤
a
k'\nmid a
k′∤a 或
k
′
∤
b
k'\nmid b
k′∤b,则
k
=
gcd
(
a
,
b
)
k=\gcd(a,b)
k=gcd(a,b)
同时,记最小公倍数为
lcm
(
a
,
b
)
=
a
b
gcd
(
a
,
b
)
\text{lcm}(a,b)=\frac{ab}{\gcd(a,b)}
lcm(a,b)=gcd(a,b)ab
-
gcd
(
a
,
b
)
=
gcd
(
b
,
a
)
\gcd(a,b)=\gcd(b,a)
gcd(a,b)=gcd(b,a)
易证。 -
gcd
(
−
a
,
b
)
=
gcd
(
a
,
b
)
\gcd ( − a , b ) = \gcd ( a , b )
gcd(−a,b)=gcd(a,b)
易证。 -
gcd
(
a
,
a
)
=
∣
a
∣
\gcd ( a , a ) = ∣ a ∣
gcd(a,a)=∣a∣
易证。 -
gcd
(
a
,
0
)
=
∣
a
∣
\gcd ( a , 0 ) = ∣ a ∣
gcd(a,0)=∣a∣
易证。 -
gcd
(
a
,
1
)
=
1
\gcd ( a , 1 ) = 1
gcd(a,1)=1
易证。 -
gcd
(
a
,
b
)
=
gcd
(
b
,
a
−
b
)
\gcd ( a , b ) = \gcd ( b , a − b )
gcd(a,b)=gcd(b,a−b)
由 p ∣ a , p ∣ b ⇒ p ∣ a − b p|a,p|b\rArr p|a-b p∣a,p∣b⇒p∣a−b 易证。 -
gcd
(
a
,
b
)
=
gcd
(
b
,
a
m
o
d
b
)
\gcd ( a , b ) = \gcd ( b , a \mod b )
gcd(a,b)=gcd(b,amodb)
可以由 gcd ( a , b ) = gcd ( b , a − b ) \gcd ( a , b ) = \gcd ( b , a − b ) gcd(a,b)=gcd(b,a−b) 简单推导而来。 -
gcd
(
a
c
,
b
c
)
=
c
⋅
gcd
(
a
,
b
)
\gcd ( ac , bc ) = c \cdot \gcd ( a , b )
gcd(ac,bc)=c⋅gcd(a,b)
设 gcd ( a , b ) = m , a = p m , b = q m , gcd ( p , q ) = 1 \gcd(a,b)=m,a=pm,b=qm,\gcd(p,q)=1 gcd(a,b)=m,a=pm,b=qm,gcd(p,q)=1
则 gcd ( a c , b c ) = gcd ( p m c , q m c ) = m c = c ⋅ gcd ( a , b ) \gcd(ac,bc)=\gcd(pmc,qmc)=mc=c\cdot\gcd(a,b) gcd(ac,bc)=gcd(pmc,qmc)=mc=c⋅gcd(a,b)
即 gcd ( a c , b c ) = c ⋅ gcd ( a , b ) \gcd ( ac , bc ) = c \cdot \gcd ( a , b ) gcd(ac,bc)=c⋅gcd(a,b) -
gcd
(
a
,
b
+
a
c
)
=
gcd
(
a
,
b
)
\gcd ( a , b+ac ) = \gcd ( a , b )
gcd(a,b+ac)=gcd(a,b)
由 p ∣ a , p ∣ b ⇒ p ∣ b + a c p|a,p|b\rArr p|b+ac p∣a,p∣b⇒p∣b+ac 易证。 - 若
c
∣
gcd
(
a
,
b
)
c|\gcd(a,b)
c∣gcd(a,b),则
gcd
(
a
c
,
b
c
)
=
gcd
(
a
,
b
)
c
\gcd ( \frac a c , \frac b c ) = \frac{\gcd( a , b )}{c}
gcd(ca,cb)=cgcd(a,b)
设 gcd ( a , b ) = m , a = p m , b = q m , gcd ( p , q ) = 1 \gcd(a,b)=m,a=pm,b=qm,\gcd(p,q)=1 gcd(a,b)=m,a=pm,b=qm,gcd(p,q)=1
则 gcd ( a c , b c ) = gcd ( p m c , q m c ) = gcd ( m c , m c ) = m c = gcd ( a , b ) c \gcd ( \frac a c , \frac b c )=\gcd(\frac {pm} c,\frac {qm} c)=\gcd(\frac m c,\frac m c)=\frac m c=\frac{\gcd(a,b)} c gcd(ca,cb)=gcd(cpm,cqm)=gcd(cm,cm)=cm=cgcd(a,b)
即 gcd ( a c , b c ) = gcd ( a , b ) c \gcd ( \frac a c , \frac b c ) = \frac{\gcd( a , b )}{c} gcd(ca,cb)=cgcd(a,b)
欧几里得算法
根据基本性质 gcd ( a , b ) = gcd ( b , a m o d b ) \gcd(a,b)=\gcd(b,a\mod b) gcd(a,b)=gcd(b,amodb),由此式不断迭代,直到遇到式子 gcd ( a ′ , 0 ) \gcd(a',0) gcd(a′,0) 时,返回 a ′ a' a′,即为最大公约数。
代码
int gcd(int a,int b){
if (b==0) return a;
return gcd(b,a%b);
}
参数
- 时间复杂度: Θ ( log ( max ( a , b ) ) ) \Theta(\log(\max(a,b))) Θ(log(max(a,b)))
- 空间复杂度: Θ ( 1 ) \Theta(1) Θ(1)