normal ordering

Boost.Spirit の練習がてら、 Mathematica の expand みたいなもの(Mathematicaよく知らんですが、要するに素因数分解の逆)を作ったわけですが。

http://shinh.skr.jp/dat_dir/no.cc

Boost.Spirit は Parsec よりはちょっと書きにくいかなぁという感じですけど、 Haskell はそれ以外の部分ていうか do モナドが苦痛でしょうがないのと、 Haskell とか OCaml の型システムってなんか parser 向きだよね、っていうあたりで、まぁどっちが幸せとも言えないような感じだなぁとか思いました。誰かが D で Spirit 作ってくれたら僕は感動すると思います。

Spirit とか Parsec で一番こう、 DSL たらしめている、というか、一見して驚く部分である、 BNF に近い記法である、っていうのは、なんかオペレータオーバーロードがある、っていうのが一番理由として大きいような。これをもって C++ やら Haskell はスバラシイ、っていうのは、なんかそれでいいんだろうか、とか思うんですよねどうも。

わざわざ再生産した理由は、少し普通と違う動作がさせたくて、演算子だと通常の交換関係が成り立たないので、このあたりなんとかしたいんですね。具体的にはボソンの昇降演算子の、

aa^\dagger=a^{\dagger}a+1

というのを処理して、全部 a^\dagger で始まるようにしてくれると嬉しいのです。

i@u ~/res/no> ./a.out
(ca-sA+z)(cA-sa+z)
(ca-sA+z)(cA-sa+z) => +cc+ccAa-csaa+cza-csAA+ssAa-szA+czA-sza+zz
<0|(ca-sA+z)(cA-sa+z)|0> => +cc+zz
<A|(ca-sA+z)(cA-sa+z)|A> => +cc+cczz-2cszz+2czz+sszz-2szz+zz
(ca-sA+z)(cA-sa+z)(ca-sA+z)(cA-sa+z)
(ca-sA+z)(cA-sa+z)(ca-sA+z)(cA-sa+z) => +cccc+3ccccAa-4cccsaa+3cccza-4cccsAA+8ccssAa-5ccszA+3ccczA-5ccsza+3cczz+ccccAAaa-2cccsAaaa+2ccczAaa-2cccsAAAa+4ccssAAaa-4ccszAAa+2ccczAAa-4ccszAaa+4cczzAa+ccssaaaa-2ccszaaa+2ccss-2csssaa+3cssza-2csssAaaa+4csszAaa+2csszaaa-4cszzaa+cczzaa-2cszz-4cszzAa+2czzza+ccssAAAA-2csssAAAa+2csszAAA-2ccszAAA+4csszAAa-4cszzAA-2csssAA+ssssAa-ssszA+ssssAAaa-2ssszAAa+3csszA-2ssszAaa+4sszzAa+sszzAA-2szzzA+cczzAA+2czzzA-sssza+sszz+sszzaa-2szzza+zzzz
<0|(ca-sA+z)(cA-sa+z)(ca-sA+z)(cA-sa+z)|0> => +cccc+3cczz+2ccss-2cszz+sszz+zzzz
<A|(ca-sA+z)(cA-sa+z)(ca-sA+z)(cA-sa+z)|A> => +cccc+3cccczz-8cccszz+6ccczz+8ccsszz-10ccszz+3cczz+cccczzzz-4cccszzzz+4ccczzzz+6ccsszzzz-12ccszzzz+6cczzzz+2ccss-4cssszz+6csszz-4cssszzzz+12csszzzz-12cszzzz-2cszz+4czzzz+sssszz-2ssszz+sssszzzz-4ssszzzz+6sszzzz-4szzzz+sszz+zzzz

わあいクソめんどくさい squeezed state の光子数分散が簡単に求められるぞー。と言ってもたぶん私以外誰も嬉しくない。一応、 A が a^\dagger です。 aAbB が昇降演算子、 z は <α|Aa|α> = z^2 ということにしてます。つまりα。

なにかあれば下記メールアドレスへ。
shinichiro.hamaji _at_ gmail.com
shinichiro.h