65 lines
2.1 KiB
Groovy
65 lines
2.1 KiB
Groovy
import static Complex.*
|
||
|
||
Number.metaClass.mixin ComplexCategory
|
||
Integer.metaClass.mixin ComplexCategory
|
||
|
||
def ε = 0.000000001 // tolerance (epsilon): acceptable "wrongness" to account for rounding error
|
||
|
||
println 'Demo 1: functionality as requested'
|
||
def a = [5,3] as Complex
|
||
def a1 = [real:5, imag:3] as Complex
|
||
def a2 = 5 + 3.i
|
||
def a3 = 5 + 3*i
|
||
assert a == a1 && a == a2 && a == a3
|
||
println 'a == ' + a
|
||
def b = [0.5,6] as Complex
|
||
println 'b == ' + b
|
||
|
||
println "a + b == (${a}) + (${b}) == " + (a + b)
|
||
println "a * b == (${a}) * (${b}) == " + (a * b)
|
||
assert a + (-a) == 0
|
||
println "-a == -(${a}) == " + (-a)
|
||
assert (a * a.recip - 1).abs < ε
|
||
println "1/a == (${a}).recip == " + (a.recip)
|
||
println "a * 1/a == " + (a * a.recip)
|
||
println()
|
||
|
||
println 'Demo 2: other functionality not requested, but important for completeness'
|
||
def c = 10
|
||
def d = 10 as Complex
|
||
assert d instanceof Complex && c instanceof Number && d == c
|
||
assert a + c == c + a
|
||
println "a + 10 == 10 + a == " + (c + a)
|
||
assert c - a == -(a - c)
|
||
println "10 - a == -(a - 10) == " + (c - a)
|
||
println "a - b == (${a}) - (${b}) == " + (a - b)
|
||
assert c * a == a * c
|
||
println "10 * a == a * 10 == " + (c * a)
|
||
assert (c / a - (a / c).recip).abs < ε
|
||
println "10 / a == 1 / (a / 10) == " + (c / a)
|
||
println "a / b == (${a}) / (${b}) == " + (a / b)
|
||
assert (a ** 2 - a * a).abs < ε
|
||
println "a ** 2 == a * a == " + (a ** 2)
|
||
println "0.9 ** b == " + (0.9 ** b)
|
||
println "a ** b == (${a}) ** (${b}) == " + (a ** b)
|
||
println 'a.real == ' + a.real
|
||
println 'a.imag == ' + a.imag
|
||
println '|a| == ' + a.abs
|
||
println 'a.rho == ' + a.rho
|
||
println 'a.ρ == ' + a.ρ
|
||
println 'a.theta == ' + a.theta
|
||
println 'a.θ == ' + a.θ
|
||
println '~a (conjugate) == ' + ~a
|
||
|
||
def ρ = 10
|
||
def π = Math.PI
|
||
def n = 3
|
||
def θ = π / n
|
||
|
||
def fromPolar1 = fromPolar(ρ, θ) // direct polar-to-cartesian conversion
|
||
def fromPolar2 = exp(θ.i) * ρ // Euler's equation
|
||
println "ρ*cos(θ) + i*ρ*sin(θ) == ${ρ}*cos(π/${n}) + i*${ρ}*sin(π/${n})"
|
||
println " == 10*0.5 + i*10*√(3/4) == " + fromPolar1
|
||
println "ρ*exp(i*θ) == ${ρ}*exp(i*π/${n}) == " + fromPolar2
|
||
assert (fromPolar1 - fromPolar2).abs < ε
|