2つの四元数の四元数積を計算する名前付き関数またはプログラムを作成します。できるだけ少ないバイトを使用してください。
四元数
四元数は、複素数をさらに拡張する実数の拡張です。i
四元数は、単一の虚数単位ではなくi,j,k
、関係を満たす3つの虚数単位を使用します。
i*i = j*j = k*k = -1
i*j = k
j*i = -k
j*k = i
k*j = -i
k*i = j
i*k = -j
(Wikipediaページにもこれらの表があります。)
言い換えると、各虚数単位はに2乗し-1
、2つの異なる虚数単位の積は残りの3番目の単位であり+/-
、循環次数(i,j,k)
が尊重されるかどうかに依存します(つまり、右手則)。したがって、乗算の順序が重要です。
一般的なクォータニオンは、実数部と3つの虚数単位の線形結合です。したがって、4つの実数で記述されます(a,b,c,d)
。
x = a + b*i + c*j + d*k
そのため、分配プロパティを使用して2つのクォータニオンを乗算し、正しい順序で単位を乗算するように注意し、結果で類似の用語をグループ化できます。
(a + b*i + c*j + d*k) * (e + f*i + g*j + h*k)
= (a*e - b*f - c*g - d*h) +
(a*f + b*e + c*h - d*g)*i +
(a*g - b*h + c*e + d*f)*j +
(a*h + b*g - c*f + d*e)*k
このように見ると、四元数の乗算は、4タプルのペアから1つの4タプルへのマップとして見ることができます。
フォーマット
プログラムまたは名前付き関数のいずれかを作成する必要があります。プログラムは、STDINから入力を受け取り、結果を出力する必要があります。関数は関数の入力を受け取り、出力を返す(印刷しない)必要があります。
入力および出力形式は柔軟です。入力は8つの実数(2つの四元数の係数)であり、出力は4つの実数で構成されます。入力は8つの数字、4つの数字の2つのリスト、2x4マトリックスなどです。入力/出力形式は同じである必要はありません。(1,i,j,k)
係数の順序はユーザー次第です。
係数は、負の値でも、全体以外でもかまいません。実際の精度やオーバーフローについて心配する必要はありません。
禁止:クォータニオンまたは同等の機能またはタイプ。
テストケース
これらは(1,i,j,k)
係数形式です。
[[12, 54, -2, 23], [1, 4, 6, -2]]
[-146, -32, 270, 331]
[[1, 4, 6, -2], [12, 54, -2, 23]]
[-146, 236, -130, -333]
[[3.5, 4.6, -0.24, 0], [2.1, -3, -4.3, -12]]
[20.118, 2.04, 39.646, -62.5]
参照実装
Pythonでは、関数として:
#Input quaternions: [a,b,c,d], [e,f,g,h]
#Coeff order: [1,i,j,k]
def mult(a,b,c,d,e,f,g,h):
coeff_1 = a*e-b*f-c*g-d*h
coeff_i = a*f+b*e+c*h-d*g
coeff_j = a*g-b*h+c*e+d*f
coeff_k = a*h+b*g-c*f+d*e
result = [coeff_1, coeff_i, coeff_j, coeff_k]
return result