雨谷の日和

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

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

さて、esper 氏の意見を採用して、イミュータブルなFraction クラスのprivate 変数にfinal をつけて実装を進めることにします。
とりあえず、multiply をその方針に従って書き直しました。

  public Fraction multiply(long dst){
    if(dst == 0)return ZERO;
    if(isZero() || isInfinity() || dst == 1)return this;
    long tempNumerator = numerator;
    long tempDenominator = denominator;
    if(dst < 0 && tempNumerator < 0){
      dst = Math.abs(dst);
      tempNumerator = Math.abs(tempNumerator);
    }else if(dst < 0 && tempDenominator < 0){
      dst = Math.abs(dst);
      tempDenominator = Math.abs(tempDenominator);
    }
    if(tempDenominator % dst == 0){
      tempDenominator = tempDenominator / dst;
    }else{
      tempNumerator = tempNumerator * dst;
    }
    return new Fraction(tempNumerator, tempDenominator);
  }

まあ、あまり変わらないといえば変わらないですし、可読性もそれほど犠牲になっているわけでもないような気がしますので、オッケーかなと。
では次に、割り算の方を実装してみます。
こんな感じになるかなぁ?
ソースコード

  public Fraction divide(long dst){
    if(dst == 0)return INFINITY;
    if(isZero() || isInfinity() || dst == 1)return this;
    long tempNumerator = numerator;
    long tempDenominator = denominator;
    if(dst < 0 && tempNumerator < 0){
      dst = Math.abs(dst);
      tempNumerator = Math.abs(tempNumerator);
    }else if(dst < 0 && tempDenominator < 0){
      dst = Math.abs(dst);
      tempDenominator = Math.abs(tempDenominator);
    }
    if(tempNumerator % dst == 0){
      tempNumerator = tempNumerator / dst;
    }else{
      tempDenominator = tempDenominator * dst;
    }
    return new Fraction(tempNumerator, tempDenominator);
  }

掛け算と違うのは、まあ色々ありますが細かい事はソースコードを見比べて頂くということで。


さて、これを実際に実行してみましょう。
ソースコード

    { //3 で割ってみる
      Fraction result = fraction.divide(3);
      print(result);
    }
    { //-2 で割ってみる
      Fraction result = fraction.divide(-2);
      print(result);
    }
    { //0 で割ってみる
      Fraction result = fraction.divide(0);
      print(result);
    }

上記の実行結果は以下のようになります。

result: 1/6 [false, false]
result: 1/-4 [false, false]
result: 1/0 [false, true]

ちゃんとできているようですね。