掲示板お問い合わせランダムジャンプ



この広告は30日以上更新がないブログに表示されております。 新しい記事を書くことで広告を消すことができます。

別のblogとか

2012年01月12日
複素数型と関数ライブラリ
色々あって複素数が必要な場面の場合、複素数をどう表現するのか、ということを調べてきました。

Perlの場合、use Math::Complex;すればよい。私の環境では既に入っていた。ただ、気になったのはprint i*i,"\n";の結果が[1,pi]と極形式になること。
なお、さっきのコードを見ればわかるように演算子は普通に実数で使っていたものが(オーバーロードされていて)使えるし、iと書けば虚数単位として認識される。
共役複素数を返す単項演算子は~である。use Math::Complex; $z=1+2*i; print ~$z;というコードを書けば、1-2iと、今度は直交形式で表示される。
ほかに、print sin(i);とか数学関数に複素数を放り込んでもちゃんと計算してくれるし(この場合は1.1752011936438iと表示された)、使いやすい。

Pythonの場合、複素数型がビルトインになっている。但し、虚数単位にはjを使う(数値の後ろに付けると、その数値は実数ではなく純虚数とみなされる)。特に何もせず、print 1j*1j;とだけすると、(-1+0j)と表示される。このように普通に四則計算もできる。
複素数における関数は、実数におけるmathに対応するものとして複素数ではcmathを使う。これは、Pythonの標準ライブラリである。import cmath; print cmath.sin(1j)とすれば、1.17520119364jという結果を得る。

Rubyは、実地で試してみようと思ったらうちのopenSUSEにはRubyがなかったのでsudo zypper install rubyした。リポジトリから持ってこれたバージョンは1.8.7である。
require 'complex'すれば複素数が使えるようになるのだが、どうやらRuby 1.9では、Complexクラスがbuilt-inになるようだ。require 'complex'; print Complex::I*Complex::I;の結果は、-1+0iとなる。ここで、Complex::Iは虚数単位である。
複素数の関数計算は、require 'cmath'すれば、Cmathモジュールで行えるようになる……はずなのだが、どうやら1.8系列にはこのモジュールはないらしい。math.rbすら入っていないし……どういうことなの。

PHPの場合は需要がない? のか、そんなライブラリはないようだ。かろうじて見つけたのがこれこれ

Javaの場合、標準ライブラリには入っていない。Jakarta Commonsにはあるらしいのだが……

VBやC#の場合、.NET Framework 4.0にはComplex構造体があるらしい。私が以前練習で作った関数電卓の場合は.NET 2.0で作ってたのでそんなものはなかった。

C言語だったら最近のバージョンはcomplex.hを使えばいい。

HSPにはそんなものはなかったので、作った
[ 投稿者:芙蓉美晴 (MihailJP) at 02:24 | コーディング | コメント(0) | トラックバック(0) ]

コマンドラインオプションをパースするライブラリ
例えば、lsコマンドに-lをつけて実行すると詳細情報が表示されるし、-aをつければドットファイルも表示される。-la とすればその両方を指定したことになる。
コマンドライン引数の取得自体はARGVとかのビルトイン変数なり関数なりを使えばいいんだけど、これをコマンドラインオプション(スイッチ)として認識するにはどうすればいいのか。いちいち専用のコードを組むのは大変だ、ライブラリがあるに違いない。

実際、あるようだ。以下、備忘録を兼ねて。

Rubyでは、OptionParserを使えばよい。OptionParser.new()でオブジェクト初期化し、OptionParser.on("-a")でコードを書くと良いようだ。--help--versionは別に登録しなくても使用できる。

Perlでは、Getopt::Longというモジュールが元から使用できるようだ。ほかに、Getopt::Compactというモジュールもあるらしく、そちらを使用する人もいる。

Pythonでは、getoptoptparseが標準添付されている。optparseのほうが簡便で使いやすいようだ。

C言語では、getopt()というライブラリ関数がある。長い形式を扱うためのgetopt_long()という関数もある(こっちはどうもGNU拡張らしい?)。

Javaにはそういうライブラリ関数が標準添付されていないらしい。しかし、ライブラリ自体はいくつかあるようだ。中にはC言語用の GNU getopt をJavaに移植したものもあった。

PHPの場合……PHPでコマンドライン、って正気か? と思ってましたが、よく考え直すとそれは私の考えが浅はかだっただけの様です。PHPにはいくつかの実装があるようです。Pearには4つパッケージがあるようで、Console_CommandLineが使いやすそうです。

HSPの場合……引数自体はdir_cmdlineで取得できるのですが、残念なことに個々の引数に分解するのも、-aのようなスイッチを認識したりするのも、自前でコードを書く必要があるようだ。
[ 投稿者:芙蓉美晴 (MihailJP) at 00:46 | コーディング | コメント(0) | トラックバック(0) ]

2012年01月07日
HSPで複素数を扱うプラグインを作ってみた
需要なんて、あるわけない


麻雀とか手書きフォントとかの息抜きに、1月2日に作ってました。
本体は以前VBで作った関数電卓用のライブラリをC言語に移植するだけだったから楽に出来ました。……いや、楽、といえば嘘になるな。
複素数は実部と虚部からなる構造体(あるいはクラス)なのですが、コンストラクタやデストラクタ、演算子のオーバーロードとかをC言語内部で付けてしまうとHSPに値を渡したときにおかしくなるので関数内の四則計算をポーランド記法(前置記法。例えば 1+2 を + 1 2 と記述すること。ポーランド人の Jan Łukasiewicz が考案したことからこの呼び名がある)にすることを……強いられているんだ!
……という訳で移植だったので半日でできたわけですが、せっかくだからと今日サンプルプログラムを作っていたらバグが発覚。今日の午前中はそれの修正をしていました(そのサンプルプログラムを作っていたのが今日だったんだけど)。移植元のVBの構造体も修正しなければならなかったので大変で。
coscx()(複素余弦関数に私がつけた名前)はWikipediaを読みなおした結果公式のプラスとマイナスを間違えていただけなのですぐに分かりました。問題はacoscx()(複素逆余弦関数)のほうはというと、どうもWikipediaのこの項目の記述が間違っているらしく、なかなか分かりませんでしたが、こっちの項目と食い違っていて、調べた結果こっちに書いている内容のほうが正しいことが判明しました。
何故かよく分からなくてPythonのインタプリタで検算したりしていました…… Pythonは複素数型がビルトインなので楽(但し虚数単位にはjを使う)。複素関数はimport cmathが必要だけどそれも標準で入っているはずなので大丈夫だ、問題ない


おまけ

【魔法数学ふくそ☆マギカ】
第1話「√の中で会った、ような…」
第2話「共役はとっても嬉しいなって」
第3話「もう三次方程式も怖くない」
第4話「実部も、虚部も、あるんだよ」
第5話「行列表現なんて、あるわけない」
第6話「cos2iなんて絶対おかしいよ」
第7話「本当のガウス平面と向き合えますか?」
第8話「あたしって、mod 2π」
第9話「そんなの、オイラーの公式が許さない」
第10話「もう極形式にも頼らない」
第11話「最後に残った複素解析」
第12話「わたしの、最高の数」
[ 投稿者:芙蓉美晴 (MihailJP) at 12:44 | 日記 | コメント(0) | トラックバック(0) ]