Так что люди продолжают настаивать на том, чтобы я опубликовал это, хотя это только решает упрощенную версию проблемы. Тогда ладно :)
В конце этого я приведу кое-что из того, что я узнал из статьи Ибарры и Трэна, и почему этот метод не подходит для нашей общей проблемы, но, возможно, все же дает некоторую полезную информацию.
Но сначала мы рассмотрим более простую проблему, связанную с попыткой решить множество
2 nL={2n∣ троичные и двоичные представления имеют как четную, так и нечетную длину2n}
Обратите внимание, что здесь а не как в исходной задаче. В частности, если входное число не является степенью 2, мы хотим отклонить его, а не пытаться вычислить его длину в любой базе. n2nn
Это значительно упрощает ситуацию: если исходное число записывается как простое множитель , то для всех кроме нам просто нужно проверить что они все .v i v 2 02v23v35v57v7...viv20
Это позволяет нам решить эту упрощенную проблему, используя обертку вокруг старого метода (я полагаю, Минского) кодирования состояния автомата счетчика в показателях простой факторизации одной переменной автомата умножения / деления, что, как отмечено в ОП выше, в значительной степени эквивалентно автомату с двумя счетчиками.k
Для начала нам понадобится автомат с счетчиком. Мы будем использовать 3 счетчика с именами , и .v 2 v 3 v 5kv2v3v5
Автомат будет принимать , если для начальных значений счетчика, тройные и двоичные представления имеют и даже длину или нечетную длину, и оба и равны нуль. Когда он принимает, он сначала обнуляет все свои счетчики.2v2v3v5
Вот некоторый код для этого в формате сборки, похожем на OP (я только что добавил переменные в инструкции). На самом деле я не проверял его, поскольку мне не с чем его запускать, но я считаю это формальностью: хорошо известно, что автоматы с 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, ну хорошо.
Как я уже упоминал, вышеупомянутый метод работает для упрощенной задачи, но он действительно не имеет шансов работать для общей задачи, потому что: В общей задаче точное значение показателя каждого простого числа учитывается при определении его общего размера и, следовательно, его длины имеет в разных базах. Это означает, что:
- У нас нет «свободных» простых чисел для счетчиков.
- Даже если мы действительно есть свободные простые числа для счетчиков, мы на самом деле не есть способ извлечь всю необходимую информацию из бесконечного множества других простых чисел , у которых показатель значения делают дело.
Итак, давайте закончим объяснением сути общего метода из вышеупомянутой связанной статьи Ibarra и Trân ( свободно скачиваемая версия ) о том, как доказать, что 2CA не могут решить некоторые проблемы , и как это досадно ломается в нашем кейс.
Во-первых, они превращают каждые 2CA в «нормальную форму», в которой два счетчика переключаются в «фазах» между одним, только увеличивающимся, а другим только уменьшающимся, пока не достигнет нуля. Число состояний этого нормализуется автомат играет важную роль в оценках.s
Затем они анализируют этот автомат, чтобы сделать вывод, что они могут построить определенные арифметические последовательности чисел, поведение которых связано. Чтобы быть точным (часть этого не сформулирована как теорема, но подразумевается в доказательстве обоих их двух основных примеров):
- Если автомат принимает число x без размера ненулевого счетчика в начале фазы когда-либо идущего , то существует целое число такое, что все числа , принимаются.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