雨谷の日和

過去12年で1,600を超えるアニメの第1話だけは見続けた僕のお勧めアニメがハズレなはずがない

分数での掃き出し法による行列式計算9

さて、掛け算・割り算を実装したので、次は足し算・引き算に行きたいところですが、ちょっとその前に最大公約数と最大公倍数を求めるモジュールを作っておこうかと思います。
何故かと言うと、足し算・引き算の時には分数の通分処理が必要になりますが、その時に最小公倍数を求める必要があるためです。更に、その最小公倍数を求めるには、最大公約数を求める必要があります。
ということでまずは最大公約数を求める関数を……と思ったんですが、Java には最大公約数を求めるための関数が既に用意されていますので、それを用いることにします。

  public static long gcd(long a, long b){
    return (BigInteger.valueOf(a)).gcd(BigInteger.valueOf(b)).longValue();
  }

BigInteger というのは無限桁の整数を表現するためのクラスですが、最大公約数を求める関数gcd が実装されています。なので、一度long の値をBigInteger に変換した後、そのgcd の実装を利用して最大公約数を得ます。
さて、次は最小公倍数ですが、これは最大公約数が分かれば簡単に求めることが出来ます。
ソースコード

  public static long lcm(long a, long b){
    if(a == 0 || b == 0)return 0;
    return (a * b / gcd(a, b));
  }

では、実際に使ってみましょう。
ソースコード

package org.dmwp.math;

class MathUtilTest {
  public static void main(String[] args) throws Exception {
    calc(12, 30);
    calc(10, 15);
  }

  private static void calc(long a, long b) {
    System.out.println("a=" + a + ", b=" + b);
    System.out.println("gcd=" + MathUtil.gcd(a, b));
    System.out.println("lcm=" + MathUtil.lcm(a, b));
    System.out.println();
  }
}

上記のテストコードを実行すると、以下のようになります。

a=12, b=30
gcd=6
lcm=60

a=10, b=15
gcd=5
lcm=30

次回はこれらを利用して、通分処理や約分処理を実装してみたいと思います。