2016-06-02 4 views
-4

Ich bin auf der Suche nach einem Algorithmus, um Pi zu berechnen und weiter zu berechnen, ohne alles neu berechnen zu müssen. Ich versuche nach einer Nummer in Pi zu suchen. Ich habe einen Algorithmus in Python, das genau das tut, aber es verlangsamt die Zeit nach unten (natürlich):Berechne Pi ohne Leistungsverlust in C++ oder Python

def make_pi(lenght): 
    q, r, t, k, m, x = 1, 0, 1, 1, 3, 3 
    for j in range(lenght): 
     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 

piArray = [] 

for i in make_pi(50): 
    piArray.append(str(i)) 

piArray = piArray[:1] + ['.'] + piArray[1:] 
piString = "".join(piArray) 

lookingFor="9833673362" 
found=False 

current=10 

while found==False: 
    print(str(current)) 
    for i in make_pi(current): 
     piArray.append(str(i)) 

    piArray = piArray[:1] + ['.'] + piArray[1:] 
    piString = "".join(piArray) 
    if piString[-len(lookingFor):] == lookingFor: 
     found=True 
     print("Found! Tries: " + str(current - 10)) 
    current+=1 

Ich brauche einen schnelleren Algorithmus in Python oder möglicherweise sogar C++. (Mit schneller ich meine es sollte nicht verlangsamen)

+2

Dieser Code ist ein bisschen hässlich und schwer zu lesen. Und Sie geben nicht genügend Informationen (z. B. welche Art von Leistungsabfall Sie beobachten. Dies ist wichtig, um festzustellen, ob diese Verschlechterung auf Ihren Code oder auf die Komplexität des Algorithmus zurückzuführen ist) Nun ... Die [BBP-Formel ] (https://en.wikipedia.org/wiki/Bailey%E2%80%93Borwein%E2%80%93Ploufle_formula) sieht aus wie es ist einfach zu implementieren und es wächst mit O (n * log n). Dies sollte asymptotisch das Beste sein, was Sie tun können. – sascha

+0

Entschuldigung für diesen hässlichen Code, ich teste gerade um + Ich habe keine Erfahrung mit der Berechnung von PI, also kann ich dir nicht genau sagen, was ich brauche. Danke für Ihre Antwort! – fabian0010

+0

Hier ist [Gauss-Legendre-Algorithmus zur Berechnung der Ziffern von π in Python] (http://stackoverflow.com/a/347749/4279). 'dezimal' Modul kann mit C seit Python 3.3 beschleunigt werden. – jfs

Antwort

5

In diesem Fall würde ich einen Spigot-Algorithmus verwenden, der die n-te Stelle von Pi mit begrenzter Menge an Speicher zu berechnen erlaubt, und nicht mit dem Index zu erhöhen der Ziffer; insbesondere die Bailey–Borwein–Plouffe Variante.

Dieser Link ist höchstwahrscheinlich, was Sie suchen, wenn ich das richtig verstehe Ihre Frage:

Die Formel kann den Wert einer bestimmten Stelle des π direkt berechnen, ohne die Berechnung der vorstehenden Ziffern