Escriba una función o programa con nombre que calcule el producto quaternion de dos cuaterniones. Use la menor cantidad de bytes posible.
Cuaterniones
Los cuaterniones son una extensión de los números reales que amplía aún más los números complejos. En lugar de una sola unidad imaginaria i
, los cuaterniones usan tres unidades imaginarias i,j,k
que satisfacen las relaciones.
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
(También hay tablas de estos en la página de Wikipedia ).
En palabras, cada unidad imaginaria se cuadra con -1
, y el producto de dos unidades imaginarias diferentes es la tercera restante, +/-
dependiendo de si (i,j,k)
se respeta el orden cíclico (es decir, la regla de la mano derecha ). Entonces, el orden de multiplicación es importante.
Un cuaternión general es una combinación lineal de una parte real y las tres unidades imaginarias. Entonces, se describe con cuatro números reales (a,b,c,d)
.
x = a + b*i + c*j + d*k
Entonces, podemos multiplicar dos cuaterniones usando la propiedad distributiva, teniendo cuidado de multiplicar las unidades en el orden correcto y agrupando términos similares en el 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 de esta manera, la multiplicación de cuaterniones puede verse como un mapa de un par de 4 tuplas a un solo 4 tuplas, que es lo que se le pide que implemente.
Formato
Debe escribir un programa o una función con nombre . Un programa debe tomar entradas de STDIN e imprimir el resultado. Una función debe tomar entradas de función y devolver (no imprimir) una salida.
Los formatos de entrada y salida son flexibles. La entrada es ocho números reales (los coeficientes para dos cuaterniones), y la salida consta de cuatro números reales. La entrada puede ser ocho números, dos listas de cuatro números, una matriz de 2x4, etc. El formato de entrada / salida no tiene que ser el mismo. El orden de los (1,i,j,k)
coeficientes depende de usted.
Los coeficientes pueden ser negativos o no completos. No se preocupe por la precisión real o los desbordamientos.
Prohibido: función o tipos específicos para cuaterniones o equivalentes.
Casos de prueba
Estos están en (1,i,j,k)
formato de 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]
Implementación de referencia
En Python, como función:
#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