Skip to Content

§4. Быстрый показательный датчик: один логарифм на всю пачку

Компьютер считает ln⁡x\ln x через разложение в ряд, и для приличной точности это около 20 арифметических операций. В серьёзных моделях — скажем, надёжность системы, где детали ломаются и чинятся в случайные моменты, — показательный датчик дёргают миллионы раз, глубоко внутри расчёта. Каждая сэкономленная операция там окупается. Идея этого параграфа: один логарифм на nn чисел вместо nn логарифмов.

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

Гамма-распределение

Величина TT имеет гамма-распределение с параметрами α>0\alpha > 0 и λ>0\lambda > 0 (пишут T∼Γ(α,λ)T \sim \Gamma(\alpha, \lambda)), если её плотность

pT(x)=λαΓ(α) xα−1e−λx,x>0.p_T(x) = \frac{\lambda^\alpha}{\Gamma(\alpha)}\, x^{\alpha - 1} e^{-\lambda x}, \quad x > 0.

Тут Γ(α)\Gamma(\alpha) — та самая гамма-функция Эйлера из главы 3 (обобщение факториала, Γ(n)=(n−1)!\Gamma(n) = (n-1)!). Знакомый показательный закон — это частный случай при α=1\alpha = 1. Моменты считаются в одну строку:

MTk=α(α+1)⋯(α+k−1)λk.\mathbf{M}T^k = \frac{\alpha(\alpha+1)\cdots(\alpha+k-1)}{\lambda^k}.

Лемма 1. Если T1∼Γ(α1,λ)T_1 \sim \Gamma(\alpha_1, \lambda) и T2∼Γ(α2,λ)T_2 \sim \Gamma(\alpha_2, \lambda) независимы, то T1+T2∼Γ(α1+α2,λ)T_1 + T_2 \sim \Gamma(\alpha_1 + \alpha_2, \lambda).

Параметры α\alpha просто складываются. Главное следствие для нас: сумма nn независимых показательных величин τ1+⋯+τn\tau_1 + \dots + \tau_n имеет закон Γ(n,λ)\Gamma(n, \lambda). По-дворовому: если ждать nn маршруток подряд, и каждую ждёшь показательное время, то общее время ожидания — гамма с α=n\alpha = n.

Порядковые статистики

Расставим значения выборки (ξ1,…,ξn)(\xi_1, \dots, \xi_n) по возрастанию: ξ(1)≤ξ(2)≤⋯≤ξ(n)\xi_{(1)} \le \xi_{(2)} \le \dots \le \xi_{(n)}. Этот набор называют вариационным рядом, а сами ξ(k)\xi_{(k)} — порядковыми статистиками. Крайние ты уже знаешь: ξ(1)\xi_{(1)} — минимум, ξ(n)\xi_{(n)} — максимум из §2.

Лемма 2. Если η1,…,ηn\eta_1, \dots, \eta_n независимы и равномерны на [0,1][0,1], то плотность вектора порядковых статистик (η(1),…,η(n))(\eta_{(1)}, \dots, \eta_{(n)}) равна n!n! на множестве {0<x1<⋯<xn<1}\{0 < x_1 < \dots < x_n < 1\} и нулю вне его.

Смысл: упорядоченные равномерные точки равномерно размазаны по «упорядоченной» части куба, а n!n! берётся потому, что все n!n! порядков исходных чисел равновероятны и схлопываются в один.

Расстояния между соседними точками, Δi=η(i)−η(i−1)\Delta_i = \eta_{(i)} - \eta_{(i-1)} (с краями η(0)=0\eta_{(0)} = 0, η(n+1)=1\eta_{(n+1)} = 1), называют равномерными спейсингами — это как случайно нарезать палку длины 1 на куски.

Лемма 3. Пусть τ1,…,τn\tau_1, \dots, \tau_n — выборка из показательного закона и Si=τ1+⋯+τiS_i = \tau_1 + \dots + \tau_i. Тогда вектор (S1/Sn,…,Sn−1/Sn)(S_1/S_n, \dots, S_{n-1}/S_n) распределён так же, как порядковые статистики n−1n-1 равномерного числа на [0,1][0,1].

