読者です 読者をやめる 読者になる 読者になる

雨谷の日和

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

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

ボヤキ - 技術

さてさて、いよいよ大本命(?)の足し算の実装に取り掛かってみます。
ソースコード

  public Fraction add(Fraction dst){
    if(this.isInfinity() || dst.isInfinity())return INFINITY;
    if(this.isZero())return dst;
    if(dst.isZero())return this;
    long lcm = MathUtil.lcm(this.denominator, dst.denominator);
    Fraction result = new Fraction(
      this.numerator * lcm / this.denominator +
      dst.numerator * lcm / dst.denominator,
      lcm
    );
    return result.reduce();
  }

まずどちらかの分数が無限大かどうかを調べ、無限大であれば無限大を返します。無限大に何を足しても無限大ですから。
次に自分自身が0の場合には相手を、相手が0の場合には自分自身を返します。0は何に足しても変化が無いので。
さて、無限大でも0でもない2つの分数について、通分処理と似たような方法で足し算を行います。
互いの分母の最小公倍数(lcm)を求め、結果の分数の分母とします。
更に、互いの分子をlcm で通分してその結果を足し合わせます。最後に結果の分数を約分して、お終いですね。


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

    { // 1/3 を足してみる
      Fraction result = fraction.add(new Fraction(1, 3));
      print(result);
    }
    { // 1/5 を足してみる
      Fraction result = fraction.add(new Fraction(1, 5));
      print(result);
    }

結果はこうなりました。

result: 5/6 [false, false]
result: 7/10 [false, false]

いやはや、足し算がようやく実装できました。これでほぼ一揃いかな?