// Complex.groovy // Version 1.0 // KAKU PROJECT (2014) // 概要:複素数を表現するクラス public class Complex { // ○複素数の実数部・虚数部プロパティ // ・実数部 private Number r = 0 // ・虚数部 private Number i = 0 // メモ:実数部・虚数部の値は Number クラスにしておくことで、任意の数値クラス // (Integer,Long,Double,float,BigDecimal)を使えるようにする。 // ・実数部の参照メソッド public Number getR () {r} // ・虚数部の参照メソッド public Number getI () {i} // メモ:変更メソッド(setR, setI) は用意しない。 // ○コンストラクタ // ・実数部のみの複素数 public Complex (Number r) { this.r = r this.i = 0 } // ・実数部+虚数部からなる複素数 public Complex (Number r, Number i) { this.r = r this.i = i } // 既存の複素数オブジェクト用コンストラクタ public Complex (Complex z) { this.r = z.r this.i = z.i } // ○演算子用メソッド。 // メモ:各演算子の結果は常に新しいオブジェクトを作成し、既存のオブジェクトは // 変化させないこととする。++ や -- などの単項演算子は用意しない。 // ・加算(二項演算・引数:複素数) public Complex plus(Complex b) { new Complex(r+b.r, i+b.i) } // ・加算(二項演算・引数:実数) public Complex plus(Number n) { new Complex(r+n, i) } // ・減算(二項演算・引数:複素数) public Complex minus (Complex b) { new Complex(r-b.r, i-b.i) } // ・減算(二項演算・引数:実数) public Complex minus(Number n) { new Complex(r-n, i) } // ・乗算(二項演算・引数:複素数) public Complex multiply (Complex b) { new Complex((r*b.r)-(i*b.i), (r*b.i)+(i*b.r)) } // ・乗算(二項演算・引数:実数) public Complex multiply(Number n) { new Complex(r*n, i*n) } // ・除算(二項演算・引数:複素数) public Complex div (Complex b) { if (b.isZero()) { // ゼロ除算例外 throw new java.lang.ArithmeticException("Division by zero") } if (this.equals(b)) { // 同じ複素数なら1を返す。 return new Complex(1, 0) } double t = b.r*b.r + b.i*b.i new Complex( (r*b.r+i*b.i)/t, (i*b.r-r*b.i)/t) } // ・除算(二項演算・引数:実数) public Complex div (Number n) { if (n == 0) { // ゼロ除算例外 throw new java.lang.ArithmeticException("Division by zero") } new Complex(r/n, i/n) } // ・累乗(二項演算・引数:整数) public Complex power (int n) { //println "n:$n" Complex z = this if (n < 0) { z = new Complex(1, 0).div(this.power(-n)) } else if (n == 0) { z = new Complex(1, 0) } else { z = this for (int i=1; i