複素数を拡張した数体系であり、虚数単位 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$の乗積表を以下のステップで作ることを目標にします。
- 集合$ \lbrace \pm 1, \pm j, \pm j, \pm k \rbrace $は乗法に関して群を成しこれを$Q_8$で表す
- この集合をsympyのQuaternionを使って表す
- その乗法の表を表すマトリクスを作る
- そのマトリクスから$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を解くのに役に立ちます