Daher fordern mich die Leute immer wieder auf, dies zu posten, obwohl dies nur eine vereinfachte Version des Problems löst. Alles klar :)
Am Ende werde ich einen Teil dessen anführen, was ich aus der Arbeit von Ibarra und Trân gelernt habe, und warum diese Methode unser allgemeines Problem auflöst, aber vielleicht noch einige nützliche Informationen liefert.
Aber zuerst schauen wir uns das einfachere Problem an, bei dem wir versuchen, die Menge zu bestimmen
2 n }L={2n∣ der ternären und der binären Darstellung von haben beide eine gerade oder ungerade Länge2n}
Beachten Sie, wie dies anstelle von wie im ursprünglichen Problem hat. Insbesondere wenn die eingegebene Zahl keine Zweierpotenz ist , möchten wir sie ablehnen, anstatt zu versuchen, ihre Länge in einer beliebigen Basis zu berechnen. n2nn
Dies vereinfacht die Sache erheblich: Wenn die ursprüngliche Zahl als , müssen wir für alle außer nur überprüfen dass sie alle .v i v 2 02v23v35v57v7...viv20
Dies ermöglicht es uns, dieses vereinfachte Problem zu lösen, indem wir eine Umhüllung der alten Methode (von Minsky, nehme ich an) zum Codieren des Zustands eines Zählerautomaten in die Exponenten der Primfaktorisierung der einzelnen Variablen eines Multiplikations- / Divisionsautomaten verwenden. Das entspricht, wie oben im OP vermerkt, einem 2-Zähler-Automaten.k
Zuerst brauchen wir einen Counter-Automaten zum Wickeln. Wir werden 3 Zähler mit den Namen , und .v 2 v 3 v 5kv2v3v5
Der Automat akzeptiert iff für die anfänglichen Zählerwerte, wenn die ternären und binären Darstellungen von beide eine gerade oder ungerade Länge haben und sowohl als auch Null sind. Wenn es akzeptiert, setzt es zuerst alle seine Zähler auf Null. v 3 v 52v2v3v5
Hier ist ein Code dafür in einem Assembler-Format, das dem OP ähnelt (ich habe den Anweisungen gerade Variablen hinzugefügt). Ich habe es nicht wirklich getestet, da ich nichts zu tun habe, aber ich halte dies für eine Formalität: 3-Zähler-Automaten sind dafür bekannt, vollständig zu sein und in der Lage zu sein, jede berechenbare Funktion von einer von ihnen zu konstruieren Anfangswerte.
// Check that v3 and v5 are both zero.
JZ v3, check5
GOTO reject
check5: JZ v5, init3
GOTO reject
// Decrement v2 until it is zero, constructing 2^n in the process. If 2^n
// was even, we will then pass to even2 with 2^n in v3; If 2^n was odd, we
// will pass to odd2 with 2^n in v5.
init3: INC v3 // Set v3 to 1 = 2^0 to start with.
even1: // We have decremented v2 an even number of times so far.
// 2^decremented amount is in v3.
JZ v2, odd2
DEC v2
dup3to5: JZ v3, odd1
DEC v3
INC v5
INC v5
GOTO dup3to5
odd1: // We have decremented v2 an odd number of times so far.
// 2^decremented amount is in v5.
JZ v2, even2
DEC v2
dup5to3: JZ v5, even1
DEC v5
INC v3
INC v3
GOTO dup5to3
// The second part checks the ternary length of 2^n, which starts out in v3
// or v5 according to whether the *binary* length of 2^n (i.e. n+1) was odd
// or even.
odd2: // v3 needs to have odd ternary length to accept.
// It is simplest to consider 0 to have even length in both
// binary and ternary. This works out as long as we're
// consistent.
JZ v3, reject
trisect3to5: DEC v3
DEC v3
JZ v3, even2
DEC v3
INC v5
GOTO trisect3to5
even2: // v5 needs to have even ternary length to accept
JZ v5, accept
trisect5to3: DEC v5
DEC v5
JZ v5, odd2
DEC v5
INC v3
GOTO trisect5to3
accept: HALT Accept
reject: HALT Reject
Der nächste Schritt besteht dann darin, das Obige in die Exponenten eines einzelnen variablen Automaten umzucodieren. Da das Ergebnis ziemlich lang ist, beschreibe ich nur die allgemeine Methode, aber auf meiner Website befindet sich eine Vollversion (an Stellen leicht "optimiert").
JZ vp, label
DEC vp
next: ...
wird (im Grunde durch p dividieren und dann aufräumen, um rückgängig zu machen, wenn die Teilung nicht gerade war):
DIV p, next, ..., newlabel.fp-1
newlabel.f1: MUL p
GOTO newlabel.i1
...
newlabel.fp-1: MUL p
INC
newlabel.ip-2: INC
...
newlabel.i1: INC
GOTO label
next: ...
INC vp
wird MUL p
. Individuell JZ
und DEC
kann zunächst in die kombinierte Form geändert werden. GOTO label
und HALT Reject
sind unverändert.
HALT Accept
wäre unverändert, mit der Ausnahme , dass wir noch in unserem Fall eine abschließende Kontrolle zu tun haben: müssen wir sicherstellen , dass keine Primfaktoren der Zahl gibt es andere als 2,3 und 5. Da unsere speziellen 3-Zähler Automaten Nullen die Zähler es verwendet, wenn es akzeptiert, ist dies einfach: Testen Sie einfach, dass die endgültige Variable 1 ist, was durch Springen zum Code erfolgen kann
DEC // BTW it cannot be zero before this.
JZ accept
HALT Reject
accept: HALT Accept
Der Code auf meiner Website hat auch eine erste Überprüfung, dass die Zahl nicht Null ist, was ich gerade festgestellt habe, ist redundant mit den v3, v5 Null-Überprüfungen, na ja.
Wie ich bereits erwähnte, funktioniert die obige Methode für das vereinfachte Problem, aber es hat wirklich keine Chance, für das allgemeine zu arbeiten, weil: Im allgemeinen Problem der genaue Wert des Exponenten jedes Prims für die Entscheidung seiner allgemeinen Größe und damit für seine Länge zählt hat in verschiedenen Basen. Das bedeutet, dass:
- Wir haben keine "freien" Primzahlen für Zähler.
- Auch wenn wir haben freie Primzahlen für die Zähler haben, wir haben nicht wirklich eine Möglichkeit , alle notwendigen Informationen aus den unendlich vielen anderen Primzahlen , deren Exponent Werte zu extrahieren tun Materie.
Lassen Sie uns also mit einer Erklärung des Kerns der allgemeinen Methode aus dem oben verlinkten Artikel von Ibarra und Trân ( frei herunterladbare Version ) abschließen, um zu beweisen, dass bestimmte Probleme von einem 2CA nicht lösbar sind , und wie es in unserem ärgerlich zusammenbricht Fall.
Erstens modifizieren sie jeden 2CA in eine "normale Form", in der die beiden Zähler in "Phasen" zwischen nur steigendem und nur fallendem Zähler wechseln, bis sie Null erreichen. Die Anzahl der Zustände diesen normalisierte Automat eine wichtige Rolle bei den Schätzungen spielt.s
Anschließend analysieren sie diesen Automaten und schließen daraus, dass sie bestimmte arithmetische Folgen von Zahlen konstruieren können, deren Verhalten miteinander verknüpft ist. Um genau zu sein (Einige davon werden nicht als Theoreme angegeben, sondern sind implizit im Beweis ihrer beiden Hauptbeispiele enthalten):
- Wenn eine Zahl x durch die Automaten akzeptiert wird, ohne dass die Größe der Nicht - Null - Zähler am Anfang einer Phase jemals gehen , dann gibt es eine ganze Zahl , so dass alle die Zahlen , werden akzeptiert.vxii ≤sD>0x+nDn≥0
Wenn eine Menge mindestens akzeptierte Zahlen enthält, so dass es für jede Zahl eine Phase so dass , dann können wir und ganze Zahlen finden so dassXs2+1x∈Xivxi≤sp,r∈XK1,K2
- Für jede ganze Zahl werden entweder und vom Automaten akzeptiert oder beide verworfen.n≥0p+nK1r+nK2
(Gedanken:
- Sie benötigen für aber ich denke, das ist eigentlich unnötig. Eigentlich ist es so, dass sie akzeptiert werden.x>sx∈X
- Das meiste davon sollte auch für abgelehnte Nummern gelten, solange die Ablehnung durch explizites Anhalten und nicht durch Nichtbeendigung erfolgt.)
Für ihre eigenen Beispiele verwenden sie häufig auch die Tatsache, dass keine Primfaktoren . Um die Unmöglichkeit zu beweisen, leiten sie dann Widersprüche ab, indem sie zeigen, dass solche arithmetischen Folgen nicht existieren können.D,K1,K2>s
In unserem Problem bricht ein Widerspruch mit dem zweiten Fall zusammen. Wenn wir , wobei groß genug ist, dass keine Zahl zwischen und durch oder teilbar ist , dann gibt es auch keine Potenzen von 2 oder 3 zwischen und , also werden sie entweder beide akzeptiert oder beide abgelehnt. k p r 2 k 3 k p + 6 k n q + 6 k nK1=K2=6kkpr2k3kp+6knq+6kn
Punkt 1 kann immer noch als unmöglich gezeigt werden, da Potenzen von 2 und 3 meist immer weiter auseinander wachsen. Und ich glaube, ich kann den zweiten Fall unmöglich zeigen, wenn (ich habe @MarzioDeBiasi das Argument per E-Mail geschickt). Vielleicht könnte jemand diese Information nutzen, um die Form des Automaten weiter einzuschränken und daraus einen Widerspruch abzuleiten.K1≠K2