Si hallas alguna incompatibilidad con tu código o trabajo, recuerda probar siempre en un entorno de testing antes subir el código al trabajo final.
Solución:
No, esta no es la forma en que cualquier persona (cuerda) calcularía un determinante. ¡Esta ni siquiera es la forma en que una computadora calcularía un determinante! Requiere una suma superior a $ n! $ Términos, que rápidamente se vuelve inviable incluso para una computadora, alrededor de $ n = 15 $ más o menos. Una forma elemental de calcular rápidamente un determinante es mediante la eliminación gaussiana.
Conocemos algunos hechos sobre el determinante:
- Agregar un múltiplo escalar de una fila a otra no cambia el determinante.
- Intercambiar dos filas niega el determinante.
- Escalar una fila por una constante multiplica el determinante por esa constante.
Entonces, ahora toma la matriz
$$ A = begin bmatrix -4 & 3 & 3 \ 8 & 7 & 3 \ 4 & 3 & 3 end bmatrix $$
De hecho (1) arriba, puedo agregar el doble de la fila superior a la fila del medio, y también la fila superior a la fila inferior, sin afectar el determinante. Entonces:
$$ det A = det begin bmatrix -4 & 3 & 3 \ 0 & 13 & 9 \ 0 & 6 & 6 end bmatrix $$
Ahora, puedo intercambiar las dos filas inferiores y escalar la fila con solo $ 6 $, a un costo de $ -6 $:
$$ det A = – det begin bmatrix -4 & 3 & 3 \ 0 & 6 & 6 \ 0 & 13 & 9 end bmatrix = – 6 det begin bmatrix -4 & 3 & 3 \ 0 & 1 & 1 \ 0 & 13 & 9 end bmatrix $$
Ahora puedo restar 13 lotes de la fila del medio de la fila inferior:
$$ det A = – 6 det begin bmatrix -4 & 3 & 3 \ 0 & 1 & 1 \ 0 & 13 & 9 end bmatrix = – 6 det begin bmatrix – 4 y 3 y 3 \ 0 y 1 y 1 \ 0 y 0 y -4 end bmatrix $$
Ahora la matriz es triangular superior, por lo que el determinante es solo el producto de las entradas diagonales. Entonces tenemos
$$ det A = -6 (-4 times 1 times -4) = -96 $$
Así que ahí lo tienes: calcular un determinante es tan fácil como encontrar la forma escalonada por filas.
En general, los determinantes de matrices grandes no se calculan mediante la expansión del cofactor, sino más bien factorizando la matriz en factores cuyos determinantes son fáciles de calcular.
Por ejemplo, puede factorizar una matriz $ n $ por $ n $ $ A $ como
$ A = P ^ T LU $
donde $ P $ es una matriz de permutación, $ L $ es triangular inferior y $ U $ es triangular superior. Este cálculo toma $ O (n ^ 3) $ tiempo para una matriz $ n $ por $ n $ $ A $.
Ya que
$ det (A) = det (P ^ T) det (L) det (U) $
y los determinantes de $ P ^ T $, $ L $ y $ U $ son fáciles de calcular (el determinante de una matriz triangular inferior o superior es el producto de los elementos diagonales y puede hacer fácilmente la expansión del cofactor en una matriz de permutación), puede encontrar rápidamente el determinante de $ A $.
Si desea probar un experimento computacional, pruebe la función det () de MATLAB en matrices generadas aleatoriamente de tamaño $ n $ por $ n $ para $ n = 1000, 2000, ldots, 10000 $ y use tic / toc para ver cuánto tiempo el cálculo lleva.
Si las entradas de su matriz pertenecen a un campo, entonces puede calcular el determinante fácilmente usando la descomposición LPU o la descomposición PLU. Estos algoritmos toman $ O left (n ^ 3 right) $ tiempo, donde $ n $ es el tamaño de la matriz.
Si las entradas de su matriz pertenecen a un anillo conmutativo arbitrario, entonces todavía hay $ O left (n ^ 4 right) $ – algoritmos de tiempo para calcular el determinante. Ver Günter Rote, Algoritmos sin división para el determinante y el Pfaffian: enfoques algebraicos y combinatorios, §2. (Si entiendo correctamente, la idea aproximada de al menos uno de los algoritmos es reemplazar la matriz $ A en R ^ n times n $ por la matriz $ 1 – En $ sobre la serie de potencias ring $ R left[left[tright] right]$, luego calcule el determinante de este último a través de la descomposición LU (que siempre existe en el anillo de la serie de potencias), y luego obtenga $ det A $ como un coeficiente de este polinomio. Por supuesto, las series de potencias en sí mismas son incuestionables, pero aquí solo deben tenerse en cuenta los primeros coeficientes).
Por supuesto, los algoritmos no pueden hacer magia. Las estimaciones de tiempo de ejecución de $ O left (n ^ 3 right) $ y $ O left (n ^ 4 right) $ asumen que las operaciones fundamentales del anillo base ($ + $, $ cdot $, $ – $ y tomar inversas en el caso de un campo) requieren un tiempo constante y la sobrecarga de almacenar y copiar entradas de la matriz es insignificante. Esta suposición está justificada si el anillo de la base es un campo finito o (hasta cierto punto) si el “anillo” de la base son los reales de punto flotante (aunque estos realmente no forman un anillo, por lo que podría terminar con resultados completamente incorrectos debido a la inestabilidad numérica), pero no si el anillo base son los números enteros (porque los números enteros se vuelven más difíciles de trabajar cuanto más grandes se vuelven), los números racionales o un anillo polinomial. Cuando las entradas de su matriz son indeterminados algebraicamente independientes, entonces no debe esperar nada demasiado rápido, al menos si desea el resultado en forma expandida; después de todo, el resultado será simplemente la fórmula general para el determinante de una matriz $ n times n $, que “contiene” una lista de todas las permutaciones $ n! $ de $ left 1,2, ldots , n right $, y claramente tal lista requiere al menos $ O left (n! right) $ tiempo para escribir! Puede haber algunos algoritmos más rápidos que den como resultado versiones no expandidas (de manera similar al esquema de Horner para la evaluación polinomial), pero no esperaría nada con el tiempo de ejecución polinomial a menos que permita que el algoritmo devuelva una recursividad en lugar de una suma explícita de -productos-sumas-de-productos-de-etc.
Si posees alguna vacilación y capacidad de refinar nuestro enunciado puedes dejar un exégesis y con deseo lo ojearemos.