Как построить машину Тьюринга для умножения десятичного числа на 11?
Используется алфавит A={0,1,2,⋯,9}. Нужно построить таблицу машины Тьюринга, которая умножает входное слово на 11.
Понятно, что последовательность такая:
1) Проверка, не равно ли нулю входное слово или не пустое ли оно, одновременно удаляя незначащие нули
2) Добавление 0 в конец, и после добавление "+"
3) Копирование справа от "+" входного слова без добавленного нуля
4) Сложение
Вопрос, как сделать это копирование нормально для десятичного числа?
Для 10 цифр это уже 10 состояний, а после записи нужно еще вернуться и восстановить заменённый символ обратно, получается еще 10 символов добавлять для каждой цифры (иначе как понять, на что восстанавливать)?
Кажется, перебор
Для правильного вопроса надо знать половину ответа
Примем, что в исходном положении каретка стоит на последней цифре числа.
У нас будут состояния от q0 до q10, соответствующие сумме младшего разряда исходного числа и переноса из него . Начальное состояние - q0.
qiaj → q((i + j) div 10) + ja(i + j % 10)L,
qi ≠ 0ε → q(i div 10)a(i % 10)L,
q0ε → qstop,
где div - целочисленное деление.
Теперь каретка стоит в пустой клетке перед результатом.
Div и mod реализовать это еще та задача, может выйти еще больше состояний.
Каретка под первым символом входного слова у меня, не проблема, конечно, перенести под последний, просто для уточнения.
ZIK1337, По этим шаблонам строится весь набор правил для умножения на 11. Просто перебираете i от 0 до 10 и j от 0 до 9 + ε и получаете 121 правило.
Например, для состояния q5 и символа a7 получим правило
q5a7 → q((5 + 7) div 10) + 7a(5 + 7) % 10L = q8a2L