Решён
Как вычислить знаки после запятой числа Пи с произвольной точностью?

Логик Математика
2.4k
5

Студент математического факультета, изучаем численные методы. Нужно написать программу, которая вычисляет знаки числа Пи после запятой с заданной точностью (например, 1000 или 10000 знаков).

Понимаю, что есть формула Лейбница и ряд Тейлора, но они сходятся медленно. Какие алгоритмы используются для быстрого вычисления Пи с большой точностью? Желательно на Python, но интересны и теоретические основы.

Решение
66
Участник • 2 ответа

Формула Чудновского. Сходится экстремально быстро - каждая итерация дает около 14 верных знаков.

from decimal import Decimal, getcontext
import math

getcontext().prec = 1050

def compute_pi(precision):
    getcontext().prec = precision + 50
    C = 426880 * Decimal(10005).sqrt()
    K = Decimal(6)
    M = Decimal(1)
    X = Decimal(1)
    L = Decimal(13591409)
    S = Decimal(13591409)

    for i in range(1, precision):
        M = M * (K**3 - 16*K) / ((i)**3)
        K += 12
        L += 545140134
        X *= -262537412640768000
        S += Decimal(M * L) / X

    return C / S

pi = compute_pi(1000)
print(str(pi)[:1002])

Алгоритм основан на обобщенных гипергеометрических рядах. Братья Чудновские использовали его для вычисления миллиарда знаков в 1989 году.

Аватар Логик

Огромное спасибо! Запустил с precision=5000, работает за пару секунд. Именно то что нужно было

23
Участник • 1 ответ

Можно юзать библиотеку mpmath, там встроенная функция mp.pi с произвольной точностью:

python">from mpmath import mp
mp.dps = 1000
print(mp.pi)

Зачем велосипед то изобретать

0
Участник • 2 ответа

есть же онлайн калькуляторы которые выдают сколько хочешь знаков, зачем программировать

40
Участник • 6 ответов

Формула Бэйли-Борвейна-Плаффа (BBP) позволяет вычислять отдельные шестнадцатеричные цифры Пи без вычисления предыдущих. Математически элегантно, хотя для десятичных знаков менее эффективна чем Чудновский.

Представляет собой:

π = Σ(k=0 to ∞) [ 1/16^k * (4/(8k+1) - 2/(8k+4) - 1/(8k+5) - 1/(8k+6)) ]

Использовалась для верификации рекордных вычислений, так как можно проверить N-й знак независимо.

8
Эксперт • 1 ответ

Метод Монте Карло тоже работает но медленнее. Генерируешь случайные точки в квадрате, считаешь сколько попало в четверть круга, умножаешь на 4. Чем больше точек тем точнее но для 1000 знаков понадобится астрономическое количество итераций)

Написать ответ

Премодерация гостей

Вы отвечаете как гость. Ваш ответ будет скрыт до проверки модератором. Чтобы ответ появился сразу и вы получали репутацию — войдите в аккаунт.

Будьте вежливы и соблюдайте правила платформы.