はじめに
神戸大学の「複素数電卓を作ろう」という学習用のページに触発されて、四元数電卓を作りました。自作、O-Prologのテストも兼ねています。
神戸大学のページ
このページを参考にさせていただきました。
http://bach.istc.kobe-u.ac.jp/prolog/intro/complex.html
四元数(しげんすう)とは
数学者ハミルトンにより考案されました。複素数は実数と虚数単位のiとの組み合わせで表現されていました。四元数は実数とi,j,kとから成ります。詳しいことはWikipediaをご覧ください。
本で四元数のことを読んだのですが、覚えているのはハミルトンがこれを思いついた瞬間のことでした。散歩をしていたら四元数のことを思いついたそうです。ハミルトンは忘れないようにすぐに近くの橋に式を刻み込んだのだそうです。ハミルトンは数学の天才だったにもかかわらず、あまりその才能を認められず、晩年は孤独な生活を送っていたということだけよく覚えています。数学とはあまり関係ないですね。
四元数の加減乗除
このページを参考にさせていただきました。→http://sammaya.garyoutensei.com/math_phys/math1/math1-10/math1-10.html
ベクトルの演算となんとなく似ています。
要素の分解
q(X,Q) :-
number(X),Q=[X,0,0,0].
q(i,Q) :-
Q=[0,1,0,0].
q(j,Q) :-
Q=[0,0,1,0].
q(k,Q) :-
Q=[0,0,0,1].
q(X1+X2*i+X3*j+X4*k,Q) :-
Q=[X1,X2,X3,X4].
加算
q(X1+X2, Q) :-
q(X1, [R1,I1,J1,K1]),
q(X2, [R2,I2,J2,K2]),
R is R1 + R2,
I is I1 + I2,
J is J1 + J2,
K is K1 + K2,
Q = [R,I,J,K].
減算
q(X1-X2,Q) :-
q(X1, [R1,I1,J1,K1]),
q(X2, [R2,I2,J2,K2]),
R is R1 - R2,
I is I1 - I2,
J is J1 - J2,
K is K1 - K2,
Q = [R,I,J,K].
負数
q(-X1) :-
q(X1,[R1,I1,J1,K1]),
R is -R1,
I is -I1,
J is -J1,
K is -K1,
Q = [R,I,J,K].
乗算
q(X1*X2,Q) :-
q(X1, [R1,I1,J1,K1]),
q(X2, [R2,I2,J2,K2]),
R is R1*R2 - I1*I2 - J1*J2 - K1*K2,
I is R1*I2 + I1*R2 + J1*K2 - K1*J2,
J is R1*J2 - I1*K2 + J1*R2 + K1*I2,
K is R1*K2 + J1*K2 - K1*I2 + K1*R2,
Q = [R,I,J,K].
除算
q(X1/X2,Q) :-
q(X1, [R1,I1,J1,K1]),
q(X2, [R2,I2,J2,K2]),
I3 is -I1,
J3 is -J1,
K3 is -K1,
q(X2*(R1+I3*i+J3*j+K3*k),[R4,I4,J4,K4]),
D is (R1^2) + (I1^2) + (J1^2) + (K1^2),
R is R4/D,
I is I4/D,
J is J4/D,
K is K4/D,
Q = [R,I,J,K].
べき乗は右結合
べき乗の^記号は右結合です。
| ?- current_op(X,Y,'^').
X = 200
Y = xfy
yes
|
カッコでくくらないと意図しない結果になってしまいます。次のように記述します。
D is (R1^2) + (I1^2) + (J1^2) + (K1^2),
電卓化
神戸大の教材と同様にこれらをまとめて電卓化します。
q :-
read(X),
q(X, [R,I,J,K]),
write(R+I*i+J*j+K*k),
nl,
q.
実行例
さあ、O-Prologで動かしてみます。
O-Prolog Ver 1.62(Chika)
| ?- ['quarternion.pl'].
yes
| ?- q.
(1+1*i+1*j+1*k)+(1+1*i+1*j+1*k).
2+2*i+2*j+2*k
(1+1*i+1*j+1*k)-(1+1*i+1*j+1*k).
0+0*i+0*j+0*k
(1+1*i+1*j+1*k)*(1+1*i+1*j+1*k).
-2+2*i+2*j+2*k
(1+1*i+1*j+1*k)/(1+1*i+1*j+1*k).
1.0+0.0*i+0.0*j+0.0*k
i.
1.0+0.0*i+0.0*j+0.0*k
12.
12+0*i+0*j+0*k
^C
このページで検算しました。→https://keisan.casio.jp/exec/user/1462095609
もっと人間にとって見やすい表示にする必要があります。工夫が必要ですね。
終わりに
ふだんは四元数を使うことはないのですが、物理学では重宝されているようです。複素数と同様に学ぶ価値がありそうです。Prologで興味をもっていただけたら幸いです。私もちゃんと勉強したくなってきました。