编写一个计算两个四元数的四元数乘积的命名函数或程序。使用尽可能少的字节。
四元数
四元数是实数的扩展,进一步扩展了复数。i
四元数使用三个i,j,k
满足关系的虚构单元,而不是单个虚构单元。
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页面上也有这些表格。)
换句话说,每个假想单位与平方-1
,两个不同的假想单位的乘积是剩余的第三个,+/-
取决于是否(i,j,k)
遵守循环顺序(即右手定则)。因此,乘法的顺序很重要。
一般的四元数是实部和三个虚部的线性组合。因此,用四个实数描述(a,b,c,d)
。
x = a + b*i + c*j + d*k
因此,我们可以使用分布属性将两个四元数相乘,注意按正确的顺序将单位相乘,并在结果中分组类似的项。
(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元组到单个4元组的映射,这是您要实现的。
格式
您应该编写程序或命名函数。程序应从STDIN输入并打印出结果。函数应接受函数输入并返回(不打印)输出。
输入和输出格式灵活。输入为八个实数(两个四元数的系数),输出为四个实数。输入可能是八个数字,两个四个数字的列表,一个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