【数学】最大公约数与欧几里得算法

最大公约数

a , b a,b a,b 的最大公约数为 gcd ⁡ ( a , b ) \gcd(a,b) gcd(a,b)
k ∣ a k|a ka k ∣ b k|b kb ∀ k ′ > k \forall k'>k k>k k ′ ∤ a k'\nmid a ka k ′ ∤ b k'\nmid b kb,则 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,ab)
    p ∣ a , p ∣ b ⇒ p ∣ a − b p|a,p|b\rArr p|a-b pa,pbpab 易证。
  • 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,ab) 简单推导而来。
  • gcd ⁡ ( a c , b c ) = c ⋅ gcd ⁡ ( a , b ) \gcd ( ac , bc ) = c \cdot \gcd ( a , b ) gcd(ac,bc)=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 ) = 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=cgcd(a,b)
    gcd ⁡ ( a c , b c ) = c ⋅ gcd ⁡ ( a , b ) \gcd ( ac , bc ) = c \cdot \gcd ( a , b ) gcd(ac,bc)=cgcd(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 pa,pbpb+ac 易证。
  • c ∣ gcd ⁡ ( a , b ) c|\gcd(a,b) 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 ) = 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)

练习

  • 洛谷P1029最大公约数和最小公倍数问题
  • 洛谷P2118比例简化

你可能感兴趣的:(数学,#,数论,算法,数论,数学,最大公约数)