геометрическая прогрессия на питоне и степени двойки — не сходится сумма
Разбираю геометрическую прогрессию. Классическая задача про зёрна на шахматной доске: на первой клетке 1 зерно, на каждой следующей вдвое больше. Надо вывести сколько зёрен на n-й клетке и сумму на всех первых n клетках. Я пробовал умножать, но запутался со степенями двойки:
n = 8
zerno = 1
for i in range(n):
zerno = zerno * 2
print(zerno)
Как правильно? И что значит знаменатель прогрессии?
2 ответа
У тебя цикл лишний раз умножает: после 8 проходов получается 2^8 = 256, а на 8-й клетке должно быть 2^7 = 128 (потому что на первой клетке 2^0 = 1, а не 2^1).
Геометрическая прогрессия — это когда каждый следующий член получается умножением предыдущего на одно и то же число. Это число называется знаменателем прогрессии (обычно q). Тут q = 2, потому что зёрна каждый раз удваиваются.
n-й член считается как b1 * q**(n-1):
b1 = 1 # первая клетка
q = 2 # удвоение
n = 8
bn = b1 * q**(n - 1) # 1 * 2^7 = 128 — зёрна на 8-й клетке
print(bn) # 128
Сумма первых n членов геометрической прогрессии (при q ≠ 1):
summa = b1 * (q**n - 1) / (q - 1)
print(summa) # для n=8 -> 255.0
Простыми словами: степени двойки 2**k и геометрическая прогрессия со знаменателем 2 — это одно и то же. 2**0=1, 2**1=2, 2**2=4... — каждое вдвое больше. А сумма всех степеней двойки от 0 до n−1 как раз получается на единицу меньше следующей степени: 1+2+4+...+128 = 256−1 = 255. Поэтому если посчитать полную доску (64 клетки), там будет 2^64 − 1 зёрен — астрономическое число, в этом и фишка задачи.
Кстати, конкретно сумму степеней двойки можно посчитать в одну строчку, без формулы геом. прогрессии:
n = 8
print(2**n - 1) # 255 — сумма 2^0 + 2^1 + ... + 2^(n-1)
Работает только для знаменателя 2, но именно в задаче про шахматную доску это самый короткий путь.