§4. Быстрый показательный датчик: один логарифм на всю пачку
Компьютер считает через разложение в ряд, и для приличной точности это около 20 арифметических операций. В серьёзных моделях — скажем, надёжность системы, где детали ломаются и чинятся в случайные моменты, — показательный датчик дёргают миллионы раз, глубоко внутри расчёта. Каждая сэкономленная операция там окупается. Идея этого параграфа: один логарифм на чисел вместо логарифмов.
Параграф технически потяжелее, но инструменты из него — гамма-распределение, порядковые статистики, спейсинги — ещё не раз пригодятся дальше. Так что потерпи.
Гамма-распределение
Величина имеет гамма-распределение с параметрами и (пишут ), если её плотность
Тут — та самая гамма-функция Эйлера из главы 3 (обобщение факториала, ). Знакомый показательный закон — это частный случай при . Моменты считаются в одну строку:
Лемма 1. Если и независимы, то .
Параметры просто складываются. Главное следствие для нас: сумма независимых показательных величин имеет закон . По-дворовому: если ждать маршруток подряд, и каждую ждёшь показательное время, то общее время ожидания — гамма с .
Порядковые статистики
Расставим значения выборки по возрастанию: . Этот набор называют вариационным рядом, а сами — порядковыми статистиками. Крайние ты уже знаешь: — минимум, — максимум из §2.
Лемма 2. Если независимы и равномерны на , то плотность вектора порядковых статистик равна на множестве и нулю вне его.
Смысл: упорядоченные равномерные точки равномерно размазаны по «упорядоченной» части куба, а берётся потому, что все порядков исходных чисел равновероятны и схлопываются в один.
Расстояния между соседними точками, (с краями , ), называют равномерными спейсингами — это как случайно нарезать палку длины 1 на куски.
Лемма 3. Пусть — выборка из показательного закона и . Тогда вектор распределён так же, как порядковые статистики равномерного числа на .
Вот это и есть ключ. Если отметить моменты прихода маршруток и поделить их на общее время , то относительные моменты окажутся просто упорядоченными равномерными точками. И наоборот: случайно нарезал общее время равномерными разрезами — получил честные показательные интервалы.
Теорема о быстром датчике
Теорема 2. Пусть независимы и равномерны на ; — упорядоченные по возрастанию числа ; , . Тогда
— выборка из показательного закона с параметром .
Разберём по кирпичикам, что тут происходит:
- — это сумма показательных чисел (каждое слагаемое — метод обратной функции), то есть общее время по закону . Произведение равномерных и один логарифм вместо .
- — равномерных разрезов, упорядоченных по возрастанию.
- — длины кусков, на которые разрезы режут отрезок .
- Умножаем длины кусков на общее время — получаем интервалов. По лемме 3 это и есть независимые показательные числа.
Например, при :
По-дворовому: общак сначала посчитали одной суммой (один логарифм), а потом поделили случайными разрезами. Доли получились честные — как если бы каждый считал своё отдельно.
Где экономия и где подвох
Экономия: на показательных чисел уходит один логарифм. Подвох: равномерных нужно вместо , а ещё разрезов надо отсортировать. Чем больше , тем дороже сортировка. Расчёты на компьютерах показали, что оптимум — около , и такой датчик работает примерно вдвое быстрее метода обратной функции.
Покрути виджет: при это обычный метод обратной функции, при больших гистограмма остаётся на месте, а логарифмов на одно число становится .
Проверим в коде, что числа действительно показательные: среднее должно быть , дисперсия . Заодно посчитаем, сколько логарифмов ушло.
В питоне выигрыша по скорости не увидишь — там логарифм вызывается из быстрой C-библиотеки и стоит копейки. Экономия ощутима в низкоуровневом коде, где каждая операция на счету.