Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
1
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

四元数電卓を作ろう

はじめに

神戸大学の「複素数電卓を作ろう」という学習用のページに触発されて、四元数電卓を作りました。自作、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で興味をもっていただけたら幸いです。私もちゃんと勉強したくなってきました。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
1
Help us understand the problem. What are the problem?