Le moyen le plus rapide de résoudre un système d'équations linéaires

8

Je dois résoudre un système de jusqu'à 10000 équations avec 10000 inconnues le plus rapidement possible (de préférence en quelques secondes). Je sais que l'élimination gaussienne est trop lente pour cela, alors quel algorithme convient à cette tâche?

Tous les coefficients et constantes sont des entiers non négatifs modulo p (où p est un nombre premier). Il est garanti qu'il n'y a qu'une seule solution. J'ai besoin de la solution modulo p.

tmwilliamlin168
la source

Réponses:

10

Une décomposition LU d'unn×n la matrice peut être calculée en O(M(n)) temps, où M(n) est le temps de multiplier deux n×nmatrices. Par conséquent, vous pouvez trouver une solution à un système den équations linéaires dans n inconnues O(M(n))temps. Par exemple, l'algorithme de Strassen atteintM(n)=O(n2.8), ce qui est plus rapide que l'élimination gaussienne. Voir https://en.wikipedia.org/wiki/Invertible_matrix#Blockwise_inversion .

Plutôt que d'essayer de l'implémenter vous-même, je suggère d'utiliser une bibliothèque: par exemple, une bibliothèque BLAS.

DW
la source
Réduisez également modulo p à la fin du calcul.
fade2black
2
@ fade2black, en fait, il vaudra probablement mieux utiliser une implémentation conçue pour être utilisée avec l'arithmétique mod p (c'est-à-dire réduire le mod p à chaque étape, pas seulement à la fin).
DW
Dans le cas où le lien Wikipedia change, la référence qui y est donnée pour le O(M(n))Le résultat peut être trouvé par exemple dans la section 28.2 de la 3ème édition de Cormen et al, Introduction to Algorithms . Plus précisément, ils montrent «l'équivalence algorithmique» entre la multiplication matricielle et l'inversion matricielle. Mais on peut supposer que l'on peut alors relier l'inversion matricielle et la décomposition LU.
Chill2Macht
4

Il y a ce que vous voulez réaliser, et il y a la réalité, et parfois ils sont en conflit. Vérifiez d'abord si votre problème est un cas spécial qui peut être résolu plus rapidement, par exemple une matrice clairsemée. Ensuite, vous recherchez des algorithmes plus rapides; La décomposition LU finira un peu plus vite. Ensuite, vous étudiez ce que Strassen peut faire pour vous (ce qui n'est pas beaucoup; cela peut économiser la moitié des opérations si vous multipliez la taille du problème par 32).

Et puis vous utilisez la force brute. Utilisez un système multiprocesseur avec plusieurs threads. Utilisez les unités vectorielles disponibles. Organisez vos données et opérations pour qu'elles soient compatibles avec le cache. Cherchez quel est le moyen le plus rapide de faire des calculs modulo p pour certains p fixes. Et vous pouvez souvent enregistrer des opérations en ne faisant pas d'opérations modulo p (résultat dans la plage 0 ≤ résultat <p) mais un peu plus détendu (par exemple, résultat dans la plage -p <résultat <p).

gnasher729
la source
2

La meilleure façon de résoudre de grandes équations linéaires est d'utiliser la parallélisation ou, d'une manière ou d'une autre, de répartir les calculs entre les processeurs.

Voir CUDA, OpenCL, OpenMP.

Beaucoup de gens le suggèrent, Strassen's algorithmmais il a une très grande constante cachée qui le rend inefficace.

Soit dit en passant: vos équations linéaires peuvent être très rares (beaucoup de zéros), il y a peu d'optimisations très soignées pour les résoudre en parallèle.

Oleg Kovalov
la source
La taille de la matrice est de 10 000 par 10 000, donc je suppose que Strassen serait en mesure d'enregistrer quelque chose. Mais pas beaucoup.
gnasher729
1
@ gnasher729 J'ai quelques doutes, Alex Stapanov dans l'une de ses conférences, il est mentionné que Boing utilisait l'algorithme de Strassen pour de très grandes matrices (1Mx1M afair) et ils étaient mécontents des performances. Mais je pense que cette information est un peu dépassée pour le matériel moderne.
Oleg Kovalov