Di mana mengunduh banyak digit pi? [Tutup]


11

Di mana saya bisa menemukan sejumlah besar pi? Saya sudah menghitung 3,14 miliar menggunakan PiFast (berfungsi dengan baik di bawah anggur).

Saya tidak peduli dengan kecepatan unduh yang lambat.


2
Apakah Anda memerlukannya untuk tujuan praktis yang bahkan jarak jauh, atau hanya untuk ...? Saya tidak bisa mengerti intinya, jadi saya hanya ingin tahu.
Benteng

2
@Idigas: Jangan pernah membuat pi?
Nosredna

Soon saya dapat menemukan algoritma untuk menghitung pi, aku akan menulis sesuatu untuk menghitung sebanyak yang Anda inginkan ...
RCIX

2
Teruskan dan coba terima jawaban baru untuk pertanyaan Anda. Jawaban asli yang diterima memiliki satu tautan yang tidak lagi ada, sehingga telah dihapus. Lanjutkan dan tandai pertanyaan jika Anda memiliki pertanyaan untuk moderator.
Troggy

Jawaban:


9

Saya tahu Anda mengatakan Anda tidak peduli, tetapi saya sangat curiga CPU Anda dapat menghitungnya lebih cepat daripada kartu jaringan Anda yang dapat mengunduhnya.

Mengingat digit terakhir dan kondisi kalkulator saat ini yang digunakan untuk menghasilkannya, digit berikutnya dapat ditemukan dalam waktu konstan. Itu tidak semakin sulit seperti menemukan prime berikutnya.


Ya, tapi itu adalah banyak waktu cpu untuk mendedikasikan, dan saya lebih suka mendedikasikan beberapa bandwidth daripada semua waktu cpu itu.
bgw

@ Joel: Omong-omong, bisakah Anda menunjukkan pointer ke suatu algoritma untuk itu? (Ya, saya tahu itu lebih seperti konten SO, tetapi karena kita di sini ...)
R. Martinho Fernandes


Matematika di luar saya, tapi baca turun di wikipedia dan salah satu seri dikatakan "memberikan 14 digit per istilah".
Joel Coehoorn

Maaf, tautan salah: numbers.computation.free.fr/Constants/PiProgram/algo.html , Itu ada di dalam bingkai
bgw

4

Menambahkan komentar Joel, SuperPi adalah salah satu alat paling populer untuk ini. Ini juga digunakan untuk pengujian stres.


PiFast lebih cepat.
bgw

3

Di Ubuntu, Anda bisa sudo apt-get install pi

lalu:

$ pi 100 3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067

Ini menghitung presisi sewenang-wenang mengingat jumlah digit untuk menghitung.


0

Jika Anda ingin menggunakan Python untuk menghitungnya, inilah metode yang sangat cepat (menggunakan Python dan pustaka gmpy2):

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

Berikut kode dengan perbaikan kecil:

"""
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]))
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.