複素数(8)

べき乗

powの値域は非常に複雑。

 z^a = (e^{\log{z}})^a = e^{a\log{z}}

だが、log zは2πiの周期を持つから、alog zは2πaiの周期になる。
aによって3種類に分かれる。


1)aが整数の場合
一価関数となる。
2)aが整数でない有理数の場合
a = m / nと表すと(m, nは互いに素、n > 0)、
n価関数となる。
3)その他の場合
無限価となる。


ただし、主値としては、次のように単純に計算すればよい。


import std.cstream;
import std.math;

void main(char[][] args) {
dout.writefln(pow(-1+0i, 0+1i)); // 0.0432139+0i
dout.writefln(pow(1+1i, 1+1i)); // 0.273957+0.583701i
dout.writefln(pow(0+0i, 1+0i)); // 1+0i
}

cdouble pow(cdouble z, cdouble a) {
if(z == 0 + 0i) {
if(a == 0 + 0i)
return 1 + 0i;
else
return 0 + 0i;
}
else {
return exp(a * log(z));
}
}

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);
}

cdouble exp(cdouble c) {
double im = c.im;
return std.math.exp(c.re) * (cos(im) + 1i * sin(im));
}