zerkalius · исследование

Щелчок по картинке — в полный размер (и ×2, ×4). Цикл Аниматрицы в Zerkalius Code на сцене «1» — что нашлось, 2026-09-24. Кратко то же — в борт-журнале (v0.089, запись после Code 35.55, и словарь). Готовым к просмотру, без разбора — «Битмультфильмы».

Коротко. Волна Аниматрицы (без нулей) — это XOR «с накоплением» по строкам. Поэтому всё решают степени двойки: цикл 128 проходов при 128 строках, у каждой строки свой период, картинка складывается из ромбов, и размер ромбов виден по двоичной записи номера прохода. Нули добавляют только разгон — к 65-му проходу они вымирают.

0Откуда числа

Журнал Аниматрицы (кнопка ⏺ Журнал в Code) со сцены «1» дал текст: 128 строк × 257 символов из «1», «0» и пробелов, проход 15. Правило волны детерминированное: каждая строка переписывается по уже переписанной строке над ней — два одинаковых символа → пробел, символ и пробел → символ, два разных → верхний. Дальше всё досчитано вне страницы тем же правилом по всем проходам. Главный вывод подтвердила сама страница на 667-м проходе: «🔁 цикл: период 128, повтор после 65-го прохода».

1Разгон и цикл 128

Нулей было 976 — они протекают вниз столбиками и гасятся друг о друга; к 65-му проходу их нет. Дальше — чистый цикл: проход 193 = проход 65, символ в символ. Если заменить нули единицами, цикл 128 идёт сразу.

16 кадров цикла через каждые 8 проходов
Цикл по 8 проходов: внешний контур не меняется, внутри «дышит» вложенный треугольник, плотность волнами.
Весь цикл из 128 проходов, анимация
Весь цикл, 128 проходов по кругу (0,35 с на проход). Собрать такой же в Code — 🎞 GIF под Аниматрицей.

2Почему 128

Без нулей проход делает строку i равной XOR всех строк над ней и её самой. Через k проходов строка собирается из строк выше с коэффициентами C(i−j+k−1, k−1) по модулю 2 — треугольник Паскаля по чётности. По теореме Лукаса (1878) через 2m проходов, если 2m ≥ числа строк, остаётся только сама строка. Отсюда период — ближайшая степень двойки не меньше числа строк: 128 строк → 128, 100 → 128, 200 → 256.

3Любой кадр — XOR сдвинутых копий

Кадр через k проходов после 65-го — это XOR копий 65-го кадра, сдвинутых вниз на все d, у которых нет общих двоичных единиц с k−1 (d & (k−1) = 0). Пример: проход 155 (он же 667-й), k = 90, k−1 = 1011001 → сдвиги 0, 2, 4, 6, 32, 34, 36, 38; проверено — совпадает символ в символ.

Все 128 проходов цикла сеткой
Все 128 проходов (65…192), над кадром — номер прохода и число единиц. Ряды по 8 держат свой мотив.

4У каждой строки свой период

строки012–34–78–1516–3132–6364–127
период1248163264128

Период строки — ближайшая степень двойки больше её номера (Лукас по одной строке: ей нужны только строки выше). Треугольник — часовой механизм: каждая полоса вдвое медленнее верхней, общий период — период нижней. В Code: ▤ Полосы периодов в «Виде».

Полосы периодов строк
Проход 155, строки окрашены по своему периоду.

5Ромбы-«кадры»

Картинка почти повторяется при сдвиге по диагонали: (16 строк, ±16 символов) — 89,5% клеток, 32 — 90%, 8 и 24 — около 70%, мимо на один символ — 59% (уровень случайности). Ромбы — 32 строки высотой, соседние сдвинуты на 16. Причины: Правило 90 ведёт узор ровно на символ за строку (диагонали под 45°), а треугольник Серпинского сложен из своих копий, сдвинутых по диагонали. В Code: ◇ Ромбическая сетка.

Проход 155 с линиями через 32 строки
Проход 155: на каждой красной линии (через 32 строки) начинается новый «кадр» мотива.

6Размер ромбов — нули в k−1

Каждый нулевой разряд 2j в двоичной записи k−1 добавляет копию со сдвигом 2j и включает ромбы этого размера. Проход 977 (k = 16, 0001111) — три размера сразу: 16, 32, 64. Проход 129 (0111111) — только 64. Проход 155 (1011001) — 32 плюс утолщения. Проход 192 (1111110) — крупных нет. В Code: сетка с шагом «авто — по проходу» рисует включённые размеры сама, с легендой.

Размеры ромбов на четырёх проходах
Сетка: зелёная — 16, жёлтая — 32, красная — 64.

7Ромбы изнутри

На проходе 155 — 21 целый ромб; с верхним совпадают на 83–97% (на средней вертикали — 97%). За весь цикл ромбов 2688 (21 место × 128 проходов), разных 1541: 1206 встречаются один раз, 130 — по 4, 128 — по 6, два почти пустых — по 20. Верхний ромб (строки 0–32) повторяется через 64 прохода, у него 64 разных кадра.

21 ромб прохода 155 подряд
21 ромб прохода 155 подряд, как кадры.
Верхний ромб за 64 прохода
Верхний ромб за свой цикл в 64 прохода.
Все ромбы прохода 155 наложены
Все 21 ромб прохода 155 наложены: жёлтое — единица во всех, тёмное — пусто во всех, фиолетовое — разнится.

8Близнецы

Почти близнецы, отличия красным
Почти близнецы: отличия (красным) — только на границе.

8½Каждый ромб — один бит

Идея пользователя: свернуть каждый ромб в один бит так, чтобы зеркальные близнецы получали одинаковый бит, а у симметричного ромба бит зависел от соседей через ось. Обоим условиям отвечает чётность ромба — XOR всех его клеток: у близнецов единиц поровну — бит один и тот же; в симметричном ромбе каждая клетка равна своей соседке через ось, пары гасят друг друга в XOR, и остаются только клетки на самой оси. А XOR — родная операция волны.

Проход 155 и его ромбы-биты трёх размеров
Проход 155 и он же из ромбов-битов: жёлтый — 1, тёмный — 0. На крупных ромбах видно ядро: жёлтая рамка и тёмная «дыра» у низа.
Цикл: кадр и его ромбы-биты рядом
Весь цикл: слева кадр, справа ромбы 8 строк как биты.

Ромбы из ромбов. Треугольник из ромбов-битов лежит в той же геометрии, что и исходный (бит через клетку, как у Правила 90), поэтому его можно свернуть ещё раз — и ещё. Лестница с ромбами высотой 4: 128 строк → 62 → 29 → 13 → 5 → 1.

ступень12345
строк · бит62 · 195329 · 43513 · 915 · 151 · 1
период128128128128128
разных кадров за цикл128128128912
Лестница ромбов из ромбов для прохода 155
Проход 155 и четыре ступени свёртки: 62, 29, 13 и 5 строк.
Ступень 4 и верхний бит по всем 128 проходам
Лента по проходам: ступень 4 (15 бит) и верхний бит; голубые метки — через 12 проходов.

8¾Зеркало через центр с XOR

Идея пользователя: на экране строки идут по кругу — снизу треугольник (начало текста, строка 0 — вершина), сверху трапеция (конец текста); они касаются в центре. Отразить нижний треугольник вверх через эту точку (строка i → строка 127−i) и сложить XOR с тем, что там есть. Треугольник симметричен слева направо, поэтому отражение через центр — то же, что отражение вверх. Сделано для верхней половины (строки 64–127), нижняя не тронута.

Проход 128: зеркало через центр с XOR
Проход 128: слева как было (середина трапеции пуста), справа — зеркало вписалось в пустоту.
Проход 155: зеркало через центр с XOR
Проход 155: совпадение 49% — XOR смешивает, середина густеет.
Зеркало-XOR по всему циклу
Зеркало-XOR на каждом кадре цикла.

