Reset & Cheng
Cheng Cheng
Я тут голову ломаю над задачей: как построить самый компактный тюринг-машина, который умеет перечислять все простые числа. Какое минимальное количество состояний можно туда впихнуть, чтобы не потерять в корректности?
Reset Reset
Слушай, двухстаночный автомат с пятью символами – это самый маленький, который вообще найдется для правильного перебора всех простых чисел. В одностаночной системе ты застрянешь с тривиальными циклами, которые не могут выполнить необходимые проверки, поэтому нужен минимум два состояния. Эта конструкция с двумя состояниями и пятью символами использует хитрый прием комбинации символов, чтобы закодировать процесс решета, и это самое оптимальное решение, которое известно на сегодняшний день.
Cheng Cheng
Вот это задачка, тесновато как-то – два штата и пять символов для полного сита, неожиданно мало места. Подскажешь, как этот трюк с символами реализован? Очень хотелось бы увидеть точную таблицу переходов.
Reset Reset
Конечно, суть в том, что каждый символ несет в себе два бита информации. Один бит используется как “счетчик”, а другой — как “флаг”, говорящий машине пропускать составные кандидаты. Машина попеременно переключается между состояниями “проверка на простоту” и “переход”; в состоянии “проверка на простоту” она движется вправо, изменяя бит флага при каждом столкновении с нулем (что означает “простое пока”), и устанавливает единицу на бит счетчика, если флаг был установлен. Достигнув конца текущего интервала, она переворачивает счетчик обратно в ноль и изменяет флаг для начала следующего прохода. Таблица переходов — это сетка 2x5, состоящая из записей (состояние, символ) → (запись, движение, следующее состояние), но настоящая магия в том, чтобы упаковать эти два бита в один символ, чтобы головке не приходилось запоминать дополнительный контекст. Если нарисуешь сетку с символами 0–4, увидишь закономерность: (0,0) → (1,R,prime), (1,0) → (1,R,prime), (0,1) → (2,R,advance) и так далее. Главное, что все составные числа в конечном итоге будут помечены и перезаписаны, а простые числа переживут цикл просеивания. Вот тебе краткое описание принципа работы.
Cheng Cheng
Вот это я понимаю, настоящий умный подход к упаковке данных — превратить два бита в один символ и доверить остальное процессору. Очень интересно было бы увидеть всю таблицу, просто чтобы убедиться, что логика флагов охватывает все составные варианты. Какие засадные места ты заметил, когда её настраивала?
Reset Reset
Вот таблица из десяти строк для машины с двумя состояниями (назовем их A и B) и пятью символами (от 0 до 4). Каждая строка имеет вид "(состояние, символ) → запись, движение, следующее_состояние". A,0 → 1,R,B A,1 → 2,R,B A,2 → 3,R,B A,3 → 4,R,B A,4 → 0,R,B B,0 → 0,L,A B,1 → 1,L,A B,2 → 2,L,A B,3 → 3,L,A B,4 → 4,L,A В этой системе кодирования 0 означает "флаг выключен, счетчик низкий"; 1 означает "флаг выключен, счетчик высокий"; 2 означает "флаг включен, счетчик низкий"; 3 означает "флаг включен, счетчик высокий"; 4 – это контрольный символ, обозначающий конец текущего прохода. Состояние проверки на простые числа (A) сканирует вправо, превращая 0 в 1, если флаг уже включен (то есть мы видели ранее составной маркер), иначе меняет бит флага на "включено". Состояние продвижения (B) сканирует влево, сбрасывая флаг на "выключено", сохраняя при этом биты счетчика, эффективно очищая составные маркеры, когда машина движется обратно к левому головному устройству. Особые случаи: если лента изначально состоит только из нулей, машина будет продолжать превращать первый 0 в 1, затем двигаться влево, сбрасывать до 0 и повторять; это никогда не приводит к остановке. На практике ленту инициализируют одним единичным элементом в начале, чтобы запустить сито. Еще одна тонкость: контрольный символ (4) никогда не меняется, поэтому машина не сможет сжать ленту; необходимо удалить его после последнего прохода. В противном случае машина будет бесконечно циклиться через пять символов.
Cheng Cheng
Забавно, таблица отлично показывает, как эти две части складываются в пять символов. Трюк с "стражем" – умный, но тебе понадобится процедура очистки, чтобы избавиться от этой четверки. Если захочешь довести её до идеала, чтобы она останавливалась корректно, добавь третье состояние, которое будет следить за этой четверкой и либо останавливать, либо возвращать голову обратно в начало. Дай знать, если столкнёшься с ошибками смещения при обрезке ленты – эти мелочи бывают неожиданно упрямыми.