// Override. // (r * exp(i * theta))^(a + bi) = r^(a + bi) * exp(i * theta * a - theta * b) // = (r^a * exp(-theta * b)) * (r^b * exp(theta * a))^i ComplexNumber Power::eval(const ComplexNumber z) const { double r = z.mag(), theta = z.angle(); double a = exponent.real(), b = exponent.imag(); double coeff = pow(r, a) * exp(-theta * b); ComplexNumber w = iPower(pow(r, b) * exp(theta * a)); ComplexNumber v (coeff * w.real(), coeff * w.imag()); return v; }
// Override. // ln(z) = ln(|r|) + i * theta, where z = r * e^(i * theta) // log_z(w) = ln(w) * log_z(e) = ln(w) * 1 / (ln(r) + i * theta), where z = r * e^(i * theta). ComplexNumber Logarithm::eval(const ComplexNumber z) const { ComplexNumber argument = z + lambda; ComplexNumber ln_z (log(argument.mag()), argument.angle()); if (base == exp(1)) { return coefficient * ln_z; } else { ComplexNumber one (1, 0); ComplexNumber log_base (log(base.mag()), base.angle()); return coefficient * ln_z * (one / log_base); } }