Quindi la gente continua a tormentarmi per pubblicarlo, anche se risolve solo una versione semplificata del problema. Va bene allora :)
Alla fine, inserirò parte di ciò che ho appreso dall'articolo di Ibarra e Trân, e perché questo metodo si rompe sul nostro problema generale, ma forse fornisce ancora alcune informazioni utili.
Ma prima vedremo il problema più semplice di provare a decidere il set
le rappresentazioni ternarie e binarie di 2 n hanno lunghezza pari o dispari }L={2n∣2n}
2nn
2v23v35v57v7...viv20
k
kv2v3v5
2v2v3v5
Ecco un po 'di codice per questo, in un formato assembly simile all'OP (ho appena aggiunto variabili alle istruzioni). In realtà non l'ho testato, dal momento che non ho nulla con cui eseguirlo, ma lo considero una formalità: gli automi a 3 contatori sono ben noti per essere completi di Turing e per essere in grado di costruire qualsiasi funzione calcolabile di uno dei loro valori iniziali.
// 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
Il passo successivo è quindi ricodificare quanto sopra negli esponenti di un singolo automa variabile. Dato che il risultato è piuttosto lungo, descriverò solo il metodo generale, ma una versione completa (leggermente "ottimizzata" in punti) è sul mio sito web.
JZ vp, label
DEC vp
next: ...
diventa (sostanzialmente dividi per p, quindi esegui la pulizia per annullare se la divisione non era pari):
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
diventa MUL p
. Individuale JZ
e DEC
può essere prima modificato nella forma combinata. GOTO label
e HALT Reject
sono invariati.
HALT Accept
rimarrebbe invariato, tranne che nel nostro caso abbiamo ancora un controllo finale da fare: dobbiamo assicurarci che non ci siano fattori primi nel numero diversi da 2,3 e 5. Dal momento che il nostro particolare automa a 3 contatori zeri i contatori esso utilizza quando accetta, questo è semplice: basta provare che la variabile finale è 1, che può essere fatta saltando al codice
DEC // BTW it cannot be zero before this.
JZ accept
HALT Reject
accept: HALT Accept
Il codice sul mio sito web ha anche un controllo iniziale che il numero non è zero, che ho appena realizzato è ridondante con i controlli zero v3, v5, oh bene.
Come ho già detto, il metodo sopra funziona per il problema semplificato, ma in realtà non ha alcuna possibilità di lavorare per quello generale, perché: nel problema generale il valore preciso dell'esponente di ogni numero primo conta per decidere la sua dimensione generale e quindi quale lunghezza ha in varie basi. Ciò significa che:
- Non abbiamo numeri primi "liberi" da usare per i contatori.
- Anche se abbiamo fatto avere numeri primi gratuiti per i contatori, che in realtà non hanno un modo per estrarre tutte le informazioni necessarie dagli infiniti altri numeri primi i cui valori esponente fare la materia.
Quindi terminiamo con una spiegazione dell'essenza del metodo generale dall'articolo collegato sopra di Ibarra e Trân ( versione scaricabile gratuitamente ) su come dimostrare che alcuni problemi non sono risolvibili da un 2CA e come si rompe fastidiosamente nel nostro Astuccio.
s
Quindi, analizzano questo automa per concludere che possono costruire determinate sequenze aritmetiche di numeri il cui comportamento è collegato. Per essere precisi (alcuni di questi non sono indicati come teoremi, ma sono impliciti nella dimostrazione di entrambi i loro due esempi principali):
- vxii ≤sD>0x+nDn≥0
Xs2+1x∈Xivxi≤sp,r∈XK1,K2
- n≥0p+nK1r+nK2
(Pensieri:
- x>sx∈X
- La maggior parte di questo dovrebbe valere anche per i numeri rifiutati , a condizione che il rifiuto si interrompa esplicitamente anziché non terminando.
D,K1,K2>s
K1=K2=6kkpr2k3kp+6knq+6kn
K1≠K2