uehaj's blog

Grな日々 - GroovyとかGrailsとかElmとかRustとかHaskellとかReactとかFregeとかJavaとか -

どう書く.org課題「 複素数 」

複素数もやってみた。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())