К содержанию

Подтема 3 из 6

Двоичное число на ленте

Как читать строку на ленте как двоичное число: таблица задачи темы вычитает единицу, другие — прибавляют, дописывают и меняют цифры.

Минус один

Что таблица задачи темы делает с числом, если на ленте его двоичная запись?

Состояниеλ01
q0λ, L, q1——
q1λ, S, q11, L, q10, S, q1

Если на ленте двоичная запись числа, действие таблицы читают как арифметику: таблица задачи темы вычитает единицу. В подтеме 1 из 10100 = 20 получилось 10011 = 19. Так и вычитают единицу столбиком: нули справа занимают у ближайшей единицы и становятся единицами, сама единица становится нулём.

Вручную

37 = 100101: справа сразу единица, она становится нулём — 100100 = 36, два такта. 40 = 101000: три нуля хвоста стали единицами, единица — нулём: 100111 = 39, пять тактов.

Python

Проверим вывод на всех числах от 1 до 500: — двоичная запись без приставки 0b, int(result, 2) — число по двоичной записи. Функция run_tm — из подтемы 1.

rules = {    ('q0', 'λ'): ('λ', 'L', 'q1'),    ('q1', 'λ'): ('λ', 'S', 'q1'),    ('q1', '0'): ('1', 'L', 'q1'),    ('q1', '1'): ('0', 'S', 'q1'),}bad = 0for n in range(1, 501):    word = bin(n)[2:]    result, pos, steps = run_tm(word, rules, len(word))    if int(result, 2) != n - 1:        bad += 1print('расхождений:', bad)
расхождений: 0

Совпадение на 500 числах — проверка, а не доказательство: доказывает рассуждение о разрядах выше.

Тонкости:строка из нулей

«Минус один» верно только для ненулевого числа. Из 000 таблица сделает 111: единицы не встретится, все нули станут единицами, и машина остановится на пустой ячейке. Запись отрицательного числа таблицей не предусмотрена.

Слово и число

Из 1000 таблица задачи темы делает 0111. Это 7 или четыре символа?

Слово на ленте хранит каждую ячейку, в том числе ведущие нули, а число — только значение. 0111 — четыре символа, один ноль, значение 7. Если вопрос о длине, числе нулей или тактов, работают со словом; если о десятичном результате — с числом.

Веса разрядов от правого края — 1, 2, 4, 8, …; значение — сумма весов там, где стоят единицы: 10101 = 16 + 4 + 1 = 21.

Цифра слева и справа

Таблица ниже проходит число 21 = 10101 и пишет единицу слева. Какое число получится? Головка начинает в ближайшей пустой ячейке справа, в q0.

  1. Начало: q0, головка в клетке 5. Перед тактом 1: q0 читает λ в клетке 5 → записать λ, влево, q1.
  2. Перед тактом 2: q1 читает 1 в клетке 4 → записать 1, влево, q1.
  3. Перед тактом 3: q1 читает 0 в клетке 3 → записать 0, влево, q1.
  4. Перед тактом 4: q1 читает 1 в клетке 2 → записать 1, влево, q1.
  5. Перед тактом 5: q1 читает 0 в клетке 1 → записать 0, влево, q1.
  6. Перед тактом 6: q1 читает 1 в клетке 0 → записать 1, влево, q1.
  7. Перед тактом 7: q1 читает λ в клетке -1 → записать 1, влево, q2.
  8. Перед тактом 8: q2 читает λ в клетке -2 → записать λ, стоп, q2.
  9. Остановка: на ленте 110101, тактов 8, головка на -2.

Единица слева от слова длины k добавляет 2ᵏ: получается N + 2ᵏ. Цифра справа сдвигает прежние на разряд: ноль даёт 2N, единица — 2N + 1. Слово 10101 длины 5: 21 + 32 = 53 = 110101. Тактов k + 3 = 8: вход, пять цифр, запись слева, остановка.