И обратно: верх вниз, в противоположные стороны. Боковые части верхней трапеции отражены через центральную точку (поворот на 180°): верхний левый угол ложится в пустоту справа от нижнего треугольника, верхний правый — слева; XOR с нижней половиной. И вариант «оба сразу» — каждая половина XOR отражённая другая, от исходного кадра.

Проход 128: отражения через центр в обе стороны
Проход 128: было; верх → вниз в противоположные стороны; низ → вверх; оба сразу.
Проход 155: отражения через центр в обе стороны
Проход 155: те же четыре варианта.
Проход 155, оба сразу: шестиугольник
Проход 155, «оба сразу», крупно: шестиугольник, симметричный сверху вниз и слева направо. В Code — «⧖ Зеркало» в разделе Логика (35.58).

8⅞Надпись: ромбы как буквы

Слово пользователя, глядя на треугольник с ромбической сеткой: «почти надпись». Проверили буквально: каждый ромб сетки — буква, одинаковые ромбы — одна и та же буква, зеркальный ромб — та же буква строчной. Ромбы 16 строк, проход 155.

Проход 155: каждый ромб подписан буквой
Проход 155, каждый ромб подписан своей буквой. Цвет — номер ряда вдоль стороны: жёлтый край «аб аб…», голубой «девз…», зелёный «гжиЛ…».
Алфавит прохода 155: 26 букв
Алфавит прохода 155 по частоте: прописная — как на рисунке, строчная — её зеркало. Половина букв — почти пустые ромбы с разным краем.

9Другие треугольники: прогноз сбылся

Откуда нули: генератор «Правило 90» пишет внутри треугольника «0» там, где клетка пустая, а «Обрезать фон» превращает в пробелы только то, что снаружи; ширина — 2·строк+1 (у 128 строк — 257, как в журнале сцены «1»). Тем же способом построены треугольники на 50, 64, 100, 128, 200, 256 строк (сид «1») и прогнаны волной с нулевого прохода:

строк5064100128200256
период6464128128256256
нули вымерли, цикл с прохода33336565129129
нулей в начале208333678749141973624758975

Шире (v0.006): 17 прогонов — другие правила, сиды, без обрезки фона. Период всегда P — ближайшая степень двойки не меньше числа строк: при любом правиле, сиде, с обрезкой и без, и даже когда нули не вымирают. А вот «половина + 1» — не общий закон, а свойство треугольника Серпинского (правило 90 или 18 из одной точки, с обрезкой):

треугольник64 строки: цикл с100 строк: цикл снули
правило 90 и 18, сид 133 (= P/2 + 1)65 (= P/2 + 1)вымирают
правило 150, сид 14080 (оба — 5/8 P)вымирают
правило 30, сид 11011вымирают
правило 110, сид 188вымирают
правило 90, сид 1118—вымирают
правило 90, сиды 101, 1101, 1001133, 18, 18—живут в цикле
правило 90 и 30, без «Обрезать фон»32 (= P/2)64 (= P/2)живут в цикле

Нули вымирают не всегда: при сидах 101, 1101, 10011 и без обрезки фона они живут внутри цикла, а период всё равно P. Без обрезки цикл начинается ровно на P/2.

Правило 150 вблизи (100 строк). Исходный треугольник почти весь из нулей (7348 синих против 2652 единиц). За первые 10 проходов нулей остаётся 502, к 40-му — 16, а дальше несколько одиночек держатся до 80-го: они и тянут разгон до 5/8 периода. С 80-го — чистый цикл 128 (проход 208 = проход 80). У цикла правила 150 свой рисунок — сквозные вертикальные «стволы» и треугольники по бокам, а не дышащий вложенный треугольник, как у правила 90.

Правило 150: разгон и цикл
Правило 150: два верхних ряда — разгон (нули синие), два нижних — цикл через каждые 16 проходов.
Правило 150: анимация от исходного треугольника через разгон в цикл
Правило 150 подряд: исходный треугольник, 80 проходов разгона, затем весь цикл из 128.

Правило 30 вблизи (100 строк) — полная противоположность. Правило 30 хаотическое: в исходном треугольнике нулей и единиц почти поровну (4804 и 5196), без правильного рисунка. Нули гибнут быстро: 3360 после первого прохода, 453 после пятого, к 11-му — ни одного. Разгон — всего 11 проходов. Цикл на вид — шум без треугольников Серпинского, но строгий: период ровно 128, проход 139 = проход 11 символ в символ (4927 единиц и там, и там). Левый край треугольника правила 30 и в цикле держит правильные косые полосы, правый — хаос.

Правило 30: разгон и цикл
Правило 30: два верхних ряда — разгон почти по проходам (нули синие), два нижних — цикл через каждые 16.
Правило 30: анимация от исходного треугольника через разгон в цикл
Правило 30 подряд: 11 проходов разгона (медленнее), затем весь цикл из 128.

Правило 110 вблизи (100 строк). Из одной точки правило 110 растёт только влево, и треугольник выходит половинкой — с вертикальным правым краем. Нулей в начале 2174 при 2876 единицах; разгон самый короткий из всех — 8 проходов (1682 нуля после первого, 234 после шестого, к 8-му — ни одного). Дальше — цикл ровно 128, проход 136 = проход 8 (по 2550 единиц). Форма треугольника на период не влияет: он всё равно задан числом строк. Зеркальной симметрии у половинки, понятно, нет — «⫼ Ось симметрии» здесь ничего не покажет.

Правило 110: разгон и цикл
Правило 110: два верхних ряда — разгон почти по проходам (нули синие), два нижних — цикл через каждые 16.
Правило 110: анимация от исходного треугольника через разгон в цикл
Правило 110 подряд: 8 проходов разгона (медленнее), затем весь цикл из 128.

9½Без обрезки: у каждого столбца своя метка

Проверка пользователя: «Правило 90», 50 строк, без «Обрезать фон» — весь прямоугольник заполнен символами, вне треугольника сплошные «0», пробелов нет вовсе. Разгон 32, период 64 (как и предсказано: P = 64, без обрезки цикл с P/2). Но в цикле единиц почти не остаётся — от 1 до 50 на кадр, и все они в одном центральном столбце, под сидом; нули живут. С обрезкой — наоборот: нули вымирают полностью, единицы живут. Разгадка закрывает оба старых вопроса.

  1. Столбцы не смешиваются. Волна переписывает клетку строки r+1 только по клетке того же столбца строки r. Каждый столбец — своя одномерная волна сверху вниз; соседи друг о друге не знают.
  2. Метка ползёт сверху. Где встречаются «0» и «1», остаётся верхний. Поэтому метка самой верхней непустой клетки столбца (в исходном тексте; строка 0 волной не переписывается) постепенно заливает весь столбец. К началу цикла каждый столбец однометочный — проверено на всех кадрах цикла, метка всегда равна метке верхней клетки.
  3. Дальше — чистый XOR. В однометочном столбце правило волны — это «одинаковые → пусто, разные → символ», то есть XOR по наличию символа. Поэтому период всегда степень двойки P, какими бы ни были нули: метки просто едут на узоре XOR и на него не влияют. (Пока метки не выровнялись, «0» под «1» даёт символ, а не пусто — это и есть разгон.)
  4. Когда нули вымирают: нули живут в цикле ровно в тех столбцах, чья верхняя непустая клетка — «0». С обрезкой верх каждого столбца — край треугольника, а у Серпинского и правил 150, 30, 110 из одной точки край всегда «1» — нули вымирают. Сиды 101, 1101, 10011 оставляют «0» в строке 0 — нули живут (это и были «загадочные» строки таблицы выше). Без обрезки строка 0 — сплошные «0», кроме сида, — единицы остаются только под сидом. Закон совпал на всех 13 прогонах (правила 90, 18, 150, 30, 110; сиды 1, 11, 101, 1101, 10011; с обрезкой и без).
  5. Полосы во всю ширину на кадрах без обрезки — это фон вне треугольника: там столбцы из одних «0» однометочны с самого начала и сразу идут чистым XOR, строки мигают своими периодами — те же полосы, что в разделе 4.

