Kann mir jemand bei folgendem Problem weiterhelfen?
Ich möchte einige Werte a i , b jai,bj (mod NN ) finden, wobei i = 1 , 2 , ... , K , j = 1 , 2 , ... , Ki=1,2,…,K,j=1,2,…,K (zum Beispiel K = 6K=6 ), wenn eine Liste von K 2K2 Werten gegeben ist, die entsprechen den Differenzen a i - b j( modN )ai−bj(modN) (zum Beispiel N = 251N=251 ), ohne die konkrete entsprechende Beziehung zu kennen. Da die Werte a i , b j( modN )ai,bj(modN) angesichts der Differenzen a_i-b_j \ pmod N nicht eindeutig definiert sind a i - b j( modN )ai−bj(modN), suchen wir nach einer gültigen Zuordnung von Werten.
Auf jeden Fall ist es nicht möglich, jede Permutation der K 2K2 Zahlen in der Liste (völlig K 2 !K2! Mögliche Fälle) zu versuchen und dann die modularen Gleichungen mit a i , b jai,bj als Variablen zu lösen.
Tatsächlich tritt dieses Problem in einem Artikel über die Kryptoanalyse zu einer frühen Version des NTRU-Signaturschemas auf ( http://eprint.iacr.org/2001/005 ). Der Autor schrieb jedoch nur einen Satz „Ein einfacher Backtrack-Algorithmus findet eine Lösung…“ (in Abschnitt 3.3). Kann jemand weitere Erklärungen geben? Darüber hinaus erwähnte der Autor, dass „jede kreisförmige Verschiebung { ( ( a i + M )modN , ( b i + M )modN } K i = 1{((ai+M)modN,(bi+M)modN}Ki=1 oder ein Tausch ( { ( N - 1 - b i , N - 1 - a i ) } K i = 1 )({(N−1−bi,N−1−ai)}Ki=1) ergibt dasselbe Muster von a i - b jmodNai−bjmodN ”und ist diese Aussage hilfreich?
Antworten:
Hier ist ein Vorschlag für und . Wir erhalten eine Liste . Beginnen Sie, indem Sie einen von ihnen ohne Verlust der Allgemeinheit . Ohne Verlust der Allgemeinheit ist und wir erhalten den Wert von . Nehmen Sie nun eine andere und hoffen Sie, dass sie die Form (dies geschieht mit einer Wahrscheinlichkeit von ), und leiten Sie .K = 6K=6 N = 251 N=251 a i - b j( modN ) ai−bj(modN) a 1 - b 1 a1−b1 b 1 = 0 b1=0 a 1 a1 a 2 - b 1a2−b1 5 / 35 = 1 / 7 5/35=1/7 a 2a2
Zu diesem Zeitpunkt kennen wir . Unser nächstes Ziel ist es, nach für zu suchen . Für jeden Kandidaten sollte auch auf der Liste stehen , wenn ist . Wenn , dann ist die Wahrscheinlichkeit, dass ebenfalls auf der Liste ist, ungefähr . Wenn wir also einen Kandidaten für den ebenfalls auf der Liste steht, dann ist wahrscheinlich . Auf diese Weise können wir mit einiger Sicherheit wiederherstellen .a 1 , a 2 , b 1 a 1 - b j j ≠ 1 a i - b j i = 1 ( a i - b j ) + ( a 2 - a 1 ) = ein 2 - b j i ≠ 1 ( a i - b j ) + ( a 2 - aa1,a2,b1 a1−bj j≠1 ai−bj i=1 (ai−bj)+(a2−a1)=a2−bj i≠1 1)(ai−bj)+(a2−a1) 33/25133/251 ai−bjai−bj (ai−bj)+(a2−a1)(ai−bj)+(a2−a1) i=1i=1 b2b2
Zu diesem Zeitpunkt kennen wir . Genauso wie wir wiederhergestellt haben , können wir mit hinreichender Sicherheit wiederherstellen . Wir können dann indem nach einem Kandidaten suchen, für den und beide auf der Liste stehen. Da wir mehr s haben, sinkt unsere Ausfallwahrscheinlichkeit merklich. Wir fahren fort und finden .a1,a2,b1,b2a1,a2,b1,b2 b2b2 a3a3 b3b3 ai−bjai−bj (ai−bj)+(a2−a1)(ai−bj)+(a2−a1) (ai−bj)+(a3−a1)(ai−bj)+(a3−a1) aa b3,a4,b4,a5,b6,a6,b6b3,a4,b4,a5,b6,a6,b6
Zu irgendeinem Zeitpunkt in diesem Algorithmus haben wir möglicherweise etwas Falsches erraten, und dies wird schließlich zu einem Widerspruch führen (sagen wir, irgendwann gibt es keinen guten Kandidaten ). Wir ziehen uns dann zurück und versuchen eine andere Möglichkeit; Wenn wir alle Möglichkeiten ausschöpfen, kehren wir zurück und versuchen eine andere Möglichkeit (für eine andere Stufe des Algorithmus). und so weiter.ai−bjai−bj
Es ist eine gute Übung, diesen Algorithmus tatsächlich zu programmieren - wahrscheinlich ist dies der einzige Weg, um zu verstehen, wie das Backtracking korrekt implementiert wird. Nur so lässt sich auch feststellen, ob dieser Algorithmus in der Praxis funktioniert.
quelle
Update : Die folgende Beschreibung bezieht sich auf ein anderes Problem (bei dem alle paarweisen Abstände in einem Satz vorhanden sind und nicht paarweise Abstände zwischen zwei unterschiedlichen Sätzen). Ich lasse es trotzdem, da es eng verwandt ist.
Dieses Problem wird als Beltway-Problem bezeichnet und ist ein Spezialfall des allgemeinen Torus-Einbettungsproblems. Es hängt auch eng mit dem Turnpike-Problem zusammen, bei dem die Entfernungsunterschiede absolut sind (nicht modulo irgendeine Zahl).dd
Es ist nicht bekannt, ob das Beltway-Problem einen Poly-Time-Algorithmus zulässt. Es gibt verschiedene Pseudo-Poly-Time-Algorithmen für verwandte Fragen. Die beste Referenz (leider eine alte) ist das Papier von Lemke, Skiena und Smith .
quelle
Hier ist eine Beobachtung, von der ich denke, dass sie Ihnen Halt gibt, möglicherweise genug, um das Problem zu lösen.
Angenommen, wir haben vier Differenzen , , , , die sich als paarweise Differenzen zwischen zwei und zwei . Nennen Sie das ein Quartett der Unterschiede. Beachten Sie, dass wir eine nicht triviale Beziehung haben:a1−b1a1−b1 a1−b2a1−b2 a2−b1a2−b1 a2−b2a2−b2 aa bb
(a1−b1)−(a1−b2)=(a2−b1)−(a2−b2)(modN).
Sie können versuchen, diese Beziehung zu verwenden, um potenzielle Quartette aus der Liste von zu identifizieren . Wählen Sie beispielsweise vier Unterschiede aus der Liste aus. wenn sie die obige Beziehung nicht erfüllen, dann entstehen sie definitiv nicht aus einer Quartettstruktur; Wenn sie die Beziehung erfüllen, können sie aus einem Quartett stammen.K2K2
Es gibt viele Möglichkeiten, wie Sie die Dinge von hier aus angehen können, aber ich vermute, dass dies ausreichen wird.
Ich vermute besonders, dass das Problem für Ihre Beispielparametereinstellungen ziemlich einfach sein wird, da der obige Test zum Erkennen eines Quartetts wahrscheinlich nicht zu viele Fehlalarme hat. Unsere aller Möglichkeiten zur Auswahl von 4 Unterschieden aus der Liste sind Quartette (die alle die Beziehung erfüllen) und der Rest sind Nicht-Quartette (die erfüllen) die Beziehung mit Wahrscheinlichkeit , heuristisch). Daher erwarten wir ungefähr falsch positive Ergebnisse, dh 4-Tupel, die den Test bestehen, obwohl sie keine Quartette sind. Für Ihre Parameter bedeutet dies, dass wir 225 Quartette und(K24)(K24) (K2)2(K2)2 1/N1/N ((K24)−(K2)2)/N((K24)−(K2)2)/N (58905−225)/251≈234(58905−225)/251≈234 andere falsch positive Ergebnisse; So ist etwa die Hälfte der 4-Tupel, die den Test bestehen, tatsächlich ein Quartett. Dies bedeutet, dass der obige Test eine ziemlich gute Möglichkeit ist, Quartette zu erkennen. Sobald Sie Quartette erkennen können, können Sie wirklich in die Stadt gehen, um die Struktur der Liste der Unterschiede wiederherzustellen.
quelle
Hier ist ein anderer Ansatz, der darauf basiert, iterativ Zahlen zu finden, die nicht unter . Nennen Sie eine Menge eine Über-Approximation der 's, wenn wir das wissen{a1,…,a6}{a1,…,a6} AA aa {a1,…,a6}⊆A{a1,…,a6}⊆A . In ähnlicher Weise ist ein overapproximation der ‚s , wenn wir wissen , dass . Offensichtlich ist , desto kleiner ist, desto nützlicher diese Über Annäherung ist, und das gleiche gilt für . Mein Ansatz basiert auf der iterativen Verfeinerung dieser Überapproximationen, dh der iterativen Verkleinerung dieser Mengen (da wir immer mehr Werte als unmöglich ausschließen).BB bb {b1,…,b6}⊆B{b1,…,b6}⊆B AA BB
Der Kern dieses Ansatzes ist ein Verfahren zur Verfeinerung : Da eine über Annäherung für die ‚s und eine über Annäherung für die ‘ s, findet eine neue über AnnäherungAA aa BB bb A∗A∗ für die ‚s , so dass . Insbesondere normalerweise wird kleiner sein als , so dass dies läßt uns die über Näherung für die Verfeinerung ‚s.aa A∗⊊AA∗⊊A A∗A∗ AA aa
Aus Symmetriegründen lässt uns im Wesentlichen der gleiche Trick unsere Überapproximation für die verfeinern : eine Überapproximation vorausgesetztbb AA für die und einer Überapproximation für die wird eine neue Überapproximation erzeugt -Näherung für die 's.aa BB bb B∗B∗ bb
Lassen Sie mich also sagen, wie Verfeinerungen vorgenommen werden, und dann werde ich alles zusammensetzen, um einen vollständigen Algorithmus für dieses Problem zu erhalten. Im Folgenden sei die Mehrfachmenge von Differenzen, dh ; wir konzentrieren sich auf eine raffinierte Über Annäherung zu finden , gegeben .DD D={ai−bj:1≤i,j≤6}D={ai−bj:1≤i,j≤6} A∗A∗ A,B
Berechnen einer Verfeinerung Betrachten wir einen einzigen Unterschied . Betrachten Sie die Menge . Basierend auf unserem Wissen, dass eine Über-Approximation der , wissen wir, dass mindestens ein Element von ein Element von sein mussd∈Dd+B={d+y:y∈B}Bbd+B{a1,…,a6} . Daher können wir jedes der Elemente in als "Vorschlag" für eine Zahl behandeln, die möglicherweise in . Lassen Sie uns also alle Differenzen und für jede identifizieren, welche Zahlen von "vorgeschlagen" werden .d+BAd∈Dd
Jetzt werde ich feststellen, dass die Zahl während dieses Vorgangs mit Sicherheit mindestens sechsmal vorgeschlagen wird. Warum? Da die Differenz in ist , und wenn wir sie verarbeiten, wird eine der Zahlen, es schlägt vor (da wir , dass garantiert sind , wird sicherlich umfassen ). Ebenso die Differenza1a1−b1Da1b1∈B(a1−b1)+Ba1a1−b2 irgendwo in und es wird veranlasst, dass erneut vorgeschlagen wird. Auf diese Weise sehen wir, dass der korrekte Wert von mindestens sechsmal vorgeschlagen wird. Gleiches gilt für undDa1a1a2a3, und so weiter.
Also sei die Menge von Zahlen , die mindestens sechsmal vorgeschlagen wurden. Dies ist sicher eine Überbewertung der 's, wie aus den obigen Kommentaren hervorgeht.A∗a∗a
Als Optimierung können wir alle Vorschläge herausfiltern, die in sofort vorhanden sind. Mit anderen Worten, wir können die Differenz so behandeln, als würden alle Werte . Dies stellt sicher, dass wir . Wir hoffen, dass genau kleiner ist als ; Keine Garantie, aber wenn alles gut geht, wird es vielleicht sein.Ad(d+B)∩AA∗⊆AA∗A
Zusammengefasst lautet der Algorithmus zur Verfeinerung von zu wie folgt:A,BA∗
Lassen . Dies ist die Vielzahl von Vorschlägen.S=∪d∈D(d+B)∩A
Zählen Sie, wie oft jeder Wert in erscheint . Sei die Menge von Werten, die in mindestens sechsmal vorkommen . (Dies kann effizient implementiert werden, indem zunächst ein Array von 251 erstellt wird, anfangs alle null, und jedes Mal, wenn die Zahl vorgeschlagen wird, erhöhen SieSA∗Sasa[s] , am Ende Sie fegen durch Suche nach Elementen , deren Wert 6 oder größer)a
Eine ähnliche Methode kann erstellt werden, um zu verfeinern undA,BB∗ . Grundsätzlich kehrt man die obigen Dinge um und dreht ein paar Zeichen um: Beispielsweise sieht man anstelle von .d+B−d+A
Wie man eine anfängliche Über-Approximation berechnet. Um unsere anfängliche Über-Approximation zu erhalten, besteht eine Idee darin, (wlog) anzunehmen, dass . Daraus folgt, dass jeder Wert irgendwo zwischen , daher kann die Liste der Differenzen als unsere anfängliche Über-Approximation für das verwendet werdenb1=0aiDDa . Leider gibt uns dies keine sehr nützliche Überapproximation für die .b
Ein besserer Ansatz ist es, zusätzlich den Wert eines der zu erraten . Mit anderen Worten, wir nehmen (wlog) an, dass , und verwenden als unsere anfängliche Über-Approximation der . Dann raten wir, welcher dieser 36 Werte tatsächlich einer der , sagen wir . Das ergibt dann eine Überapproximation für dasab1=0A=Daaa1B=a1−Db . Wir verwenden diese anfängliche Über-Approximation , verfeinern sie dann iterativ bis zur Konvergenz und testen, ob das Ergebnis korrekt ist. Wir wiederholen bis zu 36 Mal mit 36 verschiedenen Annahmen bei (im Durchschnitt sollten 6 Annahmen ausreichen), bis wir eine finden, die funktioniert.A,Ba1
Ein vollständiger Algorithmus. Jetzt können wir einen vollständigen Algorithmus haben, um . Grundsätzlich leiten wir eine anfängliche Über-Approximation für und und verfeinern sie dann iterativ.a1,…,a6,b1,…,b6AB
Errate: Errate für jedes , dass . Mach Folgendes:z∈Da1=z
Anfängliche : Definieren Sie und .A=DB=z−D
Iterative Verfeinerung: Wenden Sie wiederholt Folgendes bis zur Konvergenz an:
Auf Erfolg prüfen : Wenn die resultierenden Mengen jeweils die Größe 6 haben, prüfen Sie, ob sie eine gültige Lösung für das Problem darstellen. Wenn ja, hör auf. Wenn nicht, fahren Sie mit der Schleife über Kandidatenwerte von .A,Bz
Analyse. Ob das funktioniert? Konvergiert es irgendwann auf und , oder bleibt es , ohne das Problem vollständig zu lösen? Der beste Weg, dies herauszufinden, ist wahrscheinlich, es zu testen. Aber für Ihre Parameter, ja, ich gehe davon aus, dass es effektiv sein wird.A={a1,…,a6}B={b1,…,b6}
Wenn wir Methode # 1 verwenden, solangesind nicht zu groß, heuristisch erwarte ich, dass die größen der sets monoton schrumpfen. Ziehen Sie in Betracht, von abzuleiten . Jeder Unterschied legtWerte; einer von ihnen ist korrekt, und der andere kann (heuristisch) als Zufallszahl behandelt werden. Wenn eine Zahl ist, die nicht unter den , wie groß ist die Wahrscheinlichkeit, dass sie die Filterung überlebt und zu hinzugefügt wird ? Nun ja, wir erwarten vorgeschlagen werden über|A|,|B|A∗A,Bd|B||B|−1xaA∗a(|B|−1)×36/251 (im Durchschnitt mit einer Standardabweichung um die Quadratwurzel davon). Wenn , ist die Wahrscheinlichkeit, dass ein falsches|B|≤36xüberlebt, sollte die Filterung bei etwa (unter Verwendung der normalen Approximation für das Binomial mit Kontinuitätskorrektur). (Die Wahrscheinlichkeit ist kleiner, wenn kleiner ist; z. B. für erwarte ich .) Ich erwarte, dass die Größe von ungefähr , was die Überapproximation streng verbessern wird, da sie streng kleiner alsp=0.4|B||B|=30p≈0.25A∗p(|A|−6)+6|A|. Zum Beispiel, wenn , dann erwarte ich basierend auf diesen Heuristiken|A|=|B|=36|A∗|≈18 , was eine große Verbesserung gegenüber.|A|
Daher gehe ich davon aus, dass die Laufzeit sehr schnell sein wird. Ich erwarte, dass ungefähr 3-5 Iterationen der Verfeinerung für die Konvergenz ausreichen, und ungefähr 6 Vermutungen bei sollten wahrscheinlich ausreichen. Jede Verfeinerungsoperation umfasst möglicherweise einige tausend Speicherlesevorgänge / -schreibvorgänge, und wir tun dies möglicherweise 20 bis 30 Mal. Daher erwarte ich, dass dies für die von Ihnen angegebenen Parameter sehr schnell geht. Die einzige Möglichkeit, dies herauszufinden, besteht darin, es zu versuchen und zu prüfen, ob es gut funktioniert oder nicht.z
quelle