Подтема 5 из 6
Состояния и фазы
Таблицы из нескольких состояний: этапы работы, результат для любой длины и состояние как память.
Фазы работы
Что сделает таблица из четырёх состояний со словом 101?
Головка начинает в ближайшей пустой ячейке слева, в q0.
Когда состояний несколько, каждое из них — отдельная фаза работы. Назови, что машина делает в каждой фазе и чем фаза заканчивается, — и длинную трассу писать не придётся.
- Начало: q0, головка в клетке -1. Перед тактом 1: q0 читает λ в клетке -1 → записать λ, вправо, q1.
- Перед тактом 2: q1 читает 1 в клетке 0 → записать 1, вправо, q1.
- Перед тактом 3: q1 читает 0 в клетке 1 → записать 1, вправо, q1.
- Перед тактом 4: q1 читает 1 в клетке 2 → записать 1, вправо, q1.
- Перед тактом 5: q1 читает λ в клетке 3 → записать 0, влево, q2.
- Перед тактом 6: q2 читает 1 в клетке 2 → записать 1, влево, q2.
- Перед тактом 7: q2 читает 1 в клетке 1 → записать 1, влево, q2.
- Перед тактом 8: q2 читает 1 в клетке 0 → записать 1, влево, q2.
- Перед тактом 9: q2 читает λ в клетке -1 → записать 0, влево, q3.
- Перед тактом 10: q3 читает λ в клетке -2 → записать 1, стоп, q3.
- Остановка: на ленте 101110, тактов 10, головка на -2.
| Состояние | Что делает | Чем заканчивается |
|---|---|---|
q0 | входит в слово | первый сдвиг вправо |
q1 | идёт вправо, все цифры → 1 | на λ справа пишет 0 |
q2 | идёт влево по единицам | на λ слева пишет 0 |
q3 | пишет 1 ещё левее | остановка |
q1 повторяется много тактов подряд, но цикла нет: головка каждый раз в новой ячейке, и до края слова всё ближе. Каждая фаза конечна, машина остановится.
Результат для любой длины
Какое наибольшее число не больше 500 может получиться у этой таблицы?
Когда фазы названы, результат записывают для любой длины: здесь из слова длины k всегда получается 10, затем k единиц, затем 0. Цифры входа в первой фазе всё равно становятся единицами, поэтому результат зависит только от длины.
k = 1 — 1010 = 10, k = 2 — 22, k = 3 — 46, …, k = 6 — 101111110 = 382, k = 7 — уже 766. Ответ 382. Тактов 2k + 4: вход, k цифр, запись справа, k единиц обратно, запись слева, остановка.
Раз важна только длина, достаточно запустить по одному слову каждой длины ('1' * k — k единиц подряд) функцией run_tm из подтемы 1:
rules = { ('q0', 'λ'): ('λ', 'R', 'q1'), ('q1', 'λ'): ('0', 'L', 'q2'), ('q1', '0'): ('1', 'R', 'q1'), ('q1', '1'): ('1', 'R', 'q1'), ('q2', 'λ'): ('0', 'L', 'q3'), ('q2', '1'): ('1', 'L', 'q2'), ('q3', 'λ'): ('1', 'S', 'q3'),}for k in range(1, 8): result, pos, steps = run_tm('1' * k, rules, -1) print(k, result, int(result, 2), steps)Цифры на краях
Таблица проходит число вправо, не меняя цифр, пишет 1 справа, возвращается и пишет 1 слева. Что станет с числом 13?
| Состояние | λ | 0 | 1 |
|---|---|---|---|
q0 | λ, R, q1 | — | — |
q1 | 1, L, q2 | 0, R, q1 | 1, R, q1 |
q2 | 1, S, q2 | 0, L, q2 | 1, L, q2 |
Если цифры слова сохраняются, а на краях дописываются разряды, результат выражают через N и длину k, как в подтеме 3. Единица справа даёт 2N + 1, единица слева от слова длины k + 1 добавляет 2ᵏ⁺¹. Итог 2ᵏ⁺¹ + 2N + 1: 13 = 1101, k = 4, 32 + 27 = 59.
Состояние как память
Таблица ниже дописывает к слову одну цифру. Какую — для слова 1011? Головка начинает на первой цифре, в q0.
| Состояние | λ | 0 | 1 |
|---|---|---|---|
q0 | 0, S, q0 | 0, R, q0 | 1, R, q1 |
q1 | 1, S, q1 | 0, R, q1 | 1, R, q0 |
Состояние может хранить свойство уже просмотренной части: здесь q0 — «единиц пока чётное число», q1 — «нечётное». Ноль состояние не меняет, единица переключает. На пустой ячейке машина пишет 0 при чётном числе единиц и 1 при нечётном. В 1011 три единицы: 10111.
Смысл состояния проверяют по командам, а не по названию: каждый ноль должен сохранять смысл, каждая единица — менять его на противоположный. Перебором слов () и функцией run_tm это легко проверить на коротких строках.
Итого
- Фазачто делает состояние и чем заканчивается
- Не циклто же состояние, но новая ячейка
- Любая длина10, k единиц, 0: важна только k
- Тактысумма тактов всех фаз: 2k + 4
- Края2ᵏ⁺¹ + 2N + 1 для 1 слева и справа
- Памятьсостояние хранит чётность и подобное
Проверьте себя
Ответь сначала сам, потом открой ответ.
ОтветСкрыть ответ
10111110.ОтветСкрыть ответ
110. Что будет на ленте?ОтветСкрыть ответ
1100: две единицы — чётно, дописан 0.10101. Какое число получится?ОтветСкрыть ответ
ОтветСкрыть ответ
Практика
Для проверки ответов нужен JavaScript. Условия, подсказки и решения доступны ниже.
Такты на слове длины 5
На ленте исполнителя МТ записано слово 10110, остальные ячейки пустые (λ). Головка — в ближайшей пустой ячейке слева от строки, состояние q0. Программа:
| Состояние | λ | 0 | 1 |
|---|---|---|---|
| q0 | λ, R, q1 | — | — |
| q1 | 0, L, q2 | 1, R, q1 | 1, R, q1 |
| q2 | 0, L, q3 | — | 1, L, q2 |
| q3 | 1, S, q3 | — | — |
Сколько тактов выполнит исполнитель, включая такт с остановкой?
Введите число.
Подсказка
Сложи такты всех фаз.
Решение
Вход — 1 такт, проход по пяти цифрам — 5, запись справа — 1, возврат по пяти единицам — 5, запись слева — 1, остановка — 1: всего 14 = 2k + 4.
Ответ: 14
Наибольший результат не больше 500
На ленте исполнителя МТ записана непустая строка из нулей и единиц, остальные ячейки пустые (λ). Головка — в ближайшей пустой ячейке слева от строки, состояние q0. Программа:
| Состояние | λ | 0 | 1 |
|---|---|---|---|
| q0 | λ, R, q1 | — | — |
| q1 | 0, L, q2 | 1, R, q1 | 1, R, q1 |
| q2 | 0, L, q3 | — | 1, L, q2 |
| q3 | 1, S, q3 | — | — |
Какое наибольшее число, не превышающее 500, может получиться на ленте (в двоичной записи)? Ответ запиши в десятичной системе.
Введите число.
Подсказка
Результат зависит только от длины строки.
Решение
Машина превращает все цифры в единицы, справа пишет 0, слева — 10. Из строки длины k получается 10, k единиц, 0: при k = 6 — 101111110 = 382, при k = 7 — уже 766.
Ответ: 382
Число 2027
На ленте исполнителя МТ в соседних ячейках записано двоичное представление числа 2027 без ведущих нулей, остальные ячейки пустые (λ). Головка — в ближайшей пустой ячейке слева от строки, состояние q0. Программа:
| Состояние | λ | 0 | 1 |
|---|---|---|---|
| q0 | λ, R, q1 | — | — |
| q1 | 0, L, q2 | 1, R, q1 | 1, R, q1 |
| q2 | 0, L, q3 | — | 1, L, q2 |
| q3 | 1, S, q3 | — | — |
Определи результат выполнения программы. В ответе запиши получившееся число в десятичной системе счисления.
Введите число.
Подсказка
Важна только длина записи.
Решение
Из строки длины k получается 10, k единиц, 0, то есть 3 · 2ᵏ⁺¹ − 2. 2027 записывается одиннадцатью цифрами: 3 · 2¹² − 2 = 12 286.
Ответ: 12286
Единицы слева и справа
На ленте исполнителя МТ в соседних ячейках записано двоичное представление числа 13 без ведущих нулей, остальные ячейки пустые (λ). Головка — в ближайшей пустой ячейке слева от строки, состояние q0. Программа:
| Состояние | λ | 0 | 1 |
|---|---|---|---|
| q0 | λ, R, q1 | — | — |
| q1 | 1, L, q2 | 0, R, q1 | 1, R, q1 |
| q2 | 1, S, q2 | 0, L, q2 | 1, L, q2 |
Определи результат выполнения программы. В ответе запиши получившееся число в десятичной системе счисления.
Введите число.
Подсказка
Единица справа — 2N + 1, единица слева — ещё 2ᵏ⁺¹.
Решение
Машина дописывает 1 справа и 1 слева. 13 = 1101, k = 4: справа 2 · 13 + 1 = 27, слева от пяти цифр — вес 2⁵ = 32. Итог 59, запись 111011.
Ответ: 59
Наименьшее N: больше 1000
На ленте исполнителя МТ в соседних ячейках записано двоичное представление натурального числа N без ведущих нулей, остальные ячейки пустые (λ). Головка — в ближайшей пустой ячейке слева от строки, состояние q0. Программа:
| Состояние | λ | 0 | 1 |
|---|---|---|---|
| q0 | λ, R, q1 | — | — |
| q1 | 1, L, q2 | 0, R, q1 | 1, R, q1 |
| q2 | 1, S, q2 | 0, L, q2 | 1, L, q2 |
Определи наименьшее N, при котором результат работы программы в десятичной записи больше 1000.
Введите число.
Подсказка
Сначала найди нужное число цифр.
Решение
Результат — 2ᵏ⁺¹ + 2N + 1. При семи цифрах он не больше 2⁸ + 2 · 127 + 1 = 511. При восьми — 512 + 2N + 1 > 1000 при N ≥ 244, и 244 действительно записывается восемью цифрами.
Ответ: 244
Чётность слова 110
На ленте исполнителя МТ записано слово 110, остальные ячейки пустые (λ). Головка — на первой цифре слова, состояние q0. Программа:
| Состояние | λ | 0 | 1 |
|---|---|---|---|
| q0 | 0, S, q0 | 0, R, q0 | 1, R, q1 |
| q1 | 1, S, q1 | 0, R, q1 | 1, R, q0 |
Какое слово окажется на ленте после остановки?
Введите слово — цифры подряд, без пробелов.
Подсказка
Состояние помнит, чётно ли число просмотренных единиц.
Решение
q0 — «единиц пока чётное число», q1 — «нечётное»; единица переключает состояние, ноль — нет. В 110 две единицы, машина в q0 и на пустой ячейке пишет 0: 1100.
Ответ: 1100
Чётность слова 100110
На ленте исполнителя МТ записано слово 100110, остальные ячейки пустые (λ). Головка — на первой цифре слова, состояние q0. Программа:
| Состояние | λ | 0 | 1 |
|---|---|---|---|
| q0 | 0, S, q0 | 0, R, q0 | 1, R, q1 |
| q1 | 1, S, q1 | 0, R, q1 | 1, R, q0 |
Какое слово окажется на ленте после остановки?
Введите слово — цифры подряд, без пробелов.
Подсказка
Посчитай единицы слова.
Решение
В слове три единицы — нечётное число, машина приходит к пустой ячейке в q1 и пишет 1: 1001101.
Ответ: 1001101