Единица слева получает вес 32, веса прежних цифр не меняются: 21 + 32 = 53.
Единица справа сдвигает прежние цифры на разряд: каждый вес удваивается, и прибавляется 1 — 2 · 21 + 1 = 43.
Вручную

Длину k бери из самой записи: 100 = 1100100 — семь цифр, единица слева даёт 100 + 128 = 228. Справа: 37 = 100101, единица справа — 2 · 37 + 1 = 75, блок 10 справа — 4 · 37 + 2 = 150.

Python
rules = {    ('q0', 'λ'): ('λ', 'L', 'q1'),    ('q1', '0'): ('0', 'L', 'q1'),    ('q1', '1'): ('1', 'L', 'q1'),    ('q1', 'λ'): ('1', 'L', 'q2'),    ('q2', 'λ'): ('λ', 'S', 'q2'),}bad = 0for n in range(1, 501):    word = bin(n)[2:]    result, pos, steps = run_tm(word, rules, len(word))    if int(result, 2) != n + 2 ** len(word):        bad += 1print(run_tm('10101', rules, 5), 'расхождений:', bad)
('110101', -2, 8) расхождений: 0
Тонкости:смена старшего разряда

Пусть таблица, дойдя до левого края, сначала меняет старшую единицу на ноль и только потом пишет единицу левее. Тогда старая единица теряет вес 2ᵏ⁻¹, новая получает 2ᵏ: результат N + 2ᵏ⁻¹. Для 21 — 100101 = 37, а не 53.

Старшая единица слова 10101 стала нулём, левее записана новая единица: 21 − 16 + 32 = 37.

Инверсия

Таблица проходит слово и меняет каждую цифру на противоположную. Что станет с числом 21?

Состояниеλ01
q0λ, L, q1——
q1λ, S, q11, L, q10, L, q1

Инверсия сохраняет длину слова, а значение становится 2ᵏ − 1 − N. В каждом разряде цифра и её противоположность вместе дают единицу, поэтому N и результат вместе дают k единиц, то есть 2ᵏ − 1. 10101 → 01010: 31 − 21 = 10, а на ленте по-прежнему пять символов.

Плюс один

А если в таблице задачи темы поменять ролями 0 и 1 — что она будет делать с числом 1011?

Состояниеλ01
q0λ, L, q1——
q11, S, q11, S, q10, L, q1

Такая таблица прибавляет единицу: единицы хвоста становятся нулями, ближайший ноль или пустая ячейка слева — единицей. 1011 = 11 → 1100 = 12, четыре такта. Если единицы везде, слово удлиняется: 111 → 1000.

Перенос: две единицы хвоста стали нулями, ноль перед ними — единицей. 11 + 1 = 12.

Итого

  • Задача темывычитает единицу: 20 → 19
  • Слово и числоведущие нули — тоже ячейки
  • 1 слеваN + 2ᵏ, k — длина записи
  • Справа0 — 2N, 1 — 2N + 1
  • Инверсия2ᵏ − 1 − N, длина та же
  • Плюс одинединицы хвоста → 0, ноль → 1

Проверьте себя

Ответь сначала сам, потом открой ответ.

Вопрос 1
Таблица задачи темы получает двоичную запись числа 40. Какое число получится?
ОтветСкрыть ответ
Ответ
39: 101000 → 100111.
Вопрос 2
Сколько тактов при этом выполнит машина?
ОтветСкрыть ответ
Ответ
5: вход, три нуля хвоста, остановочная замена единицы.
Вопрос 3
Таблица «единица слева» получает слово 101. Какое число получится?
ОтветСкрыть ответ
Ответ
13: 5 + 2³ = 13, 1101.
Вопрос 4
Инверсия получает 1000. Сколько символов будет на ленте и какое значение?
ОтветСкрыть ответ
Ответ
Четыре символа, 0111, значение 7 = 2⁴ − 1 − 8.
Вопрос 5
К двоичной записи числа 37 справа дописали единицу. Какое число получилось?
ОтветСкрыть ответ
Ответ
75: 2 · 37 + 1.