Вот это и есть ключ. Если отметить моменты прихода маршруток S1,S2,…S_1, S_2, \dots и поделить их на общее время SnS_n, то относительные моменты окажутся просто упорядоченными равномерными точками. И наоборот: случайно нарезал общее время равномерными разрезами — получил честные показательные интервалы.

Теорема о быстром датчике

Теорема 2. Пусть η1,…,η2n−1\eta_1, \dots, \eta_{2n-1} независимы и равномерны на [0,1][0,1]; ξ1<⋯<ξn−1\xi_1 < \dots < \xi_{n-1} — упорядоченные по возрастанию числа ηn+1,…,η2n−1\eta_{n+1}, \dots, \eta_{2n-1}; ξ0=0\xi_0 = 0, ξn=1\xi_n = 1. Тогда

τi′=−1λ (ξi−ξi−1) ln⁡(η1η2⋯ηn),i=1,…,n,\tau'_i = -\frac{1}{\lambda}\,(\xi_i - \xi_{i-1})\,\ln(\eta_1 \eta_2 \cdots \eta_n), \qquad i = 1, \dots, n,

— выборка из показательного закона с параметром λ\lambda.

Разберём по кирпичикам, что тут происходит:

  • −1λln⁡(η1⋯ηn)=∑i=1n(−1λln⁡ηi)-\tfrac1\lambda \ln(\eta_1 \cdots \eta_n) = \sum_{i=1}^n \bigl(-\tfrac1\lambda \ln \eta_i\bigr) — это сумма nn показательных чисел (каждое слагаемое — метод обратной функции), то есть общее время по закону Γ(n,λ)\Gamma(n, \lambda). Произведение равномерных и один логарифм вместо nn.
  • ξ1<⋯<ξn−1\xi_1 < \dots < \xi_{n-1} — n−1n - 1 равномерных разрезов, упорядоченных по возрастанию.
  • ξi−ξi−1\xi_i - \xi_{i-1} — длины кусков, на которые разрезы режут отрезок [0,1][0,1].
  • Умножаем длины кусков на общее время — получаем nn интервалов. По лемме 3 это и есть независимые показательные числа.

Например, при n=2n = 2:

τ1′=−1λ η3ln⁡(η1η2),τ2′=−1λ (1−η3)ln⁡(η1η2).\tau'_1 = -\frac{1}{\lambda}\,\eta_3 \ln(\eta_1\eta_2), \qquad \tau'_2 = -\frac{1}{\lambda}\,(1 - \eta_3) \ln(\eta_1\eta_2).

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

Где экономия и где подвох

Экономия: на nn показательных чисел уходит один логарифм. Подвох: равномерных нужно 2n−12n - 1 вместо nn, а ещё n−1n - 1 разрезов надо отсортировать. Чем больше nn, тем дороже сортировка. Расчёты на компьютерах показали, что оптимум — около n=3n = 3, и такой датчик работает примерно вдвое быстрее метода обратной функции.

Покрути виджет: при n=1n = 1 это обычный метод обратной функции, при больших nn гистограмма остаётся на месте, а логарифмов на одно число становится 1/n1/n.

Быстрый показательный датчик: один логарифм на n чисел

6000 чисел по теореме 2 против плотности λe^(−λx). При n = 1 это обычный метод обратной функции.Цена одного показательного числа: логарифмов 0.33, равномерных 1.67, плюс сортировка 2 чисел на каждые 3.

Проверим в коде, что числа действительно показательные: среднее должно быть 1/λ1/\lambda, дисперсия 1/λ21/\lambda^2. Заодно посчитаем, сколько логарифмов ушло.

Загрузка редактора…

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

Проверь себя

Тест

Сколько логарифмов нужно быстрому датчику (теорема 2), чтобы получить n показательных чисел?
Обновлено