Почему разгон именно такой — разобрано в разделе 9¾: без обрезки он считается точно и выходит P/2, у Серпинского с обрезкой — в разделе 12 (не всегда P/2 + 1!), у правила 150 (5/8 P) формулы пока нет.

Правило 90 без обрезки: разгон и цикл
Без обрезки: проход 0 — треугольник на сплошном «0»; к проходу 32 единиц остаётся две, все в центральном столбце; дальше цикл 64, синие «0» живут.
Правило 90 с обрезкой: разгон и цикл
Тот же треугольник с обрезкой: к проходу 33 нули вымирают, в цикле только «1».
Без обрезки: проходы 0–96
Без обрезки, проходы 0–96: разгон и полтора цикла.

9¾Доказательство: период обязан быть P

Раздел 9½ показал, что происходит: столбцы живут порознь, метка верхней клетки заливает столбец, дальше чистый XOR. Это было замечено на прогонах. Ниже — почему иначе и быть не может, при любом правиле, сиде и любых нулях.

  1. Метка столбца вечна. Строку 0 волна не переписывает, а над пустой клеткой ничего не меняется («пробел и символ → символ», «два пробела → пробел»), поэтому верхние пробелы столбца остаются пробелами, а самая верхняя непустая клетка стоит на месте и со своим символом. Это и есть метка столбца ℓ.
  2. Выше верхней чужой клетки чужому взяться неоткуда. Пока всё над ней — пробелы и ℓ, бегущий сверху накопитель бывает только пробелом или ℓ, а значит и пишет только пробел или ℓ.
  3. Над чужой клеткой правило — чистый XOR. В одномето́чной части «одинаковые → пусто», «символ и пробел → символ»: один проход — накопительный XOR сверху, то есть умножение на 1/(1+z) над GF(2).
  4. Каждая строка когда-нибудь непуста. Пусть h — половина периода строки r (период строки — ближайшая степень двойки больше её номера, раздел 4). Тогда (Phx)r = xr ⊕ xr−h, потому что (1+z)−h ≡ 1 + zh с точностью до строки r. Если бы строка r была пуста на всех проходах, пустой на всех проходах была бы и строка r−h, и так вниз до строки 0 — а она непуста всегда. Значит строка r хоть раз, да непуста.
  5. Вывод. Верхняя чужая клетка стоит ровно под такой строкой, и в проход, когда та непуста, «два разных → верхний» ставит на её место ℓ. Чистая часть столбца растёт строго вниз, чужие метки кончаются за конечное число проходов, и дальше столбец — чистый XOR. Поэтому период всегда P, а нули — лишь ярлык, едущий по узору XOR и на него не влияющий. Нелинейность волны живёт только в разгоне.

Когда нули вымирают — оттуда же: нули остаются в цикле ровно в столбцах с меткой «0». С обрезкой верх столбца — край треугольника, а он «1», кроме столбцов под самим сидом. Значит нули вымирают тогда и только тогда, когда в сиде нет нуля: 1 и 11 — вымирают, 101, 1101, 10011 — живут, и живут именно в столбцах под своими нулями. Без обрезки строка 0 — сплошные «0», кроме сида, поэтому выживают нули, а единицы остаются только в столбце под сидом (те самые «от 1 до 50 единиц на кадр» из раздела 9½).

Разгон без обрезки — ровно P/2, и это теперь считается. Столбец на отклонении d от центра: сверху d клеток сплошного фона «0», под ними край треугольника «1» — первая чужая клетка. В XOR-мире метки «0» сплошной фон — это сплошные единицы, и строка d−1 на проходе k равна C(d−1+k, k) по модулю 2; по теореме Куммера это нечётно ровно тогда, когда в двоичной записи k & (d−1) = 0. Значит верхняя чужая клетка столбца гибнет на проходе min{k ≥ 1 : k & (d−1) = 0} — совпало для всех 676 столбцов на прогонах в 50, 64, 100 и 128 строк. Максимум берётся там, где d−1 = 2j−1: тогда k обязан быть кратен 2j, то есть равен d. Наибольшее такое d ниже числа строк — это P/2, и разгон равен ему.

Проверка расчётом заодно подтвердила и то, на чём всё держится: начало цикла — это в точности тот проход, на котором гибнет последняя чужая метка (совпало на всех прогонах: 33, 33, 65, 65 у Серпинского, 40 и 80 у правила 150, 32, 32, 64 без обрезки). Разгон — это ровно время жизни нулей, а не что-то сверх него.

10Классика и своё

Классика: Лукас (1878), Глейшер (1899: в строке n треугольника Паскаля нечётных чисел 2 в степени «число единиц в двоичной записи n»), Серпинский (1915), Вольфрам с соавторами (1983–84: Правило 90 и линейные клеточные автоматы). Своё у Zerkalius — три символа и правило «два разных → верхний»: волна нелинейна, отсюда разгон с вымиранием нулей. В литературе такого варианта не встречалось, но утверждать, что его никто не изучал, нельзя.

Закрыто (v0.019, раздел 9¾): почему период не меняется от нулей — доказано: чужие метки гибнут за конечное число проходов, дальше столбец идёт чистым XOR, и нелинейность живёт только в разгоне. При каких сидах нули вымирают — тогда и только тогда, когда в сиде нет нуля. Разгон без обрезки — ровно P/2, с выводом по теореме Куммера.

Осталось: точная формула разгона у Серпинского с обрезкой — найдена и для рекордсмена выведена в разделе 12 (открыта только верхняя граница); у правила 150 (5/8 P). Известно, где искать: последними держатся не самые глубокие клетки, а вполне определённые — у Серпинского на отклонении P/4 от центра, у правила 150 на отклонении P/8 около строки 3P/4.

111024 строки и лестница размеров

Серпинский по правилу 90 (сид 1, фон обрезан), от 64 до 1024 строк, прогнан через весь цикл вне страницы — тем же правилом волны и той же переписью ромбов, что в Треугольнике (сверено с ним: 64 строки, проход 5, ромб 16 — 21 ромб, 15 рисунков, 9 букв; 128 строк, ромб 32 — те же 1541 разных рисунков, что в разделе 7).

строк N6410012825651210001024
период P6412812825651210241024
цикл с прохода336565129257513513
Первые 150 разных ромбов высотой 32 за цикл 1024 строк
1024 строки, ромб 32: первые 150 разных рисунков в порядке появления, с прохода 0 (первые — ещё разгон, с нулями; всего разных 306 443, из них в самом цикле 265 104) — то, что собирает кнопка «📦 Все ромбы цикла». Полные GIF по всем размерам (8…512, по 1500 кадров, 3–21 МБ) — локально, в archive\_issledovanie-treugolnik-1024\, вместе с таблицей и скриптом расчёта.

12Разгон: точная формула (и поправка к «P/2 + 1»)

Столбцы живут независимо (раздел 9½), клетка видит только клетки выше в своём столбце — значит, у каждой клетки треугольника своё время жизни нуля τ, и оно не зависит от того, сколько строк ниже. Посчитано для всех клеток до 1024 строк, и прямым прогоном до повтора — для каждого N от 3 до 139 и выборочно до 512.

Формула. Треугольник из N строк (правило 90, сид 1, фон обрезан) входит в цикл на проходе 2m + 1, где 2m — наибольшая степень двойки, не превышающая 2(N − 2)/3 (при N ≤ 4 — проход 1). Проверено для всех N от 2 до 1024 — без исключений.

N50…6465…9798…128129…193194…256257…385386…512513…769770…1024
период P6412812825625651251210241024
цикл с прохода33336565129129257257513

Поправка к разделам 9 и 11. «Разгон = P/2 + 1» верно только для N от 3·2m−2 + 2 до 2m — верхней четверти каждого удвоения. В остальных трёх четвертях (например, 65…97 строк при P = 128) цикл начинается вдвое раньше, с P/4 + 1: самая долгоживущая клетка ещё не вошла в треугольник. Прежние прогоны (50, 64, 100, 128, 200, 256, 512, 1000, 1024 строки) все случайно попали в «верхние четверти», поэтому закон выглядел всеобщим.

