Python 59 байт
print reduce(lambda x,p:p/2*x/p+2*10**999,range(6637,1,-2))
Це видає 1000 цифр; трохи більше, ніж потрібно 5. Замість використання встановленої ітерації він використовує це:
pi = 2 + 1/3*(2 + 2/5*(2 + 3/7*(2 + 4/9*(2 + 5/11*(2 + ...)))))
The 6637
(Найбільш внутрішній знаменник) може бути сформульований наступним чином:
цифр * 2 * журнал 2 (10)
Це передбачає лінійну конвергенцію. Кожна більш глибока ітерація дасть ще один бінарний біт пі .
Якщо ж ви наполягаєте на використанні загару -1 ідентичності , подібне зближення може бути досягнуто, якщо ви не заперечуєте про проблему дещо інакше. Ознайомившись з частковими сумами:
4.0, 2.66667, 3.46667, 2.89524, 3.33968, 2.97605, 3.28374, ...
очевидно, що кожен доданок стрибає вперед і назад в будь-яку сторону точки конвергенції; серія має змінну конвергенцію. Крім того, кожен доданок ближче до точки зближення, ніж був попередній термін; вона абсолютно монотонна щодо точки зближення. Поєднання цих двох властивостей означає, що середнє арифметичне будь-яких двох сусідніх доданків ближче до точки зближення, ніж будь-який із самих доданків. Щоб краще зрозуміти, що я маю на увазі, розгляньте наступне зображення:
Зовнішній ряд є оригінальним, а внутрішній ряд виявляється, беручи середнє значення кожного із сусідніх членів. Чудова різниця. Але що справді примітно, це те, що ця нова серія також має чергування конвергенції та абсолютно монотонна щодо точки зближення. Це означає, що цей процес можна застосовувати знову і знову, ad nauseum.
Добре. Але як?
Деякі формальні визначення. Нехай Р 1 (п) бути п - й член першої послідовності, Р 2 (п) бути п - й член другий послідовності, і аналогічно Р до (п) п - е доданок з до - й послідовності , як визначено вище .
P 1 = [P 1 (1), P 1 (2), P 1 (3), P 1 (4), P 1 (5), ...]
P 2 = [(P 1 (1) + P 1 (2)) / 2, (P 1 (2) + P 1 (3)) / 2, (P 1 (3) + P 1 (4)) / 2, (P 1 (4) + P 1 (5)) / 2, ...]
P 3 = [(P 1 (1) + 2P 1 (2) + P 1 (3)) / 4, (P 1 (2) + 2P 1 (3) + P 1 (4)) / 4, (P 1 (3) + 2P 1 (4) + P 1 (5)) / 4, ...]
P 4 = [(P 1 (1) + 3P 1 (2) + 3P 1 (3) + P 1 (4)) / 8, (P 1 (2) + 3P 1 (3) + 3P 1 (4) + P 1 (5)) / 8, ...]
Не дивно, що ці коефіцієнти точно відповідають двочленним коефіцієнтам і можуть виражатися як один ряд трикутника Паскаля. Оскільки довільний ряд трикутника Паскаля є тривіальним для обчислення, довільно 'глибокий' ряд можна знайти, просто взявши перші n часткових сум, помноживши кожен на відповідний додаток у k- му рядку трикутника Паскаля і діливши на 2 k-1 .
Таким чином, можна досягти повної 32-бітової точності з плаваючою комою (~ 14 десяткових знаків) за допомогою всього 36 ітерацій, при цьому часткові суми навіть не зблизилися на другому знаку після коми. Це, очевидно, не гольф:
# used for pascal's triangle
t = 36; v = 1.0/(1<<t-1); e = 1
# used for the partial sums of pi
p = 4; d = 3; s = -4.0
x = 0
while t:
t -= 1
p += s/d; d += 2; s *= -1
x += p*v
v = v*t/e; e += 1
print "%.14f"%x
Якщо ви хотіли довільної точності, цього можна досягти з невеликою модифікацією. Тут ще раз обчислюємо 1000 цифр:
# used for pascal's triangle
f = t = 3318; v = 1; e = 1
# used for the partial sums of pi
p = 4096*10**999; d = 3; s = -p
x = 0
while t:
t -= 1
p += s/d; d += 2; s *= -1
x += p*v
v = v*t/e; e += 1
print x>>f+9
Початкове значення p починається на 2 10 більше, щоб протидіяти цілому поділу ефектів s / d, оскільки d стає більшим, внаслідок чого останні кілька цифр не збігаються. Зверніть увагу ще раз, що 3318
також:
цифри * журнал 2 (10)
Така ж кількість ітерацій, що й перший алгоритм (вдвічі зменшується, оскільки t зменшується на 1, а не на 2 кожної ітерації). Ще раз це вказує на лінійну конвергенцію: один бінарний біт пі за ітерацію. В обох випадках для обчислення 1000 цифр пі потрібно 3318 ітерацій , як трохи краща квота, ніж 1 мільйон ітерацій для обчислення 5.
p=lambda:3.14159