public struct Complex {

    public let real: Double
    public let imaginary: Double

    public init(real inReal:Double, imaginary inImaginary:Double) {
        real = inReal
        imaginary = inImaginary
    }

    public static var i: Complex = Complex(real:0, imaginary: 1)
    public static var zero: Complex = Complex(real: 0, imaginary: 0)

    public var negate: Complex {
        return Complex(real: -real, imaginary: -imaginary)
    }

    public var invert: Complex {
        let d = (real*real + imaginary*imaginary)
        return Complex(real: real/d, imaginary: -imaginary/d)
    }

    public var conjugate: Complex {
        return Complex(real: real, imaginary: -imaginary)
    }

}
public func + (left: Complex, right: Complex) -> Complex {

    return Complex(real: left.real+right.real, imaginary: left.imaginary+right.imaginary)
}
public func * (left: Complex, right: Complex) -> Complex {

    return Complex(real: left.real*right.real - left.imaginary*right.imaginary,
        imaginary: left.real*right.imaginary+left.imaginary*right.real)
}
public prefix func - (right:Complex) -> Complex {
    return right.negate
}