2013年5月25日土曜日

Wolfram Alpha で演算するメモ

ビット演算

 普段は google 電卓で間に合わせてしまうことも多いのですけど、 ビット論理演算は苦手な部分です。
さらに四則演算においても 64bit 整数を扱っているとどうにも使い難いことが結構あります。なぜか実数扱いになってしまって in hex で16進表示にできないようなパターンですね。

そういうときは Wolfram Alpha を使うことにしています。
しかしこれも、技術専用の計算機ではなくて幅が広いものなので、プログラミング気分で式を書くとエラーになったり assume されたりすることもしばしばあります。

例えば 0x プレフィックスの16進記法は文脈によって解釈されません。 '|' や '&' といった論理演算子は使えますが、 xor がありません。
そういうときは関数フォームを使いましょう。
関数フォームといっても bitxor() ではありません。 bitxor[] です。
bitxor[ bitor[0xdead000000000000, 0x0c00000000000000, 0x00a0000000000000], 0x5555000000000000]
結果は以下のようになります。

http://www.wolframalpha.com/share/clip?f=d41d8cd98f00b204e9800998ecf8427ea3esf8qete

まぁ、少々煩わしい。
通常、 wolfram alpha は、
to base16
で HEX 変換してくれますが、入力が既に HEX で計算している場合に to base16 を付けてしまうとなぜか Result が表示されなくなり other base conversions にも base16 の結果だけが抜けてしまうのでめんどいです。
たぶんバグだと思うのですが……。ずっとこうですから……諦めてます。

この場合は、 to base16 を付けずに other base conversions の base16 結果を使うか、その下の other data types のところの more と big endian ボタンを押して 64bit integer 且つ Big Endian 表示の結果を手に入れましょう。
なぜデフォルトが Little なのか理解に苦しみますが、これももうずっとこうなので……。
more を押さないと 64bit integer や double precision floating point の結果が見られないのも、もう 21 世紀なんだから一つ頼むよ!と思うところです。

行列計算

あれば octave、 3D に特化した計算なら blender コンソールを使うのですけどちょっと今持ち合わせが……なときとかに重宝します。
特に Blender コンソールは python 使える人には絶賛お勧めですよ。クォータニオンも使えるし。でも Matrix3, Matrix4 といったクラスベースなので、変態的な行列を使うときは逆にちょっと厳しい。

wolfram alpha での行列記法は, 2x2 の単位行列が
{{1, 0}, {0, 1}}
です。 octave と大体一緒ですかね。むしろ却って馴染み易いかも。

行ベクトルが {0, 0} で列ベクトルが {{0, 0}} です。
注意するべきは、行列の転置は
transpose M
または M^T です。 M' でもなければ M^t でもありません。

簡単な例で言うと、2Dベクトル(0, 0)の平行移動(-1, -1)は
{{1 , 0, -1}, {0, 1, -1}, {0, 0, 1}} * {0, 0, 1}
宗教上の理由で列ベクトルが使いたい人は
{{0, 0, 1}} * {{1 , 0, -1}, {0, 1, -1}, {0, 0, 1}}^T
です。DirectX 脳の人は注意してください。
例えば以下。 上向き単位ベクトルを 30deg 回転させるには
{{sqrt(3)/2 , -1/2}, {1/2, sqrt(3)/2}} * {0, 1}
または
{{0, 1}} * {{sqrt(3)/2 , -1/2}, {1/2, sqrt(3)/2}}^T

結果は,
http://www.wolframalpha.com/share/clip?f=d41d8cd98f00b204e9800998ecf8427ecq2au706qv



0 件のコメント:

コメントを投稿