Scrivi una funzione o un programma denominato che calcola il prodotto quaternione di due quaternioni. Utilizzare il minor numero di byte possibile.
quaternions
I quaternioni sono un'estensione dei numeri reali che estende ulteriormente i numeri complessi. Piuttosto che una singola unità immaginaria i
, i quaternioni usano tre unità immaginarie i,j,k
che soddisfano le relazioni.
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
(Ci sono anche tabelle di questi sulla pagina di Wikipedia .)
In parole, ogni unità immaginaria viene quadrata -1
e il prodotto di due diverse unità immaginarie è il terzo rimanente con una a +/-
seconda che l'ordine ciclico (i,j,k)
sia rispettato (cioè la regola della mano destra ). Quindi, l'ordine della moltiplicazione conta.
Un quaternione generale è una combinazione lineare di una parte reale e le tre unità immaginarie. Quindi, è descritto da quattro numeri reali (a,b,c,d)
.
x = a + b*i + c*j + d*k
Quindi, possiamo moltiplicare due quaternioni usando la proprietà distributiva, facendo attenzione a moltiplicare le unità nell'ordine giusto e raggruppando termini simili nel risultato.
(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
Vista in questo modo, la moltiplicazione del quaternione può essere vista come una mappa da una coppia di 4 tuple a una singola 4 tuple, che è ciò che ti viene chiesto di implementare.
Formato
È necessario scrivere un programma o una funzione denominata . Un programma dovrebbe prendere input da STDIN e stampare il risultato. Una funzione dovrebbe accettare input di funzione e restituire (non stampare) un output.
I formati di input e output sono flessibili. L'input è composto da otto numeri reali (i coefficienti per due quaternioni) e l'output è costituito da quattro numeri reali. L'ingresso può essere composto da otto numeri, due elenchi di quattro numeri, una matrice 2x4, ecc. Il formato di input / output non deve essere lo stesso. L'ordinamento dei (1,i,j,k)
coefficienti dipende da te.
I coefficienti possono essere negativi o non interi. Non preoccuparti della vera precisione o traboccamenti.
Vietato: funzione o tipi specifici per quaternioni o equivalenti.
Casi test
Questi sono in (1,i,j,k)
formato coefficiente.
[[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]
Implementazione di riferimento
In Python, come funzione:
#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