Le problème vient directement des mathématiques computationnelles et peut être a déclaré ce qui suit:
Étant donné une matrice régulière , trouver efficacement tous les vecteurs tels que , où est la composante maximale de la vecteur en module.
Je donne un algorithme ci-dessous, mais il est très inefficace, car il a beaucoup plus d'étapes que le nombre de points de grille. C'est toujours supportable pour dans mon cas, mais ça échoue complètement pour , je n'ai pas beaucoup de temps; de plus, j'aimerais également travailler sur des dimensions plus élevées.
Mon algorithme actuel est basé sur ce qui suit (avertissement: contient plus de mathématiques): Tout d'abord, calculez . Ensuite, on observe que . Cela signifie que nous pouvons calculer puis essayer tous les vecteurs ; il y en a exactement . (Et là réside le problème: si et , j'obtiens itérations, ce qui est des ordres de grandeur plus grand que le nombre de points que je pense qu'il y a.)
Réponses:
Voici une autre façon de voir le problème: Vous avez un réseau engendré par les colonnes de . Utilisez l'algorithme Lenstra – Lenstra – Lovász (LLL) pour obtenir une base réduite de ce réseau. Si vous remplacez par une nouvelle matrice formée par la sortie de LLL, alors les colonnes de généreront toujours le même réseau, mais les vecteurs de base seront plus proches d'être orthogonaux entre eux, et les entrées de devrait avoir une plus petite ampleur.M M M M- 1
À partir de là, il serait également utile de lier chaque composant de séparément: c'est-à-dire que vous pouvez lier le ème composantpar. (Soit dit en passant, le n'est pas correct; nous devons utiliser la somme des éléments sur chaque ligne, pas le maximum.)v je |vje| ∑réj = 1| (M- 1)je j| ∥ v∥∞≤ ∥M- 1∥
Pour des valeurs de jusqu'à environ 30, l'algorithme LLL se terminera pratiquement instantanément. De manière asymptotique, cela prend , donc cela ralentira pour les très grands , mais en même temps le nombre de points que nous devons vérifier augmente de façon exponentielle en , donc le temps d'exécution du LLL n'est pas vraiment le goulot d'étranglement. En revanche, les économies sur le nombre de points à contrôler peuvent être énormes. J'ai écrit du code GAP pour générer une matrice aléatoire régulière (stochastique) et comparer les limites sur les composants deré O (ré6) ré ré M v que nous obtenons en utilisant la base d'origine, par rapport à la base réduite en LLL (Soit dit en passant, nous n'avons pas besoin de supposer que la matrice est régulière; j'ai fait cette restriction uniquement parce que c'était le cas dans votre demande):
La sortie suivante (basée sur la graine aléatoire par défaut, avec ) n'est pas atypique:ré= 8
Edit : Ce problème est un cas particulier du problème général d'énumération des points de réseau dans les polytopes convexes, qui s'avère être un problème bien étudié, et il existe des algorithmes plus efficaces que celui décrit ci-dessus. Voir cet article pour une enquête.
la source