Help us understand the problem. What is going on with this article?

四元数電卓を作ろう

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で興味をもっていただけたら幸いです。私もちゃんと勉強したくなってきました。

sym_num
LALの笹川です。よろしくお願いします。
http://eisl.kan-be.com/
fukuokaex
エンジニア/企業向けにElixirプロダクト開発・SI案件開発を支援する福岡のコミュニティ
https://fukuokaex.fun/
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