1.4.2. 最小公倍数

最小公倍数とは

Least common multiple (Wikipedea)

2つ以上の正の整数について、それぞれの正の倍数から共通する数を取り出したときの、最も小さな数のことをいう。
例えば、 \(12, 18, 24\) の最小公倍数は \(72\) である。実際、それぞれの倍数を列挙すると
  • 12の倍数 \(12, 24, 36, 48, 60, \mathbf{72}, \ldots\)

  • 18の倍数 \(18, 36, 54, \mathbf{72}, 90, \ldots\)

  • 24の倍数 \(24, 48, \mathbf{72}, 96, \ldots\)

となり、共通の倍数のうち最小の数は \(72\) である。

法則

最小公倍数は交換則と結合則が成り立つ。

  • 交換則 \(\mathrm{lcm}(a, b) = \mathrm{lcm}(b, a)\)

  • 結合則 \(\mathrm{lcm}(a, \mathrm{lcm}(b, c)) = \mathrm{lcm}(\mathrm{lcm}(a, b), c)\)

また、2数の最大公約数と最小公倍数には次の関係がある。これは3数以上では成り立たない。

  • \(ab = \gcd(a, b) \cdot \mathrm{lcm}(a, b)\)

正の倍数に \(0\) が含まれないので、 \(0\) を含む最小公倍数は定義されない。
ただし、便宜上次のように定義することがある。
  • \(\mathrm{lcm}(a, 0) = 0\)

実装

概要

複数の整数の最小公倍数を求める。

実装のポイント

最小公倍数に関して、 \(0\) を含む定義を採用した。

計算量

  • lcm(a, b) \(\mathcal{O}(\log{\min(a, b)})\)

コード

[1]:
import math


def lcm(a: int, *args: int) -> int:
    for b in args:
        if b == 0:
            a = 0
        else:
            a = a * b // math.gcd(a, b)
    return a

使用例

[2]:
l = lcm(12, 18, 24)
print(l)
72