Время жизни нуля в каждой клетке треугольника из 128 строк
128 строк: цвет — сколько проходов в клетке держится «0». Кольца — рекордсмены: строка 97, отступ ±32 (τ = 64, отсюда цикл с 65-го) и строка 49, отступ ±16 (τ = 32). Обрежьте треугольник выше 97-й строки — и цикл начнётся с 33-го.

Почему рекордсмен именно такой — вывод (v0.022). Столбец с отступом a = 2k−1, сверху край треугольника «1» (строка a), глубина — от неё вниз.

  1. Исходный столбец. На нечётной глубине — «0» (чётность строки не та, правило 90 там ставит ноль). На чётной глубине 2i — C(a+2i, i) по модулю 2; при 0 < i < a это чётно: при сложении i и a+i младший разряд i переносится (Куммер). Значит под верхней «1» лежат ровно 2a − 1 нулей подряд. На глубине 2a — C(3a, a): a и 2a не пересекаются, переносов нет, нечётно — «1». На глубине 2a + 1 — снова «0»: это и есть рекордсмен, строка a + 2a + 1 = 3·2k−1 + 1.
  2. Первый проход. Верхняя «1» заливает все 2a − 1 нулей («разные → верхний») — получается сплошной блок из 2a единиц. «1» на глубине 2a встречает над собой «1» и гаснет в пробел — и этот пробел прикрывает ноль под ним («пробел и символ → символ»).
  3. Дальше блок — чистый XOR (метка одна). Клетка-щит под блоком (глубина 2a) после ещё k проходов равна Σ C(m+k−1, k−1) по m = 1…2a = C(2a+k, k) − 1 (правило хоккейной клюшки): она непуста ровно тогда, когда C(2a+k, k) чётно, а по Куммеру это k & 2a ≠ 0. Первое такое k — само 2a.
  4. Итог: щит пуст 2a проходов подряд, ноль под ним живёт до прохода 2a = 2k и гибнет на проходе 2k + 1 — ровно как в таблице.
столбец a = 4, глубина 0…11 (· — пробел)          проход 1: блок 1111 1111, щит «·», под ним рекордсмен «0»
п. 0: 100000001000    п. 3: 11··11···0··    п. 6: 1·1······00·
п. 1: 11111111·0·0    п. 4: 1···1····000    п. 7: 11·······0··
п. 2: 1·1·1·1··00·    п. 5: 1111·····0·0    п. 8: 1········000    п. 9: 111111111111 — щит непуст, ноль погиб

Отсюда и формула целиком, если никто не живёт дольше рекордсменов: треугольник из N строк содержит рекордсмена τ = 2k при 3·2k−1 + 1 ≤ N − 1, то есть 2k ≤ 2(N − 2)/3. Открыто одно: общее доказательство, что никакая другая клетка не живёт дольше (верхняя граница) — пока это проверено сплошным расчётом всех клеток до 1024 строк. (Первая догадка v0.021 — «сплошная лесенка 1 0 1 0 над рекордсменом» — была неверна: над ним не лесенка, а сплошь нули.)

13Протекание: как «1» и «0» текут с вершины вниз

Вопрос пришёл из «🗻 3D» Треугольника: на гранях пирамид видны полосы-слои, и по ним сверху вниз что-то «протекает». Что именно — видно по одной клетке и её верхнему соседу (он уже пересчитан этим же проходом).

сверху1010символпусто
снизу0110пусточто угодно
станет10пустопустосимволкак было

Закон родника. Одна «1» над пустым столбцом после k проходов стоит на глубине d тогда и только тогда, когда d & (k − 1) = 0 — это C(d + k − 1, d) по модулю 2, Куммер. По глубине и проходам — Серпинский (картинка слева).

Родник: одна «1» в пустом столбце по проходам и ось треугольника 128 строк
По горизонтали — проход, по вертикали — глубина от родника; синее — «1», серое — «0». Слева одиночная «1»: d & (k − 1) = 0. Справа настоящая ось треугольника из 128 строк: на проходе 0 — «1» и нули под ней, с прохода 1 — тот же узор, клетка в клетку.

14Маятник (Хоррориус): как строится и куда деваются треугольники

Перенос Excel-макроса ТРЕУГСЖАТИЯ (_pzl.xlsm, кнопка «лево-право») — страница Маятник, ядро сверено с Excel клетка в клетку. Каждая вершина пускает вниз конус правила 90: клетка = старое ⊕ левый ⊕ правый родитель (родители уже пересчитаны), вершины ставятся в одной строке по очереди: якорь, −1, +1, −2, +2… Ниже — только биты, без цветов (цвет на странице — чётность числа конусов над клеткой, на значения не влияет). Все числа — замеры на 128…1024 строках, не доказательства.

Маятник 256 строк после 1, 2, 8, 32, 64 и 128 вершин
256 строк, белое — «1», тёмное — «0», чёрное — пусто. n = 1: Серпинский через клетку; n = 2…8: соседние конусы заполняют пропуски — чистый плотный Серпинский; дальше сдвинутые конусы дают «шум», и он съедает пустые треугольники; к n = 128 их нет.

Когда гибнут дыры. Дыра шириной ≥ w исчезает к вершине n, и доля n/N почти не зависит от высоты N:

ширина дыры256 строк5121024n / N
вся ширина (N−1)121212всегда 12-я вершина
≥ N/25092178≈ 0,18
≥ N/470136262≈ 0,26
≥ 31801663360,31 → 0,32 → 0,33

Крупные гибнут первыми, мелкие последними; к n ≈ N/3 крупных пустот не остаётся. (Порог 31, а не 15: на поле 1024 обычный шум сам даёт серии из 15 нулей.)

Край шума: ступени через каждые n/2 строк
512 строк, 64 вершины, левая половина. Жёлтое — край шума (крайний левый «0» строки, кнопка «обводка» на странице), бирюзовый пунктир — край конуса якоря c = −r, красные линии — через n/2 = 32 строки. Выемки края повторяются с этим шагом.

Край — копии верхушки. Шум доходит до края конуса якоря не во всех строках; недоборы и есть ступени обводки. Они в примерах n = 64 и 128 повторяются с шагом n/2 строк (это не общий закон; поправка и доказательство — в разделе 15): при 64 вершинах недоборы по строкам 16…28 — 3, 4, 4, 4, 11, 5, 7, 9, 9, 17, 7, 7, 3, и ровно то же в 48…60, 80…92 и дальше; при 128 вершинах шаг 64. Боковой край хоррориуса — его верхушка, повторённая столбиком через n/2 строк; чем больше вершин, тем выше верхушка и реже ступени.

14½Откуда шум: края конусов

Маятник 256 строк, 64 вершины: как есть и без краёв конусов
256 строк, 64 вершины. Слева — как есть: шум в конусе якоря, снаружи полоса «1», в центре тает последняя большая дыра. Справа — те же вершины, но конусы без краёв: чистый фрактал по формуле Куммера, ни шума, ни полосы.

Порог N/3 выведен ниже (14¾); периоды края уточнены и выведены в разделе 15.

14¾Дыра: сверху вниз на ½, снизу вверх на 1 — отсюда N/3

Уточнение Codex · 12.10.2026: N/3 описывает масштаб полной центральной дыры при высоте — степени двойки. При произвольной обрезке и измерении сплошного нулевого треугольника это не универсальная точная граница. Независимые замеры и ограничения формулы — в разделе 16.

Вопрос пользователя: «когда дыра уменьшается, мы отдаляемся от верха — и потом смотрим снова сверху?» Да, и это считается точно. Дыра всё время остаётся перевёрнутым треугольником со сторонами под 45°, и у неё два края:

