
Введение
Допустим, я спрошу вас, сколько человек должно быть в комнате, чтобы у двух из них день рождения с вероятностью 50% приходился на один день. Каким будет ответ? Именно это и называется парадоксом дней рождения.
Парадокс гласит:
Если в комнате есть 23 человека, то с вероятностью 50% двое из них родились в один день.
В некоторых версиях парадокса делаются ещё более сильные заявления:
Если в комнате 70 человек, то с вероятностью 99% двое из них родились в один день.
Поначалу это казалось мне удивительным и контринтуитивным. Давайте выясним, почему же это правда. Чтобы упростить задачу, мы сделаем следующие допущения:
- Будем считать, что все люди в комнате родились не в високосный год. Мы делаем это допущение, чтобы нам не пришлось анализировать два разных случая.
- В комнате нет близнецов. При наличии пары близнецов решение будет тривиальным.
- Мы предполагаем, что люди рождаются равномерно и случайно. Что это значит? Люди с равной вероятностью могут рождаться в любой день года. Если немного это формализовать, то вероятность рождения в любой выбранный день равна
.
- Люди рождаются независимо друг от друга. Это значит, что дата рождения любого человека не влияет на дату рождения другого.
Стоит заметить, что эти условия необязательно соблюдаются в реальном мире. В частности, в реальном мире люди не рождаются с равномерной случайностью. По этой ссылке есть статистика по дням, в которые рождаются люди. Хотя наша модель не является точным отражением реального мира, её простота позволяет значительно облегчить анализ задачи.
Нужно сказать, что если в комнате находится 366 или более людей, то в ней гарантированно есть два человека с одинаковым днём рождения. Это следует из принципа Дирихле («принципа голубей и ящиков»): если есть 366 человека и 365 дней, то по крайней мере два человека обязательно имеют одинаковый день рождения.
Представим, что в комнате один человек, тогда вероятность его общего дня рождения с кем-то ещё равна 0. Пусть
Допустим, в комнате два человека, A и B. Без утери обобщения просто представим, что человек A родился 1 января. Чтобы у B и A были разные дни рождения, нужно, чтобы B родился в любой день, кроме 1 января. У человека B будет 364 варианта дня рождения.
Представим, что в комнате три человека, A, B и C. Допустим, что человек A родился 1 января, тогда чтобы все они родились в разные дни, человеку B остаётся только 364 дней, как и в предыдущем примере. Так как A и B занимают два дня, человек C может родиться только в 365 — 2 = 363 дня.
Здесь происходит нечто более интересное: предположим, что в комнате уже есть
- Все
людей, вошедших в комнату до него, должны иметь разные дни рождения. Какова вероятность этого?
.
-тому человеку нужно иметь отличающийся день рождения от всех других
людей в комнате. Какова вероятность этого?
.
Также нужно заметить, что два представленных выше исхода независимы друг от друга, потому что по допущению (4), сделанному в начале поста,
Теперь вычислим вероятности:
Поскольку мы получили
При увеличении
Более сложная задача
Допустим, мы хотим обобщить эту задачу до случая, когда есть
Можно использовать такую же систему: у нас будет исход
В случае, когда есть два человека, обозначим их как A и B. Чтобы человек B родился в другой день, человек B должен иметь день рождения среди
В случае с тремя людьми человек B должен иметь день рождения, отличающийся от дня рождения A. У человека C должен быть день, отличающийся от дней рождения A и B.
В общем случае для любого
Допустим, если мы хотим найти выражение в замкнутой форме для
Аппроксимацией этого результата является
В абстрактном виде парадокс дней рождения имеет множество применений в компьютерных вычислениях. В частности, он используется в хэшировании, которое само по себе имеет множество применений. Выводы, сделанные в этой задаче, являются ключевыми для анализа вероятности хэширования двух элементов в один ключ. Эту задачу можно ещё более обобщить до вероятностной задачи мячей и корзин (balls and bins problem), которую мы оставим для другого поста.
Применение
Парадокс дней рождения — это не просто искусственная задача или любопытный трюк для вечеринок, он имеет множество областей применения в реальном мире. Лично я считаю, что вероятностный анализ, используемый в доказательствах, полезен при анализе других задач, в которых задействована рандомизация. В частности, это относится к области разработки криптографических хэш-функций. Мы посмотрим, как сделанный выше анализ может оказаться довольно полезен при создании хэш-функций с защитой от атак «дней рождения».
Для начала определим, что такое хэш-функция. Хэш-функция
Одно из множества свойств, которыми должна обладать крипторафическая хэш-функция — стойкость к коллизиям. Должно быть сложно найти два таких
Именно на стойкости к коллизиям мы и сосредоточимся. Во-первых, я объясню, почему она является желательным свойством. Для этого мы сначала рассмотрим цифровые подписи.
В прошлом для «подписания» документов люди и организации пользовались подписями и печатями. В последнее время происходит переход к электронным или цифровым подписям. Цифровая подпись должна удовлетворять трём основным свойствам.
- При подписании документа нужна возможность проверить, кто подписал документ.
- После подписания документа никто не должен иметь возможности его подделать.
- Лицо, подписавшее документ, не может в дальнейшем опровергнуть подписание документа.
Цифровая подпись — это способ доказуемого подтверждения истинности документа или сообщения. Цифровая подпись гарантирует, что полученное сообщение было создано известным отправителем и не изменялось.
Допустим, у нас есть документ
Каждый пользователь/организация имеет уникальный закрытый ключ
- Получаем закрытый ключ
.
- Хэшируем документ
и получаем
.
- Подписываем
при помощи закрытого ключа
.
- Отправляем
и открытый ключ
всем, кто желает подтвердить документ.
Любой, у кого есть
Проблема: предположим, что злоумышленник Ева нашла два документа
В приведённом выше примере
Пусть
Задача атаки «дней рождения» — найти наименьшее количество элементов
При атаке «дней рождения» злоумышленник будет случайным образом подбирать
Для анализа атаки «дней рождения» можно использовать те же принципы, которые мы применяли для парадокса дней рождения. В атаке «дней рождения»
Ранее мы показали, что
Мы хотим задать
Показанный выше анализ говорит нам, что для получения коллизии в хэш-функции с интервалом размера
Допустим, что мы хотим получать коллизию с вероятностью 50%; тогда нам нужно
Дополнительные задачи
- Имея
людей,
дней и некое число
, найти вероятность того, что ровно
людей имеют одинаковый день рождения.
- Давайте немного преобразуем приведённую выше задачу. Допустим, у нас есть
дней и некое число
. Каким будет наименьшее значение
, при котором не менее
людей будет иметь одинаковый день рождения с вероятностью не менее 0,5? Сможете ли вы обобщить эту задачу для любой вероятности
?
- Допустим, у нас есть 100 чисел от 1 до 100, а также машина, угадывающая случайное число от 1 до 100 в однородном и случайном порядке. Сколько раз нам нужно будет воспользоваться машиной по математическому ожиданию, чтобы машина угадала все числа о 1 до 100?
- Сможете ли вы обобщить эту задачу до любых
?
- Допустим, у нас есть хэш-функция, случайным однородным образом отображающая элементы в области памяти. Пусть всего областей
. Сколько элементов
нужно добавить в нашу структуру данных по математическому ожиданию, чтобы в каждую область были хэшированы по крайней мере два элемента?