ГоловнаСтаттіІнформаційна теорія та кодування

Комплексність Колмогорова: випадковість, яку жоден програма не може обчислити

Чому K(x) доведено непродукбельним, чому стиснута довжина є чесною заміною, яку ми використовуємо, та що LZ77 розкриває про справжню структуру рядка.

mysimulator teamОновлено — червень 2026≈ 9 хв читання▶ Відкрити симуляцію

Різний спосіб визначення випадковості

Шеннонів ентропія вимірює середній вміст інформації символів, взятих із відомого розподілу ймовірностей. Кольмуґоровська складність, розроблена незалежно Раєм Соломоном, Андрієм Колмуґоровим та Грегорі Чейтіном у 1960-х роках, ставить пов’язане, але принципово інше питання щодо одного конкретного рядка символів, без жодного розподілу ймовірностей: який є найкоротший можливий програма, в певній фіксованій мові відліку, що виводить саме цей рядок і потім зупиняється?

K(x)  =  length of the shortest program p such that  U(p) = x

// U is a fixed universal computer (a universal Turing machine)
// K(x) is measured in bits — the length of p's encoding, not the length of x
жива демонстрація · пов'язана симуляція● LIVE

Чому деякі рядки стислимі, а інші фундаментально ні

Розгляньте два рядки по 1000 символів. Перший складається з тисячі копій цифри "1". Другий генерується шляхом підкидання чесного монетки тисячу разів. У першому рядку дуже мале обчислювальне складність — програма, така як print("1") * 1000), точно його відтворює, незалежно від того, яку мову ви використовуєте (з невеликою постійною для навантаження інтерпретатора). Другий, якщо це справді випадкова послідовність без експлуатованих закономірностей, має коротший опис лише те саме, що й цитування рядка — будь-яка програма, яка його виводить, в найгіршому випадку, повинна бути принаймні такою ж довжиною, як рядок, який вона виробляє, тому не існує коротшого правила, яке б генерувало цю точну послідовність кидків монети та нічого іншого.

Це дає формальне визначення випадковості Кольмогоровим: рядок є обчислювально випадковим, якщо його обчислювальну складність наближено до його власної довжини — якщо найкоротший можливий опис його не суттєво коротший, ніж просто написати його. Це фундаментально відрізняється від Шеннонівського поняття, і вони можуть не згодні щодо одного реалізованого рядка: чесна монета підкидається тисячу разів має високу Шеннонівську ентропію як джерело (кожен кидок справді містить приблизно 1 біт інформації в середньому, до того, як ви побачите результат), але будь-яка конкретна реалізована послідовність, згенерована цим джерелом, з великою ймовірністю також є обчислювально випадковою Кольмогоровим сенсі — обидва показники погоджуються в типовому випадку, що не є випадковістю, але вони відповідають на різні питання (середнє невизначеність джерела, проти найкоротшого опису конкретної послідовності рядка).

Доказ того, що його не можна обчислити, в одному абзаці

Ось найгостріший і найвідоміший результат у цій галузі: K(x) не може бути обчислений жодним алгоритмом для будь-якого x, загалом. Класичне доведення базується на аргументі суперечність типу Беррі. Припустимо, що існує програма COMPLEXITY(x), яка завжди правильно обчислює K(x). Тоді можна написати короткий програму, яка перебирає всі рядки в порядку та виводить перший, чия колоногенна складність, згідно з віджетом COMPLEXITY, перевищує певний великий ліміт N — назвемо його «перший рядок із складністю більше ніж N, описаний меншою кількістю символів, ніж N». Але ця програма пошуку та виведення, а також фіксоване кодування N, сама по собі є описом цього рядка, використовуючи менше ніж N біт (логіка пошуку є невеликою сталою, а N потребує лише близько log2(N) біт для кодування) — що суперечить твердженню, що найкоротший опис рядка потребує більше ніж N біт. Ця суперечність неминуча для будь-якого N великого, коли log(N) плюс константа менше ніж N, що змушує зробити висновок, що жодна функція COMPLEXITY обчислення K(x) точно не може існувати.

Compression як чесна, обчислювана простата

Оскільки K(x) само по собі недосяжний, практикуючі застосовують стиснуту довжину під певним, фіксованим реальним алгоритмом стиснення як обчислюване засіб заміни — верхню межу для K(x), оскільки декомпресор та стиснені дані разом утворюють одну валідну, хоч і не обов’язково мінімальну програму, яка відтворює x. Будь-який загального призначення без втрат алгоритм стиснення працює як цей простір посередника, а LZ77 — алгоритм, що лежить в основі gzip, DEFLATE та демо-версії на цій сторінці, є одним із найпростіших для розуміння, оскільки його вихід явно розділяє стисливі та нестислі частини рядка.

