技術メモ

神奈川在住のITエンジニアの備忘録。おもにプログラミングやネットワーク技術について、学んだことを自分の中で整理するためにゆるゆると書いています。ちゃんと検証できていない部分もあるのでご参考程度となりますが、誰かのお役に立てれば幸いです。

Javaで最大公約数、最小公倍数を求める。

Javaで最大公約数、最小公倍数を求めるメソッドを作成した。引数で受け取った2つの引数の最大公約数、最小公倍数をそれぞれ求めて返す。

    // 最大公約数を求める。
    int calcGcd(int m, int n) {
        if (m <= 0 || n <= 0) {
            throw new IllegalArgumentException("Arguments must be 1 and over.");
        }
        if(m < n) {
            int tmp = m;
            m = n;
            n = tmp;
        }
        int remainder = 0;
        while ((remainder = m % n) != 0) {
            m = n;
            n = remainder;
        }
        return n;
    }

    // 最小公倍数を求める。
    int calcLcm(int m, int n) {
        return m * n / calcGcd(m, n);
    }

calcLcmにて、最小公倍数は「m × n / 最大公約数」で求めている。
これは、例えば、m と n の最大公約数が a であり、
・m = a × b × c
・n = a × d × e
で表現できたとすると、
m と n の最小公倍数 x は、m と n の要素を含み、かつ、最小なもの (他に余分な要素を含まないもの) なので、
x = a × (b × c) × (d × e) = (a × b × c) × (a × d × e) / a = m × n / 最大公約数
となる。
これにより、最小公倍数は「m × n / 最大公約数」で求められることが分かる。