今回は最小公倍数を計算するプログラムを作成します。

突然ですが、分数の足し算は好きですか?

足し算よりもかけ算のほうが普通は難しいのですが、分数の場合はそうではありません。分数のかけ算は分母同士、分子同士を掛け合わせるだけです。ところが分数の足し算は通分という作業が必要です。当時小学生だった私はこれがとても嫌だったのです。

通分するときは分母を計算しようとしている分母の最小公倍数にしなければなりません。2と3の最小公倍数であれば6であることはすぐにわかるのですが、14と18の最小公倍数なんていわれるとすぐには計算できません。

14の倍数:14, 28, 42, 56, 70, 84, 98, 112, 126, 140,
18の倍数:18, 36, 54, 72, 90, 108, 126, 144, 162, 180,

だから答えは126。教科書どおりやろうとするとこうなります。

もっと効率よく計算する方法はないのでしょうか? この方法を教えてくれるのは中学1年生になってからです。簡単な方法だったので、どうして小学校で教えてくれないのかと怒りでいっぱいになったことがあります(ちょっと大袈裟か)。

効率が悪い最小公倍数をもとめるプログラム

まずは効率が悪い方法から紹介します。

14の倍数をリストに格納しておき、そのなかから18の倍数を探すというやり方です。最初にリストに格納すべき個数ですが、以下のように考えます。

14×18は最小ではないけれども14と18の公倍数である(14×18は14の18倍であり18の14倍だから)
そこで14×18以下の14の倍数を取得する

このやり方は効率が悪いです。14と18という比較的小さな数なのですぐに処理は終わりますが、巨大な数でしかも互いに素である場合、無駄に計算させられるだけでなく、それだけ多くの個数の倍数をリストに格納しなければならないのでメモリーも浪費することになります。

最小公倍数を求める

そこで中学校1年生のときに数学で教えてもらった方法を使います。

14, 18はともに素数2で割り切れる。2で割ると7と9
7と9は互いに素である。
2と7と9を掛け合わせた126が最小公倍数

素数2で割ると一発で終わってしまったので別の例を示します。

48 と 64 の最小公倍数を考える
48 と 64 はともに素数2で割り切れる。2で割ると 24 と 32
24 と 32 はともに素数2で割り切れる。2で割ると 12 と 16
12 と 16 はともに素数2で割り切れる。2で割ると 6 と 8
6 と 8はともに素数2で割り切れる。2で割ると 3 と 4
3 と 4 は互いに素である。
2 と 2 と 2 と 2 と 3 と 4 を掛け合わせた 192 が 48と64の最小公倍数である

割るときは最小の素数からやらないといけないわけではありません。両方とも16の倍数であることに気づいたのであれば
48 と 64 はともに16で割り切れる。16で割ると 3 と 4
3 と 4 は互いに素である。
16 と 3 と 4 を掛け合わせた 192 が48と64の最小公倍数である

こっちのほうがよいです。

また3つ以上の場合は以下のようにします。

14 と 48 と 64 との最小公倍数を考える
14 と 48 と 64 はともに2で割り切れる。2で割ると 7 と 24 と 32
24 と 32 は 8 で割り切れる。割り切れるものだけ8で割ると 7 と 3 と 4
これ以上、2つ以上の数を割りきることができる数は存在しない
2 と 8 と 7 と 3 と 4 を掛け合わせた 1344 が 14と48と64との最小公倍数である

ではこの方法でプログラミングしてみることにします。

最大公約数を求める

最大公約数を求めるプログラムも作成してみることにします。3つ以上の最大公約数を求める場合はすべての数を割りきることができる数を探して割りきることができた数をすべて掛け合わせます。

48 と 64 と 108 の最大公約数を考える
48 と 64 と 108 はすべて 2 で割り切れる。2で割ると 24 と 32 と 54
24 と 32 と 54 はすべて 2 で割り切れる。2で割ると 12 と 16 と 27
これ以上、すべての数を割りきることができる数は存在しない
2 と 2 を掛け合わせた 4 が 48 と 64 と 108 の最大公約数である