複素数もやってみた。apache commonsには複素数計算ライブラリもあるみたいだけど、ここでは自前で。「.i」あたりに、誰も気づかない小さな工夫があるので、言及しておこう。
class Complex { double re double im Complex(re, im) { this.re = re; this.im = im } Complex plus(c) { new Complex(re+c.re, im+c.im) } Complex minus(c) { new Complex(re-c.re, im-c.im) } Complex multiply(c) { new Complex(re*c.re - im*c.im, re*c.im + im*c.re) } Complex div(c) { def denom = (c.re ** 2) + (c.im ** 2) new Complex((re*c.re+im*c.im)/denom, (im*c.re-re*c.im)/denom) } double abs(){ Math.sqrt(re ** 2 + im ** 2) } static final i = new Complex(0, 1) String toString() { re+(im>=0?'+':'')+im+'i' } } ['plus','minus','multiply','div'].each { Number.metaClass."$it" = { Complex c -> new Complex(delegate, 0)."$it"(c) } } Number.metaClass.getI = {new Complex(0, delegate)} def i = Complex.i println ((3 + i) + (4 - i)) println ((5 - 9.i) - (2 + 6.i)) println ((5 + 3.i) * (5 + 8.i)) println ((9 - 7.i) / (9 - 3.i)) println ((2 - 3.i).abs())