Практика

Для проверки ответов нужен JavaScript. Условия, подсказки и решения доступны ниже.

Единица справа

На ленте исполнителя МТ в соседних ячейках записано двоичное представление числа 37 без ведущих нулей, остальные ячейки пустые (λ). Головка — в ближайшей пустой ячейке слева от строки, состояние q0. Программа:

Состояниеλ01
q0λ, R, q1——
q11, S, q10, R, q11, R, q1

Определи результат выполнения программы. В ответе запиши получившееся число в десятичной системе счисления.

Введите число.

На ленте исполнителя МТ в соседних ячейках записано двоичное представление числа 45 без ведущих нулей, остальные ячейки пустые (λ). Головка — в ближайшей пустой ячейке слева от строки, состояние q0. Программа:

Состояниеλ01
q0λ, R, q1——
q11, R, q20, R, q11, R, q1
q20, S, q2——

Определи результат выполнения программы. В ответе запиши получившееся число в десятичной системе счисления.

Введите число.

Единица слева к числу 5

На ленте исполнителя МТ в соседних ячейках записано двоичное представление числа 5 без ведущих нулей, остальные ячейки пустые (λ). Головка — в ближайшей пустой ячейке справа от строки, состояние q0. Программа:

Состояниеλ01
q0λ, L, q1——
q11, L, q20, L, q11, L, q1
q2λ, S, q2——

Определи результат выполнения программы. В ответе запиши получившееся число в десятичной системе счисления.

Введите число.

Единица слева к числу 100

На ленте исполнителя МТ в соседних ячейках записано двоичное представление числа 100 без ведущих нулей, остальные ячейки пустые (λ). Головка — в ближайшей пустой ячейке справа от строки, состояние q0. Программа:

Состояниеλ01
q0λ, L, q1——
q11, L, q20, L, q11, L, q1
q2λ, S, q2——

Определи результат выполнения программы. В ответе запиши получившееся число в десятичной системе счисления.

Введите число.

Единица слева к числу 1000

На ленте исполнителя МТ в соседних ячейках записано двоичное представление числа 1000 без ведущих нулей, остальные ячейки пустые (λ). Головка — в ближайшей пустой ячейке справа от строки, состояние q0. Программа:

Состояниеλ01
q0λ, L, q1——
q11, L, q20, L, q11, L, q1
q2λ, S, q2——

Определи результат выполнения программы. В ответе запиши получившееся число в десятичной системе счисления.

Введите число.

Смена старшего разряда

На ленте исполнителя МТ в соседних ячейках записано двоичное представление числа 50 без ведущих нулей, остальные ячейки пустые (λ). Головка — в ближайшей пустой ячейке справа от строки, состояние q0. Программа:

Состояниеλ01
q0λ, L, q1——
q1λ, R, q20, L, q11, L, q1
q2——0, L, q3
q31, S, q3——

Определи результат выполнения программы. В ответе запиши получившееся число в десятичной системе счисления.

Введите число.

Инверсия числа 200

На ленте исполнителя МТ в соседних ячейках записано двоичное представление числа 200 без ведущих нулей, остальные ячейки пустые (λ). Головка — в ближайшей пустой ячейке справа от строки, состояние q0. Программа:

Состояниеλ01
q0λ, L, q1——
q1λ, S, q11, L, q10, L, q1

Определи результат выполнения программы. В ответе запиши получившееся число в десятичной системе счисления.

Введите число.

Прибавление единицы к 101111

На ленте исполнителя МТ записано слово 101111, остальные ячейки пустые (λ). Головка — в ближайшей пустой ячейке справа от строки, состояние q0. Программа:

Состояниеλ01
q0λ, L, q1——
q11, S, q11, S, q10, L, q1

Какое слово окажется на ленте после остановки?

Введите слово — цифры подряд, без пробелов.