Вопрос

Мне нужна помощь в разработке машины Тьюринга, которая будет вычислять следующее f(x,y) = x*y mod 4. Анкет Как подходить к этой проблеме на бинарной базе, где $x$ а также $y$ Есть два бита?

Это было полезно?

Решение

Возможно, может быть слегка оптимизирован, но это делает свое дело:

Предположение - Вход состоит (исключительно) двух двоичных чисел (с лидером 0, поэтому 01 вместо 1 и 00 вместо 0), разделенных пустым символом (_). Результатом является двоичное число с ведущим, представляющим x * y mod 4.

Таблица перехода (состояние curity_symbol new_symbol move_direction new_state):

0 0 0 r 0
0 1 1 r 0
0 _ _ r 1
1 0 0 r 1
1 1 1 r 1
1 _ x r 2
2 _ 0 r 3 
3 _ 0 l 4
4 0 0 l 4
4 x x l 5
5 0 0 l 5
5 1 1 l 5
5 x x l 5
5 _ _ l 6
6 1 0 r 7
6 0 0 l 16
7 0 0 r 7
7 1 1 r 7
7 _ _ r 7
7 x x l 8
8 0 0 l 9
8 1 1 r 10
9 0 0 l 5
9 1 1 r 14
10 x x r 10
10 0 0 r 11
10 1 1 r 11
11 0 1 l 12
11 1 0 l 18
12 0 0 l 12
12 1 1 l 12
12 x x l 13
13 0 0 l 9
13 1 1 l 9
14 0 0 r 14
14 1 1 r 14
14 x x r 15
15 0 1 r 5
15 1 0 r 5
16 0 _ r 19
16 1 0 r 17
17 0 1 r 7
18 0 1 l 12
18 1 0 l 12
19 0 _ r 19
19 1 _ r 19
19 _ _ r 19
19 x _ r halt

Описание грубого состояния:

  • 0 Двигайтесь справа от первого числа (иду справа)
  • 1 Двигайтесь справа от второго числа (и завершить - добавить x) -
  • 2 Напишите первый результат ноль
  • 3 Напишите второй результат нулевой
  • 4 Переезд на Х (влево)
  • 5 двигаться справа от первого числа (влево)
  • 6 уменьшение правильного числа на один
  • 7 Уменьшен - теперь номер копии - перейти к левой цифре правого номера
  • 8 Прочитайте левую цифру правого номера
  • 9 Прочтите правую цифру правого номера
  • 10 правая цифра правого числа составила 1 - Двигайтесь справа от результата, чтобы увеличить
  • 11 Результат увеличения
  • 12 Переезд в х
  • 13 Переезд, чтобы прочитать правую цифру правого номера
  • 14 Перейдите в левую цифру результата, чтобы увеличить
  • 15 Приращение правого номера (примечание - так как это мод 4, мы просто переворачиваем)
  • 16 При попытке уменьшить левый номер - правая цифра была 0 - Проверьте, если 00?
  • 17 Мы уменьшили левое число на 2, теперь увеличение до -1
  • 18 При увеличении результата левого цифры составила 0 - перенос
  • 19 Очистка
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top