Где скачать много цифр пи? [закрыто]


11

Где я могу найти большое количество цифр числа пи? Я уже подсчитал 3,14 млрд, используя PiFast (хорошо работает под вином).

Меня не волнует медленная скорость загрузки.


2
Вам это нужно для каких-то даже отдаленно практических целей или просто ...? Я не вижу смысла, поэтому мне просто любопытно.
Ладья

2
@Idigas: ты никогда не пи пи?
Носредна

Скоро я смогу найти алгоритм для вычисления числа пи, я напишу что-нибудь, чтобы вычислить столько, сколько хочешь ...
RCIX

2
Попробуй принять новый ответ на свой вопрос. В исходном принятом ответе была одна ссылка, которой больше не существует, поэтому он был удален. Если у вас есть вопросы к модераторам, отметьте вопрос.
Troggy

Ответы:


9

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

Учитывая последнюю цифру и текущее состояние калькулятора, использованного для ее генерации, следующая цифра может быть найдена за постоянное время. Это не становится все труднее, чем найти следующий штрих.


Да, но это очень много времени для процессора, и я бы предпочел выделить часть пропускной способности, а не все это время.
BGW

@Joel: кстати, вы можете показать указатель на алгоритм для этого? (Да, я знаю, что это больше похоже на SO контент, но так как мы здесь ...)
Р. Мартиньо Фернандес


Математика мне не подходит, но читайте в википедии, и одна из серий, как говорят, «доставляет 14 цифр в семестр».
Джоэл Коухорн

Извините, неправильная ссылка: numbers.computation.free.fr/Constants/PiProgram/algo.html , это было в кадрах
bgw

4

В дополнение к комментарию Джоэла, SuperPi является одним из самых популярных инструментов для этого. Он также используется для стресс-тестирования.


PiFast быстрее.
BGW

4

На Ubuntu вы можете sudo apt-get install pi

а потом:

$ pi 100 3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067

Он вычисляет произвольную точность с учетом количества цифр для расчета.


0

Если вы хотите использовать Python для его вычисления, вот чрезвычайно быстрый метод (с использованием Python и библиотеки gmpy2):

http://www.craig-wood.com/nick/articles/pi-chudnovsky/

Вот код с небольшим исправлением:

"""
Python3 program to calculate Pi using python long integers, binary
splitting and the Chudnovsky algorithm

See: http://www.craig-wood.com/nick/articles/pi-chudnovsky/ for more
info

Nick Craig-Wood <nick@craig-wood.com>
"""

import math
from gmpy2 import mpz
from time import time
import gmpy2

def pi_chudnovsky_bs(digits):
    """
    Compute int(pi * 10**digits)

    This is done using Chudnovsky's series with binary splitting
    """
    C = 640320
    C3_OVER_24 = C**3 // 24
    def bs(a, b):
        """
        Computes the terms for binary splitting the Chudnovsky infinite series

        a(a) = +/- (13591409 + 545140134*a)
        p(a) = (6*a-5)*(2*a-1)*(6*a-1)
        b(a) = 1
        q(a) = a*a*a*C3_OVER_24

        returns P(a,b), Q(a,b) and T(a,b)
        """
        if b - a == 1:
            # Directly compute P(a,a+1), Q(a,a+1) and T(a,a+1)
            if a == 0:
                Pab = Qab = mpz(1)
            else:
                Pab = mpz((6*a-5)*(2*a-1)*(6*a-1))
                Qab = mpz(a*a*a*C3_OVER_24)
            Tab = Pab * (13591409 + 545140134*a) # a(a) * p(a)
            if a & 1:
                Tab = -Tab
        else:
            # Recursively compute P(a,b), Q(a,b) and T(a,b)
            # m is the midpoint of a and b
            m = (a + b) // 2
            # Recursively calculate P(a,m), Q(a,m) and T(a,m)
            Pam, Qam, Tam = bs(a, m)
            # Recursively calculate P(m,b), Q(m,b) and T(m,b)
            Pmb, Qmb, Tmb = bs(m, b)
            # Now combine
            Pab = Pam * Pmb
            Qab = Qam * Qmb
            Tab = Qmb * Tam + Pam * Tmb
        return Pab, Qab, Tab
    # how many terms to compute
    DIGITS_PER_TERM = math.log10(C3_OVER_24/6/2/6)
    N = int(digits/DIGITS_PER_TERM + 1)
    # Calclate P(0,N) and Q(0,N)
    P, Q, T = bs(0, N)
    one_squared = mpz(10)**(2*digits)
    #sqrtC = (10005*one_squared).sqrt()
    sqrtC = gmpy2.isqrt(10005*one_squared)
    return (Q*426880*sqrtC) // T

# The last 5 digits or pi for various numbers of digits
check_digits = {
        100 : 70679,
       1000 :  1989,
      10000 : 75678,
     100000 : 24646,
    1000000 : 58151,
   10000000 : 55897,
}

if __name__ == "__main__":
    digits = 100
    pi = pi_chudnovsky_bs(digits)
    print(pi)
    #raise SystemExit
    for log10_digits in range(1,9):
        digits = 10**log10_digits
        start =time()
        pi = pi_chudnovsky_bs(digits)
        print("chudnovsky_gmpy_mpz_bs: digits",digits,"time",time()-start)
        if digits in check_digits:
            last_five_digits = pi % 100000
            if check_digits[digits] == last_five_digits:
                print("Last 5 digits %05d OK" % last_five_digits)
                open("%s_pi.txt" % log10_digits, "w").write(str(pi))
            else:
                print("Last 5 digits %05d wrong should be %05d" % (last_five_digits, check_digits[digits]))
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.