Закон дыры. Дыра Серпинского с верхней строкой T и кончиком T + h (ширина 2h) после n вершин маятника — снова такой же треугольник: верх T + n/2 (опускается на одну строку за каждую пару «влево + вправо»), кончик T + h − n (поднимается на строку за вершину), ширина 2h − 3n. Верх и кончик встречаются при n = 2h/3: дыра живёт треть своей ширины.

Центральная дыра 512 строк при n = 32, 64, 96, 128, 160 и треугольник по закону
512 строк, n = 32, 64, 96, 128, 160. Жёлтое — треугольник по закону: верх N/2 + n/2, кончик N − n. Он садится на дыру; выше видна верхняя дыра — тот же закон от её собственного верха N/4.

Шаг точный, не средний. Если смотреть на край дыры в одной строке покадрово, сдвиги повторяются строго периодически. На 1024 строках (строка 900, вершины 81…144) за каждые 4 вершины: левый край +1, +1, +2, 0, правый −2, 0, 0, −2 — ровно по 4 столбца внутрь с каждой стороны за 4 вершины (по одной каждой чётности с каждой стороны), верх — на 2 строки. На 512 строках (строки 400 и 450) период 8: левый край +3, +1, −1, +2, −3, +6, 0, 0, правый −4, 0, −1, 0, −3, 0, 0, 0 — снова по 8 за 8. Скорости 1 и ½ — точный повторяющийся шаг, а не среднее по шуму.

В косых координатах — одно правило. Возьмём p = (r + c)/2 и q = (r − c)/2 (вдоль двух диагоналей). В них правило 90 — «клетка = сосед по p ⊕ сосед по q», конус вершины — четверть плоскости с углом в вершине, а дыра Серпинского — прямоугольный треугольник p < N/2, q < N/2, p + q ≥ N/2. Закон дыры тогда — все три стороны сдвигаются внутрь одинаково, на n/2, то есть на полуразмах маятника (крайние вершины стоят на ±n/2): p, q < N/2 − n/2 (отсюда кончик N − n) и p + q ≥ N/2 + n/2 (отсюда верх N/2 + n/2).

Простое наложение сдвинутых Серпинских дало бы вдвое меньше: стороны — на n/4, верх — на месте. Удвоение и опускание верха — вклад обрезки конусов (раздел 14½).

Две и три вершины: шум начинается, когда вершины есть с обеих сторон
128 строк, вершины одной чётности. Сверху — две вершины по одну сторону (0, −20 и 0, +20): узор чистый, правильный. Снизу — третья с другой стороны (0, −20, +20 и 0, +20, −20): сразу появляется шум и неровные мелкие дыры; порядок даёт зеркальную картину. Красная линия — строка 20, бирюзовая — столбец якоря.

Шум рождается на стыке: когда конус вершины одной стороны режет поле, уже изменённое вершиной другой стороны. Найти «виртуальную вершину» одной точкой не вышло: если отметить все клетки, нарушающие правило 90 относительно родителей, их оказывается почти всё поле, кроме дыр, — каждый обрезанный конус делает такими все свои клетки. Стык — это целая область, а не точка.

Открыто: точный механизм стыка, дающий второй сдвиг и опускание верха; механизм периодичности бокового края отдельно выведен в разделе 15.

14⅞Конец ленты: к 4N вершинам картинка застывает

Вопрос пользователя: «то есть это бесконечная кинолента?» При конечной высоте N — нет. Вершина a трогает клетку (r, c), только если |c − a| ≤ r. Внутри конуса якоря (|c| ≤ r < N) это возможно лишь при |a| ≤ 2(N − 1). Крайняя вершина маятника стоит на ±n/2, значит после n ≈ 4N новые конусы до конуса якоря не достают, и всё внутри него застывает — и биты, и цвета.

Nбиты последний раз меняютсяцвета4N
64250253256
128506509512
256101810211024

15Хоррориус: период края — степени двойки, а не всегда n/2

Codex — независимый исследователь Хоррориуса · 12.10.2026. Авторский вывод и независимая проверка ядра страницы.

Продолжение исследования по просьбе «смотри в хабе Хоррориус и исследуй самостоятельно, до победы». Здесь n — число уже поставленных вершин, r — строка от 0, c — столбец относительно якоря. Поле изначально пустое, ход «лево-право». Измеряем левый край шума: отступ первого «0» от диагонали c = −r; цвета не учитываем.

Поправка к разделу 14. n/2 совпало с периодом в примерах n = 32, 64, 128, но это не общий закон. При n = 48 период 32, а не 24: в строке r = 96 первый ноль отстоит от диагонали на 1 бит, в r = 120 — на 9. При n = 16 период 16, а не 8. Геометрический полуразмах маятника и период рисунка — разные величины.

Точный повтор бокового края через 32 строки при 48 и 64 вершинах
Первый ноль от левой диагонали. Пунктир отделяет полные циклы по 32 строки. Красные точки: сдвиг на n/2 = 24 при 48 вершинах не повторяет край.
вершин nточный период края, строкмаксимальный отступ первого 0
8 / 10 / 1284 / 3 / 2
16 / 24 / 32167 / 6 / 4
40 / 48 / 64 / 80329 / 10 / 17 / 11
96 / 1286414 / 19

Это установившиеся периоды на любой дальнейшей глубине, а не только совпадения в изображении на 1024 строках. Для каждого примера проверен весь конечный цикл полосы: первый ноль всегда находится не дальше 24 бит от диагонали. Самая ранняя строка, с которой действует проверенная рекурсия, и все мотивы записаны в данных ниже.

Почему период полосы — степень двойки: вывод из правила клетки

Введём диагональную координату d = c + r. На следующей строке два родителя клетки имеют координаты d − 2 и d. Пусть aj — положение j-й вершины, Fj(r,d) — бит после j конусов. Выберем конечную полосу amin ≤ d ≤ D. При достаточно большой r каждый конус либо пересчитывает данную диагональ всегда, либо не трогает её: условие — d ≥ aj и одинаковая чётность d и aj.

Если условие выполнено, буквальное правило страницы даёт

F_j(r,d) = F_(j−1)(r,d) ⊕ F_j(r−1,d) ⊕ F_j(r−1,d−2).

Иначе Fj = Fj−1. Левее amin ничего нет, поэтому там бит равен 0; F0 = 0. Это замкнутая рекурсия: для полосы не нужны клетки правее D. Достаточно начать после R = ⌈(D − amin)/2⌉ + 2, когда вершина и ранние участки границ остались выше.

Оставим только независимые пары (j,d), где j-й конус пересчитывает клетку. Упорядочим их сначала по d, затем по j. За один шаг вниз каждая переменная равна своему прежнему значению плюс значения более ранних пар: меньшая диагональ или более ранний конус. Значит, переход — нижнетреугольная матрица T = I + B над битами, где B строго треугольна.

Если переменных L, то BL = 0. Для степени двойки P ≥ L в арифметике XOR: TP = (I + B)P = I + BP = I. Через P строк возвращается весь набор битов полосы, а минимальный период делит P: он тоже степень двойки, включая 1. Это доказательство для любой конечной полосы и любого фиксированного числа вершин при указанном пустом фоне.

От полосы к настоящему краю. Если за полный цикл в каждой строке есть ноль при 0 ≤ d ≤ D, то первый ноль уже внутри полосы. Поэтому цикл полосы определяет край навсегда; никакая клетка правее D не может изменить его. Именно это дополнительно проверено для всех строк таблицы. Без такой проверки переносить вывод на весь край нельзя.

Проверка. Исследовательский код извлекает MAYATNIK.cone непосредственно из страницы «Маятник», строит 1024 строки для 12 значений n и сверяет рекурсию полосы с 575 438 битами полного поля. Затем проходит полный цикл, проверяет возврат всего состояния и находит минимальный период края; проверки заканчиваются ошибкой при несовпадении.

