public Complex64 Power(Complex64 y) {
double c = y.real;
double d = y.imag;
int power = (int)c;
if (power == c && power >= 0 && d == .0) {
Complex64 result = One;
if (power == 0) return result;
Complex64 factor = this;
while (power != 0) {
if ((power & 1) != 0) {
result = result * factor;
}
factor = factor * factor;
power >>= 1;
}
return result;
} else if (IsZero) {
return y.IsZero ? One : Zero;
} else {
double a = real;
double b = imag;
double powers = a * a + b * b;
double arg = System.Math.Atan2(b, a);
double mul = System.Math.Pow(powers, c / 2) * System.Math.Exp(-d * arg);
double common = c * arg + .5 * d * System.Math.Log(powers);
return new Complex64(mul * System.Math.Cos(common), mul * System.Math.Sin(common));
}
}