La forma más rápida de resolver un sistema de ecuaciones lineales.

8

Tengo que resolver un sistema de hasta 10000 ecuaciones con 10000 incógnitas lo más rápido posible (preferiblemente en unos pocos segundos). Sé que la eliminación gaussiana es demasiado lenta para eso, entonces, ¿qué algoritmo es adecuado para esta tarea?

Todos los coeficientes y constantes son números enteros no negativos módulo p (donde p es primo). Se garantiza que solo habrá 1 solución. Necesito la solución módulo p.

tmwilliamlin168
fuente

Respuestas:

10

Una descomposición LU de unnorte×norte matriz se puede calcular en O(METRO(norte)) tiempo, donde METRO(norte) es el momento de multiplicar dos norte×nortematrices Por lo tanto, puede encontrar una solución para un sistema denorte ecuaciones lineales en norte incógnitas en O(METRO(norte))hora. Por ejemplo, el algoritmo de Strassen lograMETRO(norte)=O(norte2.8), que es más rápido que la eliminación gaussiana. Ver https://en.wikipedia.org/wiki/Invertible_matrix#Blockwise_inversion .

En lugar de intentar implementar esto usted mismo, sugeriría usar una biblioteca: por ejemplo, una biblioteca BLAS.

DW
fuente
También reduzca el módulo p al final del cálculo.
fade2black
2
@ fade2black, en realidad, probablemente sea mucho mejor usar una implementación diseñada para usar con aritmética mod p (es decir, está reduciendo mod p en cada paso, no solo al final).
DW
En caso de que cambie el enlace de Wikipedia, la referencia dada allí para O(METRO(norte))El resultado se puede encontrar, por ejemplo, en la sección 28.2 de la 3ª edición de Cormen et al, Introducción a los algoritmos . Específicamente, muestran la "equivalencia algorítmica" entre la multiplicación de matrices y la inversión de matrices. Pero presumiblemente se puede vincular la inversión de la matriz y la descomposición de LU.
Chill2Macht
4

Hay lo que quieres lograr, y hay realidad, y a veces están en conflicto. Primero verifica si tu problema es un caso especial que se puede resolver más rápido, por ejemplo, una matriz dispersa. Entonces buscas algoritmos más rápidos; La descomposición de LU terminará un poco más rápido. Luego investigas lo que Strassen puede hacer por ti (que no es mucho; puede ahorrar la mitad de las operaciones si multiplicas el tamaño del problema por 32).

Y luego usas la fuerza bruta. Utilice un sistema multiprocesador con múltiples hilos. Use las unidades de vector disponibles. Organice sus datos y operaciones para que sean amigables con la caché. Investigue cuál es la forma más rápida de hacer cálculos módulo p para algunos p fijos. Y a menudo puede guardar operaciones al no realizar operaciones módulo p (resultado en el rango 0 ≤ resultado <p) pero un poco más relajado (por ejemplo, resultado en el rango -p <resultado <p).

gnasher729
fuente
2

La mejor manera de resolver grandes ecuaciones lineales es usar la paralelización o de alguna manera distribuir cálculos entre las CPU más o menos.

Ver CUDA, OpenCL, OpenMP.

Mucha gente sugiere Strassen's algorithmpero tiene una constante oculta muy grande que lo hace ineficiente.

Por cierto: sus ecuaciones lineales pueden ser muy escasas (muchos ceros), hay pocas optimizaciones muy claras para resolverlas en paralelo.

Oleg Kovalov
fuente
El tamaño de la matriz es de 10,000 por 10,000, así que supongo que Strassen podría guardar algo. Solo que no mucho.
gnasher729
1
@ gnasher729 Tengo algunas dudas, Alex Stapanov en una de sus conferencias menciona que Boing estaba usando el algoritmo de Strassen para matrices realmente grandes (1Mx1M en cuestión) y no estaban contentos con el rendimiento. Pero creo que esta información está un poco desactualizada para el hardware moderno.
Oleg Kovalov