オイラーの公式を使って複素数の冪乗を簡単におこなう
前回の最後で、複素数の冪乗は、指数の値が大きくなるほどに面倒くさくなることを確認しましたが、この間 Newton 別冊「虚数がよくわかる―”ありもしない”のに、難問解決に不可欠な数」というムックを読んでいたら、複素数の乗算を簡単に計算する方法が載ってました(P138、139)。
なんでもオイラーの公式というものを使うらしい。
オイラーの公式って何だよ、ってのは数学よく分からん私には説明できないので、興味のある方は各自で調べてくださいっす。
結論だけを述べると、複素数を極座標形式に置き換えると、冪乗がとっても簡単にできるようになるとのこと。
複素数は、実数部を X 座標、虚数部を Y 座標に見なすことができるので、当然、極座標で表現することもできますよね。
複素数を極座標形式に置き換えたときの距離をr、偏角を t とし、冪乗の指数を n としたとき、複素数の冪乗は以下のように計算できるそうな(t はラジアン)。
z = (r, t)
z^n = (r^n, t*n)
距離は指数で冪乗して、偏角は指数倍する。何という簡単さ。
この極座標を直交座標に置き換えます。極座標を直交座標に置き換えるのは Point クラスの poler メソッドでもできますが、その公式は以下のとおりでしたね。
x = cos(t) * r
y = sin(t) * r
この過程を ActionScript で書いたのが以下。投稿コードの213~222行目です。_expo ってのが冪乗の指数。
// 複素数を局座標化 r = Math.sqrt(zRlSqr + zImSqr); t = Math.atan2(zIm, zRl); // オイラーの公式による冪乗計算 r2 = r; // 距離 j = _expo; while (--j) r2 *= r; t2 = t * _expo; // 偏角 zRl = Math.cos(t2) * r2 + cRl; zIm = Math.sin(t2) * r2 + cIm;
ところで極座標・直交座標変換のステップは sqrt、atan2、cos、sin と Math クラスのメソッド使いまくりで重たいわけですが、これをもっとコストのかからないコードにする方法ってないですかねー? 諸先輩方のご助言頂ければ幸いです。
[ad#aquioux_net_article]
Comments
Tell me what you're thinking...
and oh, if you want a pic to show with your comment, go get a gravatar!
