Dlatego ludzie ciągle mnie nakłaniają do opublikowania tego, mimo że rozwiązuje to tylko uproszczoną wersję problemu. W porządku :)
Na koniec przedstawię trochę tego, czego nauczyłem się z pracy Ibarry i Trâna, i dlaczego ta metoda załamuje nasz ogólny problem, ale być może nadal dostarcza użytecznych informacji.
Ale najpierw przyjrzymy się prostszemu problemowi przy podejmowaniu decyzji o zestawie
trójskładnikowy i binarnym z 2 n mają zarówno nawet długość lub nieparzystej długości }L={2n∣2n}
2nn
2v23v35v57v7...viv20
k
kv2v3v5
2v2v3v5
Oto kod do tego, w formacie asemblera podobnym do OP (właśnie dodałem zmienne do instrukcji). Właściwie to go nie testowałem, ponieważ nie mam z czym go uruchomić, ale uważam to za formalność: automaty 3-licznikowe są dobrze znane jako kompletne Turinga i zdolne do konstruowania dowolnej funkcji obliczeniowej jednego z ich Wartości początkowe.
// 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
Następnym krokiem jest ponowne zakodowanie powyższego w wykładnikach automatu z jedną zmienną. Ponieważ wynik jest dość długi, opiszę tylko ogólną metodę, ale pełna wersja (nieco „zoptymalizowana” w punktach) znajduje się na mojej stronie.
JZ vp, label
DEC vp
next: ...
staje się (w zasadzie podziel przez p, a następnie wykonaj czyszczenie, aby cofnąć, jeśli podział nie był nawet równy):
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
staje się MUL p
. Indywidualne JZ
i DEC
można je najpierw zmienić w połączoną formę. GOTO label
i HALT Reject
pozostają niezmienione.
HALT Accept
pozostałby niezmieniony, z wyjątkiem tego, że w naszym przypadku mamy jeszcze jedną ostateczną kontrolę: musimy upewnić się, że nie ma żadnych czynników pierwszych w liczbie innej niż 2,3 i 5. Ponieważ nasz szczególny automat 3-licznikowy zeruje go, używa, gdy akceptuje, jest to proste: wystarczy przetestować, że zmienna końcowa ma wartość 1, co można zrobić, przechodząc do kodu
DEC // BTW it cannot be zero before this.
JZ accept
HALT Reject
accept: HALT Accept
Kod na mojej stronie ma również wstępną kontrolę, czy liczba nie jest zerowa, co właśnie zdałem sobie sprawę, że jest zbędne w przypadku kontroli zerowych v3, v5, no cóż.
Jak wspomniałem, powyższa metoda działa na uproszczony problem, ale tak naprawdę nie ma szans na działanie w przypadku problemu ogólnego, ponieważ: W ogólnym problemie dokładna wartość wykładnika każdej liczby pierwszej ma znaczenie przy podejmowaniu decyzji o jego ogólnym rozmiarze, a tym samym o jego długości ma w różnych podstawach. To znaczy że:
- Nie mamy „darmowych” liczb pierwszych do użycia dla liczników.
- Nawet jeśli nie mają wolne liczb pierwszych dla liczników, tak naprawdę nie ma sposobu, aby wyodrębnić wszystkie niezbędne informacje od nieskończenie wiele innych liczb pierwszych, których wykładnik wartości zrobić materia.
Zakończmy więc wyjaśnienie istoty ogólnej metody z powyższego powiązanego artykułu autorstwa Ibarry i Trâna ( wersja do pobrania za darmo ), aby udowodnić, że niektóre problemy nie są rozwiązane przez 2CA, i jak irytująco psuje się w naszym walizka.
s
Następnie analizują ten automat, aby stwierdzić, że mogą konstruować pewne ciągi arytmetyczne liczb, których zachowanie jest powiązane. Aby być precyzyjnym (niektóre z nich nie są określone jako twierdzenia, ale są dorozumiane w dowodzie obu ich dwóch głównych przykładów):
- vxii ≤sD>0x+nDn≥0
Xs2+1x∈Xivxi≤sp,r∈XK1,K2
- n≥0p+nK1r+nK2
(Myśli:
- x>sx∈X
- Większość z nich powinna obowiązywać również w przypadku numerów odrzuconych , o ile odrzucenie następuje poprzez wyraźne wstrzymanie, a nie zakończenie.)
D,K1,K2>s
K1=K2=6kkpr2k3kp+6knq+6kn
K1≠K2