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.
fuente
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).
fuente
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 algorithm
pero 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.
fuente