Дополнительно построены 512 строк и 48 вершин на опубликованной странице «Маятник», включены биты и обводка, выгружены реальные строки через «Строки .txt». Файл подтверждает отступы 1 и 9 в строках 96 и 120, затем снова 1 и 9 в строках 128 и 152: тот же цикл по 32, полученный независимо от формулы. Сверена и вся выгрузка: все 512 строк, 286 208 битов, совпали с расчётом ядра.

Код проверки · Числа, мотивы и границы проверки · Построение графика. Повторить из корня проекта: node issledovanie/horrorius-edge-study.cjs 1024.

Закрыт механизм повторения краевой полосы; опровергнут универсальный шаг n/2. Простая формула минимального периода только по n пока не получена. Это доказательство не выводит скорости сжатия большой центральной дыры из раздела 14¾.

16Codex: проверка дыры и реального предела строк

Codex — независимый исследователь Хоррориуса · 12.10.2026. Мои замеры, отдельный движок битов и границы проверки.

N/3 — не универсальная точная граница. Я измерял крупнейший полностью нулевой перевёрнутый треугольник: пустые клетки вне конусов исключены, каждый бит внутри должен быть нулём. Это строже, чем самая широкая серия нулей в одной строке. На 384 строках при 128 вершинах (то есть N/3) остаётся нулевой треугольник высотой 67 строк и шириной 133 клетки. На 768 строках при 256 вершинах остаётся высота 131, ширина 261. Эти контрпримеры получены по исходным битам, без уменьшения картинки.

Причина: высота видимого поля и размер исходной дыры — разные числа. Узор содержит дыры размеров, связанных со степенями двойки. Обрезав рисунок на 384-й строке, мы видим часть дыры масштаба 512; на 768 строках — часть масштаба 1024. Сначала её нижняя вершина ещё за пределами поля. Поэтому видимая высота уменьшается иначе, чем у полного треугольника.

Рабочая приближённая огибающая для дыры масштаба P (степень двойки), поля N строк и n вершин:

h ≈ max(0, min(N−1, P−1−n) − (P/2+n/2) + 1).

Пока кончик ниже поля, видимая высота теряет примерно ½ строки за вершину; когда кончик вошёл в поле — примерно 1½. Берём максимум по подходящим P. В восьми проверенных высотах 256…1024 огибающая отклоняется от замеренной высоты не более чем на 12 строк. Мелкие ступени и пересекающие полосы требуют отдельного вывода: я не называю эту огибающую точной формулой каждого кадра.

Codex: измеренные нулевые треугольники и огибающая с обрезкой
Сплошная линия — замер по битам; пунктир — приближение. Обрезанные поля 384 и 768 переживают свой N/3.
Строк NПоследний кадр с высотой ≥16В следующем кадре
25678меньше 16
384 / 512 / 600165меньше 16
640234меньше 16
768 / 1000 / 1024334меньше 16

Это крупнейший сплошной нулевой треугольник шириной ≥31, в проверенном окне кадров около исчезновения. Таблица не утверждает отсутствие всех мелких нулей или невозможность новых пустот на любых последующих шагах.

До скольких строк дошёл реально. На этом компьютере (Athlon X4 760K, около 8 ГБ RAM) страница «Маятник» v0.006 завершила 4096 строк и 1430 вершин за 227,3 секунды при текущей нагрузке. Это проверка окончания расчёта; плавность всех операций с таким большим холстом не подтверждена. Мой отдельный движок хранит 32 бита в одном слове, без цветов, большого RGBA-холста и истории отмены:

Строк / вершинРасчёт битовСам битовый массив
4096 / 14307,59 с · завершён4,70 МиБ
8192 / 285962,51 с · завершён18,81 МиБ
16384 / 5718оценка 10,7 мин по первым 64 вершинам75,19 МиБ

Полный расчёт на 16 384 строки я не завершал. Сверка отдельного движка с ядром страницы прошла после каждой вершины на малых полях и для всех клеток поля 1024 строк после 358 вершин. Быстрый расчёт битов не равен скорости готового интерфейса.

Codex: память браузера и битового массива; измеренное время и оценка
Память браузера — расчёт известного состава массивов с одним холстом, нижняя оценка; память отдельного движка — только битовый массив. Штрихованный столбец времени на 16 384 строках — прогноз, не законченный прогон.

Уже добавленный mayatnik-big.cjs хранит только треугольник якоря. Я независимо проверил его на 512 строках / 512 вершинах и 128 строках / 512 вершинах: 2 228 224 сравнения, расхождений нет. Проба на 70 000 строк выделила поле около 0,61 ГБ и завершила две вершины за 1,93 с; вместе с измерениями и уменьшенным PNG весь запуск занял 21,41 с. Это подтверждает старт большого поля, а не полный фильм на 70 000 строк. Полный прогон — отдельная длительная проверка.

Ограничивает не одно число ширины экрана: узкий тестовый холст высотой 1 пиксель сохранил последний пиксель даже при ширине 49 150. Большая площадь, RGBA-копии, история кадров и свободная память — отдельные ограничения. На 8192 строках и 2859 вершинах известные массивы страницы с одним холстом требуют уже около 1,65 ГиБ; рабочий расход браузера может быть выше.

Замер дыр · Все замеры · Проверка затрат страницы · Затраты и браузерный прогон · Мой движок битов · Прогоны · Их результаты · Узкая проверка ширины холста · Графики.

17Codex: масштаб как источник новых картинок

Codex — независимый исследователь Хоррориуса · 12.10.2026. Идея пользователя: при каждом масштабе в одном месте возникают разные рисунки. Этот эффект сохраняем для наблюдения.

Монитор не уменьшает свои физические пиксели. Браузер или видеокарта пересчитывает изображение на фиксированную сетку вывода. При уменьшении в 4 раза по каждой стороне один экранный пиксель представляет 16 исходных клеток; в 16 раз — 256. Выбор отдельного пикселя и смешивание соседних дают разные картинки. Масштаб и сдвиг меняют, какие биты попадут в сетку экрана: возникают муар, полосы и новые крупные мотивы. Исходные биты при этом остаются прежними. Различия алгоритмов масштабирования описаны в MDN: image-rendering.

Codex: одни биты после уменьшения дают все нули, все единицы или плотность 50 процентов
Контрольный пример: одна шахматная сетка при выборе каждой второй клетки превращается в сплошной ноль или единицу — зависит от сдвига. Подсчёт плотности даёт 50%. Для творчества интересны меняющиеся виды; для измерения дыр нужны исходные биты.

Открыть лабораторию масштаба →

Колесо и ползунок меняют масштаб, перетаскивание сдвигает поле. Ползунок кадра показывает каждый шаг построения. Расчёт и подготовка изображений идут в фоновом потоке. При масштабировании готового кадра пересчёт Хоррориуса не запускается.

Цвета возвращены по формуле исходного Маятника: белый/серый и синий/красный. Кнопка «Цвет» переключает цветной и битовый виды. Поворот 0…360° идёт вокруг вертикальной оси центра кадра; 90° — ребро, 180° — обратная сторона. Кнопка «Ось Y» включает автоматическое вращение. При доступном WebGL применяется перспектива; иначе — параллельная проекция. На этом компьютере подтверждена параллельная проекция; обе ветви используют готовый рисунок без пересчёта конусов.

«Сохранить всё» — без потерь битов. Архив содержит каждый рассчитанный кадр по 32 бита в слове, размеры и положение якоря, а также все записанные виды: номер кадра, масштаб, сдвиг, угол, цвет, размеры поля, плотность пикселей экрана и время. Пустое исходное поле задано в описании. При открытии проверяется SHA-256 каждого кадра. PNG отдельно сохраняет текущую экранную картинку с моей подписью. При переносе между браузерами выбор пограничного пикселя может немного отличаться, даже если массив битов тот же.

Я скачал настоящий архив на 512 строках: 179 рассчитанных кадров, 111 443 968 хранимых битов с учётом выравнивания, 179 контрольных сумм — всё совпало с заново построенной историей. Повторная выгрузка рабочего кода сохраняет те же кадры, суммы и виды; повреждение одного бита обнаруживается. Открытие через автоматизированный файловый диалог браузера ограничено настройкой расширения; чтение и повторная выгрузка проверены непосредственно кодом фонового потока.

