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,kque 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 -1e 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
