2012-01-25 22 views
12

Ho pensato a questo problema e non riesco a capirlo. Forse puoi aiutarmi. Il problema è che il mio codice non funziona per produrre 1000 cifre di pi nel linguaggio di codifica python.1000 cifre di pi in python

Ecco il mio codice:

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 

So che questo codice può essere fissato al lavoro, ma non sono sicuro cosa sistemare ... L'istruzione print dicendo qui è una grande corda e la my_array.append(str("hello, im an element in an array \n)) è solo un riempitivo per ora. So come tutto il codice è usato per funzionare, ma come ho detto prima, non riesco a farlo sparare quel codice.

+1

che assomiglia ad una versione di algoritmo di codolo pi greco, è in realtà? –

+2

Potrebbe essere un po 'più chiaro su quale sia il problema; in che modo il comportamento differisce da quello che ti aspettavi? –

+4

Il codice sembra sospetto [come il codice qui] (http://www.daniweb.com/software-development/python/code/216718) e [qui] (http://mail.python.org/pipermail/edu -sig/2006-luglio/006810.html). –

risposta

13

Esegui questo

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 


digits = make_pi() 
pi_list = [] 
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 

e leggere su yield operatore da qui: What does the "yield" keyword do in Python?

ecco la risposta:

3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337 
+1

Ho un'idea folle di trasformare un Raspberry Pi libero nel calcolare il valore di molti milioni di posti lasciandolo funzionare 24/7 per anni. Le informazioni presentate in questa domanda/risposta sembrano molto utili. Grazie per aver postato questo. Ho eseguito il codice con un intervallo di 50000 ed è finito ma non so se è accurato. Non sono stati generati errori. È necessario capire come gestire il caricamento dei risultati parziali su disco anziché conservarlo in memoria. – WyomingGeezer

+2

Il valore "per j in range (1000)" genera ben meno di 1000 cifre. Questo dovrebbe essere cambiato in "while True" o in qualche altra condizione. –

+1

Non mi piace molto questo codice, pugno - cambiate la funzione "make_pi" con alcuni limiti senza nemmeno tentare di estrarla nei parametri, ma anche questo non è necessario - make_pi() restituisce un generatore e potete leggerlo usando. next() tutte le volte che vuoi, secondo perché chiamare a make_pi due volte? – Jerzyk

0

Non ho familiarità con il tuo algoritmo. È un'implementazione di BBP?

In ogni caso, il tuo make_pi è un generatore. Provare a utilizzare in un ciclo for:

for digit in make_pi(): 
    print digit 

Si noti che questo ciclo è infinito: make_pi() mai tiri StopIteration

0

Questo fare quello che vuoi?

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:]) 
25

Se non si desidera implementare il tuo algoritmo, puoi usare 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 

Reference

Aggiornamento:. Codice supporta installazioni più vecchie e più recenti del SymPy (vedi comment) *

+0

woot! grazie! – necromancer

+2

Quando installate sympy in un ambiente come quelli creati da anaconda, installerà 'mpmath' separatamente e l'istruzione import diventerà' da mpmath import mp'. Il codice in questa risposta non funziona più con le versioni moderne di 'sympy'. Non c'è più 'sympy.mpmath'. – Zelphir

1

Qui è possibile controllare se i tuoi risultati del programma corrette 1000 digit: http://spoj.com/CONSTANT

Naturalmente puoi anche usare diff o tc, ma dovresti copiare questi 1000 cifre da qualche parte e lì basta inviare il programma e verificare se il punteggio è più grande di 999.

Si può provare a stampare ancora più cifre lì e quindi ottenere più punti. Forse ti piacerebbe.

-1

Ecco un modo diverso che ho trovato qui ->Python pi calculation? per approssimare pitone sulla base della formula fratelli Chudnovsky per la generazione di Pi che ho sightly modificato per il mio programma.

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)) 

Spero che questo aiuti in quanto è possibile generare un numero qualsiasi di cifre di pi che si desidera generare.

+0

Se rimuovo il primo "def pifunction():" in modo che venga eseguito senza errori di sintassi, la risposta è corretta solo per circa 13 posizioni: 3.1415926535897342076 –

0

la formula di wallis può arrivare a 3.141592661439964 ma è necessario un modo più efficiente per risolvere questo problema.

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

and now my code 
x = 2 
y = 3 
summing = 4 
for count in range (0,100000000): 
    summing *= (x/y) 
    x += 2 
    summing *= (x/y) 
    y += 2 
print (summing) 
Problemi correlati