Das Problem kommt direkt aus der Computermathematik und kann sein wie folgt angegeben:
Wenn eine reguläre Matrix , finden Sie effektiv alle Vektoren v \ in \ Z ^ d, so dass \ n {Mv} \ leq1 , wobei \ n {Mv} die maximale Komponente von ist Vektor im Modul. v ∈ Z d ‖ M v ‖ ∞ ≤ 1 ‖ M v ‖ ∞
Ich gebe unten einen Algorithmus an, der jedoch sehr ineffizient ist, da er viel mehr Schritte als die Anzahl der Gitterpunkte enthält. In meinem Fall ist es für d = 5 immer noch erträglich , aber für d = 6 schlägt es vollständig fehl. Ich habe nicht so viel Zeit. Darüber hinaus möchte ich auch an höheren Dimensionen arbeiten.
Mein aktueller Algorithmus basiert auf Folgendem (Haftungsausschluss: enthält mehr Mathematik): Berechnen Sie zunächst . Dann beobachten wir, dass . Dies bedeutet, dass wir L = \ operatorname {floor} \ n {M ^ {- 1}} berechnen und dann alle Vektoren v \ in \ lbrace-L, -L + 1, \ dots, L-1, L \ ausprobieren können } ^ d ; es gibt genau von ihnen. (Und hier liegt das Problem: Wenn und , erhalte ich Iterationen, was um Größenordnungen größer ist als die Anzahl der Punkte, von denen ich denke, dass sie vorhanden sind.)
Antworten:
Hier ist eine andere Sichtweise auf das Problem: Sie haben ein Gitter, das durch die Spalten von erzeugt wird . Verwenden Sie den Lenstra-Lenstra-Lovász-Algorithmus (LLL), um eine reduzierte Basis dieses Gitters zu erhalten. Wenn Sie M durch eine neue Matrix ersetzen, die durch die Ausgabe von LLL gebildet wird, erzeugen die Spalten von M immer noch dasselbe Gitter, aber die Basisvektoren sind näher daran, orthogonal zueinander zu sein, und die Einträge von M - 1 sollten haben kleinere Größe.M M M M−1
Von dort aus wäre es auch hilfreich, jede Komponente von separat zu binden : dh Sie können die i- te Komponente | binden v i | durch ∑ d j = 1 | ( M - 1 ) i j | . (Übrigens ist die Grenze ‖ v ‖ ∞ ≤ ‖ M - 1 ‖ nicht korrekt; wir müssen die Summe der Elemente in jeder Zeile verwenden, nicht das Maximum.)v i |vi| ∑dj=1|(M−1)ij| ∥v∥∞≤∥M−1∥
Für Werte von bis etwa 30 wird der LLL-Algorithmus praktisch sofort beendet. Asymptotisch dauert es O ( d 6 ) , so dass es für sehr große d langsamer wird , aber gleichzeitig wächst die Anzahl der Punkte, die wir überprüfen müssen, exponentiell in d , so dass die Laufzeit der LLL nicht wirklich die ist Engpass. Andererseits kann die Einsparung bei der Anzahl der zu prüfenden Punkte enorm sein. Ich habe einen GAP-Code geschrieben, um eine zufällige reguläre (stochastische) Matrix M zu erzeugen und die Grenzen der Komponenten von v zu vergleichend O(d6) d d M v dass wir auf der ursprünglichen Basis im Vergleich zur LLL-reduzierten Basis erhalten (Übrigens müssen wir nicht davon ausgehen, dass die Matrix regelmäßig ist; ich habe diese Einschränkung nur vorgenommen, weil dies in Ihrer Anwendung der Fall war):
Die folgende Ausgabe (basierend auf dem Standard-Zufallsstartwert mit ) ist nicht untypisch:d=8
Bearbeiten : Dieses Problem ist ein Sonderfall des allgemeinen Problems der Aufzählung von Gitterpunkten in konvexen Polytopen, das sich als gut untersuchtes Problem herausstellt, und es gibt effizientere Algorithmen als den oben beschriebenen. In diesem Artikel finden Sie eine Umfrage.
quelle