Гармонические числа
Гармонические числа (harmonic numbers) — числа
Hn=def1+21+31+41+⋯+n−11+n1=k=1∑nk1 Эти числа повсеместно встречаются в анализе алгоритмов.
Асимптотические формулы
Важное свойство гармонических чисел, основа их асимптотического анализа — Hn∼lnn.
Доказать это можно, рассмотреть если ограничить Hn с двух сторон интегралами
1∫nxdx⩽Hn⩽1+1∫nxdx⟺lnn⩽Hn⩽1+lnn Делим все части неравенства на lnn и переходим к пределу.
Hn∼lnnпри n→∞ Есть более общая формула, использующая константу Эйлера-Маскерони γ=defn→∞lim(Hn−lnn)
Hn=γ+lnn+2n1−k=1∑∞2k⋅n2kB2k Асимптотическую формулу можно применять для нахождение времени работы алгоритмов.
Например, следующая конструкция достаточно часто встречается
for int i = 1; i <= n; i++:
for int j = i; j <= n; j += i:
Количество итераций вложенного цикла, которое совпадает с количеством выполнения куска кода ,
равно
j=1∑n⌊jn⌋⩽j=1∑njn=n⋅Hn∼nlnn Гармонические суммы
Гармонические числа постоянно встречаются в анализе алгоритмов, поэтому полезно будет заранее получить
много полезных свойств, которыми обладают суммы с гармоническими числами.
Степенные суммы
Вычислим сумму гармонических чисел k=1∑nHk, поменяв порядок суммирования
k=1∑nHk=k=1∑nj=1∑kj1=j=1∑njn+1−j=(n+1)Hn−n Давайте теперь вычислим общую сумму k=1∑nkmHk.
k=1∑nkHk=k=1∑nj=1∑kj1=j=1∑njn+1−j=(n+1)Hn−n Способ вычисления. Поскольку сама формула суммы очень большая и сложная, я просто покажу, как её можно считать,
а потом приведу некоторые частные значения.
Рассмотрим исходную сумму k=1∑nkmHk, распишем гармоническое число
и поменяем порядок суммирования
k=1∑nkmHk=k=1∑nkmj=1∑kj1=j=1∑nj1k=j∑nkm Внутренняя сумма — это сумма m-х степеней чисел от j до n.
Эту сумму можно вычислить как разность сумм Фаульхабера для n и для j.
Суммы Фаульхабера мною подробно анализировались в разделе «Суммы k-х степеней» статьи «Числа Бернулли»
k=j∑nkm=k=1∑nkm−k=1∑j−1km=m+11ℓ=0∑m(ℓm+1)Bℓ(nm+1−ℓ−(j−1)m+1−ℓ) Подставляем и считаем
k=1∑nkmHk=m+11ℓ=0∑m(ℓm+1)Bℓ⋅j=1∑njnm+1−ℓ−(j−1)m+1−ℓ==m+11ℓ=0∑m(ℓm+1)Bℓ⋅(nm+1−ℓHn−j=1∑nj(j−1)m+1−ℓ) Далее для вычисления нужно разложить (j−1)m+1−ℓ по формуле бинома Ньютона
j=1∑nj(j−1)m+1−ℓ=j=1∑ni=0∑m+1−ℓ(im+1−ℓ)(−1)m+1−ℓ−iji−1=i=0∑m+1−ℓ(im+1−ℓ)(−1)m+1−ℓ−ij=1∑nji−1==(−1)m+1−ℓHn+i=1∑m+1−ℓ(im+1−ℓ)(−1)m+1−ℓ−ij=1∑nji−1 Теперь осталась сумма Фаульхабера
j=1∑nji−1=i1s=0∑i−1(si)Bsni−s Можно собрать всё воедино
k=j∑nkmHk=m+11ℓ=0∑m(ℓm+1)Bℓ⋅(nm+1−ℓHn+(−1)m−ℓHn++i=1∑m+1−ℓ(im+1−ℓ)i(−1)m−ℓ−is=0∑i−1(si)Bsni−s) Теперь некоторые значения сумм
k=1∑nkHkk=1∑nk2Hkk=1∑nk3Hkk=1∑nk4Hkk=1∑nk5Hk=2n(n+1)⋅Hn−4n(n−1)=6n(n+1)(2n+1)⋅Hn−36n(n−1)(4n+1)=4n2(n+1)2⋅Hn−48n(n−1)(n+1)(3n−2)=30n(n+1)(2n+1)(3n2+3n−1)⋅Hn−1800n(n−1)(72n3+27n2−103n−28)=12n2(n+1)2(2n2+2n−1)⋅Hn−720n(n−1)(n+1)(2n−1)(10n2−n−18) Обобщённые гармонические числа
Можно рассматривать суммы обратных s-х степеней натуральных чисел.
Тогда мы получим обобщённые гармонические числа, которые тоже иногда встречаются при анализе алгоримтов
Hn(s)=def1+2s1+3s1+4s1+⋯+(n−1)s1+ns1=k=1∑nks1 Обобщённые гармонические числа можно использовать, например, для приближения обычных гармонических чисел.
Посмотрим на ряд
ln(k−1k)=k1+2k21+3k31+4k41+⋯=j=1∑∞j⋅kj1 Справа написано lnk−ln(k−1), а значит можно выразить lnn−ln1 как
сумму
lnn−ln1=k=2∑nln(k−1k)=k=2∑nj=1∑∞j⋅kj1=j=1∑∞jHn(j)−1 Отсюда можно, например, получить значение γ с большой сходимостью,
порядка 1/2s
Hn−lnn=1−21(Hn(2)−1)−31(Hn(3)−1)−41(Hn(4)−1)−⋯=1−s=2∑∞jHn(j)−1 Переходя к пределу n→∞ получаем
γ=1−s=2∑∞jζ(j)−1 где ζ(j) — дзета-функция Римана, ζ(s)=k=1∑∞1/ks
Значения ⌊n/j⌋