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

倭算数理研究所

科学・数学・学習関連の記事を、「倭マン日記」とは別に書いていくのだ!

commons-math 解読 (10) : 分数(有理数) Fraction

今回は分数を表すクラス Fraction を見ていきます。 分数は通常の和演算と積演算で「」をなすため、Fraction クラスは FieldElement インターフェースを実装します。 また、分数がなす体は有理数体といい commons-math では FractionField で表されます。 ただし、このクラスはシングルトンであること以外特に何てことはないので、この記事では Fraction クラスのみを見ていきます。

クラス宣言

Fraction クラスは Number クラスのサブクラスで、FieldElement, Comparable, Serializable インターフェースを実装しています:

package org.apache.commons.math.fraction;

public class Fraction
        extends Number
        implements FieldElement<Fraction>, Comparable<Fraction>, Serializable{
    ...
}

BigReal クラスは Number クラスを継承していませんでしたが、Fraction クラスは Number クラスのサブクラスのようです。 なので intValue(), longValue() メソッドなども使えます。 まぁ大抵の場合、値が丸められるので使い方は注意が必要かと思いますが。

コンストラクタ

Fraction のコンストラクタは、分母・分子の整数 (int) をとるか、小数 (double) をとるかです:

public class Fraction{

    Fraction(int num)
    Fraction(int num, int den)
    Fraction(double value)
    Fraction(double value, double epsilon, int maxIterations)
    Fraction(double value, int maxDenominator)

    ...
}

サンプルとしてはこんな感じ:

def f1 = new Fraction(2)    // 2 / 1
def f2 = new Fraction(1, 2)    // 1 / 2
def f3 = new Fraction(2.5d)    // 5 / 2
def f4 = new Fraction(0.33333333333333333d, 0.01d, 10)    // 1 / 3
def f5 = new Fraction(0.33333333333333333d, 10)    // 1 / 3

まぁ、できる限り int 値2つのコンストラクタを使うのが無難でしょう。

メソッド

Fraction クラスに定義されているメソッドには以下のようなものがあります:

public class Fraction{
    ...

    FractionField getField()

    // 分子・分母の取得
    int getNumerator()
    int getDenominator()

    // 単項演算
    Fraction abs()    // 絶対値
    Fraction negate()    // 符号の反転
    Fraction reciprocal()    // 逆数

    // 四則演算
    Fraction add(Fraction fraction)
    Fraction add(int i)
    Fraction subtract(Fraction fraction)
    Fraction subtract(int i)
    Fraction multiply(Fraction fraction)
    Fraction multiply(int i)
    Fraction divide(Fraction fraction)
    Fraction divide(int i)

    // 型変換
    int intValue()
    long longValue()
    float floatValue()
    double doubleValue()

    // Object, Comparable のメソッド
    boolean equals(Object other)
    int hashCode()
    int compareTo(Fraction object)
    String toString()

    static Fraction getReducedFraction(int numerator, int denominator)
}

サンプルを見る方が分かりやすいかと:

def f12 = new Fraction(1, 2)    // 1 / 2
def f13 = new Fraction(1, 3)    // 1 / 3

// 分子・分母
assert f12.getNumerator() == 1
assert f12.getDenominator() == 2

// 単項演算
assert f12.abs() == new Fraction(1, 2)
assert f12.negate() == new Fraction(-1, 2)
assert f12.reciprocal() == new Fraction(2)

// Fraction オブジェクトとの四則演算
assert f12.add(f13) == new Fraction(5, 6)
assert f12.subtract(f13) == new Fraction(1, 6)
assert f12.multiply(f13) == new Fraction(1, 6)
assert f12.divide(f13) == new Fraction(3, 2)

// int 値との四則演算
assert f12.add(1) == new Fraction(3, 2)
assert f12.subtract(1) == new Fraction(-1, 2)
assert f12.multiply(3) == new Fraction(3, 2)
assert f12.divide(2) == new Fraction(1, 4)

// Object, Comparable のメソッド
assert f12.toString() == '1 / 2'
assert f12 >= f13    // assert f12 > f13 だとなぜかアサーションが通らない・・・(commons-math 2.2)

使い方に関しては特に分かりにくいものもないですね。

定義済み定数

変数名 変数名
ZERO 0 ONE_QUARTER 1 / 4
ONE 1 TWO_QUARTERS 2 / 4
TWO 2 / 1 THREE_QUARTERS 3 / 4
MINUS_ONE -1 / 1 ONE_FIFTH 1 / 5
ONE_HALF 1 / 2 TWO_FIFTHS 2 / 5
ONE_THIRD 1 / 3 THREE_FIFTHS 3 / 5
TWO_THIRDS 2 / 3 FOUR_FIFTHS 4 / 5

フォーマット

最後は Fraction クラスと文字列 (String) 間で値を変換する FractionFormat クラスを見ていきます。 FractionFormat クラスは java.text.Format クラスのサブクラスなので、基本的には使い方は Format クラスと同じです:

  • FractionFormat#format() メソッド : Fraction → String
  • FractionFormat#parse() メソッド : String → Fraction

簡単な使い方はこんな感じ:

def f12 = new Fraction(1, 2)
def format = new FractionFormat()

// Fraction → String
assert format.format(f12) == '1 / 2'

// String → Fraction
assert format.parse('1 / 3') == new Fraction(1, 3)

FractionFormat クラスには他にもいろいろメソッドが定義されているし、ProperFractionFormat クラスってクラスもありますが、ここでは省略。

数学ガール フェルマーの最終定理 (数学ガールシリーズ 2)

数学ガール フェルマーの最終定理 (数学ガールシリーズ 2)

数学の基礎―集合・数・位相 (基礎数学)

数学の基礎―集合・数・位相 (基礎数学)