хорошо, если вы не можете сделать это прямо, время стать умным, верно?
Так что идея получить диапазоны, где вся сумма может быть вычислена быстро. Я добавлю псевдокод, который даже не компилируется, может содержать ошибки и т. Д. Используйте его в качестве иллюстрации.
Во-первых, давайте переписать термин в сумме как
этаж (100 + 99 * x / (2 52 - x))
Первая идея - получить диапазоны, где пол не меняется из-за того, что срок
n = <99 * x / (2 <sup>52 - x)
sum = 0
r_lo = 0
for k in range(0, 2*52): # LOOP OVER RANGES
r_hi = floor(2**52/(1 + 99/n))
sum += (100 + n -1)*(r_hi - r_lo)
if r_hi-r_lo == 1:
break
r_lo = r_hi + 1
Очевидно, что размер диапазона будет уменьшаться до тех пор, пока он не станет равным 1, и тогда этот метод окажется бесполезным, мы выберемся. Очевидно, что к тому времени каждый термин будет отличаться от предыдущего на 1 или более.
Хорошо, вторая идея - снова диапазоны, где сумма равна арифметический ряд . Сначала мы должны найти диапазон, где приращение равно 1. Затем диапазон, где приращение равно 2, и т. Д. Похоже, что для этого нужно найти корни квадратного уравнения, но код будет примерно таким же
r_lo = pos_for_increment(1)
t_lo = ... # term at r_lo
for n in range(2, 2*52): # LOOP OVER RANGES
r_hi = pos_for_increment(n) - 1
t_hi = ... # term at r_lo
sum += (t_lo + t_hi)*(r_hi - r_lo) / 2 # arith.series sum
if r_hi > 2**52:
break
r_lo = r_hi + 1
t_lo = t_hi + n
может подумать о чем-то другом, но эти уловки стоит попробовать