LZ77 зсувне вікно стиснення, основна ідея: сканувати вперед по рядку на кожній позиції шукати назад у обмеженому вікні найдовшого відповідності тому, що йде далі якщо знайдеться відповідність довжиною >= певної мінімальної величини: випустити (відстань, довжину) посилання на зворотний бік замість безпосередніх символів інакше: випустити літеральні символи, не стиснуті // надзвичайно повторний рядок стискається до кількох посилань на зворотній бік // справді випадковий рядок майже не зменшується за довжиною — розмір стиснення є чесною простатою // алгоритм Запустіть LZ77 на рядку «тисяча одиниць» і він стискається до кількох байт — один літеральний «1» плюс одне довге посилання на зворотний бік, повторене або закодоване за допомогою розширеного кодування довжиною або запустіть його на тисячі справжніх кидків монети і він майже не зменшується за довжиною — розмір стиснення знаходиться близько до початкової довжини, що точно відображає передбачення Колмогорова про алгоритм випадкового рядка. Розмір стиснення є лише верхньою межею — розумніший алгоритм стиснення або більш витончений написаний вручну програма, яка використовує деякий прихований шаблон, який не бачить LZ77, завжди може знайти щось коротше — але як практичний, обчислювальний, чесний орієнтовний показник «наскільки стисливий цей конкретний рядок», це правильний інструмент для роботи, і це те, що запускає демо-версія на цій сторінці проти будь-якої бітної послідовності, яку ви надасте.

LZ77 sliding-window compression, the core idea:
  scan forward through the string
  at each position, look BACKWARD in a bounded window for the longest
  match to what comes next
  if a match of length >= some minimum is found:
    emit a (distance, length) BACK-REFERENCE instead of the raw characters
  else:
    emit the literal character(s), uncompressed

// a highly repetitive string collapses to a handful of back-references
// a genuinely random string finds almost no matches and stays close
// to its original length -- the compressed size IS the honest proxy

Де проявляються нездійсненність обчислень як практична межа

Невизначеність обчислюваності, яка лежить в основі комплексності Колмогорова, – це не просто цікава теорія. Вона надає суворий, незалежний від розподілу фундамент для бритви Оккама в машинному навчанні та теорії індуктивного висновування Соломонова (віддаючи перевагу найкоротшій гіпотезі, що відповідає даним, доводиться доречною як оптимальний попередній розподіл, у точній алгоритмічно-ймовірнісній формі). Це також безпосередньо пов'язано з теоремою неповністюсті Чайтена: для будь-якої послідовної формальної системи аксіом існує обчислювана межа, за якою система не може довести точну комплексну оцінку будь-якої конкретної послідовності символів, хоча кожна послідовність очевидно має певне значення комплексності – доведення та істина тут розходяться так само, як і показав Гёдель для арифметики.

Часті запитання

Яка різниця між Колмогоровим складністю та Шеннонівською ентропією?

Шеннонівська ентропія вимірює середній вміст інформації символів, взятих із відомого розподілу ймовірностей — це властивість джерела. Колмогорова складність вимірює найкоротший розмір програми, яка видає конкрельну окрему послідовність символів — це властивість саме цієї послідовності, без необхідності жодного розподілу ймовірностей. Двоє збігаються у типовому випадку для рядків, що генеруються випадковим джерелом, але вони є концептуально різними питаннями.

Чому Колмогорова складність не обчислювана?

Доведення через протиріччя у стилі барозу, або парадокс Беррі: якщо програма завжди правильно обчислює K(x), то її можна використати для побудови короткої програми, що описує «перший рядок, чия складність перевищує N» — але процедура написання цього описового програмного забезпечення займає лише приблизно log(N) біт, що суперечить твердженню, що рядку потрібно більше ніж N біт для опису. Той самий стиль самореференції лежить в основі проблеми зупинки та теорем про неповність Гільберта.

Якщо Колмогорова складність не може бути обчислена, чому хтось її використовує?

Тому що обчислюване верхнє обмеження на розмір стиснутої послідовності під будь-яким реальним алгоритмом стиснення (наприклад, LZ77 від gzip) є завжди корисним, оскільки декомпресор плюс стиснуті дані разом утворюють одну дійсну програму, яка відтворює рядок. Це лежить в основі суворих версій «закону найпростішого пояснення» (Occam's razor) в машинному навчанні та індукції Соломонова.

Спробуйте наживо

Усе, що вище, працює прямо у вашому браузері — відкрийте Kolmogorov Complexity і змінюйте параметри під час роботи. Нічого не встановлюється, нічого не завантажується на сервер, уся модель живе в одній вкладці.

▶ Відкрити симуляцію Kolmogorov Complexity

Що ви знайшли?

Додати кроки відтворення (опційно)