El polinomio característico de una matriz cuadrada A se define como el polinomio p A (x) = det ( I x- A ) donde I es la matriz de identidad y det el determinante . Tenga en cuenta que esta definición siempre nos da un polinomio monico tal que la solución es única.
Su tarea para este desafío es calcular los coeficientes del polinomio característico para una matriz con valores enteros, para esto puede usar incorporados pero no se recomienda.
Reglas
- la entrada es una matriz entera NxN (N ≥ 1) en cualquier formato conveniente
- su programa / función generará / devolverá los coeficientes en orden creciente o decreciente (especifique cuál)
- los coeficientes están normados de tal manera que el coeficiente de x N es 1 (ver casos de prueba)
- no necesita manejar entradas inválidas
Casos de prueba
Los coeficientes se dan en orden decreciente (es decir, 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 ejemplo?Respuestas:
SageMath , 3 bytes
5 bytes guardados gracias a @Mego
Pruébalo en línea!
Toma un
Matrix
como entrada.fcp
representa f actorization de la c haracteristic p olynomial,que es más corto que el incorporado normal
charpoly
.fuente
Octava ,
164 bytes@BruteForce acaba de decirme que una de las funciones que estaba usando en mi solución anterior puede hacer todo el trabajo:
Pruébalo en línea!
16 bytes: esta solución calcula los valores propios de la matriz de entrada y luego continúa construyendo un polinomio a partir de las raíces dadas.
Pero, por supuesto, también está lo aburrido.
(necesita una
symbolic
matriz de tipo en Octave, pero funciona con las matrices habituales en MATLAB).Pruébalo en línea!
fuente
Pari / GP , 8 bytes
Pruébalo en línea!
Pari / GP , 14 bytes
Pruébalo en línea!
fuente
x
a una matriz de la dimensión adecuada? ¡Agradable!R , 53 bytes
Pruébalo en línea!
Devuelve los coeficientes en orden creciente; es decir,
a_0, a_1, a_2, ..., a_n
.Calcula el polinomio al encontrar los valores propios de la matriz.
R + pracma , 16 bytes
pracma
es la biblioteca de "Matemáticas prácticas" para R, y tiene bastantes funciones útiles.fuente
Mathematica, 22 bytes
-7 bytes de alephalpha
-3 bytes de Misha Lavrov
Pruébalo en línea!
y por supuesto...
Mathematica, 29 bytes
Pruébalo en línea!
ambas respuestas generan un polinomio
fuente
Haskell ,
243 223222 bytesPruébalo en línea!
¡Gracias a @ ØrjanJohansen por ayudarme a jugar golf!
Explicación
Esto utiliza el algoritmo Faddeev – LeVerrier para calcular los coeficientes. Aquí hay una versión sin golf con nombres más detallados:
Nota: Tomé esto directamente de esta solución
fuente
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 similar debería funcionar en el otro también.Python 2 + numpy , 23 bytes
Pruébalo en línea!
fuente
MATL , 4 bytes
Pruébalo en línea!
Esto es simplemente un puerto de respuesta de octava de flawr , por lo que devuelve los coeficientes en orden decreciente, es decir,
[a_n, ..., a_1, a_0]
fuente
CJam (48 bytes)
Conjunto de pruebas en línea
Disección
Esto es bastante similar a mi respuesta al Determinante de una matriz entera . Tiene algunos ajustes porque los signos son diferentes y porque queremos mantener todos los coeficientes en lugar de solo el último.
fuente