Это явление знакомо всякому, кто хоть раз записывал музыку на магнитную ленту. Первая копия была немного шумнее оригинала (шум представляет собой случайные неточности). На второй копии (т. е. копии копии) шумов было еще больше, а десятая содержала один только шум.
Это наводит на мысль, что с той же проблемой столкнется и мир цифровых вычислительных машин. Рассмотрим передачу цифровой информации по некоему каналу. Поскольку идеальных каналов не существует, любому из них изначально будет присущ определенный уровень ошибок. Допустим, мы выбрали канал с вероятностью правильной передачи каждого бита 0,9. Если я отправлю сообщение длиной в один бит, вероятность точной передачи его через этот канал будет равна 0,9. Допустим, я отправил 2 бита. Теперь точность составит 0,92 = 0,81. А если я отправлю 1 байт (8 битов)? В таком случае вероятность, что я получу его правильно, окажется менее 0,5 (0,43, если быть точным). Вероятность точной отправки пяти байтов составит около 1 процента.
На первый взгляд наилучший способ обойти эту проблему – сделать канал более точным. Предположим, канал совершает всего одну ошибку на миллион битов. Если я отправлю файл размером в полмиллиона байт (примерно столько «весит» скромная программка или база данных), вероятность правильной его передачи составит менее 2 процентов, хотя изначально точность канала была весьма высока. Учитывая, что ошибка в один бит может испортить всю компьютерную программу, это не лучший выход. Вне зависимости от исходной точности канала вероятность ошибки стремительно возрастает с увеличением размера сообщения. Выходит, эта проблема неразрешима?
Аналоговые вычислительные машины тоже аккумулируют неточности, но если ограничиться небольшим набором вычислений, они оказываются весьма полезными. Цифровые машины, с другой стороны, требуют наличия постоянной связи не только между двумя разными машинами, но и между собственными составными частями. Так, память связана с центральным процессором, внутри которого происходит постоянный обмен данными между регистрами, а также между регистрами и арифметическим устройством. Внутри арифметического устройства информация передается от одного битового регистра к другому. Если считать, что частота ошибок стремительно возрастает с увеличением количества таких связей и что ошибка в один бит может нарушить весь процесс, то необходимо признать: цифровые машины обречены.
Таково было общее мнение, пока Шеннон не провозгласил первую ключевую идею информационной эры. Он продемонстрировал, что мы можем создавать произвольно точные сообщения, используя самые ненадежные каналы передачи информации. В своей знаковой статье «Математическая теория связи», опубликованной в журнале Bell System Technical Journal в июле и октябре 1948 года, Шеннон предложил теорему кодирования для каналов с шумами, которая гласила: если у вас есть доступный канал с любым коэффициентом ошибок (за исключением 50 процентов на бит, поскольку это означает, что канал передает чистый шум), вы можете передать сообщение с любой желаемой степенью точности. Другими словами, частота появления ошибок может составлять один бит из n бит, где n может быть сколь угодно большим. Например, если у вас есть канал, который правильно передает биты информации только в 51 проценте случаев (т. е. передает правильный бит чуточку чаще, чем неправильный), вы тем не менее можете передавать сообщения таким образом, что неправильным окажется только один бит из миллиона, один бит из триллиона или один бит из триллиона триллионов.
Как такое возможно? Ответ: через избыточность.
Сейчас подобное решение может показаться элементарным, но в то время оно было далеко не очевидным. Рассмотрим простой пример. Если я передам каждый бит три раза и применю «принцип большинства», то я значительно повышу надежность результата. Если этого будет недостаточно, я могу увеличить избыточность, пока не получу необходимую надежность. Повторение информации – самый простой способ достичь высокой точности в каналах низкой точности. Однако данный подход не самый эффективный. В своей статье Шеннон не только заложил основы теории информации, но и предложил оптимальные методы обнаружения и исправления ошибок. Эти методы позволяли добиться любой желаемой точности через любой неслучайный канал.
Читатели более старшего возраста наверняка помнят телефонные модемы, в которых постоянно что-то шипело и щелкало, так как они передавали информацию по аналоговым линиям с высоким уровнем помех. Однако те же модемы могли передавать цифровые данные с очень высокой точностью – благодаря теореме Шеннона для канала с шумами.