2016-06-02 6 views
-4

Я ищу алгоритм вычисления pi и продолжаю вычислять, не вычисляя все заново. Я пытаюсь найти номер в pi. Я сделал алгоритм в Python, который делает именно это, но это замедляет со временем (очевидно):Вычислить pi без потери производительности в C++ или 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 

мне нужен быстрый алгоритм в Python или, возможно, даже C++. (С быстрым я имею в виду, что он не должен замедляться)

+2

Этот код является довольно уродливым и трудночитаемым. И вы не даете достаточно информации (например, какую деградацию производительности вы наблюдаете. Это важно, чтобы определить, связано ли это ухудшение с вашим кодом или из-за сложности алгоритма) Ну ... [BBP-формула ] (https://en.wikipedia.org/wiki/Bailey%E2%80%93Borwein%E2%80%93Plouffe_formula) выглядит так, что его легко реализовать, и он растет с помощью O (n * log n). Это должно быть асимптотически лучшим, что вы можете сделать. – sascha

+0

Извините за этот уродливый код, я просто тестирую + У меня нет опыта вычисления PI, поэтому я не могу точно сказать вам, что мне нужно. Спасибо за ваш ответ! – fabian0010

+0

Вот [Алгоритм Гаусса-Лежандра для вычисления чисел π в Python] (http://stackoverflow.com/a/347749/4279). 'decimal' модуль может быть ускорен с использованием C с Python 3.3. – jfs

ответ

5

В этом случае я бы использовал алгоритм вставки, который позволяет вычислять n-ю цифру pi с ограниченным объемом памяти и не увеличиваться с индексом цифры; в частности, вариант Bailey–Borwein–Plouffe.

Эта ссылка, скорее всего, то, что вы ищете, если я правильно понял ваш вопрос:

Формула может непосредственно вычислить значение любой заданной цифры П без расчета предшествующих цифр

 Смежные вопросы

  • Нет связанных вопросов^_^