倭算数理研究所

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

倭マン's Math (5) : 続・FieldElement (org.apache.commons.math. パッケージ)

今回はメタクラスを使って FieldElement にメソッド(クロージャ型のプロパティ)を追加します(一覧)。 追加するメソッドは、基本的に前回定義したカテゴリ・メソッドと同じように動作するものです(positive() も追加):

  • 和演算、積演算に関する単位元 (0, 1) と等しいかどうかを評価する izZero(), isOne() メソッド
  • 四則演算を行う plus(), minus(), div() メソッド (multiply() は定義されているので省略)
  • 正符号 (+) の単項演算子に対応する positive() メソッド
        FieldElement.metaClass.define{
            isZero = { -> getField().getZero() == delegate }
            isOne = { -> getField().getOne() == delegate }

            plus = { arg -> add(arg) }
            minus = { arg -> subtract(arg) }
            div = { arg -> divide(arg) }

            positive = { -> delegate }
        }

使い方は同じ:

@GrabResolver('http://www5.ocn.ne.jp/~coast/repo/')
@Grab('org.waman.math:wamans-math:0.0.1')

import org.apache.commons.math.complex.Complex

WamansMath.enhance(CommonsMathPackage.MATH)

def c0 = new Complex(0d, 0d)    // 0
def c1 = new Complex(1d, 0d)    // 1
def c2 = new Complex(1d, 2d)    // 1+2i
def c3 = new Complex(3d, 4d)    // 3+4i

// 零元、単位元の確認
assert c0.isZero()
assert !c1.isZero()
assert !c0.isOne()
assert c1.isOne()
    
// 加減乗除演算
assert c2 + c3 == new Complex(4d, 6d)
assert c2 - c3 == new Complex(-2d, -2d)
assert c2 * c3 == new Complex(-5d, 10d)
assert c2 / c3 == new Complex(0.44d, 0.08d)

// 正符号演算
assert +c2 == new Complex(1d, 2d)

前回と比べて、use キーワードを使わなくていい代わりに、メタクラスにメソッドを追加するための呼び出し (WamansMath...) が必要になります。

Javaによるアルゴリズム事典

Javaによるアルゴリズム事典