web-dev-qa-db-ja.com

Pythonのパイの1000桁

私はこの問題について考えていましたが、理解できません。おそらくあなたは私を助けることができます。問題は、コードがPythonコーディング言語でpiの1000桁を出力するように機能していないことです。

これが私のコードです:

_def make_pi():
    q, r, t, k, m, x = 1, 0, 1, 1, 3, 3
    while True:
        if 4 * q + r - t < m * t:
            yield m
            q, r, t, k, m, x = (10*q, 10*(r-m*t), t, k, (10*(3*q+r))//t - 10*m, x)
        else:
            q, r, t, k, m, x = (q*k, (2*q+r)*x, t*x, k+1, (q*(7*k+2)+r*x)//(t*x), x+2)

digits = make_pi()
pi_list = []
my_array = []
for i in range(1000):
    my_array.append(str("hello, I'm an element in an array \n" ))
big_string = "".join(my_array)

print "here is a big string:\n %s" % big_string 
_

このコードが機能するように修正できることはわかっていますが、何を修正すればよいかわかりません... printステートメントは、ここに大きな文字列であり、my_array.append(str("hello, im an element in an array \n))は、今。すべてのコードがどのように機能するかを知っていますが、前に述べたように、そのコードを実行することはできません。

18
bobimo

これを実行

def make_pi():
    q, r, t, k, m, x = 1, 0, 1, 1, 3, 3
    for j in range(1000):
        if 4 * q + r - t < m * t:
            yield m
            q, r, t, k, m, x = 10*q, 10*(r-m*t), t, k, (10*(3*q+r))//t - 10*m, x
        else:
            q, r, t, k, m, x = q*k, (2*q+r)*x, t*x, k+1, (q*(7*k+2)+r*x)//(t*x), x+2


my_array = []

for i in make_pi():
    my_array.append(str(i))

my_array = my_array[:1] + ['.'] + my_array[1:]
big_string = "".join(my_array)
print "here is a big string:\n %s" % big_string 

そして、ここからyield演算子について読んでください: 「yield」キーワードは何をするのですか?

ここに答えがあります:

3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337
21
batbaatar

独自のアルゴリズムを実装したくない場合は、 mpmath を使用できます。

try:
    # import version included with old SymPy
    from sympy.mpmath import mp
except ImportError:
    # import newer version
    from mpmath import mp
mp.dps = 1000  # set number of digits
print(mp.pi)   # print pi to a thousand places

参照

更新:コードは SymPy の新旧のインストールをサポートします( コメント を参照)。*

30
Garrett Hyde

ここで、プログラムが正しい1000桁を出力するかどうかを確認できます。 http://spoj.com/CONSTANT

もちろん、diffまたはtcも使用できますが、これらの1000桁をどこかからコピーする必要があり、そこでプログラムを送信して、スコアが999より大きいかどうかを確認するだけです。

そこでさらに多くの桁を印刷して、より多くのポイントを獲得することができます。おそらくあなたはそれを楽しむでしょう。

1
user1

私はあなたのアルゴリズムに慣れていません。 BBPの実装ですか?

いずれにせよ、あなたの_make_pi_はジェネレータです。 forループで使用してみてください。

_for digit in make_pi():
    print digit
_

このループは無限であることに注意してください:make_pi()StopIterationをスローしません

1
Managu

wallis式は3.141592661439964に到達できますが、この問題を解決するには、より効率的な方法が必要です。

https://www.youtube.com/watch?v=EZSiQv_G9HM

そして今私のコード

x, y, summing = 2, 3, 4

for count in range (0,100000000):
    summing *= (x/y)
    x += 2
    summing *= (x/y)
    y += 2

print (summing)
0
tanny

コメントに記載されているように、受け入れられた回答は正しくありません。

OPのコードは ここから からコピーされた スピゴットのアルゴリズム の実装に基づいているようです。

OPの質問に従ってコードを修正するには(変数と関数の名前を元のソースにあったものと一致するように変更しました)、1つの解決策は次のようになります。

#!/usr/bin/env python

DIGITS = 1000

def pi_digits(x):
    """Generate x digits of Pi."""
    q,r,t,k,n,l = 1,0,1,1,3,3
    while x >= 0:
        if 4*q+r-t < x*t:
            yield n
            x -= 1
            q,r,t,k,n,l = 10*q, 10*(r-n*t), t, k, (10*(3*q + r))/t-10*n, l
        else:
            q,r,t,k,n,l = q*k, (2*q+r)*l, t*l, k+1, (q*(7*k+2)+r*l)/(t*l), l+2

digits = [str(n) for n in list(pi_digits(DIGITS))]
print("%s.%s\n" % (digits.pop(0), "".join(digits)))

また、これははるかに高速な*実装であり、明らかにスピゴットのアルゴリズムに基づいています。

#!/usr/bin/env python

DIGITS = 1000

def pi_digits(x):
    """Generate x digits of Pi."""
    k,a,b,a1,b1 = 2,4,1,12,4
    while x > 0:
        p,q,k = k * k, 2 * k + 1, k + 1
        a,b,a1,b1 = a1, b1, p*a + q*a1, p*b + q*b1
        d,d1 = a/b, a1/b1
        while d == d1 and x > 0:
            yield int(d)
            x -= 1
            a,a1 = 10*(a % b), 10*(a1 % b1)
            d,d1 = a/b, a1/b1

digits = [str(n) for n in list(pi_digits(DIGITS))]
print("%s.%s\n" % (digits.pop(0), "".join(digits)))

this オンラインPiディジットジェネレーターに対して両方とも数回テストしました。

this のすべての功績 deeplook による要点。

* 10,000桁のテストに基づいており、約1秒ではなく約7秒かかりました。

0
Alex Harvey

ここに私がここで見つけた別の方法があります-> Python pi計算? 近似するpython Piを生成するためのチュドノフスキー兄弟式に基づいて、私のために少し変更したプログラム。

def pifunction():
    numberofdigits = int(input("please enter the number of digits of pi that you want to generate"))
    getcontext().prec = numberofdigits

def calc(n):
    t = Decimal(0)
    pi = Decimal(0)
    deno = Decimal(0)
    k = 0
    for k in range(n):
        t = (Decimal(-1)**k)*(math.factorial(Decimal(6)*k))*(13591409+545140134*k)
        deno = math.factorial(3*k)*(math.factorial(k)**Decimal(3))*(640320**(3*k))
        pi += Decimal(t)/Decimal(deno)
    pi = pi * Decimal(12)/Decimal(640320**Decimal(1.5))
    pi = 1/pi
    return str(pi)
print(calc(1))

生成したい任意の桁数のpiを生成できるので、これが役立つことを願っています。

0
Timothy

Fabrice Bellardのサイトから: Pi Computation アルゴリズム。そのような単純な実装で申し訳ありません。 1000は十分高速(私にとっては0.1秒)ですが、10000はそれほど高速ではありません-71秒:-(

import time
from decimal import Decimal, getcontext

def compute(n):
    getcontext().prec = n
    res = Decimal(0)
    for i in range(n):
        a = Decimal(1)/(16**i)
        b = Decimal(4)/(8*i+1)
        c = Decimal(2)/(8*i+4)
        d = Decimal(1)/(8*i+5)
        e = Decimal(1)/(8*i+6)
        r = a*(b-c-d-e)
        res += r
    return res

if __name__ == "__main__":
    t1 = time.time()
    res = compute(1000)
    dt = time.time()-t1
    print(res)
    print(dt)
0
Guest007

5-6年前にベローフォーミュラで解決しました。

機械のような数式

ウィキペディア: https://en.wikipedia.org/wiki/Machin-like_formula

Math formula

コードの品質でごめんなさい。変数名は意味がない場合があります。

#-*- coding: utf-8 -*-

# Author:    Fatih Mert Doğancan
# Date:      02.12.2014

def arccot(x, u):
    sum = ussu = u // x
    n = 3
    sign = -1
    while 1:
        ussu = ussu // (x*x)
        term = ussu // n
        if not term:
            break
        sum += sign * term
        sign = -sign
        n += 2
    return sum

def pi(basamak):
    u = 10**(basamak+10)
    pi = 4 * (4*arccot(5,u) - arccot(239,u))
    return pi // 10**10

if __name__ == "__main__":
    print pi(1000) # 1000 

これはあなたが望むことをしますか?

i = 0;
pi_str = ""
for x in make_pi():
    pi_str += str(x)
    i += 1
    if i == 1001:
        break

print "pi= %s.%s" % (pi_str[0],pi_str[1:])
0
Scott Hunter