Il modo più veloce per risolvere un sistema di equazioni lineari


8

Devo risolvere un sistema di fino a 10000 equazioni con 10000 incognite il più velocemente possibile (preferibilmente entro pochi secondi). So che l'eliminazione gaussiana è troppo lenta per questo, quindi quale algoritmo è adatto a questo compito?

Tutti i coefficienti e le costanti sono numeri interi non negativi modulo p (dove p è un numero primo). È garantita una sola soluzione. Ho bisogno della soluzione modulo p.

Risposte:


10

Una decomposizione LU di una matrice può essere calcolata nel tempo , dove è il tempo per moltiplicare due matrici . Pertanto, è possibile trovare una soluzione a un sistema di equazioni lineari in incognite nel tempo . Ad esempio, l'algoritmo di Strassen raggiunge , che è più veloce dell'eliminazione gaussiana. Vedi https://en.wikipedia.org/wiki/Invertible_matrix#Blockwise_inversion .n×nO(M(n))M(n)n×nnnO(M(n))M(n)=O(n2.8)

Invece di provare a implementarlo da solo, suggerirei di utilizzare una libreria: ad esempio una libreria BLAS.


Riduci anche il modulo p alla fine del calcolo.
fade2black

2
@ fade2black, in realtà, probabilmente sarà molto meglio usare un'implementazione progettata per l'uso con l'aritmetica mod (ovvero, sta riducendo la mod p ad ogni passo, non solo alla fine).
DW

Nel caso in cui il collegamento Wikipedia cambi, il riferimento fornito lì per il risultato può essere trovato ad esempio nella sezione 28.2 della 3a edizione di Cormen et al, Introduzione agli algoritmi . In particolare, mostrano l '"equivalenza algoritmica" tra la moltiplicazione della matrice e l'inversione della matrice. Ma presumibilmente si possono quindi collegare inversione di matrice e decomposizione LU. O(M(n))
Chill2Macht,

4

C'è quello che vuoi ottenere, e c'è la realtà, e talvolta sono in conflitto. Innanzitutto controlla se il tuo problema è un caso speciale che può essere risolto più rapidamente, ad esempio una matrice sparsa. Quindi cerchi algoritmi più veloci; La decomposizione LU finirà un po 'più veloce. Quindi indaghi su ciò che Strassen può fare per te (il che non è molto; può salvare 1/2 delle operazioni se moltiplichi la dimensione del problema per 32).

E poi usi la forza bruta. Utilizzare un sistema multiprocessore con più thread. Usa le unità vettoriali disponibili. Disporre i dati e le operazioni in modo che siano compatibili con la cache. Scopri qual è il modo più veloce per fare calcoli modulo p per alcuni p fissi. E spesso è possibile salvare le operazioni non eseguendo le operazioni modulo p (risultato nell'intervallo 0 ≤ risultato <p) ma un po 'più rilassato (ad esempio risultato nell'intervallo -p <risultato <p).


2

Il modo migliore per risolvere grandi equazioni lineari è usare la parallelizzazione o in qualche modo distribuire calcoli tra CPU o simili.

Vedi CUDA, OpenCL, OpenMP.

Molta gente suggerisce Strassen's algorithmma ha una costante nascosta molto grande che la rende inefficiente.

A proposito: le tue equazioni lineari potrebbero essere molto sparse (molti zeri), ci sono poche ottimizzazioni molto chiare per risolverle in parallelo.


La dimensione della matrice è 10.000 per 10.000, quindi suppongo che Strassen sarebbe in grado di salvare qualcosa. Solo non molto.
gnasher729,

1
@ gnasher729 Ho dei dubbi, Alex Stapanov in una delle sue lezioni si dice che Boing stava usando l'algoritmo di Strassen per matrici davvero grandi (1Mx1M inavvertitamente) ed erano scontenti delle prestazioni. Ma penso che queste informazioni siano un po 'datate per l'hardware moderno.
Oleg Kovalov,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.