fundo
Quaternion é um sistema numérico que estende números complexos. Um quaternion tem a seguinte forma
onde são números reais e são três unidades fundamentais de quaternião . As unidades possuem as seguintes propriedades:
Observe que a multiplicação de quaternion não é comutativa .
Tarefa
Dado um quaternion não real , calcule pelo menos uma de suas raízes quadradas.
Quão?
De acordo com esta resposta Math.SE , podemos expressar qualquer quaternion não real da seguinte forma:
onde são números reais e é o vetor da unidade imaginária na forma com . Qualquer um desses possui a propriedade , para que possa ser visto como a unidade imaginária.
Então o quadrado de fica assim:
Inversamente, dado um quaternário , podemos encontrar a raiz quadrada de resolvendo as seguintes equações
que é idêntico ao processo de encontrar a raiz quadrada de um número complexo.
Observe que um número real negativo tem infinitas raízes quadradas em quaterniões, mas um quaternion não real possui apenas duas raízes quadradas .
Entrada e saída
Input é um quaternion não real. Você pode assumir isso como quatro números reais (ponto flutuante), em qualquer ordem e estrutura de sua escolha. Não real significa que pelo menos um de é diferente de zero.
A saída é um ou dois quaternions que, ao quadrado, são iguais à entrada.
Casos de teste
Input (a, b, c, d) => Output (a, b, c, d) rounded to 6 digits
0.0, 1.0, 0.0, 0.0 => 0.707107, 0.707107, 0.000000, 0.000000
1.0, 1.0, 0.0, 0.0 => 1.098684, 0.455090, 0.000000, 0.000000
1.0, -1.0, 1.0, 0.0 => 1.168771, -0.427800, 0.427800, 0.000000
2.0, 0.0, -2.0, -1.0 => 1.581139, 0.000000, -0.632456, -0.316228
1.0, 1.0, 1.0, 1.0 => 1.224745, 0.408248, 0.408248, 0.408248
0.1, 0.2, 0.3, 0.4 => 0.569088, 0.175720, 0.263580, 0.351439
99.0, 0.0, 0.0, 0.1 => 9.949876, 0.000000, 0.000000, 0.005025
Gerado usando este script Python . Somente uma das duas respostas corretas é especificada para cada caso de teste; o outro são todos os quatro valores negados.
Critério de pontuação e vitória
Aplicam-se as regras de código-golfe padrão . O programa ou função mais curto em bytes em cada idioma vence.
a,[b,[c,[d]]]
é bom, se você pode de alguma forma salvar bytes com ele :)
a, (b, c, d)
?