Cuatro vectores, parte 3: transformaciones de Lorentz

En este desafío, ampliamos la clase FourVector que creamos en la primera y segunda entrega de la colección FourVector. Ahora agregaremos transformaciones de Lorentz, concretamente "Rotaciones puras" e "Impulsos puros". Para obtener detalles sobre esta operación, consulta la página de Wiki enlazada en Recursos.

Por lo tanto, agrega las siguientes funciones a la clase FourVector:

  • Un método auxiliar KroneckerDelta que recibe dos enteros (por ejemplo, i y j) y devuelve 1 si i=j y 0 en caso contrario.
  • Un método auxiliar LeviCivitaSymbol que recibe tres enteros (por ejemplo, i, j y k) y devuelve 1 si (i,j,k) es una permutación par de (1,2,3) (es decir, (i,j,k) es (1,2,3), (2,3,1) o (3,1,2)), -1 si (i,j,k) es una permutación impar de (1,2,3) (es decir, (i,j,k) es (1,3,2), (2,1,3) o (3,2,1)) y 0 en caso contrario (es decir, si i=j, i=k o j=k).
  • Un método PureRotation que recibe un vector 3D y un ángulo (en grados) como argumentos. Debe realizar una rotación pura (sin impulso), tal como se especifica aquí. En los casos de prueba, el vector 3D no siempre es un vector unitario, así que normalízalo. El valor de retorno es un Four Vector nuevo; es decir, el FV original no cambia.
  • Un método PureBoost que recibe un vector 3D como argumento, el cual representa una 3-velocidad entre los dos marcos de referencia, tal como se especifica aquí. Debe realizar un impulso puro (sin rotación) mediante la 3-velocidad pasada como argumento. El valor de retorno es un Four Vector nuevo; es decir, el FV original no cambia. Usa un valor de 299792458 para la velocidad de la luz (en metros por segundo).

Ejemplos

u1 = FourVector([0, 1, 0, 0])
u1.KroneckerDelta(1, 1) ➞ 1
u1.KroneckerDelta(1, 2) ➞ 0
u1.LeviCivitaSymbol(1, 3, 2) ➞ -1
u1.LeviCivitaSymbol(1, 3, 1) ➞ 0
u1.PureRotation([0, 1, 0], 90) ➞ FourVector([0.0, 0.0, 0.0, -1.0])
c = 299792458.0
u1.PureBoost([c/100., 0, 0]) ➞ FourVector([-0.010000500037503126, 1.0000500037503126, 0.0, 0.0])

Notas

Guarda tu clase FourVector para usarla más adelante; agregaremos nuevas funciones en próximos desafíos de esta serie. Puedes suponer que los casos de prueba son válidos (por ejemplo, no habrá ningún impulso con v=[0,0,0]).