Escreva uma função ou programa nomeado que calcule o produto quaternion de dois quaternions. Use o mínimo de bytes possível.
Quaternions
Quaternions são uma extensão dos números reais que ampliam ainda mais os números complexos. Em vez de uma única unidade imaginária i
, os quaternions usam três unidades imaginárias i,j,k
que satisfazem os relacionamentos.
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
(Também há tabelas na página da Wikipedia .)
Em palavras, cada unidade imaginária se enquadra em -1
e o produto de duas unidades imaginárias diferentes é o terceiro restante, +/-
dependendo se a ordem cíclica (i,j,k)
é respeitada (isto é, a regra da mão direita ). Então, a ordem da multiplicação é importante.
Um quaternion geral é uma combinação linear de uma parte real e das três unidades imaginárias. Então, é descrito por quatro números reais (a,b,c,d)
.
x = a + b*i + c*j + d*k
Assim, podemos multiplicar dois quaternions usando a propriedade distributiva, tendo o cuidado de multiplicar as unidades na ordem correta e agrupando os termos no resultado.
(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
Visto dessa maneira, a multiplicação de quaternion pode ser vista como um mapa de um par de quatro tuplas para uma única quatro, que é o que você deve implementar.
Formato
Você deve escrever um programa ou uma função nomeada . Um programa deve receber entradas do STDIN e imprimir o resultado. Uma função deve receber entradas de função e retornar (não imprimir) uma saída.
Os formatos de entrada e saída são flexíveis. A entrada é oito números reais (os coeficientes para dois quaternions) e a saída consiste em quatro números reais. A entrada pode ter oito números, duas listas de quatro números, uma matriz 2x4 etc. O formato de entrada / saída não precisa ser o mesmo. A ordem dos (1,i,j,k)
coeficientes depende de você.
Os coeficientes podem ser negativos ou não inteiros. Não se preocupe com precisão real ou transbordamentos.
Banido: Função ou tipos especificamente para quaterniões ou equivalentes.
Casos de teste
Estes estão no (1,i,j,k)
formato coeficiente.
[[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]
Implementação de referência
No Python, como função:
#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