複素数(4)

対数関数

指数関数の逆関数だから、

 e^{X+iY} = e^X(\cos{Y} + i\sin{Y}) = x + iy

とおいて、

 e^X = \sqrt{x^2+y^2}
 Y = \mbox{atan2}(y, x)

atan2は便宜的に使った。
だから、

 \log{(x + iy)} = \log{\sqrt{x^2+y^2}} + i\mbox{atan2}(y, x)

ところが、atan2は周期2πの多価関数だから、logも同様となる。
例えば、 \log{i}を考えると、

 e^{\frac{\pi}{2}i} = \cos{\frac{\pi}{2}} + i\sin{\frac{\pi}{2}} = i

となるが、同時に、

 e^{\frac{5\pi}{2}i} = \cos{\frac{5\pi}{2}} + i\sin{\frac{5\pi}{2}} = i

となるため、 \log{i}は多価関数である。


プログラムとして、
返り値が複数あるのでは成り立たないため、
代表的な値をとる。
これを主値と呼ぶ。
C++ではどうなっているのかというと、


#include
#include
#include

using namespace std;

typedef complex cplx;

void main(void) {
cout << log(cplx(-1, 0)) << endl; // (0,3.14159)
cout << log(cplx(-1, -1)) << endl; // (0.346574,-2.35619)
}

虚部θは、-π<θ≦πとなっているようである。
すなわち、atan2がそのまま使える。


import std.cstream;
import std.math;

void main(char[][] args) {
dout.writefln(log(-1+0i)); // 0+3.14159i
dout.writefln(log(-1-1i)); // 0.346574+-2.35619i
}

cdouble log(cdouble z) {
double x = z.re;
double y = z.im;
return std.math.log(x * x + y * y) / 2 + 1i * atan2(y, x);
}