Çok sayıda pi rakamını nereden indirebilirim? [kapalı]


11

Büyük miktarda pi rakamını nerede bulabilirim? PiFast (şarap altında iyi çalışır) kullanarak 3,14 milyar zaten hesapladım.

Düşük indirme hızları umurumda değil.


2
Hatta uzaktan pratik bir amaç için mi yoksa sadece ... için mi ihtiyacınız var? Konuyu anlayamıyorum, bu yüzden sadece merak ediyorum.
Rook

2
@Idigas: Hiç pi yapmadın mı?
Nosredna

Yakında pi hesaplamak için algoritma bulabilirim, istediğiniz kadar hesaplamak için bir şeyler yazacağım ...
RCIX

2
Devam edin ve sorunuza yeni bir cevap kabul etmeyi deneyin. Kabul edilen orijinal yanıtın artık var olmayan tek bir bağlantısı vardı, bu nedenle silindi. Moderatörler için herhangi bir sorunuz varsa soruyu işaretleyin.
Troggy

Yanıtlar:


9

Umursamadığını söylediğini biliyorum, ama cpu'nuzun ağ kartınızın bunları indirebileceğinden daha hızlı hesaplayabileceğinden şüpheleniyorum .

Son haneyi ve hesap makinesini oluşturmak için kullanılan geçerli durumu göz önüne alındığında, bir sonraki hane sabit zamanda bulunabilir. Bir sonraki prime'ı bulmak gibi gittikçe zorlaşmıyor.


Evet, ama ayırmak için çok fazla cpu zamanı ve tüm cpu zamanlarından ziyade bant genişliği ayırmayı tercih ederim.
bgw

@Joel: Bu arada, bunun için bir algoritmaya bir işaretçi gösterebilir misiniz? (Evet, bunun daha çok SO içeriğine benzediğini biliyorum, ama burada olduğumuzdan beri ...)
R. Martinho Fernandes


Matematik benden öte, ama wikipedia'da aşağı okudum ve serinin birinden "dönem başına 14 hane teslim ettiği" söyleniyor.
Joel Coehoorn

Üzgünüz, yanlış bağlantı: numbers.computation.free.fr/Constants/PiProgram/algo.html , Çerçevelerdeydi
bgw

4

Joel'in yorumuna ek olarak, SuperPi bunun için en popüler araçlardan biridir. Stres testi için de kullanılır.


PiFast daha hızlı.
bgw

4

Ubuntu'da şunları yapabilirsiniz: sudo apt-get install pi

ve sonra:

$ pi 100 3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067

Hesaplanacak basamak sayısı göz önüne alındığında keyfi hassasiyeti hesaplar.


0

Hesaplamak için Python kullanmak istiyorsanız, işte son derece hızlı bir yöntem (Python ve gmpy2 kütüphanesini kullanarak):

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

İşte küçük bir düzeltme ile kod:

"""
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]))
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.