Могу только дать ссылку преобразования суммы в дигамма-функции.
Можете использовать заранее известные таблицы. Можете аппроксимировать степенной функцией, откуда найти обратную функцию и вычислить i из X. Самый адекватный вариант.
Поиск i лучше делать не последовательным перебором, а половинным делением.
Добавка на каждом шаге уменьшается, значит, вы можете аппроксимировать 3-4 прямыми.
Griboks, в random.choices как раз bisect используется для поиска i. И да, если избавиться от хранения огромного массива для больших N в памяти, то логарифмическая сложность поиска i была бы уже достаточно хорошим решением.
Сергей Паньков, ок, давайте подумаем.
1. C[n] - это смещённая частичная сумма гармонической прогрессии. Значит C[n] = H[n+a]-H[n]=ln(1+n/a). Отлично, это уже О(1) по количеству базовых операций.
2. Из этого можно найти формулу n=ceil(a*(exp(X)-1)) и обойтись без вероятностей.