piの多くの数字をダウンロードする場所 [閉まっている]


11

大量のパイをどこで見つけることができますか?私はすでにPiFastを使用して31億4,000万ドルを計算しています(ワインの下でも十分に機能します)。

ダウンロード速度が遅いことは気にしません。


2
リモートでの実際的な目的のために必要ですか、それとも...?ポイントが見えないので、興味があります。
ルーク

2
@Idigas:piを作ることはありませんか?
Nosredna

すぐに私はパイを計算するためのアルゴリズムを見つけることができますあなたが望むように、私は多くのように計算するのに何かを書きます...
RCIX

2
先に進み、質問に対する新しい回答を受け入れてみてください。元の受け入れられた回答には、もう存在しない単一のリンクがあったため、削除されました。モデレーターに質問がある場合は、質問にフラグを立ててください。
トロギー

回答:


9

あなたはあなたが気にしないと言うことは知っていますが、あなたのCPUはあなたのネットワークカードがそれらをダウンロードできるより速くそれらを計算できると真剣に疑っています。

最後の数字と、それを生成するために使用された計算機の現在の状態を考えると、次の数字は一定の時間で見つけることができます。次の素数を見つけるように次第に難しくなることはありません。


はい、しかし、それは専用のCPU時間です。すべてのCPU時間ではなく、帯域幅を専用にしたいです。
BGW

@ジョエル:ところで、そのためのアルゴリズムへのポインタを示すことができますか?(ええ、私はそれがSOコンテンツに似ていることを知っていますが、私たちはここにいるので...)
R.マルティーニョ・フェルナンデス


数学は私を超えていますが、ウィキペディアで読み進めており、シリーズの1つは「用語ごとに14桁を配信する」と言われています。
ジョエルCoehoorn 2009

申し訳ありませんが、間違ったリンク:numbers.computation.free.fr/Constants/PiProgram/algo.html、それがフレームにあった
BGW

4

Joelのコメントに加えて、SuperPiはこのための最も人気のあるツールの1つです。また、ストレステストにも使用されます。


PiFastは高速です。
BGW

3

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]))
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.