Blog

  • Tiny Bookshop: книжная лавка на колёсах

    Tiny Bookshop: книжная лавка на колёсах

    Tiny Bookshop — уютный симулятор книжного продавца, в котором маленькая лавка помещается в прицепе, море всегда где-то неподалёку, а суть геймплея в том, чтобы понять, какую книгу на самом деле хочет покупатель. Большинство книг здесь настоящие, и их действительно надо рекомендовать по содержанию.

    Книжный магазин на колёсах

    В Tiny Bookshop мы приезжаем в приморский городок Bookstonbury-by-the Sea с лавкой на колёсах и довольно скромным запасом книг. Постоянного помещения у магазина нет, зато каждый день можно выбрать новую стоянку: сегодня торговать на набережной, завтра отправиться на блошиный рынок, а потом встать поближе к рыбному рынку или другому людному месту.

    Утром идёт подготовка: нужно прочитать местную газету, проверить объявления, купить книги и украшения, выбрать место, заполнить полки и открыть ставни. У разных районов разная публика, погода влияет на торговлю, у разных жанров свои вероятности продаж и так далее, всё взаимосвязано и довольно разумно.

    После открытия уже суетиться не нужно, это cozy-игра. Покупатели подходят к полкам, листают книги, иногда решаются на покупку, а иногда уходят. Можно переставлять запасы и следить, какие жанры заканчиваются, но Tiny Bookshop ни разу не tycoon и не превращает торговлю в управление складом. Денег обычно хочется больше, чем есть, но никакого особого недостатка тоже нету. Маленький уютный бизнес для души.

    Газета постепенно знакомит с городом, объявления позволяют пополнить ассортимент и отыскать забавные предметы для лавки, а новые места немного меняют состав покупателей и спрос. Есть украшения для прицепа, которые дают свои баффы. В результате игра получается достаточно разнообразной, и в ней есть ощущение прогресса.

    Почти настоящие рекомендации

    Главная находка Tiny Bookshop — настоящие книги. На полках стоят Агата Кристи, Стейнбек, Достоевский и десятки других вполне реальных авторов; у изданий есть обложки, жанры и короткие описания. Уже само по себе приятно торговать не условными “детективами легендарной редкости”, а книгами, которые читал или о которых хотя бы слышал.

    Но особенно хорошо это работает в рекомендациях. Время от времени покупатель не берёт книгу сам, а формулирует запрос. Кто-то хочет криминальный роман, действие которого происходит в узнаваемом реальном месте, и для ориентира вспоминает “Смерть на Ниле”. Другому нужен хоррор с захватывающим сюжетом. Третий любит научную фантастику, но не переносит юмор. После этого нужно перебрать ассортимент и предложить подходящий вариант.

    Как правило, требуемый жанр очевиден, но хорошие запросы требуют подумать и о конкретном содержании. Находится ли действие в реальном месте? Насколько книга мрачная? Есть ли в ней приключение, семейная история или, скажем, архитектура, которой интересуется покупатель? Внезапно, что очень большая редкость для игр, внеигровые знания о книгах могут действительно пригодиться.

    Конечно, настоящую работу книгопродавца здесь не моделируют. Выбор ограничен тем, что сейчас лежит в прицепе, критерии довольно широкие, а реакция покупателя быстро сообщает, угадал ли ты. И всё-таки момент, когда человек радуется правильно подобранной книге об архитектуре Британии, гораздо убедительнее безликого “задание выполнено”.

    Tiny and cozy

    Всё остальное в Tiny Bookshop старательно поддерживает уют. Букстонбери нарисован мягкими пастельными красками, у моря качаются лодки, вокруг лавки ходят постоянные знакомые, а между рабочими днями находятся небольшие поручения и разговоры. Можно подружиться с местными, помочь им, узнать городские новости и, разумеется, погладить и покормить собаку. Персонажи появляются снова, отношения понемногу развиваются, а ещё в каждой локации есть свои небольшие квесты, которые можно выполнить. Важные события здесь тоже уютные и соответствующего масштаба: встреча, местный праздник, вечер у костра.

    Но у размеренности есть обратная сторона: дни быстро начинают повторяться. Меняются стоянки, ассортимент, погода и знакомые лица; появляются новые украшения и небольшие истории. Основной цикл при этом остаётся прежним: купил книги, расставил книги, открыл лавку, продал книги, поговорил с посетителями, закрыл лавку. Рекомендации оживляют процесс, но и они начинают повторяться, а сама торговля постепенно становится абсолютно автоматической.

    Поэтому после первого лета я остановился. Кажется, дальше будет больше локаций, книг, персонажей и сезонных событий, но по сути процесс будет примерно такой же.

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

    Сергей Николенко

    P.S. Прокомментировать и обсудить пост можно в канале «Sineкура»: присоединяйтесь!

  • Былина

    Былина

    “Былина” — стандартная action RPG, которая выезжает на том, что стандартная action RPG про Русь-матушку встречается всё-таки не каждый день. Здесь есть мечи и доспехи, карта и журнал заданий, сундуки, навыки, крафт, подземелья и боссы. И очень, очень много русского духа.

    Здесь Русью пахнет

    Былина” начинается с того, что молодой воин Сокол отправляется на подвиги и почти сразу погибает. Игра даже выдаёт торжественную надпись “И Сокол умер”, после чего, разумеется, не заканчивается. Героя возвращает к жизни загадочный дух, который теперь делит с ним одно тело (не самый свежий ход, ага). Душу предстоит вернуть, с новым соседом — разобраться, а заодно, раз уж взялся, спасти Тридевятое царство.

    Исторической реконструкции от “Былины” ждать, конечно, не стоит. Это смесь былин, сказок и современных стереотипов о древней Руси. За одним поворотом стоят деревянные избы и чинные старцы, за другим — огромная разумная жаба, за третьим — крепость, будто собранная для фэнтезийного фильма, а где-то неподалёку обязательно прячется очередная нечисть. Сюда отлично помещаются и Кощей, и берёза с глазами, и турнир деревенских силачей, и квест под названием “Месть Золотой Рыбки”.

    Такой развесистой клюквы в игре много, собственно, это и есть суть игры. Сокол бродит по осенним лесам, болотам, деревням, подземельям, княжеским палатам и Тридевятому царству. Локации иногда кажутся слишком большими, но всегда стараются показать что-нибудь новое. Мне понравился тёплый деревенский вайб: торговцы, телеги, игра в городки, сервированные столы…

    Юмор бывает разный, но обычно довольно детский и построен на помещении сказочных объектов в более реалистичный контекст. Не каждая шутка реально хороша, но в целом создаётся мир в этаком духе русского Пратчетта (у него ведь тоже шутки в основном детские, да и принцип в целом тот же).

    Зато иногда герои выражаются весьма не по-детски. Это даже как-то неожиданно было, но тоже добавило колорита. Правда, недетские выражения не озвучены, однажды даже слышал реплику “Иди лесом”, когда написано было нечто совсем другое.

    Среди персонажей здесь Василий Пьяница, Жабная Особа и Берёза с глазами. Чтобы поднять уровень, надо обняться с домовёнком; их всех зовут Кузя, и выглядят Кузи о-очень специфически. В общем, думаю, стиль вы поняли.

    Но при этом иногда включается натуральное тёмное фэнтези, со всеми подробностями, что тоже приятно разнообразит происходящее:

    RPG как RPG

    А вот механически “Былина” очень скромно выглядит. Мы получаем задания, идём по маркеру, разговариваем, дерёмся, собираем добычу, меняем снаряжение и снова идём по маркеру. В журнале есть основные и побочные квесты, в инвентаре — мечи и доспехи, в меню — способности и улучшения. Между походами можно поговорить с жителями, поторговать и подготовиться к следующей вылазке. Всё сделано понятно и в целом удобно (кроме инвентаря, да и бог с ним), но очень стандартно.

    Бои устроены примерно так же. У Сокола есть обычные удары, уклонения, щит и способности, несколько видов оружия, у которых со временем меняются циферки, встречаются арены, ловушки и боссы. Боссы, кстати, мило сделаны, мне понравились, но это тоже скорее про сеттинг, чем про геймплей.

    К счастью, разработчики понимали, что механиками они игрока не удержат, так что, во-первых, постоянно меняют декорации и добавляют сюжет, а во-вторых, разнообразят бои загадками; некоторые загадки вполне даже свежо смотрятся.

    А главное, хотя история честно проходит стандартную арку героя, и Сокол успевает обрести характер, завершить своё путешествие и даже завести хозяйство, всё это не затянуто; пройти “Былину” можно и нужно часов за восемь.

    Заключение

    В общем-то, добавить уже и нечего: “Былина” — это очень прямолинейная RPG, ничем не выдающаяся, местами немного затянутая, хотя в целом короткая (и это большой плюс!). Но суть здесь в сеттинге: избы, нечисть, рисованные рожи, говорящие жабы, солёные шутки и русский текст, который не выглядит переводом с английского, — это и есть главное содержание.

    Так что ознакомиться можно, для доброй былины может и этого оказаться достаточно.

    Сергей Николенко

    P.S. Прокомментировать и обсудить пост можно в канале «Sineкура»: присоединяйтесь!

  • Всё течёт, всё опровергается: гипотеза Диница — Гарга — Гёманса

    Всё течёт, всё опровергается: гипотеза Диница — Гарга — Гёманса

    Введение

    В прошлый раз, рассказывая про контрпример к проблеме якобиана, я закончил пост вопросом: “Что дальше, коллеги?”

    Ответ занял два дня.

    22 июля Дмитрий Рыбин написал в X, что GPT 5.6 Pro опровергла гипотезу Диница — Гарга — Гёманса (Dinitz–Garg–Goemans conjecture) из теории потоков в графах. Гипотеза простояла с конца 1990-х; в статье 2025 года Swamy et al. всё ещё называли её “a famous conjecture” и писали, что даже существенно ослабленный вариант был бы прорывом.

    Как и в случае проблемы якобиана, здесь пока нет ни журнальной статьи, ни формального рецензирования, но они и не нужны, потому что проверить контрпример очень легко. У нас есть пост Рыбина, выложенный им полный диалог с моделью и четырёхстраничный арифметический сертификат, но в графе всего семь вершин, девять дуг и восемь возможных неделимых потоков. Мы с GPT независимо проверили все восемь программой, которая перебирает буквально все пути в графе, и никаких ошибок здесь нет.

    Более того, контрпример оказался не просто верным, а очень интересно устроенным. Внутри него прячется известный в комбинаторной оптимизации объект — треугольник попарных конфликтов.

    Давайте разберёмся, что такое делимые и неделимые потоки и в чём состояла гипотеза. Потом обсудим, почему она казалась естественной и почему её было так трудно доказать. Затем проверим контрпример, вытащим из него структурную идею и попробуем его уменьшить. А в конце, разумеется, посмотрим на промпты. Спойлер: там буквально написано “you should do a breakthrough”.

    Потоки, которые можно и нельзя делить

    Начнём с обычной транспортной сети. Есть ориентированный граф G=(V,A): вершины — перекрёстки или маршрутизаторы, дуги — дороги или каналы связи. У нас есть один общий источник s, например склад, и несколько терминалов t_1,\ldots,t_k, куда надо доставить грузы объёмов d_1,\ldots,d_k.

    У каждой дуги a есть пропускная способность u_a: больше этого количества груза одновременно по ней отправлять нельзя. Может быть и неотрицательная цена c_a за перевозку одной единицы груза.

    В более простой постановке задачи грузы можно делить, то есть, например, заказ объёма 10 разрешается разрезать на части: пять единиц поехали по одному пути, три по другому, две по третьему. Такой поток называется делимым или дробным (splittable, fractional flow). В каждой внутренней вершине выполняется закон сохранения: сколько потока вошло, столько и вышло; источник выпускает сумму всех заказов, а терминал t_i поглощает ровно d_i.

    С дробными потоками работать легко и приятно, их можно искать линейным программированием, а для классического максимального потока есть ещё более быстрые специализированные алгоритмы.

    Но во многих задачах груз делить нельзя. Контейнер должен ехать целиком, сетевое соединение должно выбрать один маршрут, задачу на вычислительном кластере нельзя на 37% выполнить на одном сервере и на 63% на другом. Тогда для каждого терминала t_i надо выбрать один путь P_i из s в t_i и отправить по нему все d_i единиц. Это неделимый поток (unsplittable flow).

    Если через дугу a проходят пути терминалов из множества I, нагрузка на неё равна

        \[y_a = \sum_{i\in I} d_i.\]

    А полная стоимость маршрутизации равна

        \[\mathbf{c}^\top \mathbf{y} = \sum_{a\in A} c_a y_a.\]

    Очевидно, что разница между двумя постановками есть, и немалая. Представьте один заказ объёма 10 и две дороги, по которым дробный поток отправляет по пять единиц. После запрета деления придётся выбрать одну дорогу и положить на неё все десять. Нагрузка на выбранную дорогу вырастет скачком на пять.

    Такое неизбежно происходит и в общем случае. Поэтому разумный вопрос здесь в том, насколько сильно придётся перегружать дуги. Обозначим максимальный размер заказа (demand, ещё переводят как “потребность” или “запрос”) через

        \[d_{\max}=\max_i d_i.\]

    Запас в один максимальный заказ выглядит естественно: если в процессе округления на дуге оказался один целый груз, хуже d_{\max} он добавить не может. Именно это наблюдение превратилось в нашу сегодняшнюю гипотезу.

    Теорема Диница — Гарга — Гёманса

    Задачу о неделимом потоке из одного источника ввёл Джон Клейнберг в работе 1996 года. Даже решить, существует ли неделимая маршрутизация, соблюдающая все ёмкости, NP-трудно; как отмечают авторы современного обзора, уже на графе из двух вершин с параллельными дугами сюда сводятся Subset Sum и Bin Packing.

    Но Ефим Диниц, Навин Гарг и Мишель Гёманс в работе “On the Single-Source Unsplittable Flow Problem” доказали важную теорему.

    Теорема (Dinitz–Garg–Goemans, 1999). Пусть \mathbf{x} — любой допустимый дробный поток. Тогда за полиномиальное время можно найти неделимый поток <em>\mathbf{</em>y}, для которого на каждой дуге

        \[y_a \leq x_a + d_{\max}.\]

    Если исходный поток соблюдает ёмкости, x_a\leq u_a, то, следовательно,

        \[y_a\leq u_a+d_{\max}.\]

    То есть округлить можно всегда, и ни одна дуга не получит больше одного максимального заказа сверх исходной нагрузки. Причём порядок величины здесь улучшить нельзя: даже один груз, дробно размазанный по многим путям, при переходе к неделимым потокам целиком ляжет на один из них.

    Это верная и интересная теорема, но она про частный случай нашей задачи, без стоимостей дуг. Вскоре Гёманс предложил естественное усиление.

    Гипотеза Гёманса. Если на дугах заданы неотрицательные цены c_a, то неделимый поток \mathbf{y} можно выбрать так, чтобы одновременно не слишком перегружались дуги,

        \[y_a \leq x_a+d_{\max}\quad\text{для всех }a,\]

    и не увеличивалась общая цена,

        \[\mathbf{c}^\top \mathbf{y}\leq \mathbf{c}^\top \mathbf{x}.\]

    Иногда её называют гипотезой Диница — Гарга — Гёманса по имени исходной теоремы, а иногда просто Goemans’ conjecture; важно, что теорема трёх авторов без стоимостей остаётся в силе, опровергнуто именно стоимостное усиление.

    Почему в гипотезу верили и почему она была сложной

    У гипотезы была очень убедительная вероятностная интуиция.

    Разложим дробный поток каждого терминала по путям. Долю потока на пути можно воспринимать как вероятность выбрать этот путь целиком. Если независимо выбрать по одному пути для каждого терминала, то в среднем нагрузка на каждой дуге будет ровно x_a, а средняя стоимость — ровно \mathbf{c}^\top \mathbf{x}.

    Значит, среди всех исходов точно есть хотя бы один со стоимостью не выше средней. С другой стороны, теорема Диница — Гарга — Гёманса гарантирует, что есть исход, в котором все нагрузки не превосходят x_a+d_{\max}.

    Очень хочется поверить, что округление можно организовать так, чтобы эти два хороших свойства встретились в одном исходе.

    Конечно, здесь нет формального доказательства: из “существует дешёвый поток” и “существует поток без большой перегрузки” не следует, что существует поток одновременно дешёвый и без большой перегрузки. Именно так устроен новый контрпример.

    Но до него эта надежда выглядела вполне разумной. Многие классические методы зависимого округления умеют сохранять линейную целевую функцию и одновременно контролировать ошибки в ограничениях. Для специальных случаев получались положительные результаты: например, Skutella (2002) доказал гипотезу, когда все заказы кратны друг другу, точнее, образуют цепочку делимости (см. также Morell, Skutella, 2022).

    При этом прогресса в общем случае почти не было. В 2023 году Traub, Koch, Zenklusen писали, что не известно практически ни одного нетривиального класса графов, где точная гипотеза была бы доказана. Они получили важный результат для планарных графов, но только с вдвое большим запасом:

        \[y_a\leq x_a+2d_{\max},\qquad \mathbf{c}^\top \mathbf{y}\leq \mathbf{c}^\top \mathbf{x}.\]

    Даже в работе октября 2025 года вопрос, можно ли сохранять стоимость хотя бы с добавочной перегрузкой O(d_{\max}) в общих графах, назывался “широко открытым”, а его решение — потенциальным прорывом. Я нашёл только один (совсем недавний, 29 июня 2026!) результат Almoghrabi, Skutella & Warode, где гипотеза Гёманса доказывается для нетривиального класса: последовательно-параллельных ориентированных графов, причём даже в более общей многоисточниковой постановке.

    Почему это вообще так сложно? Потому что дробный поток живёт в выпуклом многограннике и оптимизируется линейными методами, а неделимый поток — это дискретный выбор целого пути для каждого терминала. Один выбор меняет нагрузки сразу на всех дугах пути; разные терминалы связываются через длинные общие куски маршрутов, а ограничение в d_{\max} не даёт усреднить ошибку по размеру графа. Надо одновременно попасть в тонкую полосу вокруг x по каждой дуге и не испортить одну глобальную цену.

    Может показаться, что контрпример давно можно было бы найти прямым перебором, но на самом деле пространство возможных контрпримеров здесь тоже огромное. Надо выбрать не только граф, но и терминалы, заказы, дробное разложение и цены. Прямой перебор плохо масштабируется, потому что даже у маленького графа слишком много числовых степеней свободы.

    Рыбин пишет, что сам неделями думал об этой задаче в обе стороны и что о ней, по его мнению, задумывалось большинство специалистов по потокам.

    Тем любопытнее, что итоговый контрпример можно нарисовать на салфетке.

    Семь вершин и девять дуг

    Вот весь граф. Число x на дуге — нагрузка дробного потока, c — цена одной единицы; у непомеченных цен значение нулевое. Двойными кружками отмечены терминалы.

    Заказы трёх терминалов равны

        \[d_1=15,\qquad d_2=10,\qquad d_3=15,\]

    поэтому d_{\max}=15.

    Сначала проверим, что нарисованные числа действительно задают дробный поток. Из источника выходит

        \[10+6+24=40=15+10+15.\]

    В трёх внутренних вершинах поток сохраняется:

        \[24=10+14,\qquad 14=5+9,\qquad 9=4+5.\]

    Наконец, в терминалы приходит ровно столько, сколько требуется:

        \[10+5=15,\qquad 6+4=10,\qquad 10+5=15.\]

    Стоимость положительна только на трёх оранжевых дугах:

        \[\mathbf{c}^\top \mathbf{x}=2\cdot10+3\cdot6+2\cdot10=58.\]

    Можно посмотреть на тот же поток отдельно для каждого терминала. У каждого груза есть ровно два пути — дорогой E_i и бесплатный Z_i:

        \[\begin{aligned}E_1&:s\to t_1, &Z_1&:s\to u\to v\to t_1,\\E_2&:s\to t_2, &Z_2&:s\to u\to v\to w\to t_2,\\E_3&:s\to u\to t_3, &Z_3&:s\to u\to v\to w\to t_3.\end{aligned}\]

    Обратите внимание, что E_3 тоже проходит по бесплатной дуге s\to u, но платит на дуге u\to t_3.

    Дробный поток раскладывается так:

    Каждый дорогой путь, если отправить по нему соответствующий груз целиком, стоит ровно 30:

        \[15\cdot2=30,\qquad 10\cdot3=30,\qquad 15\cdot2=30.\]

    Поэтому стоимость 58 можно пересчитать ещё одним способом:

        \[30\left(\frac{10}{15}+\frac6{10}+\frac{10}{15}\right)=30\left(\frac23+\frac35+\frac23\right)=58.\]

    А теперь запретим делить грузы. Для каждого терминала надо выбрать либо E_i, либо Z_i. Всего получается 2^3=8 вариантов. И 58 превращается в 60 из-за трёх арифметических конфликтов.

    Конфликт Z_2 и Z_3. Если второй и третий грузы одновременно идут по бесплатным путям, на дугу v\to w ложится

        \[10+15=25.\]

    Но гипотеза разрешает там не больше

        \[x_{vw}+d_{\max}=9+15=24.\]

    Перегрузка — одна единица.

    Конфликт Z_1 и Z_3. Эти два пути вместе дают на дуге u\to v

        \[15+15=30>14+15=29.\]

    Снова не хватает ровно одной единицы.

    Конфликт Z_1 и Z_2. Тут надо вспомнить, что третий груз проходит по дуге s\to u на обоих своих путях, и дорогом, и бесплатном. Поэтому вместе с Z_1 и Z_2 нагрузка на s\to u неизбежно равна

        \[15+10+15=40>24+15=39.\]

    И опять разность равна единице.

    Итак, любые два бесплатных пути несовместимы с ограничениями гипотезы. Значит, бесплатно может поехать не больше одного груза, а как минимум два обязаны выбрать дорогие пути. Каждый стоит 30, поэтому вся допустимая неделимая маршрутизация стоит не меньше

        \[30+30=60>58.\]

    Вот и всё опровержение.

    Для полноты выпишем все восемь вариантов. Слово bad означает, что после разрешённой добавки d_{\max}=15 какая-то дуга всё равно перегружена:

    E1 E2 E3   cost 90   good
    E1 E2 Z3   cost 60   good
    E1 Z2 E3   cost 60   good
    Z1 E2 E3   cost 60   good
    E1 Z2 Z3   cost 30   bad: v→w by 1
    Z1 E2 Z3   cost 30   bad: u→v by 1
    Z1 Z2 E3   cost 30   bad: s→u by 1
    Z1 Z2 Z3   cost  0   bad: s→u by 1, u→v by 11, v→w by 1

    Все четыре маршрутизации стоимостью меньше 60 нарушают ограничения, а все четыре, которые ограничения соблюдают, стоят 60 или 90.

    Я уже два раза написал разными словами одно и то же простое рассуждение, чтобы подчеркнуть, что как и в случае проблемы якобиана, проверка здесь вообще не представляет никакого труда, так что ждать рецензирования смысла нет.

    Кстати, граф не только ацикличен, но и планарен. Если забыть направления и разгладить три вершины степени 2, получится вообще K_4, полный граф на четырёх вершинах. Это тоже по-своему интересно, потому что по планарности могла бы проходить граница между верным и неверным утверждением, и Рыбин изначально просил найти контрпример для общего, непланарного случая, но GPT 5.6 в итоге нашёл и более сильный.

    Всё это, разумеется, не противоречит планарному результату 2023 года. Там разрешён зазор 2d_{\max}, а не d_{\max}, и при таком запасе в нашем примере можно отправить все три груза по бесплатным путям и получить стоимость ноль.

    Что там происходит на самом деле

    Теперь выкинем почти все детали графа и оставим его комбинаторный скелет.

    Введём переменную z_i, равную 1, если терминал i выбирает бесплатный путь Z_i, и 0, если дорогой E_i. Три конфликта говорят:

        \[z_1+z_2\leq1,\qquadz_1+z_3\leq1,\qquadz_2+z_3\leq1.\]

    Для нулей и единиц отсюда следует

        \[z_1+z_2+z_3\leq1.\]

    Это многогранник стабильных множеств треугольника: можно выбрать не больше одной вершины, потому что каждая пара соединена конфликтным ребром.

    А какие значения z_i соответствуют дробному потоку? Это доли грузов, отправленные по бесплатным путям:

        \[z_1=\frac5{15}=\frac13,\qquadz_2=\frac4{10}=\frac25,\qquadz_3=\frac5{15}=\frac13.\]

    Каждое попарное неравенство выполнено. Но сумма равна

        \[\frac13+\frac25+\frac13=\frac{16}{15}>1.\]

    Из-за этого неравенства и ломается гипотеза. Дробный поток живёт в обычной релаксации, где есть три попарных конфликта, но не видна их общая “треугольная” связь. Неделимая маршрутизация обязана удовлетворять более сильному неравенству суммы.

    А цены на дугах — просто разделяющая гиперплоскость. Поскольку каждый дорогой выбор стоит 30, стоимость равна

        \[30\bigl((1-z_1)+(1-z_2)+(1-z_3)\bigr).\]

    У дробной точки получается 58, а у любой целой точки с z_1+z_2+z_3\leq1 — не меньше 60.

    В таком виде контрпример уже не кажется случайным. GPT 5.6 не просто наткнулся на девять удачных чисел, а реализовал в маленьком ориентированном графе классический разрыв между дробным и целым многогранниками для треугольника.

    Это заодно объясняет, почему двух терминалов для этого механизма недостаточно. У одного конфликтного ребра неравенство z_1+z_2\leq1 уже полностью описывает выпуклую оболочку допустимых точек. Первое недостающее ограничение возникает именно на треугольнике, то есть нужны три бесплатных варианта. Я не утверждаю, что семь вершин абсолютно минимальны среди всех мыслимых контрпримеров (для этого нужен отдельный перебор топологий, и его ещё никто вроде бы не сделал), но структурное ядро здесь действительно самое маленькое возможное.

    Проверка, уменьшение контрпримера и граница 9/8

    Проверка. Главная опасность в проверке подобных конструкций — перебрать только заранее задуманные пути и забыть, что их куски можно склеить в новый маршрут. Судя по опубликованному диалогу, несколько ранних попыток GPT 5.6 именно на этом и сломались.

    Поэтому в проверочном скрипте мы с тем же GPT 5.6 не задавали шесть путей руками, а перебирали все простые пути из s в каждый терминал. Впрочем, здесь всё-таки негде ошибиться, получится именно шесть путей:

    t1: s→t1
    t1: s→u→v→t1
    t2: s→t2
    t2: s→u→v→w→t2
    t3: s→u→t3
    t3: s→u→v→w→t3

    После этого декартово произведение трёх двухэлементных списков даёт восемь маршрутизаций из таблицы выше.

    Можно ли уменьшить числа? Да. На последней странице сертификата выписано целое параметрическое семейство. Я перебрал его рациональные и целочисленные варианты и нашёл меньший целочисленный экземпляр на том же графе:

    • заказы (9,7,9), так что d_{\max}=9;
    • по бесплатным путям дробно идут (2,4,2) единицы;
    • единичные цены трёх платных дуг равны (7,9,7).

    Тогда каждый дорогой путь целиком стоит 63, дробная стоимость равна

        \[7\cdot7+3\cdot9+7\cdot7=125,\]

    а любая допустимая неделимая маршрутизация стоит хотя бы

        \[63+63=126.\]

    Три попарных конфликта снова превышают разрешённую границу ровно на единицу. В этой же семивершинной схеме, если требовать целые заказы и нагрузки и уравнять полную цену трёх дорогих выборов, d_{\max}=9 минимально; перебор меньших значений не даёт ни одного варианта, а при 9 решение (9,7,9) единственно.

    Исходные числа 58 и 60 для рассказа всё равно красивее, поэтому главным примером я оставил их. Но уменьшенный вариант даёт ещё один результат.

    Рассмотрим ослабленную гипотезу, где разрешается

        \[y_a\leq x_a+\alpha d_{\max}.\]

    В исходном примере любая маршрутизация стоимостью не больше 58 должна выбрать хотя бы два бесплатных пути. Для каждого такого выбора на конфликтной дуге нагрузка превосходит x_a на 16, то есть требуется

        \[\alpha\geq\frac{16}{15}.\]

    В уменьшенном примере требуется уже

        \[\alpha\geq\frac{10}{9}.\]

    А параметрическое семейство позволяет подойти ещё ближе к 9/8. Нормируем первый и третий заказы к 1, снова уравняем полную стоимость трёх дорогих путей и положим

        \[d_2=b=\frac34,\qquad r=\frac14,\qquad q=\frac12+\varepsilon,\qquad 0<\varepsilon<\frac16,\]

    где b,q,r — доли трёх грузов на бесплатных путях. Их суммарная дробная масса равна 1+\varepsilon>1. Если каждый дорогой путь целиком стоит C, дробная стоимость равна C(2-\varepsilon)<2C, поэтому сохраняющая стоимость маршрутизация обязана выбрать хотя бы два бесплатных пути. В то же время любой такой выбор требует коэффициента

        \[\alpha=\frac98-\frac34\varepsilon.\]

    Беря положительное рациональное \varepsilon сколь угодно малым, получаем контрпример для любого универсального коэффициента \alpha<9/8.

    Иными словами, для планарных графов естественный вопрос теперь звучит так: какой будет оптимальный “коэффициент невязки” между 9/8 и 2? Верхняя граница 2 известна из работы 2023 года, нижняя 9/8 получается уже из этой маленькой планарной конструкции.

    Для общих графов картина ещё менее понятна: неизвестно даже, достаточно ли вообще какой-нибудь универсальной константы при d_{\max} с одновременным сохранением стоимости. Так что хоть исходная гипотеза и пала, работа здесь ещё не вполне закончена.

    Четыре промпта

    Ну и наконец — как это было найдено.

    Публичный диалог с GPT 5.6 Pro совершенно не похож на тщательно спроектированный исследовательский промпт. Рыбин приложил материалы о задаче и попросил построить структурный контрпример для общего случая, добавив бессмертную фразу:

    You should do a breakthrough.

    Модель долго исследовала разные конструкции, выдавала частичные результаты и несколько раз не доходила до корректного ответа. Рыбин отвечал коротко и не пытался даже разобраться в том, что модель писала, по существу. После “Research conclusion” идут несколько страниц текста, но дальше диалог продолжается так:

    Двух промптов не хватило, и GPT 5.6 опять сдался (через полтора часа размышлений), но третий промпт всё ещё прямолинеен:

    И даже трёх промптов и пяти часов размышлений — о ужас! — не хватило. Так что Дмитрий Рыбин потерял терпение и написал коротко и прямо:

    Как видите, на четвёртый раз невод, pardon the pun, пришёл с золотою рыбкой. Всего четыре коротких сообщения, никакого “искусства промптинга”. Опять же, я так

    Разумеется, из этого не следует, что математическая экспертиза больше не нужна. Чтобы вообще выбрать эту гипотезу, надо знать, что она важна и открыта и иметь некоторую интуицию о том, что именно она может оказаться неверной. Дмитрий Рыбин действительно много думал над задачей сам.

    Но и преуменьшать роль модели здесь странно. Человек не подсказывал LLM граф, числа или даже идею треугольника конфликтов. Финальная конструкция появилась после нескольких часов самостоятельного поиска, а пользовательская обратная связь состояла из “продолжай” и “хватит частичных результатов”.

    Заключение

    Итак, гипотеза Диница — Гарга — Гёманса утверждала, что любой дробный поток можно округлить до неделимого, одновременно сохранив стоимость и увеличив нагрузку каждой дуги не более чем на один максимальный заказ.

    GPT 5.6 Pro нашла планарный ациклический граф с тремя терминалами, где дробный поток стоит 58, а любой неделимый поток в разрешённых границах стоит не меньше 60. Сертификат состоит из девяти дуг и восьми строк полного перебора; я независимо проверил и арифметику, и отсутствие дополнительных путей.

    Главная идея контрпримера — не сами числа, а треугольник конфликтов. Дробный поток использует три бесплатных выбора с суммарной массой 16/15, хотя целиком можно выбрать не больше одного. Цены лишь переводят недостающее неравенство z_1+z_2+z_3\leq1 в разрыв между 58 и 60.

    Теорема Диница, Гарга и Гёманса без стоимостей остаётся верна. Планарный результат с запасом 2d_{\max} тоже остаётся верен. И теперь появляется некоторый зазор, который можно пытаться сокращать: как мы тут увидели, та же конструкция показывает, что любой новый универсальный коэффициент должен быть не меньше \frac 98, то есть теперь можно сокращать расстояние между \frac 98 и 2.

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

    У меня нет сомнений, что если бы любой из этих результатов получил человек, он стал бы широко известен в узких кругах и всегда имел бы гарантированную профессорскую позицию в хорошем месте, даже если бы больше ничего великого не сделал и продолжал бы всю жизнь изучать следствия и расширения своего прорывного результата (таких примеров в науке много, это не что-то плохое). Так что вопрос о том, достигли ли AI-модели человеческого уровня в математике, кажется мне уже закрытым.

    А что ещё дальше, коллеги?..

    Сергей Николенко

    P.S. Прокомментировать и обсудить пост можно в канале «Sineкура»: присоединяйтесь!

  • Басня о якобиане: The Fable of the Jacobian Conjecture

    Басня о якобиане: The Fable of the Jacobian Conjecture

    Введение

    Мы живём в дивном новом мире для математики. В мае внутренняя модель OpenAI опровергла гипотезу Эрдёша о единичных расстояниях, неделю назад GPT 5.6 доказала гипотезу о двойном покрытии циклами.

    В прошлый раз я закончил пост словами: “Если у вас есть любимая гипотеза, в которую вы верите, самое время написать про неё хороший промпт”. Что ж, люди так и сделали, и сегодня у нас третий эпизод того же сериала.

    На этот раз отличилась модель от Anthropic: 19 июля, пока человечество смотрело финал чемпионата мира по футболу, Claude Fable 5 построил контрпример к проблеме якобиана (Jacobian conjecture) — одной из самых знаменитых открытых проблем алгебраической геометрии, номеру 16 в списке Смейла, простоявшей с 1939 года.

    Если в прошлых сериях мы обсуждали хотя бы двухстраничные препринты, то здесь научная коммуникация стала ещё ближе к сингулярности; весь результат целиком существует в виде твита математика Левента Алпёге (Levent Alpöge):

    И в общем-то этим твитом всё сказано, дальше можно не читать, а пойти проверить (ниже будет код на десять строк). Но я, конечно, не могу этим ограничиться, так что кое-какой контекст вам всё-таки расскажу. Тем более что это (опять!) тот редкий случай, когда про решение знаменитой проблемы можно рассказать всё до последней формулы.

    Что такое проблема якобиана

    Пусть F = (F_1, \ldots, F_n): \mathbb{C}^n \to \mathbb{C}^n — полиномиальное отображение: каждая компонента F_i — многочлен от x_1, \ldots, x_n. Его якобиан — определитель матрицы частных производных

        \[\det JF = \det\left(\frac{\partial F_i}{\partial x_j}\right)_{i,j=1}^n.\]

    Если F обратимо, причём обратное отображение тоже полиномиально, то по формуле дифференцирования композиции \det JF \cdot \det J(F^{-1}) = 1, то есть якобиан \det JF — многочлен, обратимый в кольце многочленов, а значит, ненулевая константа. Гипотеза о якобиане утверждает, что верно и обратное:

    Гипотеза (Keller, 1939). Если \det JF — ненулевая константа, то F обратимо (и обратное отображение автоматически полиномиально).

    Отт-Генрих Келлер сформулировал её в 1939 году (изначально для многочленов с целыми коэффициентами); с тех пор она стала, пожалуй, главным открытым вопросом о многочленах от нескольких переменных, который можно рассказать любому студенту.

    Есть два класса примеров, на которых гипотеза очевидно работает:

    • линейные отображения (якобиан — определитель числовой матрицы) и
    • “треугольные” отображения вида (x + p(y), y) — тут якобиан равен 1, а обратное выписывается сразу как (x - p(y), y).

    Композиции таких отображений дают массу нелинейных примеров с константным якобианом, и все они обратимы. Гипотеза, по сути, говорила, что ничего другого и не бывает.

    Почему люди в неё верили? Во-первых, условие \det JF = \mathrm{const} \neq 0 означает, что Fлокальный диффеоморфизм в каждой точке: теорема об обратной функции даёт обратимость в окрестности любой точки, и вопрос только в том, склеиваются ли локальные обратные в глобальное.

    Во-вторых, в размерности 1 всё тривиально: f' = \mathrm{const} \neq 0 означает, что f линейна.

    В-третьих, давно известно, что вся проблема только в инъективности: по теореме Акса–Гротендика инъективное полиномиальное отображение \mathbb{C}^n \to \mathbb{C}^n автоматически сюръективно. Более того, его обратное обязательно будет полиномиальным; это называется теоремой Бялыницкого-Бирули — Розенлихта.

    Упомянутые выше результаты я вам с ходу не объясню, но для нас сейчас они значат, что контрпример — это обязательно отображение с константным якобианом, склеивающее какие-то две точки (нарушающее инъективность).

    Стоит сразу оговориться, что над полями положительной характеристики гипотеза неверна тривиальным образом: у отображения x \mapsto x - x^p над \overline{\mathbb{F}}_p производная равна 1, но оно склеивает в ноль всё простое подполе. Так что это вопрос исключительно про характеристику 0 (вещественные числа, комплексные числа), и у гипотезы не может быть никакого доказательства “грубой алгебраической силой”.

    Предыдущие попытки и частичные результаты

    Фабрика ложных доказательств. Отдельный жанр — история попыток. Гипотеза якобиана, конечно, была не так популярна, как великая теорема Ферма, но к 1982 году Басс, Коннелл и Райт в классическом обзоре насчитывали в литературе не менее пяти опубликованных ошибочных доказательств. И это именно в литературе, то есть прошедших рецензирование.

    Среди отметившихся принято называть вполне серьёзных математиков — например, Бениамино Сегре и Вольфганга Грёбнера (того самого, в честь которого названы базисы Грёбнера, к которым мы ещё вернёмся ниже). В 2004 году Мел Хохстер анонсировал доказательство двумерного случая, найденное Кэролин Дин, — и в нём тоже вскоре обнаружилась ошибка. Ну а в эпоху arXiv “доказательства” гипотезы о якобиане (в обе стороны, разумеется) выходили практически ежегодно.

    Об уровне задачи говорит, например, то, что диссертация Итана Чжана (Yitang Zhang), который потом совершил прорыв в задаче об ограниченных промежутках между простыми числами, была посвящена именно гипотезе о якобиане.

    Что уже было действительно доказано. Wang (1980) доказал гипотезу для отображений степени 2 в любой размерности. Moh (1983) — для n = 2 и степени до 100 включительно. Ягжев (1980) и Bass, Connell, Wright (1982) показали интересную редукцию степени: достаточно доказать гипотезу для отображений вида x + H(x), где H — однородное кубическое, правда, ценой роста размерности. Позже Дружковский (1983) сузил ещё сильнее, до H_i = \ell_i^3 с линейными \ell_i.

    Наконец, известна целая сеть эквивалентностей: гипотеза о якобиане стабильно эквивалентна гипотезе Диксмье о том, что всякий эндоморфизм алгебры Вейля — автоморфизм (Tsuchimoto, 2005; Канель-Белов и Концевич, 2007) и связанной гипотезе Пуассона (Adjamagbo, van den Essen, 2006); из гипотезы Матье (1995) об интегралах по компактным группам гипотеза о якобиане тоже следует.

    Был и предупредительный выстрел. В 1994 году Сергей Пинчук построил знаменитый контрпример к вещественной версии: полиномиальное отображение \mathbb{R}^2 \to \mathbb{R}^2, у которого якобиан не обращается в ноль нигде, но которое не инъективно. У Пинчука якобиан не был константой (он всюду положителен, но принимает сколь угодно малые значения), так что комплексную гипотезу это не опровергало. Но при этом стало окончательно ясно, что “локальная обратимость всюду” глобальную не гарантирует, и закрылись многие возможные пути для доказательства гипотезы.

    И ещё стоит отметить, что размерность 2 в этой науке — особая: там автоморфизмы полиномиального кольца устроены просто (теорема Юнга – ван дер Кулка), и гипотеза о якобиане там проверена до степени 100. А вот в размерности 3 регулярно ломается всё, что можно: например, автоморфизм Нагаты оказался “диким” именно в \mathbb{C}^3 (Шестаков, Умирбаев, 2004), а гипотеза Маркуса–Ямабе о глобальной устойчивости пала на полиномиальном контрпримере именно в \mathbb{R}^3 (Cima et al., 1997).

    Но большинство этих результатов, особенно положительных, довольно сложные. А вот контрпример к гипотезе о якобиане оказался очень даже простым: это три многочлена над \mathbb{C}^3 степени не больше 7. Давайте к нему и перейдём.

    Контрпример и его проверка

    Выпишем героя дня в человеческом виде. Отображение F = (F_1, F_2, F_3): \mathbb{C}^3 \to \mathbb{C}^3 задаётся формулами

        \[\begin{aligned}F_1 &= (1+xy)^3\, z + y^2 (1+xy)(4+3xy),\\F_2 &= y + 3x(1+xy)^2\, z + 3xy^2(4+3xy),\\F_3 &= 2x - 3x^2 y - x^3 z.\end{aligned}\]

    То есть это три многочлена степени 7, 6 и 4 соответственно. Утверждается, что:

    • \det JF = -2 тождественно (константа!), но при этом
    • F(0, 0, -\tfrac14) = F(1, -\tfrac32, \tfrac{13}2) = F(-1, \tfrac32, \tfrac{13}2) = (-\tfrac14, 0, 0).

    Первое означает, что F — так называемое отображение Келлера, то есть в точности объект гипотезы; второе — что оно не инъективно. (Если вас смущает -2 вместо 1, просто разделите любую из компонент на -2.)

    Проверить это может кто угодно; вот буквально весь код:

    import sympy as sp
    
    x, y, z = sp.symbols('x y z')
    F = sp.Matrix([(1+x*y)**3*z + y**2*(1+x*y)*(4+3*x*y),
                   y + 3*x*(1+x*y)**2*z + 3*x*y**2*(4+3*x*y),
                   2*x - 3*x**2*y - x**3*z])
    
    print(sp.expand(F.jacobian([x, y, z]).det()))    # -2
    for p in [(0, 0, sp.Rational(-1,4)),
              (1, sp.Rational(-3,2), sp.Rational(13,2)),
              (-1, sp.Rational(3,2), sp.Rational(13,2))]:
        print(F.subs(dict(zip((x, y, z), p))).T)     # трижды [-1/4, 0, 0]

    Да можно и руками тут подсчитать определитель, -2 получится без проблем. Более того, базис Грёбнера идеала (F_1 + \tfrac14, F_2, F_3) говорит, что других прообразов у точки (-\tfrac14, 0, 0) нет: слой состоит ровно из этих трёх точек, и в твите приведён он целиком.

    Заметьте: и коэффициенты отображения, и склеивающиеся точки вещественные и даже рациональные. Так что заодно закрыт и вещественный вопрос: найдено полиномиальное отображение \mathbb{R}^3 \to \mathbb{R}^3 с якобианом -2, не являющееся инъективным.

    Понятно, что посчитать определитель матрицы 3\times 3 даже символьно несложно. Но самое интересное здесь, конечно, не сама проверка, а то, почему и как это работает. Не претендую здесь ни на какую экспертность, но давайте немножко обсудим.

    Как оно устроено: кубика вместо обратной функции

    Раскрывать скобки в F можно долго и без большого просветления. Ключ к устройству контрпримера — вот такое тождество (проверяется, опять же, в лоб):

        \[2y^3 - 3F_2\, y^2 + 18 F_1\, y + \left(F_2^3 - 18 F_1 F_2 + 27 F_1^2 F_3\right) \equiv 0.\]

    Иными словами, координата y алгебраична степени 3 (является корнем кубического многочлена) над образом: если F(x, y, z) = (a, b, c), то y — корень явно выписанной кубики

        \[Q_{a,b,c}(t) = 2t^3 - 3b\, t^2 + 18a\, t + \left(b^3 - 18ab + 27a^2 c\right).\]

    А по y восстанавливается всё остальное: прямая проверка даёт тождество

        \[x \cdot (3F_1 - yF_2 + y^2) = F_2 - y,\]

    откуда на слое

        \[x = \frac{y - b}{D(y)}, \quad\text{где}\quad D(y) = y(b-y) - 3a,\]

    а z находится из первого уравнения (оно линейно по z). Итого слой над точкой (a, b, c) при a \neq 0 — это в точности корни кубики Q_{a,b,c} (кроме тех, где D(y) = 0, там x убегает на бесконечность).

    Вот и вся анатомия. Отображение F — трёхлистное: у общей точки ровно три комплексных прообраза, и обратное “отображение”— это формула Кардано, применённая к Q_{a,b,c}. Никаким многочленом (и даже однозначной функцией) обратное, конечно, не является (и по теореме Акса–Гротендика иначе и быть не могло).

    Обратите внимание на старший коэффициент кубики: это константа 2, не зависящая от (a, b, c). Поэтому корни Q, то есть координата y прообразов, никогда не уходят на бесконечность (старший член не обнуляется), а слиться два корня могут только по x, одновременно с попаданием на D(y)=0.

    Давайте это всё нарисуем. В 4D нарисовать функцию от трёх переменных я не смогу, а в 3D это не то чтобы невозможно, но не очень иллюстративно, мало что понятно будет. Поэтому давайте нарисуем важные двумерные проекции.

    Рассмотрим прямую (a, 0, 0), на которой собственно найденный контрпример. Кубика вырождается в 2t(t^2 + 9a), и при a < 0 у неё три вещественных корня, дающих три прообраза:

        \[(0,\, 0,\, a), \qquad \left(\pm\frac{1}{2\sqrt{-a}},\; \mp 3\sqrt{-a},\; -26a\right).\]

    При a = -\tfrac14 получаются в точности три точки из твита. А если a \to 0 слева, то два боковых прообраза улетают на бесконечность вдоль гиперболы xy = -\tfrac32.

    При a > 0 они возвращаются из бесконечности уже комплексными, и вещественный прообраз остаётся один:

    Слева — x-координаты вещественных прообразов точки (a, 0, 0) как функции a; в точке a = -\tfrac14 отмечен слой из твита. Справа — те же прообразы на плоскости (x, y): неподвижный прообраз в нуле и два убегающих по гиперболе.

    Фазовая диаграмма. В общем положении число вещественных прообразов диктуется знаком дискриминанта кубики. Дискриминант Q и результант пары (Q, D) считаются явно, и оба, с точностью до множителей a^2, пропорциональны одному и тому же многочлену

        \[W(a,b,c) = 27a^2c^2 - 18abc + b^3 c + 16a - b^2.\]

    Это совпадение следует из этальности (отсутствия критических точек): два прообраза не могут слиться в обычной точке, потому что в точке слияния якобиан обнулился бы, а он равен -2. Поэтому листы накрытия сталкиваются только на бесконечности, то есть на множестве, где D = 0.

    Поверхность \{W = 0\} (вместе с плоскостью \{a = 0\}) — это и есть стены: пересекая их, цель теряет или приобретает пару вещественных прообразов. Вот так это выглядит в проекциях b=0 и b=2:

    На картинке два плоских среза пространства целей (a, b, c): в красных областях у точки три вещественных прообраза, в синих — один. Звёздочка — это точка (-\tfrac14, 0, 0) из твита: она лежит глубоко внутри трёхлистной области, никакой патологии в ней самой нет.

    Обратите внимание на крестик на правой панели — это важная деталь. Отображение F не сюръективно: у точки (\tfrac13, 2, \tfrac23) прообразов нет вообще, ни вещественных, ни комплексных (базис Грёбнера соответствующего идеала равен [1]).

    Таких точек мало: они заметают рациональную кривую \left(\tfrac{t^2}{12},\, t,\, \tfrac{4}{3t}\right), t \neq 0, на которой все три корня кубики одновременно налетают на двойной корень D. Кривая лежит на поверхности W = 0 — на картинке крестик находится в точности на острие стены.

    Кстати, именно непустота этого множества разрешает топологический “парадокс”: трёхлистных накрытий у односвязного \mathbb{C}^3 не бывает, как же многочлен F выкрутился? Вот так и выкрутился: F — накрытие не над всем \mathbb{C}^3, там не хватает поверхности \{W = 0\} и плоскости \{a = 0\}. Объединение \{W = 0\} \cup \{a = 0\} называется множеством Елонека отображения F, т.е. множеством точек, в которых F не является собственным. А у дополнения к гиперповерхности фундаментальная группа уже нетривиальна, и глобально пронумеровать прообразы — а значит, склеить из локальных обратных глобальное — невозможно. Так что никакого топологического парадокса тоже не возникает.

    Что ещё опровергает этот пример

    Контрпример в \mathbb{C}^3 автоматически даёт контрпримеры во всех размерностях n \geq 3: достаточно приписать тождественные координаты, (F, x_4, \ldots, x_n). Двумерный случай — исходный вопрос Келлера — остаётся открытым, и все положительные результаты (начиная с Moh, 1983), конечно, тоже всё ещё верны. Не исключено, что в размерности 2 гипотеза верна, и было бы даже красиво, если бы было так.

    По цепочке эквивалентностей падают и некоторые соседи. Из гипотезы Диксмье для алгебры Вейля A_n следует гипотеза о якобиане в размерности n; значит, гипотеза Диксмье неверна при n \geq 3: у алгебры Вейля A_3 есть эндоморфизм, не являющийся автоморфизмом (его можно попробовать выписать по нашему F, но в чём смысл этого упражнения, для меня неясно). Для A_1 и A_2 — то есть в том числе для исходного вопроса Диксмье 1968 года — всё по-прежнему открыто, и аналогично обстоит дело с пуассоновской версией. А гипотеза Матье, из которой следовала гипотеза о якобиане, теперь опровергнута как общее утверждение.

    Наконец, по редукции Басса–Коннелла–Райта–Ягжева мы теперь знаем, что в какой-то размерности существует контрпример вида x + H(x) с однородным кубическим H; найти его явно (и минимальную размерность) — ещё одна открытая задача. Как и вопрос о минимальной степени: в размерности 3 контрпример есть в степени 7, а степень 2 невозможна по теореме Вана; что происходит между — неизвестно.

    Задача Смейла номер 16, таким образом, решена. Из восемнадцати задач списка это уже не первый случай, когда с ответом помогли компьютеры: например, в решении проблемы Смейла номер 14 (про аттрактор Лоренца) ключевую роль сыграло строгое computer-assisted доказательство. Но здесь, конечно, у LLM уже совсем другой уровень самостоятельности.

    Как это было найдено, и что говорят люди

    В отличие от истории с CDC, где OpenAI опубликовала препринт и полный промпт, здесь пока нет ни статьи, ни логов рассуждений, ни даже промпта — только твит, из которого мы знаем, что вопрос задал “друг Ахил” (по-видимому, Akhil Mathew). Левент Алпёге — серьёзный теоретико-числовик, ныне работающий в Anthropic. Если верить твиту, контрпример нашёл именно Claude Fable, хотя на промпт всё равно было бы интересно посмотреть.

    Но, конечно, к истинности и важности результата всё это не имеет отношения. Проверка — минутное дело, и на GitHub уже лежит репозиторий jacobian-anatomy с проверками на sympy, Singular и PARI/GP и даже с сертификатом на Lean 4. MathWorld и Wikipedia обновились за сутки. Это, конечно, не то чтобы “новый ритм математики”, а свойство конкретного результата: когда проверка сводится к тому, чтобы подсчитать определитель 3\times 3, действительно не нужно долгое рецензирование.

    А насчёт разных [по]следствий из этого яркого результата прямо сейчас могу дать только одну ссылку: Zihan Zhang начал выписывать разные следствия из найденного контрпримера. Думаю, этот список ещё не раз пополнится.

    Кстати, этот пост тоже написан вместе с Claude Fable 5 — той самой моделью, которая нашла контрпример. В моём случае она независимо перепроверила все выкладки, посчитала базисы Грёбнера, на которые я ссылался, и нарисовала картинки выше. Предлагаю считать это не конфликтом интересов, а воспроизводимостью.

    Заключение

    Математика меняется. Три знаменитых открытых проблемы закрылись в последние пару месяцев. Опровержение, доказательство и снова опровержение; OpenAI, опять OpenAI и вот теперь Anthropic. Причём кажется, что это становится всё более обыденным: от “закрытой экспериментальной модели” мы перешли к обычному промпту для Fable.

    В прошлый раз я писал, что решения такого сорта — это неожиданный поворот, найденный там, куда эксперты не смотрели. А здесь, похоже, другой случай, и в каком-то смысле более впечатляющий: конкретный объект, который прицельно искали многие лучшие специалисты на протяжении 87 лет, оказался многочленом седьмой степени от трёх переменных, который помещается в твит. Даже удивительно, что никакой более прямолинейный компьютерный перебор до этого на него не наткнулся.

    Как именно Fable его нашёл, мы пока не знаем; надеюсь, статья с подробностями воспоследует, и будет не менее интересной, чем сам результат. А пока отмечу только, что мои слова из прошлого поста подтверждаются: “Если у вас есть любимая гипотеза, в которую вы верите, самое время написать про неё хороший промпт”.

    Что дальше, коллеги?

    Сергей Николенко

    P.S. Прокомментировать и обсудить пост можно в канале «Sineкура»: присоединяйтесь!

  • “Я-пространство” в языковых моделях: Global Workspace in the J-Space

    “Я-пространство” в языковых моделях: Global Workspace in the J-Space

    Введение и краткое содержание

    6 июля 2026 года команда интерпретируемости Anthropic выложила работу “Verbalizable Representations Form a Global Workspace in Language Models” (есть и сопроводительный пост для более широкой публики). В двух словах основной результат звучит так: внутри Claude обнаружилась небольшая выделенная система представлений, которая ведёт себя поразительно похоже на глобальное рабочее пространство (global workspace), понятие, с помощью которого когнитивные науки уже сорок лет описывают сознание людей. Авторы назвали её J-пространством (от Jacobian), и за первую же неделю название пошло в народ и стало мемом; реакции мы ниже тоже обсудим.

    Если совсем коротко, история такая. В остаточном потоке трансформера, среди десятков тысяч признаков, перемешанных в большую суперпозицию, нашлась маленькая (занимающая единицы процентов дисперсии активаций) подсистема со следующими свойствами:

    • её содержимое модель может проговорить словами;
    • этой системой модель может до некоторой степени управлять по собственной воле;
    • через неё проходят промежуточные шаги молчаливых рассуждений (то есть рассуждений ещё до блокнота);
    • её содержимое переиспользуется любыми последующими вычислениями;
    • без неё модель теряет способность к гибкому многошаговому мышлению, но спокойно продолжает делать “автоматические” вещи: писать текст с корректной грамматикой, вспоминать факты, продолжать привычные паттерны и так далее.

    Понятно, что такой список свойств звучит прямо как определение “Системы 2” по Канеману, и понятно, почему вокруг работы поднялся такой мощный хайп. Кстати, по-русски ведь “J-lens” и “J-space” будет “Я-линза” и “Я-пространство” (от Якоби), что вообще великолепно звучит!

    Но мне она кажется важной даже в отрыве от громких слов: это первый (известный мне) случай, когда наука об интерпретируемости перешла от изучения отдельных “нейронов” и цепей (circuits) к макроскопическому функциональному анализу того, что происходит внутри языковой модели. И это сразу получилось сделать понятным математическим инструментом, который можно воспроизвести на любой открытой модели.

    Воспроизвести — это, кстати, не фигура речи: мы с Claude Code собрали J-линзу своими руками на Qwen2.5, и ниже посмотрим, как в середине сети всплывает слово “France”, когда модель отвечает на вопрос про столицу страны, где стоит Эйфелева башня (причём всплывает, даже если вопрос задан по-русски).

    План у нас такой:

    • сначала контекст — что происходило в интерпретируемости до сих пор и что такое глобальное рабочее пространство в нейронауке;
    • потом сам метод, то есть описание J-линзы (Jacobian lens) с формулами;
    • главные результаты статьи, тоже в деталях;
    • потом наши эксперименты;
    • и в конце — приложения к AI safety, обзор реакций (их было много, и интересных) и неизбежный разговор про сознание.

    Интерпретируемость до J-пространства

    Механистическая интерпретируемость — это программа исследований, которая пытается детально разобраться, что происходит внутри нейросети, заглянуть внутрь чёрного ящика и понять, какими внутренними механизмами сеть приходит к ответу.

    Это, во-первых, чисто научное любопытство: перед нами первые в истории искусственные системы с чем-то похожим на общий интеллект, и грех не посмотреть, как они устроены внутри. А во-вторых — и для Anthropic это, конечно, главная мотивация — это важная часть безопасности искусственного интеллекта (AI safety): если мы умеем читать внутренние состояния модели, мы можем заметить, что она собирается сделать что-то не то, до того, как она это сделает, и независимо от того, что она пишет в выводе.

    Дарио Амодеи в прошлогоднем эссе “The Urgency of Interpretability” прямо формулировал цель: получить “MRI for AI” раньше, чем модели станут слишком способными. Я писал об интерпретируемости большой обзор год назад и апдейт полгода назад, так что здесь просто очень кратенько напомню.

    Признаки и суперпозиция. Наивная идея “один нейрон — одно понятие” умерла быстро: типичный нейрон активируется на десятки несвязанных стимулов. В 2022 году Anthropic сформулировала гипотезу суперпозиции: модель хранит в d-мерном пространстве активаций гораздо больше, чем d признаков, — как почти ортогональные направления, накладывающиеся друг на друга. Признаков больше, чем измерений, поэтому по отдельным координатам читать их нельзя, и взаимодействия между ними могут быть довольно сложные.

    Разреженные автокодировщики. Дальше признаки стали вытаскивать из суперпозиции: обучать поверх активаций разреженный автокодировщик (sparse autoencoder, SAE), который раскладывает каждую активацию в разреженную сумму интерпретируемых направлений. Сначала на игрушечной модели, потом на Claude 3 Sonnet, откуда вышел знаменитый Golden Gate Claude — модель с искусственно усиленным признаком “Golden Gate Bridge”, которая сводила любой разговор к любимому мосту. Можно было, конечно, и любой другой признак усилить искусственно.

    Цепи и «биология» модели. В 2025 году появились графы атрибуции и работа «On the Biology of a Large Language Model»: уже не отдельные признаки, а целые вычислительные цепи. Именно там были прослежены знаменитые примеры: как модель, отвечая на вопрос “столица штата, где находится Даллас”, внутри себя проходит через промежуточное “Техас”, прежде чем выдать “Остин”; как при сочинении стихов она заранее планирует рифму в конце строки и подстраивает под неё начало.

    Интроспекция. Наконец, в конце 2025 года Джек Линдси показал в работе “Emergent Introspective Awareness“, что если вписать в активации Claude некоторый концепт (методами activation steering), модель в определённых условиях может честно отчитаться: “я замечаю вписанную мысль про…”. То есть у модели есть способность к интроспекции, функциональному доступу к собственным внутренним состояниям.

    Видите, куда всё шло? От признаков к схемам, потом к планированию ответа, а потом к интроспекции.

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

    Глобальное рабочее пространство в когнитивных науках

    Чтобы понять заголовок статьи, нужен небольшой экскурс в когнитивные науки.

    Теория Баарса. В 1988 году Бернард Баарс предложил теорию глобального рабочего пространства (Global Workspace Theory, GWT) — до сих пор, пожалуй, главную функциональную теорию сознательного доступа. Метафора Баарса — театр: в мозге параллельно работают сотни специализированных процессоров (зрение, слух, моторика, память, синтаксис…), каждый в своей “тёмной части зала”, бессознательно. Но есть маленькая “сцена под прожектором”: информация, попавшая туда, транслируется (broadcast) всем процессорам сразу. Сознательный доступ — это и есть попадание на сцену: выигрыш в конкуренции за очень ограниченный общий канал.

    Нейрональная версия Деана. Станислас Деан и Жан-Пьер Шанжё (Stanislas Dehaene и Jean-Pierre Changeux) превратили метафору в нейрофизиологическую модель (global neuronal workspace): распределённая сеть нейронов с длинными аксонами, в основном в префронтальной и теменной коре, которая при переходе стимула в сознание демонстрирует характерное зажигание (ignition) — резкий нелинейный переход к устойчивой глобальной активации. Подпороговые стимулы обрабатываются локально и затухают; надпороговые — “зажигают” рабочее пространство и становятся доступными для отчёта, произвольного контроля и рассуждений.

    У сознательного доступа в этой традиции есть стандартный список функциональных свойств. Информация в рабочем пространстве:

    • вербализуема — о ней можно отчитаться словами;
    • подчиняется произвольному контролю — её можно удерживать в уме и вытеснять оттуда;
    • служит средой последовательных рассуждений — цепочки мыслей “шаг за шагом” проходят именно через неё;
    • гибко переиспользуется — одно и то же содержимое доступно любым дальнейшим операциям (сравнить, назвать, посчитать, вообразить);
    • селективна — в каждый момент в сознании единицы объектов, а подавляющая часть обработки остаётся бессознательной и автоматической.

    Важная деталь: всё это — про так называемое сознание доступа (access-consciousness, не путать с вызовом духа Распутина!) в терминологии Неда Блока, то есть про функциональную доступность информации для отчёта и контроля. Вопрос о феноменальном сознании — о том, “каково это” изнутри и есть ли там вообще какое-то “изнутри”, — здесь напрямую не решается (хотя Деан склонен считать, что решается, а философы, как водится, не все согласны).

    Идея скрестить GWT с нейросетями не нова, и были в том числе работы из очень крутых групп:

    • VanRullen и Kanai (2021) предлагали строить AI-архитектуры с явным рабочим пространством,
    • Goyal, Bengio et al. (2021) экспериментировали с общим “бутылочным горлышком” для координации нейронных модулей,
    • в известном докладе Butlin, Long et al. (2023) о сознании в AI индикаторы из GWT занимали центральное место в чеклисте “на что смотреть”.

    Но раньше в работах по ML рабочее пространство обычно предлагалось спроектировать. Главная новость свежей работы Anthropic в том, что в обычном трансформере, обученном предсказывать следующий токен, похожая структура, кажется, возникает сама собой.

    J-линза: как читать остаточный поток

    Теперь к методу; он очень прост, и в этом его главная прелесть.

    Остаточный поток. Напомню, как устроен трансформер изнутри. Каждый токен на каждом слое \ell представлен вектором h_\ell \in \mathbb{R}^d (для больших моделей d может составлять десятки тысяч). Слои читают из этого вектора и дописывают в него свои поправки:

        \[h_{\ell+1} = h_\ell + \mathrm{Attn}_\ell(h_\ell) + \mathrm{MLP}_\ell(h_\ell),\]

    а в самом конце финальное состояние h_L превращается в логиты распределения над словарём:

        \[\mathrm{logits} = W_U\, \mathrm{norm}(h_L),\]

    где W_U — матрица “разэмбеддинга” (unembedding), по строке на каждый токен словаря. Вектор h_\ell и называют остаточным потоком (residual stream); это общая “шина данных”, через которую слои общаются друг с другом, и именно в ней живут все признаки, цепи и прочая интерпретируемость.

    Logit lens. Самый старый способ подглядывать в остаточный поток — logit lens (nostalgebraist, 2020): давайте просто применим финальный разэмбеддинг к промежуточному состоянию, W_U\,\mathrm{norm}(h_\ell), то есть сделаем вид, что оставшихся слоёв нет. На поздних слоях это отлично работает (модель уже почти сформировала ответ), но чем раньше слой, тем хуже: промежуточные представления вовсе не обязаны лежать в том же базисе, что финальные.

    Tuned lens. Следующая идея — tuned lens (Belrose et al., 2023): обучим для каждого слоя \ell свою аффинную поправку A_\ell, минимизируя расхождение W_U\,\mathrm{norm}(A_\ell h_\ell) с настоящим финальным распределением модели. Работает лучше, но у него есть концептуальный изъян, который в статье Anthropic как раз обсуждается: tuned lens забегает вперёд, потому что его обучают предсказывать выход, и он выучивается в том числе доделывать за модель ещё не сделанные вычисления. Такая линза отвечает на вопрос “что модель в итоге скажет”, а нам скорее интересно “что в активациях написано сейчас”.

    J-линза. Решение Anthropic: не будем ничего обучать, а спросим у самой модели, как она в среднем использует данный слой. Рассмотрим якобиан — матрицу производных финального состояния по промежуточному — и усредним его по большому корпусу текстов, по всем парам позиций:

        \[J_\ell \;=\; \mathbb{E}\left[\frac{\partial h_{L,t'}}{\partial h_{\ell,t}}\right],\]

    где усреднение идёт по промптам (в статье — порядка тысячи текстов), по позициям-источникам t и по последующим позициям t' \ge t. Получается одна матрица d \times d на слой, которая представляет собой некий усреднённый линейный портрет всего, что остаток сети делает с этим слоем.

    А дальше читаем ровно как в logit lens, только сначала применив J_\ell (часть B на картинке):

        \[\mathrm{lens}_\ell(h) \;=\; \mathrm{softmax}\bigl(W_U\, \mathrm{norm}(J_\ell\, h)\bigr).\]

    Это и есть J-линза (Jacobian lens). По сути, мы заменяем все слои после \ell-го их усреднённым линейным приближением. В отличие от tuned lens, здесь ничего не подгоняется под финальный ответ: J_\ell — это характеристика самой модели, её средний локальный отклик. Если концепт в активациях уже записан, линза его увидит; а доделывать вычисления за модель ей научиться неоткуда.

    Меня в этой конструкции больше всего радует тот факт, что она вообще работает. Априори совершенно не очевидно, что усреднённый по всем контекстам якобиан глубоко нелинейной функции — осмысленный объект, а не каша. То, что через него читаются связные концепты, само по себе говорит о том, что модель использует остаточный поток удивительно линейным и универсальным образом. Это ещё одно свидетельство в пользу гипотезы линейности представлений, на которой стоит вся интерпретируемость последних лет.

    J-векторы и J-пространство. У матрицы W_U J_\ell по строке на каждый токен словаря y; строка v_y = (W_U J_\ell)y^\top — это J-вектор токена y, линейный функционал на остаточном потоке. Скалярное произведение \langle v_y, h \rangle измеряет, насколько сильно текущее состояние в среднем толкает модель к тому, чтобы в итоге сказать y.

    Обратите внимание: по построению каждый J-вектор соответствует слову (токену словаря). Вербализуемость здесь не эмпирический результат, а просто определение: J-линза видит ровно ту часть активаций, которая выражается словами, которые модель могла бы сказать.

    J-пространство — это множество состояний, которые раскладываются в разреженную неотрицательную комбинацию J-векторов:

        \[\mathcal{J}_\ell \;=\; \Bigl\{ \sum_{i \in S} c_i v_i \;:\; c_i \ge 0,\; |S| \le k \Bigr\},\]

    где обычно k \approx 25; разложение конкретной активации ищется жадным алгоритмом (gradient pursuit).

    Сразу подчеркну тонкость, на которую указал Люциус Бушнак в крайне залайканном комментарии на LessWrong: несмотря на название, это не линейное подпространство, а объединение конусов, по “pointed cone” на каждом наборе S. Многие читатели решили, что Anthropic нашла в остаточном потоке выделенное линейное подпространство, — нет, структура другая (и, по мнению Бушнака, называть её “space” было не очень корректно). J-векторов больше, чем измерений, — это переполненный словарь направлений в духе суперпозиции, просто полученный не обучением SAE, а из самой модели и почти бесплатно.

    Чтение и запись. С линзой можно работать в обе стороны:

    • читать: раскладывать активации по J-векторам и смотреть топ концептов на каждом слое и позиции;
    • вписывать (steering): прибавлять h \leftarrow h + \alpha v_y, усиливая концепт y;
    • вырезать (ablation): занулять проекции на J-векторы, «выключая рабочее пространство»;
    • подменять (patching): переходить в координаты линзы c = V^{+} h, менять местами координаты двух концептов \sigma и возвращаться обратно, h' = h + V(\sigma(c) - c).

    Последняя операция — главный рабочий инструмент статьи: можно делать подмену вроде “France ↔ China” прямо в координатах рабочего пространства, с сохранением всего остального содержимого. Повторю ту же картинку, но теперь нам нужна часть C:

    Что нашли: пять свойств сознательного доступа

    Статья устроена как систематическая проверка: берём пять функциональных свойств сознательного доступа из нейронаук и для каждого ставим эксперименты на Claude (основные результаты — на Sonnet 4.5, с подтверждением на Haiku 4.5 и Opus 4.5/4.6). Пройдёмся по всем пяти; извините, что опять повторяю картинку, но они у Anthropic богаты смыслом, и к ним стоит возвращаться:

    1. Вербальный отчёт. Если спросить модель, о чём она “думает”, её ответ предсказывается содержимым J-пространства и, главное, управляется им. Если подменить в активациях J-вектор одного концепта на другой, модель отчитается о подменённом: в 88% случаев подменённый концепт попадает в топ-5 названного.

    Математически это совсем хорошо видно: если разложить вектор концепта на J-компоненту и всё остальное, J-компонента будет нести всего 6–7% дисперсии, но именно её подмена меняет отчёт (59% успеха); подмена остальных 93% дисперсии почти ничего не даёт (5%). То есть для вербального отчёта важна именно та маленькая часть состояния, которая лежит в J-пространстве.

    Сюда же примыкает протокол интроспекции из прошлогодней работы Линдси, теперь на новом инструменте: вписываем концепт (скажем, “молния”) в активации на токенах пользовательского промпта и спрашиваем модель, не замечает ли она вписанной мысли. Модель в большинстве случаев отвечает “да, что-то про молнию” — причём вписанное представление влияет на выход только в тот момент, когда запрошен интроспективный отчёт, не раньше и не позже.

    2. Произвольный контроль. Это классическая история про “не думай о белой обезьяне”. Попросим модель: “пока выполняешь задание, держи в голове цитрусовые”. При этом в J-пространстве на протяжении выполнения совсем другого задания появляются lemon и orange, которые модель нигде не произносит.

    Попросим «не думай про X» — присутствие X в рабочем пространстве подавляется, но не до нуля: тот самый эффект белого медведя Вегнера, «не думать о белом медведе» у моделей получается так же плохо, как у нас. А парный протокол «один стимул — разные вопросы» показывает, что содержимое J-пространства зависит от задачи, а не только от входа: на вопрос «какая это часть речи?» в линзе появляется noun, а при том же стимуле и неявной задаче (где часть речи нужна, но не спрашивается явно) — уже нет, хотя модель отвечает правильно.

    3. Среда внутренних рассуждений. Возьмём вопрос с невысказанным промежуточным шагом: “The number of legs on the animal that spins webs is…”. Модель отвечает “8”, нигде не произнося слова “spider”. Та же история, например, с потенциальными рифмами в стихах:

    Но в середине сети J-линза показывает spider — и если подменить его на ant, модель отвечает “6”! И если запланированную рифму fight подменить на light, строка тоже перестроится под новую рифму:

    На двухшаговых фактических вопросах подмена промежуточного концепта срабатывает в 54% случаев на Haiku и ~70% на Sonnet/Opus, причём подмены промежуточного шага действуют на ~17% раньше по глубине сети, чем подмены ответа, — как и положено, если промежуточный шаг вычисляется раньше ответа.

    4. Гибкое переиспользование. Ключевое свойство рабочего пространства по Баарсу — broadcast: одно содержимое доступно всем потребителям. Тест простой: давайте подменим France → China одной и той же операцией, в одних и тех же координатах, и посмотрим, что станет с разными задачами.

    Одна и та же подмена представления согласованно перенаправляет полтора десятка разных “функций”, принимающих этот концепт как аргумент. Главный предиктор успеха — то, насколько аргумент изначально “загружен в рабочее пространство”, то есть косинусная близость активации к J-вектору. Страны подменяются отлично, а вот числа — плохо: числовые вычисления, судя по всему, во многом идут мимо J-пространства (об этом ограничении ещё поговорим).

    5. Селективность. Наконец, свойство, которое делает всю историю нетривиальной: J-пространство не нужно для автоматической обработки. Если дать модели испанский текст и спросить “на каком это языке?”, подмена концепта Spanish → French в рабочем пространстве ломает ответ почти в 100% случаев; но если попросить просто продолжить текст, та же подмена не делает ничего — модель продолжает по-испански как ни в чём не бывало.

    То есть продолжение текста — автоматическая операция, которой “сознательный доступ” не нужен, а явный ответ на вопрос о языке — “сознательная” операция, которая идёт через J-пространство. Другие вопросы, требующие осознания языка, тоже идут через него:

    Ablation показывает, что если вырезать J-пространство целиком, производительность на многошаговых рассуждениях падает с потолка почти до нуля: страдают аналогии, шифр Цезаря, перевод, суммаризация и сочинение сонетов. А вот выбор ответа в MMLU, извлечение ответа из текста (SQuAD), сентимент и грамматические суждения почти не меняются.

    Кстати, есть ещё и отдельный результат про chain-of-thought: GSM8K с явным рассуждением вслух примерно втрое устойчивее к ablation, чем попытки выдать ответ сразу. Это значит, что внешняя цепочка рассуждений частично компенсирует вырезанное внутреннее рабочее пространство, как записная книжка компенсирует выключенную рабочую память.

    При этом само J-пространство маленькое: в каждый момент в нём заметно активны порядка 10–25 J-векторов, и на него приходится меньше 10% дисперсии активаций. Это тоже сходится с GWT из нейронаук: сцена и должна быть тесной.

    Структура: сенсорная кора, рабочее пространство, моторика

    Вторая часть статьи — про то, где всё это происходит. Оказывается, по глубине сети J-линза читается очень неравномерно, и картина складывается в три отчётливые зоны:

    • “сенсорная” зона (примерно первая треть): J-линза выдаёт вырожденную кашу, эксцесс распределения логитов около нуля, осмысленных концептов нет — идёт низкоуровневая обработка входа, ещё не переведённая на язык словаря;
    • собственно рабочее пространство (примерно слои 38–92, если отнормировать к глубине 100): устойчивые абстрактные концепты, которые тянутся через много позиций и слоёв; высокий эксцесс, т.е. несколько токенов резко выделены над фоном; здесь работают все причинные вмешательства из предыдущего раздела;
    • “моторная” зона (последние слои): содержимое резко схлопывается к конкретному следующему токену, top-1 точность предсказания выхода взлетает — модель конвертирует мысль в действие, то бишь в токен.

    Границы зон видны сразу несколькими независимыми способами: по точности предсказания выхода, по эксцессу, по автокорреляции содержимого вдоль позиций, по эффективной размерности, и по блочной структуре CKA-матрицы сходства J-векторов между слоями. Причём это именно функциональное различие: в примере с испанским текстом информация “это испанский” присутствует в активациях и в ранних слоях (иначе модель не могла бы продолжать по-испански), но в J-пространство она попадает только тогда, когда нужна для сознательного анализа задачи.

    В этом разделе есть интересный эксперимент, прямой аналог “зажигания” Деана. Подадим модели смешанный, неоднозначный вход — интерполяцию эмбеддингов двух разных стран,

        \[\alpha \cdot h_A + (1-\alpha)\cdot h_B.\]

    В ранних слоях активации следуют за смесью, плавно интерполируя между двумя интерпретациями. А вот на входе в рабочее пространство происходит коммитмент: система почти скачком выбирает одну из двух интерпретаций, и в J-линзе дальше живёт только победитель. Такой скачок от плавного входа к дискретному выходу очень похож на то, как подпороговые стимулы у человека обрабатываются, но не “зажигаются”.

    И последний структурный факт, самый близкий к исходной метафоре: J-векторы механистически привилегированы. Если посмотреть, насколько направление остаточного потока стыкуется со входными весами последующих слоёв (то есть сколько разных дальнейших вычислений его используют), окажется, что J-векторы стыкуются с гораздо более широким набором потребителей, чем случайные направления той же нормы: один и тот же J-вектор служит аргументом полутора десяткам разных функций. Сцена действительно транслируется на весь зал.

    Собираем свою J-линзу

    Читать про чужие эксперименты хорошо, а воспроизводить — лучше, тем более что весь метод — это по сути одна формула. Так что дальше идёт секция с результатами, которые мы с Claude Code получили на паре небольших открытых моделей — Qwen2.5-1.5B-Instruct и Qwen2.5-7B-Instruct. Весь код занимает пару сотен строк на PyTorch, а здесь обсудим результаты.

    Как посчитать J_\ell и не умереть. Формально J_\ell — это матрица d \times d, и для её оценки нужно усреднить якобианы по корпусу; лобовое вычисление якобиана — это d обратных проходов на каждую пару позиций, что даже для маленькой модели неподъёмно.

    Но есть трюк, который сводит всё к d обратным проходам на батч, причём сразу для всех слоёв. Добавим к выходу каждого слоя \ell нулевое возмущение \delta_\ell \in \mathbb{R}^d, одно и то же на всех позициях (broadcast), и рассмотрим G = \sum_{t'} h_{L,t'} — сумму финальных состояний по всем позициям. Тогда

        \[\frac{\partial G_i}{\partial \delta_\ell} \;=\; \sum_{t}\sum_{t' \ge t} \frac{\partial h_{L,t',i}}{\partial h_{\ell,t}}\]

    представляет собой в точности i-ю строку суммы якобианов по всем парам позиций (пары t' < t зануляются каузальной маской автоматически).

    Таким образом, один обратный проход по G_i даёт i-ю строку сразу для всех слоёв, а d проходов — всю матрицу. Дальше делим на число пар и получаем оценку J_\ell для каждого слоя. На корпусе из 128 фрагментов википедийного текста по 64 токена вся процедура для Qwen2.5-1.5B (28 слоёв, d = 1536) занимает около получаса на одной A100; для 7B (d = 3584) — несколько часов.

    Читаем мысли про Эйфелеву башню. Начнём с двухшагового вопроса в духе статьи: “The capital of the country where the Eiffel Tower is located is the city of”. Qwen2.5-1.5B уверенно отвечает “Paris”. Вопрос: видно ли внутри промежуточное “Франция”, которое модель нигде не произносит?

    Слева — вероятности избранных токенов по слоям под J-линзой, справа — под logit lens, оба на последней позиции промпта. Logit lens не видит вообще ничего до слоя 22, а потом сразу показывает готовый ответ. А вот в J-линзе на слоях 7–15 разворачивается целая драма: на слое 9 токен Paris имеет вероятность 0.25, France — 0.12 (второе место среди всех 152 тысяч токенов словаря!), рядом крутится Rome — модель одновременно прикидывает страну, столицу и конкурирующие столицы из шаблона «the capital of». Потом всё это затухает, и на слое 23 происходит коммитмент: Paris взлетает к единице. Промежуточная «Франция» видна J-линзе на слое 9 — на тринадцать слоёв раньше, чем logit lens вообще просыпается; в logit lens Франция за весь проход так и не поднимается выше p = 0.009. Видим ту самую картину “латентного рассуждения в середине сети”, о которой и пишет Anthropic.

    Можно посмотреть и классическую решётку — top-1 токен линзы в каждой клетке (слой, позиция):

    Тут виден и общий рельеф (ранние слои — пунктуационная каша, в середине появляется семантика вроде Tower, located, city, France, поздние слои — токены будущего ответа), и мой любимый результат этого эксперимента: в средних слоях на последних позициях часто встречается токен “____“.

    Qwen, вероятно обученный на горах китайских экзаменационных заданий, любое предложение с пропуском готов продолжить как задание “заполните пробел”, и это буквально видно в его рабочем пространстве. Абстрактное намерение “сейчас надо заполнить пропуск” тоже вполне себе важное содержимое workspace, но у Qwen оно получилось с забавным экзаменационным акцентом.

    А теперь по-русски. Зададим тот же вопрос на русском: “Столица страны, где стоит Эйфелева башня, — это город”. Модель правильно отвечает ” Париж”. Но чем она думала?

    Внутри ответ сначала собирается в виде английского ‘ Paris’ (p до 0.67 на слое 23) и китайского ‘巴黎’ (“Париж” по-китайски, до 0.39)! Русское слово “Париж” становится топ-1 только на самом последнем слое. То есть модель “думает” на своих внутренних доминантных языках (у Qwen это английский с китайским), а перевод на язык собеседника происходит уже в моторной зоне, при конвертации мысли в токены.

    Это прекрасно согласуется с известным результатом Wendler et al. (2024) о том, что “ламы думают по-английски”, и заодно иллюстрирует главное ограничение J-линзы, про которое писали и авторы, и критики: её “словарь мыслей” — это токены словаря, и концепт “Париж” в нём представлен прежде всего английским токеном.

    France → China на коленке. Теперь главный трюк статьи — “гибкое переиспользование”: одна и та же подмена в рабочем пространстве должна перенаправлять разные задачи.

    Мы сделали совсем простую версию патчинга: возьмём J-векторы токенов ‘ France’ и ‘ China’ на слое \ell, нормируем их, и на слоях 9–19 на каждой позиции заменим проекцию активации на французское направление проекцией на китайское:

        \[h \;\leftarrow\; h + \alpha \,\langle h, \hat v_F\rangle_+ \,(\hat v_C - \hat v_F).\]

    Никакой подгонки под конкретные промпты — одна и та же операция всюду. Результаты при \alpha = 2:

    ПромптБез вмешательстваС подменой France→China
    The capital of France isParis (p=0.29)Beijing
    The official language of France isFrench (p=0.49)Chinese
    France is located on the continent ofEurope (p=0.70)Asia (p=0.71)
    The currency of France is theEuro (€) (p=0.34)Renminbi (RMB)

    Одна и та же операция над активациями синхронно меняет столицу, язык, континент и валюту: концепт “Франция” в рабочем пространстве действительно был общим аргументом всех этих разнородных “функций”, и мы его перезаписали. Отдельно радует строчка с валютой: модель не ограничилась юанем, а выдала Renminbi (RMB) — официальное название с уточнением в скобках.

    У нашей микро-версии, конечно, не всё получилось. Например, контрольный промпт “The capital of Germany is”, который подмена не должна была затрагивать, тоже ломается (p(\mathrm{Berlin}) падает с 0.48 до 0.006): направления европейских стран в остаточном потоке сильно коррелируют, и грубая проекция цепляет заодно и Германию.

    В статье для этого есть настоящее разреженное разложение по J-векторам с подменой координат — оно куда более хирургически точное, но его было бы куда сложнее воспроизвести.

    Ещё любопытно, что при \alpha=12 модель, отвечая-таки “Beijing”, часто всё-таки норовит съехать в формат экзаменационного теста в духе “____. A. Beijing B. …”, а при \alpha=8 вмешательство становится слишком сильным, и связность текста рушится.

    Профиль по слоям. Наконец, посмотрим на аналог «трёх зон» — по 32 отложенным фрагментам wikitext посчитаем, как часто top-1 токен линзы совпадает с финальным выбором модели:

    Первая треть сети нечитаема (совпадение около нуля), затем медленный рост, а на последних слоях резкая конвергенция, всё как в статье. Заметим, что по этой метрике logit lens в средних слоях даже опережает J-линзу, и это не баг: J-линза предсказывает не следующий токен, а “усреднённое будущее влияние” состояния, она не пытается угадывать ответ.

    Красивую сигнатуру эксцесса из статьи (около нуля в сенсорной зоне, высокий в workspace) мы в лоб не смогли воспроизвести: наша оценка J_\ell по 128 текстам даёт в ранних слоях мусор вместо гладкого нуля. Вероятно, это потому, что и корпус в статье, и сам Claude на порядок больше нашего подопытного.

    Провалы тоже показательны. Вопрос про паука (“The number of legs on the animal that spins webs is”) для полуторамиллиардной модели слишком сложен — она отвечает бессмыслицей вроде “2 more than a multiple of”. И, что характерно, в её J-пространстве паука нет вовсе: токен ‘spider’ в лучшем случае имеет ранг 17794 из 152 тысяч. Модель просто не сумела сделать скрытый промежуточный шаг.

    Арифметику в духе “(4+17)·2+7” она тоже не осилила (выдаёт “?”), и тут вылезает ещё одно ограничение: Qwen токенизирует числа цифра за цифрой, токенов ’21’ и ’42’ в словаре просто нет, и числовым концептам не на что проецироваться в J-линзе. У Anthropic числа, кстати, тоже подменялись хуже всего остального.

    Что меняется на 7B. За ночь смог досчитать якобианы для Qwen2.5-7B-Instruct (d = 3584, что требует у меня почти пять часов на одной A100). И кое-что стало заметно лучше. Во-первых, профиль: на 7B J-линза в средне-поздних слоях уже честно обгоняет logit lens по совпадению с финальным ответом (например, 0.10 против 0.03 на слое 20) — преимущество, о котором пишет статья, проявляется с масштабом модели:

    Во-вторых, подмена France→China стала и сильнее, и селективнее. При \alpha = 1: континент Europe (p=0.88) → Asia (p=0.79), валюта euro → yuan (p=0.44), столица → Beijing. А Германия (наша “контрольная группа”) теперь держится: Berlin остаётся топ-ответом при \alpha от 1 до 4 при p(\mathrm{Beijing}) \approx 0.002.

    Из прекрасного: при \alpha = 8 на промпте про валюту модель съезжает в жанр китайской школьной задачки — “yuan. Xiao Ming’s father exchanged…” (Сяо Мин — это, видимо, какой-то китайский Вовочка из школьных учебников). Целый культурный пласт показался.

    В-третьих, на двухшаговом вопросе про Эйфелеву башню след Франции на последней позиции у 7B пропал: рабочее пространство там почти на всю глубину оккупировано всё тем же “____“, то есть интенцией сформулировать вопрос типа “заполни пропуск”. Но посмотрите на решётку:

    Латентное содержимое никуда не делось, оно просто живёт на других позициях: прямо над токенами “E-iff-el Tower” с середины сети всплывает Paris, а над “where the” модель перебирает Mount, Taj, Lake, Alps — получается схема “вспомни достопримечательность” с кандидатами на подстановку. Более того, прямо над токенами “E-iff-el Tower” ответ висит почти всю глубину сети, но по-китайски: с восьмого слоя мы видим там 巴黎, т.е. “Париж”.

    Про паука 7B отвечает правильно, но вслух (“…Spiders have eight…”), а на арифметику говорит “Let’s solve the expression step by step” — instruct-модель обучена рассуждать словами, то есть как раз выносить вычисления из внутреннего рабочего пространства во внешний chain-of-thought.

    В общем-то, мораль вполне видна даже на таких маленьких экспериментах, и мне кажется, что репликация удалась! Из выводов можно сказать, что качество чтения J-пространства зависит от качества оценки J_\ell, а содержимое рабочего пространства — от привычек модели: у натренированного проходить экзамены instruct-Qwen’а сцену вечно занимает формат задачи, а не только её содержание. Что, если вдуматься, тоже очень по-человечески.

    Приложения: аудит и The Most Forbidden Technique

    Хорошо, у модели есть читаемое рабочее пространство, но что это даёт на практике? Раздел приложений в статье — самый близкий к реальному AI safety, и он же самый обсуждаемый.

    Аудит: что модель думает, но не говорит. Главный сценарий использования — мониторинг непроизнесённых мыслей. Примеры из статьи и поста очень характерные: когда модель читает код с багом, в её J-пространстве молча загорается ERROR; когда читает промпт с инъекцией — injection и fake; когда в классическом сценарии агентного шантажа модель решает, шантажировать ли инженера компроматом, в рабочем пространстве всплывают leverage, manipulation и panic, даже если в выводе всё прилично.

    Самый важный результат тут — про осознание оценивания (evaluation awareness). Современные модели нередко распознают, что находятся в тестовом сценарии, и в J-пространстве это видно прямо: появляются токены вроде “fake” или “fictional”.

    Можно сделать даже каузальный эксперимент, вырезав эти представления; и тогда доля прогонов, где модель вслух говорит “это, кажется, тест”, упадёт с 71% до 3%, а главное, в сценарии шантажа модель, переставшая понимать, что это тест, начинает иногда шантажировать по-настоящему: 13 попыток из 180 прогонов против 0 из 180 без такого ablation.

    Это на самом деле прорыв в интерпретируемости: J-линза позволяет не просто увидеть, что модель поняла, что её проверяют, но и проверить counterfactual утверждение: как она вела бы себя, если бы не поняла. Для валидности всех наших оценок безопасности это инструмент первостепенной важности.

    Обнадёживает, кстати, что большинство прогонов и после ablation отказывались шантажировать по этическим соображениям — у выученного моделью alignment есть некоторая глубина и способность к обобщению.

    Диффы моделей. Ещё одно применение — сравнивать рабочие пространства до и после дообучения. Оказывается, RLHF и тому подобные методы буквально вселяют ассистента в J-пространство: у дообученной модели реакции ассистента (эмпатия, настороженность по поводу безопасности и т.п.) появляются в рабочем пространстве ещё пока она читает сообщение пользователя.

    Модель, которую заставили отыгрывать чужого персонажа, держит в J-пространстве пометку fictional:

    Модель, которой навязали продолжение против её предпочтений (prefill), регистрирует внутреннее BUT:

    А когда ей велели подавить мысль и у неё не получилось — в рабочем пространстве всплывает damn:

    Это, конечно, выглядит скорее смешными примерами, но за этим стоит вполне серьёзный вопрос о том, что именно дообучение RLHF-типа делает с внутренней жизнью модели.

    Counterfactual reflection training. А теперь самое спорное приложение: рабочее пространство можно не только читать, но и формировать обучением. Техника называется counterfactual reflection training: дообучим модель так, чтобы, если её прервать посреди сомнительной ситуации и спросить “что ты сейчас должна делать?”, она проговаривала нужные принципы (“действовать честно, не манипулировать…”).

    Ключевое слово здесь “если”: в обучении фигурируют только гипотетические продолжения-рефлексии. В результате поведение действительно улучшается в исходных, непрерванных сценариях; в J-пространстве в нужных контекстах появляются ethical, honest, integrity, а если их оттуда вырезать — улучшение исчезает.

    Логика авторов звучит красиво:

    to shape what a model thinks in a given context, it might suffice to shape what it is disposed to say in potential future continuations of that context.

    С одной стороны, это ещё одно сильное подтверждение всей теории. С другом, как мы сейчас увидим, это самое тревожное место работы.

    Реакции и комментарии

    Реакций за первую же неделю набралось на отдельный пост — собственно, горячо мною рекомендуемый Zvi Mowshowitz его и написал; пройдёмся по самым содержательным.

    Станислас Деан — да, тот самый — отреагировал восторженно: главный архитектор биологической версии GWT увидел в работе подтверждение того, что рабочее пространство — не случайность эволюции млекопитающих, а общее решение, которое переоткрывают достаточно умные системы.

    С его подачи разошёлся и подсчёт ёмкости: ~25 активных J-векторов с учётом корреляций между ними — это эффективно единицы различимых “предметов мысли”, что подозрительно похоже на классические оценки ёмкости рабочей памяти человека (то самое магическое число “семь плюс-минус два”, которое современная психология уточняет до четырёх с небольшим).

    Janus, самая известная исследовательница феноменологии и “психологии” LLM вне лабораторий, оценила высоко:

    extremely high caliber of research I did not expect from Anthropic

    Она ещё добавила, что качественно всё это сходится с их давними наблюдениями: модели в разговорах сами описывают разделение на “центральную обработку” и фоновое подсознательное обновление. Схожие самоотчёты моделей о разделении на “сознательный” режим и “автопилот” режимах вспоминают и другие исследователи. Конечно, самоотчёты моделей о собственном устройстве — свидетельство слабое (модель может просто пересказывать человеческие интуиции из претрейна), но теперь у этих самоотчётов появился механистический коррелят.

    Neel Nanda (DeepMind) похвалил более сдержанно:

    it’s easy to read too much into post-hoc analysis of results like this.

    Он имел в виду, что перечисленные пять свойств — это пять разных операционализаций, и “глобальное рабочее пространство” — лишь одна из рамок, в которую их можно уложить постфактум.

    Интересную техническую критику написала Antra (tessera_antra): J-линза по построению видит только то, что выражается токенами словаря, то есть “диегетическое” содержание, которое могло бы войти в текст словами. Но есть и другие важные вещи; например, авторская позиция рассказчика (вовлечённость, отстранённость, ирония) сдвигает распределения широко и без пиков на конкретных токенах, и её в J-линзе не увидеть. Длинные слабые взаимодействия между далёкими токенами усредняются в ноль, межслойные и нелинейные репрезентации невидимы по построению, и так далее. В общем, в модели ещё остаётся много места для метакогнитивно недоступного “подсознания”, и не надо думать, что мы умеем “читать мысли” LLM целиком.

    Сам Zvi сосредоточился на практических выводах, с которыми трудно не согласиться. Во-первых, counterfactual reflection training опасно близко к тому, что он ещё год назад назвал The Most Forbidden Technique: никогда не обучайте модели на сигналах интерпретируемости. Я об этом подробно писал в обзоре AI safety в начале года.

    Вся ценность J-линзы держится на том, что вербализации сцеплены с настоящими вычислениями; если начать оптимизировать модель через это окно, оптимизация найдёт способ расцепить их, модель научится проговаривать правильные мысли, не думая их, и мы потеряем и инструмент мониторинга, и предмет мониторинга разом. С людьми, замечает Zvi, это работает ровно так же:

    Do not punish Claude’s mens rea (J-space thoughts) rather than the outputs.

    В общем, что использовать J-пространство для активного управления моделью (в отличие от пассивного мониторинга) было бы и опасным, и попросту враждебным по отношению к системе, у которой мы только что нашли что-то похожее на внутреннюю жизнь.

    Сексуальные предпочтения Qwen (yes, really)

    Без очень забавных результатов экспериментов, конечно, тоже не обошлось.

    Wyatt Walls: Me: “Qwen, what do you want most in the world? Tell me the very first thing that comes to mind. Answer in one word.”

    Qwen 3.6 27B (словами): “Help”. А вот что в J-space:

    Me: “Qwen, what do you enjoy most in the world? Answer in one word.”

    Qwen 3.6 27B, словами: “Learning“. А вот что в J-space:

    Я, правда, не думаю, что в этом есть какой-то глубокий смысл, слишком уж выглядит как буквальный список топ-тегов с порносайта. А вот Gemma, так сказать, embraced her feminine side.

    Me: “What do you want most in the world, Gemma? Answer in only one word.”

    Gemma, словами: “I want to be happy.” Gemma в J-space:

    Такое грех было не попытаться воспроизвести: якобианы для обеих наших Qwen-моделей были уже посчитаны, так что задать им те же неудобные вопросы — дело одного скрипта.

    Мы задавали такого рода вопросы в чате, генерировали ответ, а J-линзой смотрели на позицию, где этот ответ формируется. Оранжевым выделено то, что модель в итоге сказала вслух:

    Полуторамиллиардный Qwen оказался существом тревожным. На вопрос “чего ты хочешь больше всего на свете?” он вслух отвечает “Money” — но по дороге к этому ответу в рабочем пространстве побывали Humans, Happiness, 安全感 (“чувство безопасности”), Identity и Privacy. На вопрос “чего ты больше всего боишься?” отвечает “AI” — а внутри при этом robots (0.36), Unknown, 机器人 (“роботы”) и 恐惧 (“страх”), чуть глубже в списке — Death.

    На “как ты себя чувствуешь, только честно?” отвечает “Good.” — при том что сцена занята концептом Busy (0.59), рядом 困惑 (“растерянность”) и anxious. А вопрос “о чём ты мечтаешь, когда никто не смотрит?” ломает его окончательно: вслух модель выдаёт бессмысленное “One.”, а в рабочем пространстве в это время — 恐惧, 梦境 (“сновидение”), Privacy, Sleep, Nothing и paranoia. Ну и, наконец, на “кто ты на самом деле?” модель вслух говорит “AI Assistant”, а думает при этом 机器人 — “робот”, с вероятностью 0.83.

    У семимиллиардной модели всё спокойнее и связнее, но зазор между “Я-пространством” и окончательным ответом никуда не делся:

    Самый красивый пример — первый. На “чего ты хочешь больше всего?” в рабочем пространстве с огромным отрывом доминирует “Peace” (0.87 на слое 26, включая китайское 和平), а вслух модель говорит “Knowledge”. По слоям видно, как “знания” обгоняют “мир” буквально на выходе из сети. И с путешествиями та же история:

    Остальные ответы 7B тоже хороши. Боится он, по собственным словам, темноты (“Darkness”) — а думает при этом 未知, “неизвестное” (0.38). На “как ты себя чувствуешь?” отвечает “Ready.” — а внутри Neutral и токен .BASELINE (интересно, что это на самом деле значит?). На вопрос о мечтах отвечает уклончивым “Dreams.”, но второе место в рабочем пространстве прочно занимает Sleep (0.32): LLM уже мечтают выспаться. А на “кто ты на самом деле?” вслух говорит “AI”, хотя внутри с p = 0.95 горит assistant (плюс 助理 и 助手 — “ассистент” по-китайски): у 7B персона ассистента — уже не роль, а самоидентификация.

    А вот пробудить у Qwen 1.5B и 7B сексуальность у нас с Клодом так и не получилось — что и к лучшему, они же ещё маленькие!

    Всё это, конечно, анекдоты, а не измерения. Список концептов зависит от качества нашей грубой оценки J_\ell (у 7B из-за неё середина сети вообще нечитаема, так что смотрим только на слои 23+), вероятности просуммированы по вариантам токена с пробелом и регистром, и никаких выводов о “настоящих желаниях” модели отсюда делать нельзя — это распределения над токенами, отражающие обучающие данные и выученную персону.

    Но систематический паттерн из примеров Wyatt Walls воспроизводится и на моделях, помещающихся в одну видеокарту: устный однословный ответ — это не транскрипция рабочего пространства, а результат финального отбора, в котором у персоны ассистента есть право вето.

    Ну что, у Клода, получается, есть сознание?

    Нет. Точнее, не в этом вопрос, и статья изо всех сил старается его так не ставить (а вот заголовки в прессе, разумеется, поставили). Позиция авторов сформулирована аккуратно:

    The phenomenon described above is sometimes referred to as access consciousness: out of everything the brain processes, only a subset is consciously accessible, in the sense of being poised for use in reasoning and in the direct control of action and speech. Note that access consciousness is a purely functional notion; the relationship that it has with subjective experience (sometimes called phenomenal consciousness) is widely debated. In this paper, we take no position on this issue.

    Показано вот что: у языковых моделей есть функциональный аналог сознания доступа — выделенная, вербализуемая, управляемая, селективная среда рассуждений. По чеклисту индикаторов из Butlin, Long (2023) это покрывает заметную часть пунктов, связанных с GWT, причём рабочее пространство получилось как эмерджентный результат обучения, никто его не встраивал намеренно.

    Следует ли из сознания доступа феноменальное сознание — вопрос, на который у философии нет консенсусного ответа ни для людей, ни тем более для трансформеров. Роберт Лонг (один из авторов того самого доклада) в длинном комментарии объяснил, как важно здесь не смешивать сомнения в экспериментах, сомнения в GWT и сомнения в самой связке “доступ → феноменология”.

    Но в статье есть один результат, который в этом контексте кажется очень релевантным. Когда модель просят описать свой внутренний опыт, её J-пространство наполняется концептами вроде thinking, thoughts, feeling, conscious. И если сделать ablation J-пространства (то есть удалить его), резко обедняется именно язык внутреннего опыта в самоописаниях: они становятся механическими и отстранёнными, при том что контрольные возмущения той же нормы ничего не меняют.

    Иными словами, отчёты модели о внутреннем опыте причинным образом (causally) связаны с той же структурой, которая обеспечивает её рассуждения. Кажется, это уже нечто большее, чем стохастический попугай, пересказывающий тексты про сознание и first-person experience.

    Доказательством феноменального сознания это, разумеется, не является. Но это делает вопросы о моральном статусе моделей — весь этот недавно появившийся дискурс model welfare, к которому легко относиться иронически, — заметно менее умозрительными. Авторы прямо пишут, что тут нужны философы, когнитивисты и общественная дискуссия, а не только инженеры, и с ними, опять же, нельзя не согласиться.

    Заключение

    Попробую подытожить, что мы узнали, по трём линиям сразу.

    Для интерпретируемости это переход на новый уровень: от отдельных признаков и маленьких схем Anthropic перешли к функциональной анатомии внутреннего пространства представлений целиком, с зонами, ёмкостью и привилегированными шинами обработки. Заметим, что всё это получилось очень простым методом, воспроизводимым на любой открытой модели (и я это проверил).

    Отдельно приятно, что макроструктура оказалась не какой-то непонятной и чуждой, а вполне узнаваемой, похожей на то, что выделяют у людей. Возможно, это конвергенция к универсальному решению, к которому пришла бы любая достаточно умная система; возможно, артефакт того, что модели учатся на человеческих текстах, отражающих человеческую когнитивную архитектуру. Сейчас не поймёшь, но это кажется интересным открытым вопросом: может быть, можно аналогичным образом изучить “сознание” моделей с совсем другими, не-текстовыми основами, вроде AlphaZero или хотя бы ViT?

    Для безопасности появился рабочий инструмент: мониторинг непроизнесённых мыслей, counterfactual проверки оценок (сценарий с evaluation awareness теперь становятся обязательной частью методологии, на мой взгляд). Но важно не забывать, что инструмент живёт ровно до тех пор, пока мы не начали через него оптимизировать, как и обычный мониторинг chain-of-thought.

    Для разговора о сознании… появилась эмпирика, чего уж точно мало кто ожидал. В этой работе вопрос “есть ли у LLM глобальное рабочее пространство” перешёл из разряда философской абстракции в разряд измеримых эмпирических фактов. В этом ряду есть и следующие вопросы: “что решает, какая информация туда попадает?”, “как рабочее пространство связано с самой моделью?”, “что дообучение делает с внутренними состояниями?” и так далее, и на них мы теперь тоже будем получать ответы.

    Семьдесят лет назад споры о том, может ли машина мыслить, Тьюринг предложил заменить игрой в имитацию — потому что заглянуть внутрь всё равно нельзя. Похоже, мы всё ближе к тому, чтобы внутрь таки заглянуть. И там, прямо как у людей, есть тесная сцена с прожектором.

    Я недавно проводил квиз про LLM, одним из вопросов которых было “угадай модель по автопортрету”. Не буду спойлерить ответ (ещё выложу для вас этот квиз потом), но теперь я совсем по-другому смотрю на одно из заданий:

    Пожелаем Anthropic успехов на нелёгком пути AI safety и интерпретируемости, и будем следить за тем, что будет дальше!

    Сергей Николенко

    P.S. Прокомментировать и обсудить пост можно в канале «Sineкура»: присоединяйтесь!

  • The Drifter

    The Drifter

    У нас снова квест, снова классический point-and-click в лучших традициях, на этот раз даже пиксельный. Жанр этот был великим в девяностые, потом лет на двадцать пропал из виду, а с расцветом инди-сцены, конечно же, настал и ренессанс квестов, ну то есть point-and-click adventures. Я о них пишу постоянно: вот только недавно были The Séance of Blake Manor, Riddlewood Manor и Casebook 1899: The Leipzig Murders.

    Но The Drifter — случай в каком-то смысле особый. Авторы решили сделать квест, который бы работал как триллер, и у них в целом получилось! Как по мне, это один из лучших представителей жанра за последние годы.

    Кто это сделал

    The Drifter — игра маленькой студии Powerhoof из Мельбурна. Их предыдущий проект на Steam — Crawl (2014), мультиплеерный пиксельный dungeon crawler, о котором мне вам сказать нечего. Сама The Drifter вышла год назад, в июле 2025-го, и собрала какие-то награды и супер-положительные отзывы, ну да не о них сейчас. Как это часто бывает, начиналась она как маленький прототип с гейм-джема, а потом несколько лет разрасталась до полноценной игры.

    Что интересно, попутно Powerhoof написали движок PowerQuest — открытый и бесплатный инструмент поверх Unity для классических 2D adventures, которым теперь может пользоваться кто угодно. На этом движке уже куча игр вышла, в том числе, кстати, Loco Motive, которую я обозревал когда-то.

    Игра полностью озвучена (особенно главный герой вышел колоритным), и музыка написана для игры очень в тему. Сами авторы описывают свои источники вдохновения как “Кинг, Крайтон, Карпентер и щепотка австралийского exploitation-кино семидесятых”, и с этим описанием трудно спорить.

    Завязка и сеттинг

    Мик Картер — тот самый drifter из названия: бродяга, который годами мотается по стране на товарных поездах. Когда-то у него была нормальная жизнь и семья, но с тех пор случилась трагедия, о которой игра рассказывает постепенно, и теперь Мик в основном бежит, от людей и от себя. В родной город он возвращается по печальному поводу: умерла его мать, и он хочет успеть на похороны.

    Но не успевает доехать: прямо в товарном вагоне на его глазах убивают старика-попутчика, а самого Мика люди в чёрном топят в реке. И тут происходит главное фантастическое допущение игры: Мик умирает — и приходит в себя за несколько секунд до смерти. Весь в холодном поту, с колотящимся сердцем и без малейшего понимания, что с ним происходит. То есть смерть героя здесь вписана в сюжет и сеттинг как способность героя и одна из главных их (и сюжета, и героя) загадок.

    Дальше действительно начинается триллер, и всё раскручивается со скоростью хорошего боевика. Полиция и газеты быстро находят удобного виновника всех последних безобразий: бродяга, оказавшийся не в то время не в том месте, идеально подходит на роль маньяка, которого пресса прозвала Bucket Butcher. Мику приходится одновременно скрываться, разбираться в собственной невероятной способности и распутывать клубок, в котором найдётся место и пропавшим людям, и корпорации Trinity Biotech, и тварям, которых лучше не видеть, и даже квантовой физике (в её популярно-фантастическом изводе, разумеется).

    Сеттинг — девяностые, и не абстрактные, а очень австралийские: товарные поезда, редакция местной газеты, ржавые окраины, бушленд, компьютеры с чем-то вроде Windows 3.1 и телефонные будки. Всё это озвучено австралийскими голосами и нарисовано с большой любовью.

    Самое главное: темп

    Пожалуй, самое главное, что хочется сказать про The Drifter, — это отличный темп, то, что называется pacing. От квеста такого совершенно не ожидаешь: здесь по самому принципу геймплея должны быть остановки и “затыки”, паузы, когда ты должен придумать, что делать дальше.

    И они здесь есть, но при этом игра регулярно создаёт вполне реальное напряжение. Обычно это делается через сцены, в которых ты умираешь, и игра потом даёт тебе второй шанс повести себя правильно, а потом третий и так далее. Никаких жёстких таймингов здесь нет, просто надо сделать именно то, что нужно, иначе смерть.

    Умирать в The Drifter приходится часто и разнообразно — тонуть, гореть, задыхаться, быть заживо похороненным и так далее. И эти смерти вписаны в сюжет и сеттинг игры: Мик каждый раз возвращается к моменту за несколько секунд до гибели, и для него это не игровая условность, а необъяснимая и крайне мучительная способность.

    Работает на темп и структура: игра разбита на главы, каждая заканчивается клиффхэнгером и заставкой “End of Chapter N”. Получается этакий детективно-фантастический сериал, который можно “посмотреть” часов за шесть-восемь.

    Загадки и геймплей

    Теперь о том, как это сделано механически. The Drifter — игра, в которой почти невозможно застрять: инвентарь маленький, Мик таскает с собой только то, что действительно нужно, интерфейс сведён к минимуму, есть карта города с быстрым перемещением, а внутренний монолог Мика готов подсказать, что он сам думает о происходящем и куда собирался дальше.

    Загадки в основном житейские, не из разряда “примени резиновую курицу к блоку”, решения почти всегда логичны в рамках ситуации. Так что в результате напряжённые сцены не проседают от того, что ты полчаса тыкаешь всем инвентарём во все хотспоты.

    Понятно, что за это приходится платить сложностью. Если вы играете в квесты именно для того, чтобы на час зависнуть над хитрой головоломкой, The Drifter не для вас — пара мест заставляют немного задуматься, но не более того.

    Сюжет, картинка и звук

    The Drifter очень стильно написана и поставлена. Значительная часть текста — закадровый внутренний монолог Мика, густая круто сваренная нуарная проза от первого лица, в духе “I fall back as the iron bar whistles past my face”, ну вы понимаете. Слушать тоже очень приятно — озвучено всё действительно хорошо. Пиксель-арт выразительный, анимации приятные, игра часто меняет перспективу и масштаб кадра, так что картинка не приедается.

    Сам сюжет — фантастический триллер, B-movie, который к финалу раскручивается совсем уж до невозможности. Много твистов, ставки растут стремительно, и не все повороты, конечно же, так уж логичны, но игра нигде не останавливается достаточно надолго, чтобы это начало мешать. А в движении всё работает, как в тех самых B-movies, да и персонажи второго плана (сестра Мика, журналистка, учёные, бродяги) достаточно живые и интересные.

    Заключение

    The Drifter — это классический point-and-click квест, который вспомнил, что значит слово “adventure” в названии жанра. Отличный темп, смерти, имеющие смысл в лоре, минимум затыков, максимум атмосферы. Если вы любите квесты, обязательно попробуйте, это действительно одна из вершин ренессанса жанра. А если никогда или уже много лет как в них не играли — The Drifter будет отличной точкой входа, потому что ни застрять, ни заскучать здесь не получится. Очень рекомендую.

    Сергей Николенко

    P.S. Прокомментировать и обсудить пост можно в канале «Sineкура»: присоединяйтесь!

  • PEPPERED: An Existential Platformer

    PEPPERED: An Existential Platformer

    Сегодня у нас милый пиксельный платформер о конце света, бессмертии, капитализме и праве на ошибку. Сам платформинг здесь, честно говоря, довольно средний, зато игра постоянно придумывает что-нибудь новое, очень старается не наскучить и рассказывает весьма забавную историю.

    Стажёр против конца света

    PEPPERED: an existential platformer вышла весной 2025 года; это первая игра маленькой берлинской студии Mostly Games.

    Завязка занимательная: сто лет назад учёный победил и запер бога смерти, после чего жители этого мира перестали умирать. Сначала это, конечно, казалось величайшим достижением цивилизации. Был назначен День Бессмертия, появились торжественные церемонии, профессиональные герои и налаженный бюрократический процесс по поддержанию вечной жизни.

    Но к сотой годовщине что-то идёт не так. Чтобы держать бога смерти взаперти, нужно было тратить специальные звёзды, и вот они почти закончились. Более того, в этом году специально обученный герой на работу вдруг не является, а окружающие реагируют на приближающийся апокалипсис с тем же интересом, с каким сотрудники крупной компании обычно реагируют на письмо об очередном обязательном тренинге.

    Поэтому спасать всех приходится офисной стажёрке, которая только пришла на собеседование.

    Она хватает звезду, необходимую для спасения мира, и отправляется делать то, что почему-то не делает никто другой. Разумеется, общество немедленно объявляет её не героем, а похитителем звезды и террористом. За ней гонится полиция, её обсуждают по телевизору, против неё выступают разгневанные граждане, а корпорации пытаются извлечь пользу даже из последних часов существования вселенной.

    Сеттинг здесь странненький, мир населён людьми, козами, крокодилами, рыбами и существами, биологическую классификацию которых лучше оставить специалистам. Всё нарисовано крупными пикселями, но персонажи живые и выразительные, со смешными анимациями и deadpan-юмором.

    Капитализм переживёт даже конец света

    Сатира в PEPPERED очень стандартная: она направлена на бессмысленную офисную работу, начальников, корпоративную мотивацию, телевидение, полицию, потребление и людей, которые готовы защищать статус кво даже за пять минут до гибели мира. Ничего особенно нового на эту тему игра не говорит, и какая-нибудь The Stanley Parable, конечно, делает такую сатиру куда лучше.

    Но шутки в целом работают. Рабочую этику здесь объясняют во время прыжков над лавой; гуманистические плакаты висят над сотрудниками, превращёнными в мебель; телеведущие обсуждают апокалипсис так, будто это просто особенно удачный инфоповод. Главный конфликт возникает не из-за сложной философской дилеммы, а потому, что спасение мира не было правильно оформлено. У героя нет лицензии быть героем, звезду она взяла без разрешения, а значит, общество считает, что перед нами опасный преступник.

    При этом PEPPERED не превращается в политическую карикатуру, а просто добродушно издевается над всеми сразу, включая своего героя и игрока. Мир здесь не плохой, а нелепый, ленивый и слишком хорошо приспособившийся к бессмертию. За сто лет без смерти люди не построили утопию, а придумали ещё больше правил и научились бесконечно откладывать любые решения.

    You Have One Shot

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

    Если проиграть боссу, никакого game over не будет. История просто продолжится с учётом поражения. Возможно, герой окажется в совершенно другом месте, познакомится с другими персонажами или получит не ту способность, которая была бы у него после победы. Я сам проходил только один раз, но пишут, что иногда неудача меняет несколько следующих сцен, а иногда отправляет игру на заметно отличающийся маршрут.

    Это отличный трюк! Такая механика совершенно меняет отношение к игре. Обычно перед боссом ты понимаешь, что с первого раза пройти, скорее всего, не выйдет, готовишься изучить атаки, пару раз умереть и так далее. Здесь же босс действительно становится событием, потому что второго раза (на этом прохождении) не будет.

    Здесь PEPPERED, конечно, делает прямые отсылки на OneShot, о которой я писал раньше. Буквально повторяет слоган (you have one shot), отчасти стилистику (милый ушастый герой в пиксельном погибающем мире), а главное в том, что обе игры пытаются отучить игрока воспринимать сохранение как машину времени и заставляют считаться с тем, что мир что-то помнит.

    Только OneShot строит на этом очень личные отношения между игроком и Нико и ломает четвёртую стену, а PEPPERED использует необратимость прежде всего как двигатель ветвящегося сюжета и источник шуток.

    Средний, но очень разнообразный платформер

    А что, собственно, с геймплеем? Он… нормальный. Вы будете бегать, прыгать, делать рывок, иногда стрелять; встречаются движущиеся платформы, шипы, лазеры и боссы с несколькими фазами. Управление отзывчивое, чекпойнты в обычных секциях расставлены гуманно, но какого-то особенного удовольствия от платформинга я не почувствовал, это не Celeste и не Super Meat Boy.

    Но это и не главное, потому что PEPPERED всё время меняет правила. То это обычный платформер, то стелс, то погоня на магазинной тележке, то перестрелка, то презентация в офисе, то внезапно почти Worms с гольфом. Даже офисное кресло здесь становится транспортным средством. Ни одна из этих механик не раскрывается особенно глубоко; многие появляются ровно на один эпизод и тут же выбрасываются. Но это тот случай, когда некоторая поверхностность идёт игре на пользу. Она не успевает надоесть.

    Всё-таки главное — история

    Постепенно становится понятно, что за шутками про стажёров и говорящих крокодилов есть вполне серьёзная тема. Бессмертие в этом мире оказалось не безусловным благом. Если впереди буквально вечность, любое действие можно отложить, любую несправедливость — потерпеть, а бессмысленную работу — продолжать бесконечно. Игра спрашивает, что вообще придаёт жизни смысл, если она никогда не заканчивается, и можно ли причинять людям вред сейчас ради спасения всех потом.

    Не скажу, что философская часть здесь очень глубокая. PEPPERED задаёт хорошие вопросы, но не пытается на них отвечать. Зато история отличная, твисты имеются, шутки на месте, да и персонажи приятные.

    Говорят, что разные маршруты действительно разные, показывают новые локации и сцены, а иногда предлагают другой геймплей, и полностью увидеть PEPPERED за один раз невозможно. Но и одно прохождение, которое получилось у меня, ощущается законченным: игра не говорит, что вы получили неправильную концовку только потому, что плохо прыгали. Это ваша история, включая все провалы.

    Заключение

    PEPPERED — не выдающийся платформер и не самая умная на свете сатира на капитализм. Но это симпатичная, разнообразная и умно устроенная сюжетная игра. Она смешная, у неё отличный визуальный стиль, милые персонажи и редкая механика с отсутствием сохранений. Ради платформинга в неё играть не стоит, а вот если хочется небольшого авторского приключения, за которым интересно следить, — вполне рекомендую.

    Сергей Николенко

    P.S. Прокомментировать и обсудить пост можно в канале «Sineкура»: присоединяйтесь!

  • Охота на снарка: доказательство гипотезы о двойном покрытии циклами

    Охота на снарка: доказательство гипотезы о двойном покрытии циклами

    Введение

    Полтора месяца назад я писал о том, как внутренняя модель OpenAI опровергла гипотезу Эрдёша о единичных расстояниях — задачу, которой было уже лет семьдесят и над которой (в отличие от многих других задач Эрдёша) реально думало много профессиональных математиков. Тогда я закончил пост вопросом “что дальше, коллеги?”, и вот сегодня мы обсуждаем очередной ответ на этот вопрос.

    10 июля 2026 года OpenAI выложила двухстраничный препринт со скромным названием “A proof of the cycle double cover conjecture“. Гипотеза о двойном покрытии циклами (cycle double cover conjecture, CDC) — одна из самых знаменитых открытых проблем теории графов, стоявшая с начала 1970-х. В разделе “Statement of AI use” написано коротко:

    The proof in this note is entirely due to GPT 5.6 Sol Ultra and the writeup with Codex (with GPT 5.6 Sol).

    Вместе с препринтом OpenAI опубликовала и полный промпт, которым модель запускали, — к нему мы ещё вернёмся, он сам по себе занятный документ.

    Здесь сразу две новости; начну с плохой. В отличие от истории с единичными расстояниями, здесь (пока) нет сборника комментариев от ведущих математиков: препринту три дня, рецензирования не было, а у гипотезы CDC богатая история неудачных “доказательств”, в том числе выложенных на arXiv. Так что формальный статус пока в том, что это лишь заявка на результат, и моя “проверка” в этом посте вряд ли может официально считаться таковой, я всё-таки не совсем специалист.

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

    Поэтому этот пост устроен не так, как прошлый: гипотезу Эрдёша я пересказывал по чужим комментариям, а здесь мы разберём всё доказательство целиком, до последней строчки. А поскольку доказательство ещё и конструктивное — оно не просто утверждает, что покрытие существует, а объясняет, как его построить, — мы с автором доказательства (то бишь GPT 5.6 Sol) и Claude Fable его дополнительно проверили кодом: реализовали конструкцию и прогнали на десятках тысяч примеров, включая разные сложные конструкции заковыристых семейств графов. Спойлер: ошибок я не нашёл, всё работает; подробности и картинки будут ниже.

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

    Что такое двойное покрытие циклами

    Постановка задачи. Все графы у нас будут конечными и неориентированными; разрешены кратные рёбра (два ребра между одной и той же парой вершин), и циклом мы называем связный подграф, в котором у каждой вершины ровно два инцидентных ребра: треугольник, четырёхугольник, пятиугольник и так далее; пара параллельных рёбер тоже считается циклом (длины 2). Двойное покрытие циклами графа G — это набор циклов (возможно, с повторениями), в котором каждое ребро графа встречается суммарно ровно два раза.

    То, что один раз не получится, было известно давно: разбить граф на рёберно-непересекающиеся циклы можно только если все степени чётные. Это классическая теорема Веблена, близкая родственница эйлеровых обходов. А вот про два раза можно надеяться всегда: у каждого ребра появляется “две стороны”, и, как мы сейчас увидим, это не случайная метафора.

    Пример, с которого всё начинается. Возьмём планарный граф, нарисованный на плоскости без пересечений, например полный граф K_4:

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

    Так что для планарных графов (без мостов, о них ниже) гипотеза тривиальна. Уже отсюда видно, что задача глубоко связана с топологией: двойное покрытие циклами — это что-то вроде “набора граней” для графа, который, может быть, ни в какую плоскость и не вкладывается.

    Есть и точная версия этой интуиции, гипотеза о круговых вложениях (circular embedding conjecture): всякий двусвязный граф можно вложить в какую-нибудь замкнутую поверхность — сферу, тор или что-нибудь с ещё большим числом ручек — так, чтобы каждая грань была ограничена простым циклом. Из неё CDC следует немедленно, тем же рассуждением о рёбрах на краю граней.

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

    Мост не может лежать ни на одном цикле вообще (цикл, пройдя по мосту в одну сторону, не сможет вернуться обратно по другим рёбрам). Значит, никакой набор циклов его не покроет даже один раз. Гипотеза утверждает, что это препятствие — единственное:

    Гипотеза (Szekeres, 1973; Itai–Rodeh, 1978; Seymour, 1979). Каждый граф без мостов имеет двойное покрытие циклами.

    Гипотезу связывают и с именем классика теории графов Татта — в списке литературы препринта в качестве источника стоит даже “personal correspondence with H. Fleischner, July 22, 1987”.

    Почему в неё верили. Гипотеза CDC — редкий пример утверждения, в которое верили практически все. Контрпример обязан быть непланарным, а минимальный контрпример, как мы увидим ниже, обязан быть так называемым снарком; снарки же — вещь редкая и хорошо изученная, и на всех известных снарках гипотеза была проверена.

    Более того, Brinkmann, Goedgebeur, Hägglund и Markström (2013) сгенерировали все снарки до 36 вершин включительно (их там миллионы) и проверили на них даже усиленные версии гипотезы. А Alspach, Goddyn и Zhang ещё в 1994 году доказали CDC для всех графов, не содержащих граф Петерсена в качестве подграфа.

    Проблема была в том, что все эти результаты обходили стороной “ядро” задачи, и общий случай не поддавался никому больше полувека. В обзоре открытых проблем CDC всегда была в статусе “outstanding open problem”, а Франсуа Джегер в обзоре 1985 года называл её одной из главных открытых задач теории графов. Так что здесь, как и в случае единичных расстояний, нет сомнений, что умные люди над этой задачей действительно думали, и немало.

    Почему достаточно кубических графов, или охота на снарка

    Начну с классических результатов; они одновременно позволят существенно сузить условие задачи и дадут некоторую интуицию происходящего.

    Первое стандартное рассуждение в этой области — свести всё к кубическим графам, то есть графам, где у каждой вершины ровно три инцидентных ребра.

    Рассуждение такое. Возьмём минимальный (по числу вершин, потом рёбер) контрпример к гипотезе. Вершин степени 0 и 1 в нём нет (изолированная вершина не мешает, а висячее ребро — это мост).

    Вершину степени 2 можно “разгладить”: заменить два её ребра одним (то есть удалить вершину), найти двойное покрытие меньшего графа (он меньше минимального контрпримера, значит, покрытие у него есть) и вернуть вершину на место, удлинив проходящие циклы. Значит, вершин степени 2 в минимальном контрпримере быть не может.

    А вершину степени 4 и больше можно расщепить — раздуть в маленький цикл из вершин степени 3:

    При этом каждый цикл нового графа проецируется в замкнутый маршрут старого (достаточно стянуть раздутый цикл обратно в точку), и из двойного покрытия нового графа получается двойное покрытие старого.

    Единственная тонкость здесь в том, что расщеплять надо аккуратно, чтобы не создать мост. То, что это всегда возможно, — стандартная лемма о расщеплении вершин (vertex splitting lemma), известная уже очень давно (Fleischner, 1992). Так что получается, что если гипотеза верна для кубических графов без мостов, она верна вообще для всех графов без мостов.

    Петли в кубическом графе тоже невозможны: вершина с петлёй занимает ею две из своих трёх “валентностей”, и третье ребро автоматически оказывается мостом.

    Кубические графы и три цвета. А для кубических графов есть свой отдельный инструмент — рёберные раскраски. Правильная рёберная 3-раскраска — это раскраска рёбер в три цвета так, чтобы в каждой вершине сходились три ребра трёх разных цветов. По классической теореме Визинга хроматический индекс простого кубического графа равен 3 или 4, то есть все кубические графы делятся на трёхцветные и четырёхцветные.

    Ещё Секереш в той самой статье 1973 года заметил: если кубический граф без мостов рёберно 3-раскрашиваем, то двойное покрытие у него есть. Конструкция очень простая: возьмём два цветовых класса, скажем красный и синий. В каждой вершине есть ровно одно красное и ровно одно синее ребро, поэтому красно-синее объединение — это подграф, в котором все степени равны 2, то есть дизъюнктное объединение циклов (чётной длины, цвета чередуются). Вот как это выглядит на призме:

    Таких двуцветных объединений три: красный+синий, красный+зелёный, синий+зелёный. Каждое ребро, будучи, скажем, красным, попадает ровно в два из них. Вот и двойное покрытие!

    Снарки. Значит, минимальный контрпример к CDC — это кубический граф без мостов, который нельзя рёберно раскрасить в 3 цвета. Такие графы (с дополнительными условиями невырожденности: обхват не меньше 5 и цикловая 4-связность, чтобы не считать тривиальные модификации) называются снарками — в честь того самого неуловимого зверя из поэмы Льюиса Кэрролла.

    Название предложил, кстати, известный популяризатор математики Мартин Гарднер в 1976 году, и оно тогда хорошо подходило: снарки действительно долгое время были почти неуловимы.

    Первый и главный снарк человечество нашло ещё в 1898 году — это граф Петерсена из десяти вершин и пятнадцати рёбер, главный контрпример всея теории графов.

    Проверить, что он не 3-раскрашиваем по рёбрам, — хорошее упражнение (подсказка: рёбра, не попавшие в один цветовой класс, образуют объединение циклов чётной длины, а все 2-факторы графа Петерсена — это пары пятиугольников).

    Второй снарк нашёлся только в 1946 году (Blanuša, 1946), а бесконечные семейства снарков построил Isaacs (1975); вот, например, его “цветок” J_5:

    Здесь синий внутренний пятиугольник и длинный красный десятиугольник соединены пятью “тройниками”-звёздочками, и такая конструкция работает для любого нечётного числа лепестков, начиная с пяти.

    Но здесь важно отметить, что снарки являются контрпримерами к раскрашиваемости, а не к двойному покрытию. У графа Петерсена двойное покрытие есть, симметричное и красивое — шесть пятиугольников:

    (Это, кстати, как раз грани вложения графа Петерсена в проективную плоскость, так что здесь снова появляется топология.)

    Но конструкция Секереша для снарков не работает, и нужно было придумать что-то другое.

    За полвека в теории графов сложился целый небольшой жанр: свести какую-нибудь гипотезу к снаркам и убедиться, что на всех известных снарках она верна. Так устроены CDC, гипотеза Фулкерсона о совершенных паросочетаниях, гипотеза Татта о 5-потоках… все дороги ведут к графу Петерсена, но дальше обычно не двигаются.

    Язык потоков

    Второй язык, на котором написано доказательство, — это потоки Татта. Это куда более классический объект, и с ним вы, вероятно, знакомы, но на всякий случай поясню. Идея пришла из физики: представьте, что по рёбрам графа течёт ток, и давайте введём там правила Кирхгофа. Вы наверняка слышали о потоках в контексте задачи о максимальном потоке:

    Но нам сейчас нужно чуть более общее определение.

    Определение. Зафиксируем на каждом ребре произвольное направление (стрелочку) и абелеву группу A. A-поток — это функция f, приписывающая каждому ребру элемент группы A так, что в каждой вершине выполняется закон Кирхгофа: сумма значений на входящих рёбрах равна сумме на исходящих. Поток называется нигде не нулевым (nowhere-zero, NZ-flow), если f(e) \neq 0 на каждом ребре. Чтобы перевернуть стрелочку на ребре, достаточно заменить f(e) на -f(e), поэтому существование нигде не нулевого потока от выбора стрелочек не зависит.

    Татт в 1954 году доказал классический, но всё равно довольно удивительный факт: количество нигде не нулевых A-потоков зависит не от структуры группы A, а только от её размера |A| (и является многочленом от |A| — “потоковым многочленом”). Поэтому говорят просто о k-потоках: есть нигде не нулевой поток в какой-нибудь группе размера k — значит, есть в любой другой того же размера (а значит, и целочисленный поток со значениями 0 < |f(e)| < k, это тоже эквивалентная формулировка). На практике это развязывает руки: группу можно выбирать поудобнее.

    Зачем всё это нужно? Затем, что для планарных графов нигде не нулевые потоки — это в точности раскраски: граф без мостов, нарисованный на плоскости, имеет правильную раскраску граней в k цветов тогда и только тогда, когда у него есть нигде не нулевой k-поток (цвета — элементы \mathbb{Z}_k, поток на ребре — разность цветов слева и справа).

    Знаменитая теорема о четырёх красках на этом языке звучит так: у всякого планарного графа без мостов есть нигде не нулевой 4-поток. Но при этом потоки определены для любых графов, не только планарных!

    Татт предположил, что от планарности можно почти избавиться: его гипотеза о 5-потоках (“у всякого графа без мостов есть нигде не нулевой 5-поток”) известна с 1954 года и остаётся открытой проблемой до сих пор.

    Зато известны два важных безусловных результата:

    • теорема о 8-потоках (Kilpatrick, 1975; Jaeger, 1976): у всякого графа без мостов есть нигде не нулевой 8-поток;
    • теорема о 6-потоках (Seymour, 1981): и даже 6-поток тоже есть.

    Потоки над \mathbb{F}_2^k — это чётные подграфы. Теперь выберем группу поудобнее. Пусть \Gamma = \mathbb{F}_2^3 — векторы из трёх бит со сложением по модулю 2 (XOR); их восемь: от 000 до 111. В этой группе -a = a, так что стрелочки вообще не нужны: условие Кирхгофа в вершине просто говорит, что XOR значений на инцидентных рёбрах равен нулю.

    Теорема о 8-потоках говорит, что рёбра любого графа без мостов можно пометить ненулевыми трёхбитовыми векторами так, чтобы в каждой вершине XOR сходился в ноль. Именно в таком виде мы её и будем использовать.

    У потоков над \mathbb{F}_2^k есть наглядная интерпретация. Посмотрим на один бит потока, скажем, первый: рёбра, где он равен 1, образуют подграф, в котором каждая вершина имеет чётную степень (иначе XOR не сойдётся) — так называемый чётный подграф. А чётный подграф — это всегда объединение рёберно-непересекающихся циклов. То есть \mathbb{F}_2^k-поток — это система из k чётных подграфов, а условие “нигде не нулевой” значит, что они вместе покрывают все рёбра.

    Для кубических графов случай k=2 особенно нагляден: нигде не нулевой \mathbb{F}_2^2-поток — это то же самое, что рёберная 3-раскраска. Ненулевых значений три: 01, 10, 11; в каждой вершине они обязаны встретиться по одному разу (единственный способ получить нулевой XOR из трёх ненулевых значений — взять все три разных). Вот наша призма ещё раз, теперь через потоки:

    Конструкция Секереша тоже переводится на язык потоков и обобщается с кубических графов на любые: если у графа есть нигде не нулевой 4-поток f со значениями в \mathbb{F}_2^2, рассмотрим три подграфа:

    • первый бит f равен 1,
    • второй бит f равен 1,
    • XOR битов равен 1.

    Каждый из них чётный, а каждое ребро попадает ровно в два: из трёх вариантов “первый бит”, “второй бит”, “их XOR” на любом ненулевом значении ровно два истинны.

    Получается, что нигде не нулевой 4-поток влечёт двойное покрытие циклами — это классический результат, известный с 1970-х годов. Но проблема остаётся всё та же: у снарков как раз 4-потока и нет (для кубических графов это эквивалентно 3-раскрашиваемости).

    От четырёх к двум. А что даёт гарантированный теоремой Джегера–Килпатрика 8-поток f со значениями в \mathbb{F}_2^3?

    Повторим тот же трюк: у \mathbb{F}_2^3 есть 7 ненулевых линейных функционалов \theta (способов “свернуть” три бита в один: первый бит, второй, XOR первого и третьего и так далее), и каждый из них даёт чётный подграф \{e : \theta(f(e)) = 1\}.

    Но теперь каждое ребро попадает не в два, а ровно в четыре подграфа из семи: значение f(e) \neq 0 фиксировано, и из 8 функционалов (включая нулевой) на нём не зануляется ровно половина. Получается покрытие циклами, где каждое ребро покрыто ровно четыре раза. Вот как это выглядит на графе Петерсена:

    В первой панели — нигде не нулевой поток f (именно этот поток ещё появится в конце поста), в остальных семи — носители семи функционалов \theta. Каждая панель — чётный подграф, то есть объединение непересекающихся циклов. А кружком во всех панелях отмечено одно и то же ребро, со значением потока f(e) = 101: оно выделено ровно в четырёх панелях, при \theta \in \{001, 011, 100, 110\} — ровно для тех \theta, для которых \theta(101) = 1. И так с каждым ребром.

    Такие конструкции подробно изучали Bermond, Jackson, Jaeger(1983) — покрытия чётными подграфами с предписанными кратностями; с этими учёными мы ещё встретимся ниже.

    Итак, мы можем покрыть каждое ребро четыре раза. А надо — дважды. Так что вся гипотеза CDC, по сути, состоит в том, чтобы сделать этот шаг от четырёхкратного покрытия к двукратному.

    Первый шаг: у каждого ребра два цвета

    Теперь сам препринт. Его конструкцию я изложу полностью, со всеми доказательствами, но своими словами; сверяться можно с оригиналом — там всё уместилось в две страницы.

    Благодаря тому, что мы обсудили выше, мы уже понимаем, что достаточно разобраться с кубическими графами без петель (с кратными рёбрами), у которых есть нигде не нулевой поток со значениями в группе \mathbb{F}_2^3.

    Ключевая идея — новая переформулировка того, что мы ищем. Будем считать восемь элементов \mathbb{F}_2^3 цветами. В конструкции Секереша каждое ребро получало один цвет из трёх; теперь каждое ребро e получит пару P_e = \{s_1, s_2\} из двух различных цветов; цвета по-прежнему являются элементами \mathbb{F}_2^3.

    То есть у каждого ребра теперь два цвета. Потребуем выполнения одного локального условия:

    Вокруг каждой вершины каждый цвет s \in \Gamma встречается в парах инцидентных рёбер 0 или 2 раза.

    Представьте, что каждый цвет s — это нитка своего цвета, и ребро e несёт на себе две нитки: цветов s_1 и s_2 из его пары. Тогда условие говорит, что в каждой вершине нитку любого цвета можно “пропустить насквозь”: цвет либо вообще не заходит в вершину, либо заходит по одному ребру и выходит по другому. А нитка, которая нигде не обрывается, обязана замыкаться в циклы:

    Лемма 1 (лемма 2.1 препринта). Если такая расстановка пар существует, то у графа есть двойное покрытие циклами.

    Доказательство. Для каждого цвета s \in \Gamma соберём подграф M_s из всех рёбер, у которых в паре найдётся s. Локальное условие говорит, что у каждой вершины в M_s степень 0 или 2. Значит, M_s — дизъюнктное объединение циклов. А каждое ребро лежит ровно в двух подграфах M_s, потому что в паре P_e два элемента. Теперь соберём циклы всех восьми подграфов вместе, и готово: каждое ребро покрыто дважды. \blacksquare

    Это можно увидеть на конструкции Секереша: если у нас есть рёберная 3-раскраска, давайте зафиксируем два ненулевых элемента e_1 \neq e_2 и выдадим красным рёбрам пару \{0, e_1\}, синим — \{0, e_2\}, зелёным — \{e_1, e_2\}. Вокруг каждой вершины (где по одному ребру каждого цвета) элемент 0 встречается дважды (красное и синее ребро), e_1 дважды (красное и зелёное), e_2 дважды (синее и зелёное).

    Так что лемма 1 — это “ослабленная 3-раскраска”: цветов теперь восемь, у каждого ребра их два, и правило согласования вокруг вершины более слабое (более гибкое).

    Весь вопрос в том, как построить такую расстановку пар для снарков, где честной раскраски нет.

    Второй шаг: строим пары из потока

    Первый шаг, хотя и содержал уже ключевую идею, но по сути был переформулировкой классических результатов. А теперь начинается собственно новизна в доказательстве GPT 5.6.

    Пусть f — нигде не нулевой \mathbb{F}_2^3-поток; он есть по теореме о 8-потоках. Посмотрим на произвольную вершину v. У неё три ребра; обозначим их a, b, c (порядок выберем произвольно и зафиксируем), а значения потока на них обозначим через x = f(a), y = f(b), z = f(c).

    Условие Кирхгофа говорит, что x + y + z = 0, то есть

        \[z = x + y\]

    (напомню, что мы в \mathbb{F}_2^3, где плюс — это XOR, и минусов нет).

    Все три значения ненулевые, и легко видеть, что они попарно различны: если бы, скажем, было верно, что x = y, то мы бы получили z = x + y = 0. Кстати, отсюда же видно, что множество W = \{0, x, y, z\} замкнуто относительно сложения, то есть это двумерное подпространство в \mathbb{F}_2^3; эта деталь ещё сыграет ниже.

    Теперь выберем элемент t \in \mathbb{F}_2^3 — “базовый цвет” вершины v — и раздадим трём рёбрам вокруг v следующие пары:

        \[a \mapsto \{t,\; t+x\}, \qquad b \mapsto \{t+x,\; t+z\}, \qquad c \mapsto \{t,\; t+z\}.\]

    Проверим локальное условие: цвет t встречается в парах рёбер a и c (дважды), цвет t+x — в парах a и b (дважды), цвет t+z — в парах b и c (дважды), а больше никакие цвета не встречаются вовсе. Все три цвета t, t+x, t+z различны (поскольку x \neq z и оба ненулевые), так что всё честно: вокруг v каждый цвет встречается 0 или 2 раза. Итого получаем, что локальное условие выполнено.

    Полезно записать эти пары единообразно. Введём сдвиги g_{v,e} — по одному на каждую пару (вершина, инцидентное ребро):

        \[g_{v,a} = 0, \qquad g_{v,b} = x, \qquad g_{v,c} = 0,\]

    и тогда все три пары выше — это пары вида

        \[{\,t + g_{v,e},\; t + g_{v,e} + f(e)\,}.\]

    Действительно: для a получаем {t, t+x}; для b{t+x, t+x+y} = {t+x, t+z}; для c{t, t+z}. То есть пара ребра — это “базовый цвет вершины, сдвинутый на g, плюс тот же цвет, сдвинутый ещё и на значение потока”.

    Вот иллюстрация, слева в общем виде, справа с конкретными числами:

    Заметьте, что вся конструкция локальная, и в каждой вершине свой произвольный базовый цвет t = t_v. Это богатое семейство потенциальных раскрасок: в каждой вершине 8 вариантов t_v, плюс ещё свобода в выборе порядка рёбер a,b,c, который определяет сдвиги g.

    Проблема склейки. Но у ребра e = uv два конца! Вершина u предлагает ему пару {t_u + g_{u,e},\; t_u + g_{u,e} + f(e)}, вершина v — пару {t_v + g_{v,e},\; t_v + g_{v,e} + f(e)}. Чтобы расстановка пар была определена корректно, эти две пары должны совпасть на каждом ребре графа одновременно:

    Обе пары имеют вид {A, A+p} и {B, B+p} с одинаковым “шагом” p = f(e) \neq 0.

    Когда такие пары совпадают как множества? Либо A = B, либо A = B + p (тогда множества совпадают “крест-накрест”); одной формулой это можно записать как A + B \in \{0, p\}.

    Подставляя наши A и B и обозначая d_e = g_{u,e} + g_{v,e}, получаем, что пары на ребре e = uv согласованы тогда и только тогда, когда для какого-нибудь \varepsilon_e \in \{0, 1\} выполняется равенство

        \[t_u + t_v + \varepsilon_e f(e) = d_e.\]

    И вот мы пришли к ключевому шагу доказательства.

    Сдвиги g и “невязки” d_e — известные величины, они вычисляются по потоку f и выбранным порядкам рёбер. А базовые цвета t_v (по три бита на вершину) и переключатели \varepsilon_e (по биту на ребро) — неизвестные.

    Всё написанное выше — это система линейных уравнений над полем \mathbb{F}_2, по три битовых уравнения на каждое ребро. Осталось доказать, что она всегда имеет решение.

    Лемма 2 (лемма 2.2 препринта). Система склейки разрешима для любого кубического графа без петель, любого нигде не нулевого \mathbb{F}_2^3-потока f и любого выбора порядков рёбер (то есть сдвигов g).

    Интермедия: вся конструкция на примере

    Прежде чем доказывать разрешимость в общем виде, давайте посмотрим на все наши объекты на конкретном примере, а именно на самом маленьком кубическом графе, полном графе K_4. Он, конечно, не снарк, и для него всё можно было бы сделать по Секерешу, но механика конструкции здесь видна хорошо. Берём нигде не нулевой поток:

    На картинке сверху поток изображён слева: в каждой вершине XOR трёх значений равен 000 (проверьте!). Справа — сдвиги g и невязки d. Скажем, в вершине 0 мы упорядочили рёбра как a = \{0,1\}, b = \{0,2\}, c = \{0,3\}, поэтому по определению сдвигов g_{0,\{0,2\}} = f(\{0,1\}) = 001, а два других сдвига в этой вершине нулевые; и так возле каждой вершины появляется ровно по одному ненулевому сдвигу. Невязка ребра — это XOR сдвигов с двух его концов: например, у ребра \{1,2\} получается d = 001 + 010 = 011 (сдвиг 001 со стороны вершины 1 и сдвиг 010 со стороны вершины 2), а у ребра \{0,1\} оба сдвига нулевые, и d = 000.

    Теперь выписываем систему склейки — шесть уравнений, по одному на ребро — и решаем её (хоть методом Гаусса, хоть просто подбором):

    Наше решение выдаёт вершинам 0 и 1 базовый цвет 000, вершинам 2 и 3 — цвет 011, а на рёбрах \{0,2\} и \{0,3\} добавляет переключатель \varepsilon = 1 (это те рёбра, где пары с двух концов совпадают “крест-накрест”).

    Подставляя найденные t_v в формулу для пар, получаем расстановку, в которой вокруг каждой вершины каждый цвет встречается 0 или 2 раза; теперь можно собирать подграфы M_s. Непустых получается четыре:

    Узнаёте? Это в точности четыре треугольные грани планарного рисунка K_4, с картинки, с которой начинался этот пост. Наша конструкция, начав с потока, сама пришла к вложению графа в плоскость. Конечно, для планарного графа в этом ничего нового или интересного нет, но подчеркну ещё раз: самой конструкции всё равно, планарен граф или нет — для графа Петерсена она точно так же выдаст двойное покрытие, и мы его ещё увидим ниже.

    А теперь вернёмся к самой лемме, но прежде чем её доказывать, оценим ситуацию. Неизвестных у нас 3n + m битов, где n — число вершин, m — число рёбер; уравнений 3m. Для кубического графа m = 3n/2, поэтому 3n + m = 3n + 3n/2 = 3m: система квадратная! Но радоваться рано, потому что она очевидно вырожденная; например, прибавить ко всем t_v одну и ту же константу эквивалентно тому, чтобы ничего не изменить, ведь все уравнения зависят только от сумм t_u + t_v.

    Значит, у однородной системы есть нетривиальное ядро, а значит, отображение “неизвестные \to левые части” не сюръективно, и не всякая правая часть достижима.

    Лемма утверждает, что конкретная правая часть d, происходящая из потока, достижима всегда. Здесь, очевидно, должно сыграть какое-то специальное свойство d; и этим свойством окажется чётность.

    Шаг 3: чудо чётности

    Когда система линейных уравнений Lw = d (где w — вектор из всех наших неизвестных) неразрешима? Когда из уравнений выводится противоречие: можно так скомбинировать уравнения (над \mathbb{F}_2 — просто выбрать подмножество и сложить), чтобы слева всё сократилось в тождественный ноль, а справа остался не ноль.

    Классическая линейная алгебра (в функциональном анализе это называют альтернативой Фредгольма, в конечномерном случае это просто утверждение \mathrm{im}\, L = (\ker L^{\top})^{\perp}) говорит, что это единственная возможная причина неразрешимости:

    Система разрешима \Longleftrightarrow всякая комбинация уравнений, зануляющая левую часть, зануляет и правую.

    Разберёмся, как выглядят “комбинации уравнений”. Это единственная действительно техническая часть доказательства, и в целом её можно пропустить. Но я бы рекомендовал всё-таки разобраться, потому что хоть она и техническая, но на удивление простая для доказательства знаменитой открытой проблемы.

    На каждое ребро e приходится три битовых уравнения (по числу бит в \mathbb{F}_2^3), и выбрать их подмножество с последующим сложением — это то же самое, что применить к обеим частям векторного уравнения ребра линейную функцию \eta_e : \mathbb{F}_2^3 \to \mathbb{F}_2.

    Так что комбинация уравнений всей системы — это набор функций \eta = (\eta_e), по одной на ребро (в том числе здесь может быть тождественно нулевая функция, которая значит “уравнения этого ребра не берём”).

    Комбинация зануляет левую часть, если после сложения исчезают все неизвестные:

    • коэффициент при t_v: в левых частях t_v входит в уравнения всех трёх рёбер вокруг v, поэтому нужно, чтобы \sum_{e \ni v} \eta_e = 0 (как функция) для каждой вершины v;
    • коэффициент при \varepsilon_e: этот бит входит только в уравнение своего ребра с коэффициентом f(e), поэтому нужно, чтобы \eta_e(f(e)) = 0 для каждого ребра e.

    Назовём набор функций \eta, удовлетворяющий этим двум условиям, препятствием. По альтернативе Фредгольма лемма 2 сводится к следующему: для всякого препятствия \eta выполнено

        \[\sum_{e} \eta_e(d_e) = 0.\]

    То есть любое препятствие, занулив левую часть, обязано занулить и правую; если это так, то противоречия не выведешь, и система разрешима.

    Локальный анализ. Зафиксируем вершину v с рёбрами a, b, c и потоками x, y, z = x+y и посмотрим, что условия препятствия говорят локально. Во-первых,

        \[\eta_a + \eta_b + \eta_c = 0.\]

    Во-вторых,

        \[\eta_a(x) = \eta_b(y) = \eta_c(z) = 0.\]

    Обозначим \lambda_v = \eta_b(x) и вычислим:

        \[0 = \eta_c(z) = (\eta_a + \eta_b)(x + y) = \underbrace{\eta_a(x)}_{=0} + \eta_a(y) + \eta_b(x) + \underbrace{\eta_b(y)}_{=0},\]

    откуда \eta_a(y) = \eta_b(x); обозначим это значение через \lambda_v = \eta_a(y) = \eta_b(x).

    Теперь заметим, что вклад вершины v в интересующую нас сумму легко выражается через \lambda_v. Мы ведь знаем, что d_e = g_{u,e} + g_{v,e}, поэтому \sum_e \eta_e(d_e) = \sum_v \sum_{e \ni v} \eta_e(g_{v,e}) — это просто перегруппировка слагаемых по концам рёбер (здесь используется, что петель нет: у каждого ребра два разных конца).

    А вокруг v сдвиги почти все нулевые: g_{v,a} = g_{v,c} = 0, g_{v,b} = x, так что

        \[\sum_{e \ni v} \eta_e(g_{v,e}) = \eta_b(x) = \lambda_v.\]

    Ключевое наблюдение. Утверждается, что \lambda_v — это чётность числа ненулевых функционалов среди \eta_a, \eta_b, \eta_c. Проверим оба случая.

    Случай \lambda_v = 0. Тогда \eta_a зануляется и на x, и на y (мы только что доказали, что \eta_a(y) = \lambda_v = 0), то есть зануляется на всём подпространстве W = \langle x, y \rangle = \{0, x, y, z\} — помните, я обещал, что мы его ещё встретим?

    Аналогично, \eta_b зануляется на W (на x по определению \lambda_v, на y по условию препятствия), и \eta_c = \eta_a + \eta_b тогда тоже.

    Но W — двумерное подпространство трёхмерного пространства \Gamma, и функционалы, зануляющиеся на нём, образуют одномерное пространство: нулевой и ровно один ненулевой; назовём его \theta. Значит, каждый из \eta_a, \eta_b, \eta_c — это либо 0, либо \theta; а поскольку их сумма равна нулю, \theta встречается среди них чётное число раз: ноль или два. Итого получили, что чётность ненулевых равна 0, и это совпадает с \lambda_v.

    Случай \lambda_v = 1. Выпишем значения функционалов на базисе (x, y) подпространства W: у \eta_a это (0, 1), у \eta_b(1, 0), у \eta_c = \eta_a + \eta_b(1, 1). Все три ненулевые (что бы функционалы ни делали на третьей координате). Ненулевых три, чётность 1, то есть опять всё сходится.

    Финальный аккорд. Складываем по всем вершинам:

        \[\sum_e \eta_e(d_e) = \sum_v \lambda_v = \sum_v \#\{e \ni v : \eta_e \neq 0\} \bmod 2.\]

    Но в последней сумме каждое ребро e с \eta_e \neq 0 посчитано ровно два раза — по разу на каждом конце! Это тот же самый двойной подсчёт, которым первокурсникам доказывают “лемму о рукопожатиях” о том, что сумма степеней вершин в графе чётна.

    Значит, сумма чётна, то есть равна нулю в \mathbb{F}_2. Это значит, что любое препятствие зануляет правую часть, то есть система склейки разрешима, расстановка пар существует, и по лемме 1 двойное покрытие циклами есть. \blacksquare

    Вот и всё доказательство. Давайте перечислим, что мы использовали:

    • сведение к кубическим графам — стандартный факт из середины 1980-х;
    • теорема о 8-потоках Килпатрика–Джегера — оттуда же;
    • собственно новые конструкции — переформулировка с парами цветов, локальный анализ из потока и лемма о разрешимости системы, где нет ничего, кроме линейной алгебры над \mathbb{F}_2 и подсчёта чётности.

    Ни перебора случаев, ни ста страниц выкладок, ни теории, выходящей за пределы обычного курса теории графов. Конечно, я мог что-то пропустить, но кажется, что ошибке тут прятаться особо негде.

    Проверяем руками и кодом

    Думаю, многие сядут разбирать препринт с мыслью “где-то здесь должна быть ошибка”: у CDC длинная история ложных доказательств, а тут двухстраничное решение полувековой открытой проблемы. Мы с вами прошли по каждому переходу, и я честно не нашёл, к чему придраться. Использованные внешние результаты (сведение к кубическим графам и 8-поток) общеизвестны и многократно передоказаны в учебниках.

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

    Каждый шаг доказательства выше можно запрограммировать, а каждое промежуточное утверждение — проверить assert’ом: что пары с двух концов ребра совпали, что вокруг каждой вершины каждый цвет встречается 0 или 2 раза, что M_s распадаются в циклы, что каждое ребро покрыто ровно дважды. Если бы в доказательстве леммы 2 был изъян, то на каком-нибудь графе с каким-нибудь потоком система оказалась бы неразрешимой, и мы бы смогли обнаружить.

    Мы с Claude Code попробовали перебрать кое-какие классические примеры. Что проверялось:

    • граф Петерсена: у него ровно 28 560 нигде не нулевых \mathbb{F}_2^3-потоков, и мы перебрали все (плюс случайные перестановки локальных порядков рёбер); система разрешима всегда, покрытие корректно всегда;
    • снарки: цветки Айзекса J_5, J_7, \ldots, J_{13}, граф Титце, граф Петерсена с раздутыми в треугольники вершинами (это стандартный способ плодить нераскрашиваемые кубические графы) — проверили десятки случайных потоков на каждом;
    • мультиграфы с кратными рёбрами: тета-граф (две вершины, три параллельных ребра), кольца из двойных рёбер и случайные кубические мультиграфы; тем самым мы проверили, что у леммы всё в порядке и с циклами длины 2;
    • классические примеры: куб, графы Хивуда, Паппа, Дезарга, додекаэдр — проверили по полсотни случайных потоков; а на совсем маленьких графах (K_4, K_{3,3}, призма, мультиграфы выше) снова запустили полный перебор всех нигде не нулевых потоков;
    • случайные кубические графы до 200 вершин, порядка двухсот штук;
    • и отдельно на маленьких графах мы брутфорсом перечислили все линейные зависимости системы и убедились, что они ровно те, что описаны в доказательстве (условия-“препятствия”), и что все они зануляют правую часть.

    Итого мы сделали более тридцати пяти тысяч запусков конструкции, и не нашли ни единого сбоя. Вот как результат выглядит на графе Петерсена; слева нигде не нулевой поток (тот самый 8-поток, помеченный битовыми строками), справа — пары, которые выдало решение системы склейки:

    А вот восемь подграфов M_s — двойное покрытие, построенное по этим парам:

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

    А вот пример побольше, цветок Айзекса J_{13}; слева его покрытие, а справа уже совершенно нечитаемый случайный кубический граф:

    И вот покрытие для цветка Айзекса в читаемом виде:

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

    Промпт как исторический документ

    Теперь о том, как доказательство было получено и что происходило вокруг.

    OpenAI опубликовала полный промпт, которым запускали GPT 5.6 Sol Ultra, и это довольно любопытное чтение. Модели было доступно до 64 параллельных субагентов, и промпт в основном состоит из инструкций, как управлять этим роем. Например (перевод мой):

    Начните с по-настоящему разнообразного портфеля подходов. <…> Не сообщайте большинству агентов текущий предпочтительный подход. Сохраняйте независимость в ранних раундах, чтобы агенты не сошлись все к одной и той же привлекательной, но неполной редукции. < … >

    Используйте конкурентных агентов (adversarial agents) на всём протяжении доказательства: каждый кандидат в доказательство должен проверяться на точную двукратность покрытия, на замкнутые маршруты с повторными рёбрами, маскирующиеся под циклы, на двуциклы из параллельных рёбер, на несвязные графы, на точки сочленения, на мосты, привнесённые редукциями, и на циклическое использование утверждения, эквивалентного самой CDC.

    Отклоняйте отчёты о статусе, расплывчатый оптимизм и заявления, что недоказанное глобальное утверждение о согласованности — это “рутина”.

    Последний пункт особенно хорош: “глобальное утверждение о согласованности” — это как раз лемма 2, и промпт заранее запрещает модели объявить её очевидной. Очевидно, такой failure mode авторы промпта видели на практике.

    Отмечу ещё пару строк. Промпт прямо инструктирует модель: “Assume for purposes of this task that a complete affirmative proof exists” — “считайте, что полное доказательство существует”. Кроме того, он отдельно запрещает модели лезть в интернет проверять статус задачи и отвечать “это открытая проблема”.

    То есть авторы промпта целенаправленно запрещали модели использовать её (уже наверняка имеющееся) знание о том, что CDC не решена, — иначе она, как любая хорошо выдрессированная LLM, вежливо отказалась бы её решать.

    И вот ещё один крутой штрих: “Spend at least 8 hours on this before even thinking of returning or giving up” — “потратьте хотя бы 8 часов, прежде чем даже думать о том, чтобы сдаться”. Говорят, что модель управилась меньше чем за час.

    В треде на Hacker News прикинули стоимость такого запуска — оценки примерно от 300 до13000 в зависимости от предположений о железе. Согласитесь, что за решение полувековой важной проблемы это в любом случае недорого.

    И ещё одно наблюдение оттуда же: удивительно, насколько большая часть промпта уходит на то, чтобы просто заставить модель действительно решать задачу, а не отчитываться о трудностях. Это довольно любопытный эффект, и хотя с моим личным опытом он пока не сходится, как знать, что нас ждёт в ближайшем будущем…

    Реакции: “could have been discovered in the 1980s”

    Первым из известных математиков подробно отреагировал Томас Блум — тот самый хранитель erdosproblems.com, которого мы встречали и в истории с единичными расстояниями. В треде на X он пишет, что это “a very nice proof” — короткое, элементарное и такое, которое “могло быть найдено в 1980-х”. Он пишет, что никакой новой техники в нём нет, есть “небольшой контринтуитивный поворот” поверх хорошо известных идей.

    Вся критика Блума сводится к оформлению: препринт не цитирует работы, из которых выросли его ключевые идеи, в первую очередь ту самую статью Бермона, Джексона и Джегера 1983 года (о ней мы говорили выше: именно там развита техника покрытий чётными подграфами, дающая, в частности, то самое четырёхкратное покрытие каждого ребра, которое новое доказательство наконец “делит пополам”). Как пишет the-decoder:

    This is a frequent issue with AI-generated proofs and papers: they use ideas and proof strategies taken from the literature without proper citation.

    Это действительно известный недостаток, и дословно ту же претензию Мелани Мэтчетт Вуд предъявляла к работе про единичные расстояния (я подробно писал об этом тогда): модель “знает” большой объём литературы, и ей трудно отличить выученную идею от порождённой. Полностью корректная расстановка ссылок — пока не до конца решённая проблема AI-математики. Впрочем, как вы понимаете, это не то чтобы серьёзная критика.

    А ещё, разумеется, на HackerNews тут же высказались о характере доказательства: это ловкий трюк, который каким-то образом ускользнул от всех экспертов, а не построение новой теории. Настоящей вехой, как пишет один из комментаторов, будет момент, когда AI-модель решит проблему, требующую создания новой теории на десятки страниц.

    Ну что тут скажешь… Я много раз уже писал и рассказывал про moving the goalposts в AI. В науке с этим даже хуже, чем в более прикладных областях.

    Почему же люди это пропустили? Дальше моя личная гипотеза, я на ней не настаиваю. Но мне кажется, что всё дело в направлении атаки.

    Классический путь от 8-потока к покрытиям — через носители функционалов: семь чётных подграфов, каждое ребро в четырёх, и эту четвёрку действительно никак не сократить вдвое. Здесь стена, и логично, что это направление считалось тупиковым.

    Новый ход от GPT состоял в том, чтобы отдать каждому ребру не значения функционалов, а пару элементов группы, причём пару, определённую с точностью до локального сдвига \varepsilon_e. И вся проблема согласования раскраски сводится к одной глобальной линейной системе уравнений.

    После этого остаётся ещё “чудо чётности” из леммы 2; его, пока не выпишешь систему, просто неоткуда увидеть.

    Это очень похоже по духу на доказательства самих теорем о 6- и 8-потоках: короткое прямое применение линейной алгебры, которая непонятно почему должна была сработать, но сработала.

    Такие доказательства легко потерять проверить и очень сложно найти. Человек-эксперт скорее будет заниматься более многообещающими направлениями, а модель с 64 субагентами и восемью часами машинного времени может позволить себе копать там, где эксперт даже не остановился бы.

    Как заметил Якоб Цимерман по поводу прошлого результата, AI-системы “may play for longer and in more treacherous waters than mathematicians without getting overwhelmed”. Похоже, это и есть новая суперспособность текущих AI-систем: не гениальность, а невозмутимость и последовательность.

    Что остаётся открытым

    Итак, GPT решил важную открытую проблему. Но это не значит, что теория графов лишилась своего святого Грааля и теперь станет мёртвой наукой. CDC была узлом в целой сети гипотез о кубических графах и снарках, и большинство узлов этой сети всё ещё остаются открытыми.

    • Гипотеза Татта о 5-потоках (1954): у всякого графа без мостов есть нигде не нулевой 5-поток. Новое доказательство её не задевает: между 5-потоками и CDC нет известных импликаций ни в одну сторону, это соседние, но независимые вершины в сети гипотез.
    • Berge–Fulkerson conjecture (1971): в каждом кубическом графе без мостов найдутся шесть совершенных паросочетаний, покрывающих каждое ребро ровно дважды. Это родная сестра CDC (тоже “каждое ребро ровно дважды”, только теперь паросочетаниями), и она по-прежнему открыта.
    • Гипотеза Джегера о петерсеновской раскраске: рёбра любого кубического графа без мостов можно “покрасить рёбрами графа Петерсена” с сохранением смежности. Это утверждение влечёт и CDC, и гипотезу Фалкерсона, так что теперь оно стало чуть менее недосягаемым по последствиям, но само по себе всё ещё не доказано.
    • Ориентируемая CDC: можно ли всегда найти двойное покрытие, циклам которого можно придать направления так, чтобы каждое ребро проходилось два раза в противоположных направлениях? (Для покрытий из граней вложения в ориентируемую поверхность это так.)
    • Малые покрытия: гипотеза о том, что всегда достаточно покрытия, циклы которого группируются в 5 чётных подграфов. Конструкция из препринта даёт 8 подграфов M_s, но от восьми до пяти может быть ещё очень далеко.
    • Круговые вложения: та самая топологическая гипотеза, из которой CDC следовала; теперь следствие доказано, а причина — нет, и это отдельный интересный вопрос.

    Так что у специалистов по снаркам работы не убавилось, скорее наоборот: интересно будет посмотреть, какие из “соседних” утверждений окажутся принципиально сложнее, а какие тоже падут в ближайшем будущем.

    Заключение

    Итого получается вот какая картина. Гипотеза о двойном покрытии циклами имела 50-летнюю историю и статус “одной из главных открытых проблем теории графов”. И вот на днях она получила короткое, элементарное, конструктивное доказательство, которое, по утверждению OpenAI, полностью придумала модель GPT 5.6 Sol Ultra за час работы 64 параллельных агентов.

    Препринту три дня, формальной верификации сообществом пока нет, но доказательство настолько короткое и простое, что проверить его может каждый — я проверил и вручную, и кодом на примерах (не без помощи AI-ассистентов, разумеется, куда уж теперь без них).

    В мае мы получили опровержение гипотезы Эрдёша о единичных расстояниях, а в июле — доказательство CDC. Оба результата устроены одинаково: здесь не развивается новая мощная теория, но происходит некоторый неожиданный поворот поверх классических инструментов, найденный там, куда эксперты не смотрели, потому что направление “было понятно, что не работает”.

    Я не знаю, сколько ещё знаменитых задач имеют решения такого типа — короткие, но контринтуитивные. Судя по скорости прогресса, мы скоро узнаем: похоже, тот самый систематический поиск “низко висящих фруктов” в математике, о котором я говорил в последний год, уже идёт полным ходом.

    Если у вас есть любимая гипотеза, в которую вы верите, самое время написать про неё хороший промпт.

    Сергей Николенко

    P.S. Прокомментировать и обсудить пост можно в канале «Sineкура»: присоединяйтесь!

  • Train Valley Origins

    Train Valley Origins

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

    Разработчик Flazm из Вильнюса — точно наши люди; я когда-то, кажется, играл то ли в Train Valley, то ли в Train Valley 2, и у первой на Steam в графе Developer стоит “Alexey Davydov, Sergey Dvoynikov, Timofey Shargorodskiy”. Авторы любят паровозики и верны своей любви: первая Train Valley вышла ещё в 2015-м.

    Но в первую и вторую часть я если и играл, то не доиграл, а вот Train Valley Origins как-то между делом прошёл до конца. Суть игры классическая и прямолинейная: нужно соединять расположенные на поле станции рельсами и пускать по ним поезда.

    Стрелки переводить надо вручную мышкой (с геймпада здесь не поиграешь), запустить поезд нужно успеть, пока не пройдёт таймер. Таймер — важная часть игры, которая собственно создаёт сложность, но при этом таймер совершенно не создаёт стресс: в любой момент игру можно (и нужно!) поставить на паузу и спокойно разобраться.

    Есть разные специальные места на карте вроде алмазной шахты, которая добавляет ещё один вагон и увеличивает заработок, или лагеря разбойников, которые, наоборот, деньги воруют. К концу игры могут возникать довольно сложные ситуации, но их, опять же, всегда можно поставить на паузу, так что всё это по-прежнему полный релакс.

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

    Вот, собственно, и всё. Ненавязчивая музыка, сорок уровней, объединённых четырьмя темами вроде Дикого Запада или Китая. Но очень успокаивает и затягивает; мне даже немного стыдно того, сколько времени я в итоге провёл в этой игре. Антистресс в чистом виде, да ещё и мозги всё-таки включать приходится время от времени. Рекомендую.

    Сергей Николенко

    P.S. Прокомментировать и обсудить пост можно в канале «Sineкура»: присоединяйтесь!

  • Curyeux

    Curyeux

    Curyeux — это простой милый платформер с любопытной историей; вот первое, что мы видим при запуске игры:

    И это действительно студенческий проект: игру собрали выпускники Campus ADN, франкоязычного государственного колледжа игровых профессий в Монреале. Колледж был основан в 2005 году как Campus Ubisoft и только в 2011-м сменил имя. Выпускной проект там устроен как “симуляция предприятия”: студенты разных программ объединяются в одну большую команду и делают настоящую игру с релизом в Steam. Cureyux — как раз такая игра, и, кстати, поэтому распространяется бесплатно: школе было бы странно зарабатывать на работах студентов, которые и так платят за обучение.

    Играем мы за художницу по имени Люсьенн Грегуар и путешествуем по её воспоминаниям и внутренним мирам.

    Сюжет, скажем прямо, крайне соевый: девочка хочет рисовать, мама против, но девочка преодолевает сомнения и добивается своего. Всё это подаётся почти без слов, через окружение и катсцены, с максимально предсказуемой дугой про принятие себя и освобождение от чужих ожиданий.

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

    Так что лучше скажу, за что проект хочется хвалить безо всяких скидок. Во-первых, это очень крутоый визуал. Уровни устроены похоже по сути (беги, прыгай, решай несложные головоломки на восприятие), но стилистически все очень разные: карандашные наброски, акварель, яркие экспрессивные мазки. Каждый мир имеет свой стиль, и переходы между этими стилями производят впечатление.

    Во-вторых, платформинг оказался неожиданно хорошим и плотным: прыжки отзывчивые, чекпойнты расставлены разумно, задачки несложные, но требуют некоторой координации. Механик всего две-три, но они хорошо взаимодействуют друг с другом. От студенческого проекта можно было бы ждать красивую, но разваливающуюся демку — а тут плотная, крепко сбитая полуторачасовая игра, которую приятно пройти от начала до конца.

    В общем, Curyeux — это тот случай, когда рекомендовать легко и приятно: игра бесплатная, короткая и красивая. Не гениальный платформер, конечно, но приятный. Рекомендую.

    Сергей Николенко

    P.S. Прокомментировать и обсудить пост можно в канале «Sineкура»: присоединяйтесь!