「最大公約数」と問われると「ユークリッドの互除法!」とただちに着想が湧くようにはなってきた。
その一方で「最小公倍数」と問われたら、「おや...」と思いながら調べ直さざるをえない自分がいた。
この記事できちんと整理して、記憶に定着させたい。
定理
正整数に
,
に対して、
と
の最大公約数
と最小公倍数
との間には
という関係がある。1
実践
つまりAとBの最小公倍数LCMは、AとBの最大公約数GCDを使ってこう書ける。
要するに、まずは最大公約数をユークリッドの互除法で求めてから、単純計算で最小公倍数を求めればよい。 として、
#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) となる。