Dada uma matriz quadrada, produza os autovalores da matriz. Cada valor próprio deve ser repetido um número de vezes igual à sua multiplicidade algébrica.
Os valores próprios de uma matriz A
são valores escalares λ
de tal modo que, por algum vector de coluna v
, A*v = λ*v
. Eles também são as soluções para o polinômio característico de A
: det(A - λ*I) = 0
(onde I
é a matriz de identidade com as mesmas dimensões que A
).
As saídas devem ter precisão de 3 dígitos significativos. Todas as entradas e saídas estarão dentro do intervalo representável de valores numéricos para o idioma escolhido.
Construções internas são aceitáveis, mas você deve incluir soluções que não usam construções internas.
Casos de teste
Nestes casos de teste, I
representa a unidade imaginária. Números complexos são escritos no formulário a + b*I
. Todas as saídas têm 3 dígitos significativos de precisão.
[[42.0]] -> [42.0]
[[1.0, 0.0], [0.0, 1.0]] -> [1.00, 1.00]
[[1.0, 2.0, 3.0], [4.0, 5.0, 6.0], [7.0, 8.0, 9.0]] -> [16.1, -1.12, -1.24e-15]
[[1.2, 3.4, 5.6, 7.8], [6.3, 0.9, -5.4, -2.3], [-12.0, -9.7, 7.3, 5.9], [-2.5, 7.9, 5.3, 4.4]] -> [7.20 + 5.54*I, 7.20 - 5.54*I, -4.35, 3.75]
[[-3.22 - 9.07*I, 0.193 + 9.11*I, 5.59 + 1.33*I, -3.0 - 6.51*I, -3.73 - 6.42*I], [8.49 - 3.46*I, -1.12 + 6.39*I, -8.25 - 0.455*I, 9.37 - 6.43*I, -6.82 + 8.34*I], [-5.26 + 8.07*I, -6.68 + 3.72*I, -3.21 - 5.63*I, 9.31 + 3.86*I, 4.11 - 8.82*I], [-1.24 + 9.04*I, 8.87 - 0.0352*I, 8.35 + 4.5*I, -9.62 - 2.21*I, 1.76 - 5.72*I], [7.0 - 4.79*I, 9.3 - 2.31*I, -2.41 - 7.3*I, -7.77 - 6.85*I, -9.32 + 2.71*I]] -> [5.18 + 16.7*I, -24.9 - 2.01*I, -5.59 - 13.8*I, 0.0438 - 10.6*I, -1.26 + 1.82*I]
[[-30.6 - 73.3*I, 1.03 - 15.6*I, -83.4 + 72.5*I, 24.1 + 69.6*I, 52.3 + 2.68*I, 23.8 + 98.0*I, 96.8 + 49.7*I, -26.2 - 5.87*I, -52.4 + 98.2*I, 78.1 + 6.69*I], [-59.7 - 66.9*I, -26.3 + 65.0*I, 5.71 + 4.75*I, 91.9 + 82.5*I, -94.6 + 51.8*I, 61.7 + 82.3*I, 54.8 - 27.8*I, 45.7 + 59.2*I, -28.3 + 78.1*I, -59.9 - 54.5*I], [-36.0 + 22.9*I, -51.7 + 10.8*I, -46.6 - 88.0*I, -52.8 - 32.0*I, -75.7 - 23.4*I, 96.2 - 71.2*I, -15.3 - 32.7*I, 26.9 + 6.31*I, -59.2 + 25.8*I, -0.836 - 98.3*I], [-65.2 - 90.6*I, 65.6 - 24.1*I, 72.5 + 33.9*I, 1.47 - 93.8*I, -0.143 + 39.0*I, -3.71 - 30.1*I, 60.1 - 42.4*I, 55.6 + 5.65*I, 48.2 - 53.0*I, -3.9 - 33.0*I], [7.04 + 0.0326*I, -12.8 - 50.4*I, 70.1 - 30.3*I, 42.7 - 76.3*I, -3.24 - 64.1*I, 97.3 + 66.8*I, -11.0 + 16.5*I, -40.6 - 90.7*I, 71.5 - 26.2*I, 83.1 - 49.4*I], [-59.5 + 8.08*I, 74.6 + 29.1*I, -65.8 + 26.3*I, -76.7 - 83.2*I, 26.2 + 99.0*I, -54.8 + 33.3*I, 2.79 - 16.6*I, -85.2 - 3.64*I, 98.4 - 12.4*I, -27.6 - 62.3*I], [82.6 - 95.3*I, 55.8 - 73.6*I, -49.9 + 42.1*I, 53.4 + 16.5*I, 80.2 - 43.6*I, -43.3 - 3.9*I, -2.26 - 58.3*I, -19.9 + 98.1*I, 47.2 + 62.4*I, -63.3 - 54.0*I], [-88.7 + 57.7*I, 55.6 + 70.9*I, 84.1 - 52.8*I, 71.3 - 29.8*I, -3.74 - 19.6*I, 29.7 + 1.18*I, -70.6 - 10.5*I, 37.6 + 99.9*I, 87.0 + 19.0*I, -26.1 - 82.0*I], [69.5 - 47.1*I, 11.3 - 59.0*I, -84.3 - 35.1*I, -3.61 - 35.7*I, 88.0 + 88.1*I, -47.5 + 0.956*I, 14.1 + 89.8*I, 51.3 + 0.14*I, -78.5 - 66.5*I, 2.12 - 53.2*I], [0.599 - 71.2*I, 21.7 + 10.8*I, 19.9 - 97.1*I, 20.5 + 37.4*I, 24.7 + 40.6*I, -82.7 - 29.1*I, 77.9 + 12.5*I, 94.1 - 87.4*I, 78.6 - 89.6*I, 82.6 - 69.6*I]] -> [262. - 180.*I, 179. + 117.*I, 10.3 + 214.*I, 102. - 145.*I, -36.5 + 97.7*I, -82.2 + 89.8*I, -241. - 104.*I, -119. - 26.0*I, -140. - 218.*I, -56.0 - 160.*I]
Respostas:
Haskell ,
576 554 532507 bytesSem built-ins!
Experimente online!
Muito obrigado @ ØrjanJohansen por um total de -47 bytes!
Explicação
Primeiro, calcula o polinômio característico com o algoritmo Faddeev – LeVerrier, que é a função
f
. Então a funçãoz
calcula todas as raízes desse polinômio iterando og
que implementa o Método de Laguerre para encontrar uma raiz, uma vez que uma raiz é encontrada, ela é removida eg
chamada novamente até que o polinômio tenha o grau 1, o qual é resolvido trivialmentez[a,b]=[-b/a]
.Ungolfed
Eu re-inlined as funções
sum
,length
,magnitude
,fromIntegral
,zipWith
e(&)
, assim como o pequeno ajudante(!)
. A funçãofaddeevLeVerrier
corresponde af
,roots
paraz
eg
paralaguerre
respectivamente.fonte
n!
!!
e fiquei realmente confuso: DOitava , 4 bytes
Experimente online!
Apenas dois bytes a mais que o equivalente ao idioma de golfe MATL!
Define um identificador de função anônimo para o
eig
interno. Curiosamente, a filosofia de design do MATLAB vai contra muitas linguagens de ponta, que gostam de usarDescripteFunctionNamesTakingArguments()
, enquanto o MATLAB e, consequentemente, o Octave tendem a obter o menor nome de função inequívoco possível. Por exemplo, para obter um s ubset de valores próprios (por exemplo, o menorn
em valor absoluto), você usaeigs
.Como um bônus, aqui está uma função (funciona no MATLAB e, em teoria, poderia funcionar no Octave, mas
solve
a tarefa não está realmente preparada) que não usa built-ins, mas resolve simbolicamente o problema de autovalordet(A-λI)=0
e o converte para a forma numérica usandovpa
fonte
MATL , 2 bytes
Experimente online!
Explicação
Eu segui o conselho usual em álgebra linear numérica: em vez de escrever sua própria função, use um built-in projetado especificamente para evitar instabilidades numéricas.
Aliás, é mais curto. ¯ \ _ (ツ) _ / ¯
fonte
Yv
?ZQ
) do polinômio característico. Mas computar explicitamente os coeficientes do polinômio pode ser muito trabalhosoMathematica, 11 bytes
Experimente online!
fonte
First@Eigensystem@#&
(20 bytes)R , 22 bytes
Experimente online!
Toma
m
como uma matriz. Frustrantemente, aeigen
função em R retorna um objeto de classeeigen
, que possui dois campos:values
os autovalores evectors
os autovetores.No entanto, mais irritantemente, o argumento opcional
only.values
retorna alist
com dois campos,values
contendo os valores próprios evectors
, definido comoNULL
, mas comoeigen(m,,T)
também tem 22 bytes, é uma lavagem.fonte
Julia , 12 bytes
Experimente online!
Infelizmente,
eig
retorna os valores próprios e os vetores próprios, como uma tupla, portanto, desperdiçamos outros 9 bytes para identificá-lo e capturar o primeiro item.fonte
Python + numpy, 33 bytes
fonte
Pari / GP , 19 bytes
Experimente online!
fonte