Тож люди продовжують нудити мене публікувати це, хоча це вирішує лише спрощену версію проблеми. Тоді добре :)
Наприкінці цього я викладу деякі з того, що я дізнався з паперів Ібарри та Трана, і чому цей метод розпадається на нашу загальну проблему, але, можливо, все ж дає корисну інформацію.
Але спочатку ми розглянемо більш просту проблему спроби вирішити множину
L={2n∣ потрійних та двійкових уявлень мають як парну, так і непарну довжину2n}
Зверніть увагу, як це має а не як у вихідній задачі. Зокрема, якщо число вводу не є потужністю 2, ми хочемо відхилити його, а не намагатися обчислити його довжину в будь-якій базі.2nn
Це значно спрощує питання: Якщо оригінальне число записується простим фактором як , то для всіх крім нам просто потрібно перевірити що вони всі .2v23v35v57v7...viv20
Це дозволяє вирішити цю спрощену задачу за допомогою обгортки навколо старого методу (я вважаю, як вважає Мінський) кодування стану автоматичного обчислювача в експонентах первинної факторизації єдиної змінної автомата множення / ділення, що, як зазначалося в ОП вище, в значній мірі еквівалентно 2-лічильному автомату.k
По-перше, нам потрібен автомат -счетчика, щоб обернути його. Ми будемо використовувати 3 лічильники, іменовані , та .kv2v3v5
Автомат прийме iff для початкових значень лічильника, потрійні та двійкові представлення мають як і непарну довжину, а і дорівнюють нулю. Коли він прийме, він спочатку обнуляє всі свої лічильники.2v2v3v5
Ось код для цього у форматі складання, подібному до ОП (я щойно додав змінні до інструкцій). Я насправді не перевіряв його, оскільки мені не було з чим його запускати, але я вважаю це формальністю: 3-лічильні автомати добре відомі як повний Тьюрінг і здатні побудувати будь-яку обчислювальну функцію однієї з їх початкові значення.
// 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
Наступним кроком є повторне кодування вищевказаного в експонентах одного автомата змінної. Оскільки результат досить довгий, я просто опишу загальний метод, але повна версія (трохи «оптимізована» в плямах) є на моєму веб-сайті.
JZ vp, label
DEC vp
next: ...
стає (в основному розділіть на p, а потім очистіть, щоб скасувати, якщо поділ не було рівним):
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
стає MUL p
. Індивідуальний JZ
і DEC
спочатку може бути змінений у комбіновану форму. GOTO label
і HALT Reject
є незмінними.
HALT Accept
буде без змін, за винятком того, що в нашому випадку ми ще одну остаточної перевірка робити: ми повинні переконатися , що немає простих множників в числі інших , ніж 2,3 і 5. Так як наші зокрема 3-лічильника автоматних нулів лічильників це використовує, коли він приймає, це просто: просто перевірити, що кінцева змінна дорівнює 1, що можна зробити, перейшовши до коду
DEC // BTW it cannot be zero before this.
JZ accept
HALT Reject
accept: HALT Accept
Код на моєму веб-сайті також має початкову перевірку того, що число не дорівнює нулю, що я щойно зрозумів, що це зайве з перевіркими нуля v3, v5, ну добре.
Як я вже згадував, вищевказаний метод працює для спрощеної задачі, але він дійсно не має шансів працювати на загальну, тому що: У загальній проблемі точне значення експонента кожного прем'єра рахується для визначення його загального розміру і, таким чином, довжини його є в різних базах. Це означає що:
- У нас немає "безкоштовних" прайменів, які можна використовувати для лічильників.
- Навіть якщо ми дійсно є вільні прості числа для лічильників, ми на самому ділі не є спосіб витягти всю необхідну інформацію з нескінченної кількості інших простих чисел , у яких показник значення роблять справу.
Отже, давайте закінчимо поясненням суті загального методу з вищезгаданого зв'язаного документа Ібарри та Трана ( вільно завантажувана версія ) про те, як довести, що певні проблеми не вирішуються 2CA і як це дратівливо руйнується в нашій справа.
По-перше, вони змінюють кожен 2CA на "нормальну форму", в якій два лічильника перемикаються у "фази" між одним лише зростаючим, а другий лише зменшується, поки він не досягне нуля. Число станів цього нормалізується автомат грає важливу роль в оцінках.s
Потім вони аналізують цей автомат для висновку, що вони можуть побудувати певні арифметичні послідовності чисел, поведінка яких пов'язана. Якщо бути точним (Деякі з цих питань не викладені як теореми, але явно маються на увазі обох основних їх прикладів):
- Якщо число х приймається автоматом, без розміру лічильника ненульовим на початку фази коли - небудь збирається , то існує ціле число таке , що всі числа , приймаються.vxii ≤sD>0x+nDn≥0
Якщо множина містить принаймні прийнятих чисел, таких, що для кожного числа є фаза така, що , то ми можемо знайти та цілі числа такі, щоXs2+1x∈Xivxi≤sp,r∈XK1,K2
- Для кожного цілого числа автомат приймає або і , або обидва відхиляються.n≥0p+nK1r+nK2
(Думки:
- Їм потрібно для але я думаю, що це насправді непотрібно. Власне так, що їх приймають.x>sx∈X
- Більшість цього має також стосуватися відхилених чисел, якщо відхилення відбувається шляхом явного припинення, а не невиконання.)
Для власних прикладів вони також часто використовують той факт, що не мають простих факторів . Щоб довести неможливість, вони виводять протиріччя, показуючи, що такі арифметичні послідовності не можуть існувати.D,K1,K2>s
У нашій проблемі отримання протиріччя з цього розпадається на другий випадок. Якщо у нас , де досить великий, що жодне число між і не ділиться ні на ні на , тоді також не буде сили 2 або 3 між і , тому вони або прийняті, або обидва відхилені. k p r 2 k 3 k p + 6 k n q + 6 k nK1=K2=6kkpr2k3kp+6knq+6kn
Точку 1 все ще можна виявити неможливою, оскільки сили 2 і 3 здебільшого зростають все далі і далі. І я вважаю, що я можу показати другий випадок неможливим, якщо (я аргументував електронною поштою @MarzioDeBiasi). Тож, можливо, хтось міг би скористатися цією інформацією для подальшого обмеження форми автомата і, нарешті, з цього вивести протиріччя.K1≠K2