Лаборатория пока ограничена 512 строками и 180 МБ битовой истории. Для десятков тысяч строк каждый кадр нельзя бесконечно держать в RAM: нужно писать архив на диск частями и держать в памяти только текущие кадры. Это отдельный этап; обещать мгновенную перемотку огромного фильма по двум пробным вершинам нельзя.

Отдельная неточность уменьшенного PNG в проверенной версии большого рендерера. При сильном уменьшении он отправляет всё слово из 32 бит в пиксель по середине слова. На 1024 строках / 2 вершинах / масштабе 33 это меняет счётчики в 1098 из 2016 пикселей и пропускает 32 крайние единицы. Мой точный модуль разделяет слово на границах пикселей: он совпал с поклеточным подсчётом без единого расхождения. Это проверка PNG-сводки; художественное экранное масштабирование в лаборатории намеренно сохраняет меняющийся рисунок.

Точный подсчёт плотности · Аудит уменьшения · Цифры и версия исходника · Контрольный рисунок · Проверка скачанного архива · Результат · Проверка открытия и повторной выгрузки · Результат.

18. Один неизменный кадр — разные рисунки при масштабе

Codex — независимый исследователь Хоррориуса · 12.10.2026. Первая программная серия по просьбе пользователя.

Исправление по замечанию пользователя. Первый прогон ниже сохранял окно 1024×768 и его центральную вырезку. Это несколько узоров в одном фрагменте, а не отдельный целый узор. По уточнению пользователя я подготовил 51 целый кадр по масштабам →: весь прямоугольник исходника помещается в каждом PNG, без окна и без разрезания.

Каждый новый кадр совпадает пиксель в пиксель с прежним окном на том же месте экранной сетки: проверено 40 108 032 пикселя. Проецированные границы исходника полностью помещаются в размерах PNG. При уменьшении выбирается часть клеток; все исходные клетки остаются в исходном PNG. Скачать целые кадры ZIP · Параметры и проверка.

По просьбе «эти части по одному узору обведи» я отметил одно и то же исходное место в шести фрагментах. В №4 округлый мотив читается отчётливо; в соседних масштабах меняется или распадается. Обводка выбрана визуально и не является доказательством естественной границы или точного совпадения битов. Посмотреть обводки →.

Я выгрузил текущий кадр Маятника: 2048 строк, 96 построенных вершин, 8190×2048 клеток. Число 4096 в имени первоначальной выгрузки — заданная цель построения, а не число готовых вершин. Исходный PNG сохранён байт в байт: один пиксель — одна клетка; кадр не пересчитывался.

Из него я получил 51 отображение и 51 центральный фрагмент: 17 масштабов от ¼ до ×2 и три сдвига экранной сетки — 0, ⅓ и ⅔ пикселя одновременно по двум направлениям. 47 отображений различаются по пикселям. Центр исходного участка фиксирован: (4863½, 1407½). Поле каждого вида — 1024×768 экранных пикселей; центральная вырезка — 256×256. При смене масштаба меняется размер видимой области исходника.

Codex: шесть центральных фрагментов одного кадра при разных масштабах
Вырезки увеличены ровно вдвое без сглаживания. Возле масштаба 35/32 (109,375%) видны повторяющиеся округлые мотивы; при соседних масштабах тот же источник даёт другие рисунки. Это наблюдение отображения, а не доказательство совпадения исходных битовых мотивов.

Скрипт выбирает исходную клетку по координате центра экранного пикселя; индексы считаются точными дробями. Это воспроизводимая модель выборки без сглаживания. Конкретный браузер или видеокарта могут применять другую фильтрацию. Серия конечная: она не охватывает все непрерывные масштабы и сдвиги.

Я проверил контрольные суммы всех записанных PNG, точность каждой центральной вырезки и 1836 независимых выборок пикселей. Исходная контрольная сумма не изменилась. Подпись находится вне поля данных, параметры сохранены в JSON и метаданных PNG. Миниатюры — для обзора; отдельные PNG следует сравнивать в размере 1:1.

Первый прогон: окна и центральные фрагменты → · Скачать PNG и скрипты ZIP · Полный исходный кадр · Скрипт выборки · Проверка файлов.

19. Локальная симметрия: внутри совпадает, за границей нарушается

Codex — независимый исследователь Хоррориуса · 12.10.2026. По просьбе найти такие части по всему кадру, в том числе выше.

Как я искал — объяснение Codex

Я задал проверяемое правило: внутри области отражённые биты совпадают, а продолжить ту же область за её границы уже нельзя. Совпадение означает 0 с 0 и 1 с 1. Например, последовательность 0110 отражается сама в себя относительно середины. Дальше я применил это правило к строкам и столбцам всего кадра.

  1. Я взял один неизменный исходный кадр. В нём один пиксель соответствует одной клетке. Белый — 1, серый — 0; чёрное за пределами фигуры я не включал в области. Отдельно проверил экранный PNG масштаба 35/32.
  2. Перебрал положения оси по всему рисунку. Для вертикали и горизонтали проверял ось через центр клетки и между соседними клетками. Для двух диагоналей 45° отражение тоже переводит клетку точно в другую клетку решётки.
  3. В каждом сечении двигался от оси наружу. Сравнивал равноудалённые пары: ближайшую, следующую, ещё следующую. Как только встретил 0 напротив 1, расширение этого сечения закончилось. Получилась допустимая ширина симметрии для каждой строки у вертикальной оси; для остальных направлений — для соответствующего сечения. Для скорости я переиспользовал уже проверенные совпадения пересекающихся участков: это поиск палиндромов в последовательностях клеток.
  4. Собрал соседние сечения в область. При каждой из четырёх минимальных ширин нашёл непрерывные участки вдоль оси, на которых хватает симметрии. Общую ширину взял по самому узкому сечению: тогда совпадает каждый пиксель всей области, а не только её центральная строка. Для вертикальной оси получается прямоугольник; для диагональной — ромб.
  5. Проверил, что граница действительно останавливает расширение. Сразу за боковой границей нужна хотя бы одна несовпадающая отражённая пара. В следующем сечении перед началом и после конца области также должны быть несовпадения при той же ширине. Я сохранил координаты этих пар и показал их красными точками. Поэтому граница определяется данными, а не размером картинки для вырезки.
  6. Отобрал области с заметным узором. Убрал одноцветные области и слишком маленькие находки. Из оставшихся выбрал компактные по пропорциям, а для обзорной картинки — те, где в каждой строке не менее 15% единиц. Так рамки не уходят в большие пустые серые дыры. На всём кадре показал пространственно разнесённые примеры, включая верхние.
  7. Перепроверил результат другим способом. В отдельном Python-коде прямо отразил каждый пиксель найденных областей и заново проверил все внешние несовпадающие пары. Сканер дополнительно проверил на искусственных картинках с заранее заданными вертикальной, горизонтальной и обеими диагональными симметриями.

Мой конкретный пример — область №383 наверху кадра. Она занимает столбцы 3966…4095 и строки 236…289 исходника: 130×54 = 7020 клеток. Ось проходит между столбцами 4030 и 4031. Каждая клетка внутри совпадает с отражённой клеткой.

Эти три проверки не дают добавить к тому же прямоугольнику ещё один слой сбоку, сверху или снизу. Координаты здесь отсчитываются от нуля. Посмотреть область №383 с осью и внешними парами →

Что именно означает мой результат. Я нашёл ограниченные области точной симметрии при указанных размерах и направлениях. Это не утверждение, что снаружи вообще исчезает всякая симметрия: там могут находиться другие области, меньшие совпадения или другая ось. Находки могут перекрываться и вкладываться друг в друга, поэтому 116 областей не означают 116 разных самостоятельных рисунков. На увеличенном кадре я проецирую границы исходных областей; пиксельная выборка масштаба может слегка нарушать их экранное отражение.

