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.
la source
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).
la source
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 algorithm
mais 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.
la source