O polinômio característico de uma matriz quadrada A é definido como o polinômio p A (x) = det ( I x- A ) onde I é a matriz de identidade e det é o determinante . Observe que essa definição sempre nos fornece um polinômio monônico, de modo que a solução é única.
Sua tarefa para esse desafio é calcular os coeficientes do polinômio característico para uma matriz com valor inteiro; para isso, você pode usar built-ins, mas isso é desencorajado.
Regras
- entrada é uma matriz inteira NxN (N ≥ 1) em qualquer formato conveniente
- seu programa / função produzirá / retornará os coeficientes em ordem crescente ou decrescente (especifique qual)
- os coeficientes são normatizados de modo que o coeficiente de x N seja 1 (consulte casos de teste)
- você não precisa lidar com entradas inválidas
Casos de teste
Os coeficientes são dados em ordem decrescente (por exemplo, x N , x N-1 , ..., x 2 , x, 1):
[0] -> [1 0]
[1] -> [1 -1]
[1 1; 0 1] -> [1 -2 1]
[80 80; 57 71] -> [1 -151 1120]
[1 2 0; 2 -3 5; 0 1 1] -> [1 1 -14 12]
[4 2 1 3; 4 -3 9 0; -1 1 0 3; 20 -4 5 20] -> [1 -21 -83 559 -1987]
[0 5 0 12 -3 -6; 6 3 7 16 4 2; 4 0 5 1 13 -2; 12 10 12 -2 1 -6; 16 13 12 -4 7 10; 6 17 0 3 3 -1] -> [1 -12 -484 3249 -7065 -836601 -44200]
[1 0 0 1 0 0 0; 1 1 0 0 1 0 1; 1 1 0 1 1 0 0; 1 1 0 1 1 0 0; 1 1 0 1 1 1 1; 1 1 1 0 1 1 1; 0 1 0 0 0 0 1] -> [1 -6 10 -6 3 -2 0 0]
[ 1.00000000e+00 -1.51000000e+02 1.12000000e+03]
, por exemplo?Respostas:
SageMath , 3 bytes
5 bytes salvos graças ao @Mego
Experimente online!
Toma um
Matrix
como entrada.fcp
significa f actorization do c haracteristic p olynomial,que é mais curto que o normal embutido
charpoly
.fonte
Oitava ,
164 bytesO @BruteForce acabou de me dizer que uma das funções que eu estava usando na minha solução anterior pode realmente fazer todo o trabalho:
Experimente online!
16 bytes: Esta solução calcula os autovalores da matriz de entrada e depois cria um polinômio a partir das raízes especificadas.
Mas é claro que também há o chato
(precisa de uma
symbolic
matriz de tipos no Octave, mas funciona com as matrizes usuais no MATLAB.)Experimente online!
fonte
Pari / GP , 8 bytes
Experimente online!
Pari / GP , 14 bytes
Experimente online!
fonte
x
a uma matriz da dimensão apropriada? Agradável!R , 53 bytes
Experimente online!
Retorna os coeficientes em ordem crescente; ou seja,
a_0, a_1, a_2, ..., a_n
.Calcula o polinômio encontrando os autovalores da matriz.
R + pracma , 16 bytes
pracma
é a biblioteca "PRACtical MAth" para R e possui algumas funções úteis.fonte
Mathematica, 22 bytes
-7 bytes de alephalpha
-3 bytes de Misha Lavrov
Experimente online!
e claro...
Mathematica, 29 bytes
Experimente online!
ambas as respostas produzem um polinômio
fonte
Haskell ,
243 223222 bytesExperimente online!
Obrigado a @ ØrjanJohansen por me ajudar a jogar isso!
Explicação
Isso usa o algoritmo Faddeev – LeVerrier para calcular os coeficientes. Aqui está uma versão não destruída com nomes mais detalhados:
Nota: tirei isso direto dessa solução
fonte
c=z pure[1..]a
.f a|let c=z pure[0..]a;g(u,d)k|m<-[z(+)a b|(a,b)<-a#u&[[s[d|x==y]|y<-c]|x<-c]]=(m,-s[a#m!!n!!n|n<-c]`div`(k+1))=snd<$>scanl g(0<$c<$c,1)c
algo semelhante deve funcionar no outro também.Python 2 + numpy , 23 bytes
Experimente online!
fonte
MATL , 4 bytes
Experimente online!
Este é apenas um porto da resposta Oitava do flawr , portanto, ele retorna os coeficientes em ordem decrescente, ou seja,
[a_n, ..., a_1, a_0]
fonte
CJam (48 bytes)
Conjunto de testes online
Dissecação
Isso é bastante semelhante à minha resposta ao determinante de uma matriz inteira . Ele tem alguns ajustes porque os sinais são diferentes e porque queremos manter todos os coeficientes, e não apenas o último.
fonte