Quatro vetores, parte 3: transformações de Lorentz

Neste desafio, estendemos a classe FourVector que criamos na primeira e na segunda parte da coleção FourVector. Agora adicionaremos transformações de Lorentz, especificamente "Rotações puras" e "Boosts puros". Para obter detalhes sobre essa operação, consulte a página da Wiki vinculada em Recursos.

Portanto, adicione os seguintes recursos à classe FourVector:

  • Um método auxiliar KroneckerDelta que recebe dois inteiros (por exemplo, i e j) e retorna 1 se i=j e 0 caso contrário.
  • Um método auxiliar LeviCivitaSymbol que recebe três inteiros (por exemplo, i, j e k) e retorna 1 se (i,j,k) for uma permutação par de (1,2,3) (ou seja, (i,j,k) for (1,2,3), (2,3,1) ou (3,1,2)), -1 se (i,j,k) for uma permutação ímpar de (1,2,3) (ou seja, (i,j,k) for (1,3,2), (2,1,3) ou (3,2,1)) e 0 caso contrário (ou seja, se i=j, i=k ou j=k).
  • Um método PureRotation que recebe um vetor 3D e um ângulo (em graus) como argumentos. Ele deve realizar uma rotação pura (sem boost), conforme especificado aqui. Nos casos de teste, o vetor 3D nem sempre é um vetor unitário, portanto normalize-o. O valor de retorno é um novo Four Vector, ou seja, o FV original não é alterado.
  • Um método PureBoost que recebe um vetor 3D como argumento, representando uma 3-velocidade entre os dois referenciais, conforme especificado aqui. Ele deve realizar um boost puro (sem rotação) usando a 3-velocidade passada como argumento. O valor de retorno é um novo Four Vector, ou seja, o FV original não é alterado. Use um valor de 299792458 para a velocidade da luz (em metros por segundo).

Exemplos

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

Salve sua classe FourVector para uso posterior; adicionaremos novos recursos nos próximos desafios desta série. Você pode presumir casos de teste válidos (por exemplo, nenhum boost com v=[0,0,0]).