0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

四元数(quaternion)と四元数群(その1)

0
Last updated at Posted at 2026-04-16

四元数(quaternion)(Wikipedia)とは、

複素数を拡張した数体系であり、虚数単位 i, j, k を用いて
$a+bi+cj+dk$
と表せる数のことである。ここで、a, b, c, d は実数であり、虚数単位 i, j, k は以下の関係を満たす。
$i^2=j^2=k^2=ijk=-1$

とのことですが、もう少し知りたいという人は四元数とはいったい何なのか?【ゆっくり解説】(YouTube) がお勧めです。

四元数だけで1冊の本になるほどトピックはたくさんあるようですが、今回は四元数群$Q_8$の乗積表を以下のステップで作ることを目標にします。

  1. 集合$ \lbrace \pm 1, \pm j, \pm j, \pm k \rbrace $は乗法に関して群を成しこれを$Q_8$で表す
  2. この集合をsympyのQuaternionを使って表す
  3. その乗法の表を表すマトリクスを作る
  4. そのマトリクスから$Q_8$の乗積表を作る

Q8をsympyのQuaternionを使って表す

Quaternionでは四元数$a+bi+cj+dk$を$Quaternion(a,b,c,d)$の形で表します。例えば$j \rightarrow Quaternion(0,0,1,0)$ となるのですが長いので8個の要素を整数$[0,1,2,3,4,5,6,7]$に変換するQ8dictを作っておきます

from sympy import Quaternion as Q

N2Quat = ["1", "-1", "i", "-i", "j", "-j", "k", "-k"]
Q8quat = [Q(1,0,0,0), Q(-1,0,0,0), Q(0,1,0,0), Q(0,-1,0,0), Q(0,0,1,0), Q(0,0,-1,0), Q(0,0,0,1), Q(0,0,0,-1)]
Q8dict = {Q8quat[i]: i for i in range(len(Q8quat))}   # (a+bi+cj+dk) -> 0-7
S2Q = {"i":2, "j":4, "k":6}

for k, v in Q8dict.items():
  print(f"# {v}: {N2Quat[v]:>3} =  {k}")
# 0:   1 =  1 + 0*i + 0*j + 0*k
# 1:  -1 =  (-1) + 0*i + 0*j + 0*k
# 2:   i =  0 + 1*i + 0*j + 0*k
# 3:  -i =  0 + (-1)*i + 0*j + 0*k
# 4:   j =  0 + 0*i + 1*j + 0*k
# 5:  -j =  0 + 0*i + (-1)*j + 0*k
# 6:   k =  0 + 0*i + 0*j + 1*k
# 7:  -k =  0 + 0*i + 0*j + (-1)*k

乗法の表を表すマトリクスQ8multを作る

Q8mult = [[Q8dict[Q8quat[x]*Q8quat[y]] for x in range(8)] for y in range(8)]   # Q8 multiplication matrix
print(Q8mult)
# [[0, 1, 2, 3, 4, 5, 6, 7], [1, 0, 3, 2, 5, 4, 7, 6], [2, 3, 1, 0, 7, 6, 4, 5], [3, 2, 0, 1, 6, 7, 5, 4], [4, 5, 6, 7, 1, 0, 3, 2], [5, 4, 7, 6, 0, 1, 2, 3], [6, 7, 5, 4, 2, 3, 1, 0], [7, 6, 4, 5, 3, 2, 0, 1]]

Q8の乗積表を作る

このQ8multの内容をN2Quatで "1,i,j,k" に戻せばQ8の乗積表ができます。

print(f"|  | "+" | ".join(list(map(lambda x: N2Quat[x], Q8mult[0])))+" |")
print("|:---:|" + ":---:|"*8)
for y, qm in enumerate(Q8mult):
  print(f"| **{N2Quat[y]}** | "+" | ".join(list(map(lambda x: N2Quat[x],qm)))+" |")
1 -1 i -i j -j k -k
1 1 -1 i -i j -j k -k
-1 -1 1 -i i -j j -k k
i i -i -1 1 -k k j -j
-i -i i 1 -1 k -k -j j
j j -j k -k -1 1 -i i
-j -j j -k k 1 -1 i -i
k k -k -j j i -i -1 1
-k -k k j -j -i i 1 -1

次回のその2では$ijk$の順列を変えた時の積を考えます。

(開発環境:Google Colab)

この考え方はProject Euler, Problem 980: The Quaternion Group Iを解くのに役に立ちます

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?