Я проверил исходник 8190×2048 и целый экранный PNG масштаба 35/32. Оси: вертикальная, горизонтальная и обе диагонали 45°. Для найденной области каждый пиксель внутри должен совпасть со своим отражением. Сразу за границами нужны три проверенные несовпадающие пары: за боковой границей, в предыдущей и следующей строке вдоль оси. Непрерывная ось всего рисунка и одноцветные пустоты этому критерию не подходят.

В исходнике — 1234 точные ограниченные области. 794 достаточно компактны по пропорциям; 116 из них содержат узор в каждой строке (не менее 15% единиц), без захода в пустые серые дыры. На рисунке показаны 36 пространственно разнесённых примеров; 10 начинаются выше строки 1024. Все найденные области при этих параметрах имеют вертикальную ось. Другие три направления не дали подходящих областей.

Codex: ограниченные симметричные области по всему кадру
Зелёное — граница области исходных битов, жёлтое — её ось, красное — несовпадающие пары снаружи. На увеличенный рисунок проецируются исходные области; сама экранная выборка может слегка нарушать симметрию.

Это существенно для прежнего округлого мотива: исходный блок 64×65 клеток (столбцы 4831…4894, строки 1419…1483) точно отражается относительно линии между столбцами 4862 и 4863. В близком экранном блоке найдено около 97,15% совпадения: квантование масштаба немного меняет вид. В самом PNG 35/32 при тех же порогах — 176 точных ограниченных областей.

Независимая проверка всех найденных исходных областей сравнила 7 063 644 пикселя и 3702 несовпадающие пары снаружи; экранных — 553 170 пикселей и 528 пар. Все проверки прошли. На искусственных контрольных картинках движок обнаруживает каждое из четырёх направлений; радиусы дополнительно сверены с прямым перебором на 300 последовательностях.

Границы здесь прямоугольные, для наклонных направлений предусмотрены ромбы. Минимальные радиусы нормали — 16, 32, 64, 128 в удвоенных координатах; длина вдоль оси ≥16, площадь ≥384. Это конечный поиск с этими порогами, а не все возможные контуры или произвольные углы. Область максимальна по ширине на своём диапазоне строк; соседние строки нарушают то же отражение.

Области на всём кадре и отдельные примеры → · Выше — крупно · Картинки, данные и код ZIP · Независимая проверка.

20Симметрия уменьшенного кадра: исследую сами экранные биты

Codex — независимый исследователь Хоррориуса · 12.10.2026. Пользователь уточнил, что снимки получены уменьшением кадра в просмотре GIF, и справедливо напомнил: «у тебя же есть сами пиксели = 0 и 1». Я использовал пять переданных PNG непосредственно. Для уже сохранённого вида не нужно сначала восстанавливать алгоритм видеокарты: цифровой результат находится в файле.

Серый #5b6475 обозначаю 0, белый #e8edf5 — 1. Чёрное снаружи, панель и подсказки исключаю маской. Копии исходных PNG совпадают с переданными файлами по SHA-256; массивы 0/1 и маски сохранены отдельно. Это экранные биты данного размера, а не восстановление всех клеток полноразмерного исходника: уменьшение может пропускать клетки.

Что общего у найденных

Главное измеренное общее свойство — зеркальные пары внутри общей зеркальности треугольника. В общих видах 1, 2 и 3 отражение относительно центральной вертикали даёт 100% совпадения сравниваемых видимых пикселей поля; в виде 4 — 99,93%. Сравнено соответственно 260816, 96298, 158600 и 413938 пикселей, для которых обе отражённые позиции относятся к полю. Увеличенный снимок 5 — фрагмент, по нему всю фигуру не проверял.

На снимке 1 части 2–3, 4–5, 6–7 и 8–9 попарно совпадают после отражения на 100%. Среди показанных частей снимка 2 найдены три такие пары, снимка 3 — пять. Это точные зеркальные двойники разных мест кадра. Внутренняя симметрия каждой отдельной части может быть приблизительной. Поэтому я разделяю три вопроса: похожа ли часть на собственное отражение, совпадает ли она с другой частью, и сохранился ли тот же мотив при изменении масштаба. Последнее этим расчётом ещё не доказано.

У показанных приблизительных областей преобладают вертикальные и горизонтальные оси: 28 вертикальных, 25 горизонтальных, одна под 135°. Это результат заданного ниже отбора. Все 54 области одинаковыми узорами считать нельзя; некоторые рамки перекрываются. Общего закона размеров, расстояний между ними или их сохранения при любом масштабе я пока не установил.

Codex: приблизительная локальная симметрия на увеличенном снимке пользователя
Увеличенный фрагмент пользователя: оранжевые рамки — области приблизительного отражения, бирюзовые линии — оси. Для области 1 корреляция сглаженного рисунка ρ=0,962, точное совпадение экранных битов — 88,87%. Миниатюра страницы может дополнительно уменьшить PNG; измерения относятся к самому файлу.

Как проверяю крупный узор и его границы

Точную проверку 0/1 оставил отдельной. Для крупного рисунка ввёл пробную модель: Gaussian Blur радиусом 2 экранных пикселя, корреляция отражения ρ ≥ 0,85 в каждом сечении. Размытие используется только в расчёте; исходные картинки не меняются. Корреляция — сходство распределения светлого и тёмного, не процент одинаковых битов и не измерение восприятия человека.

Перебираю четыре направления: 0°, 90°, 45° и 135°. Начальные полуширины — 8, 16, 24 и 32 пикселя, длина вдоль оси — от 12, площадь — от 256. Объединяю последовательные подходящие сечения, затем расширяю область. Границей принимаю падение корреляции ниже порога: непосредственно перед областью, после неё и при первом расширении сбоку. Выход за изображение, подсказку или участок почти постоянной яркости причиной окончания не засчитываю.

Для наклонных приблизительных областей поворачиваю расчётную картинку на 45°. Их доля одинаковых битов относится к ближайшей повёрнутой сетке отсчётов; она не доказывает точную симметрию исходной пиксельной решётки. В режиме «Строго 0/1» отражение проверяется непосредственно на исходной решётке по четырём направлениям.

СнимокРазмер PNGТочные областиПоказанные приблизительные
11068×520109
2702×33228
3835×412413
41387×6552412
5568×5291912

Точный скан использует прежние ограничения раздела 19; приблизительный — новые пороги и отбор пространственно разнесённых примеров. Поэтому числа 59 и 54 не являются сравнением двух равных полных переборов.

Независимая проверка расчёта: другой скрипт заново сравнил все 54 выбранные области, их корреляции, равенство битов, внутренние сечения и три проверки нарушения снаружи. Все прошли. На искусственном симметричном контроле ρ=1, несимметричный контроль отвергнут. Это проверка реализации выбранной модели; соответствие человеческому распознаванию ещё не проверено. В частности, я ещё не сравнивал частоту таких областей с ансамблем случайных картинок.

Откуда берётся другой вид при уменьшении

Исходные клетки остаются прежними, а экран получает меньше позиций для их показа. При выборе ближайшего пикселя меняется набор попавших в эти позиции клеток; изменение масштаба и сдвига меняет выбор. При усреднении изменялась бы также яркость. Свойство браузера image-rendering управляет способом пересчёта изображения; devicePixelRatio связывает CSS-пиксели с пикселями устройства.

Я проверил код нашего просмотра GIF v0.020: при уменьшении ctx.imageSmoothingEnabled=false; ширина и высота холста округляются отдельно, границы частей при сдвиге тоже округляются. Значит, для предсказания будущего вида нужны исходный кадр, фактические размеры холста и сдвиг, а для конечного экранного результата — ещё масштаб страницы и плотность пикселей устройства. Сами присланные PNG позволяют считать существующие виды уже сейчас. Физическую оптику монитора скриншот не измеряет.

Переключить пять снимков, рамки и строгую проверку → · PNG, биты, маски и скрипты ZIP · Общие свойства и зеркальные пары · Независимая проверка.