「最大公約数」と問われると「ユークリッドの互除法!」とただちに着想が湧くようにはなってきた。
その一方で「最小公倍数」と問われたら、「おや…」と思いながら調べ直さざるをえない自分がいた。
この記事できちんと整理して、記憶に定着させたい。
定理
正整数に[tex:{\displaystyle a}], [tex:{\displaystyle b}]に対して、[tex:{\displaystyle a}]と[tex:{\displaystyle b}]の最大公約数[tex:{\displaystyle \mathrm {gcd} (a,\ b)}]と最小公倍数[tex:{\displaystyle \mathrm {lcm} (a,\ b)}]との間には [tex:{\displaystyle \mathrm {gcd} (a,\ b)\cdot \mathrm {lcm} (a,\ b)=ab}] という関係がある。1
実践
つまりAとBの最小公倍数LCMは、AとBの最大公約数GCDを使ってこう書ける。
[tex:{\displaystyle \mathrm {lcm} (a,\ b)=\frac{ab} {\mathrm {gcd} (a,\ b)}}]
要するに、まずは最大公約数をユークリッドの互除法で求めてから、単純計算で最小公倍数を求めればよい。[tex:{\displaystyle A \geq B}] として、
#include <iostream>
int main() {
int A = 24, B = 18;
int a = A, b = B, r = a % b;
while (r != 0) {
a = b;
b = r;
r = a % b;
}
int gcd = b;
int lcm = A * B / gcd;
printf("%d\n", lcm);
return 0;
}
全体の計算量はユークリッドの互除法の計算量に従って O(logn) となる。