2012-09-16 3 views
4

아래 코드에서 사용하는 알고리즘/공식은 무엇입니까?다음 Java 코드는 Pi의 자릿수를 어떻게 계산 했습니까?

/** 
* Computes the nth digit of Pi in base-16. 
* 
* If n < 0, return -1. 
* 
* @param n The digit of Pi to retrieve in base-16. 
* @return The nth digit of Pi in base-16. 
*/ 
public static int piDigit(int n) { 
    if (n < 0) return -1; 

    n -= 1; 
    double x = 4 * piTerm(1, n) - 2 * piTerm(4, n) - 
       piTerm(5, n) - piTerm(6, n); 
    x = x - Math.floor(x); 

    return (int)(x * 16); 
} 

private static double piTerm(int j, int n) { 
    // Calculate the left sum 
    double s = 0; 
    for (int k = 0; k <= n; ++k) { 
     int r = 8 * k + j; 
     s += powerMod(16, n-k, r)/(double) r; 
     s = s - Math.floor(s); 
    } 

    // Calculate the right sum 
    double t = 0; 
    int k = n+1; 
    // Keep iterating until t converges (stops changing) 
    while (true) { 
     int r = 8 * k + j; 
     double newt = t + Math.pow(16, n-k)/r; 
     if (t == newt) { 
      break; 
     } else { 
      t = newt; 
     } 
     ++k; 
    } 

    return s+t; 
} 

이 코드는 이미 우리 문제 세트에 포함되어 있습니다. 어떤 알고리즘/공식을 사용하고 있는지 궁금합니다. 나는이 알고리즘이 단순한 알고리즘이라고 생각하지만이 코드만을 기반으로 수식을 찾을 수는 없습니다.

+0

확인 :

Formula to calculate the Nth digit of pi

베일리의 홈페이지를 참조하십시오. 알고리즘에 대해 자세히 설명하지는 않겠지 만이 주제에서는 pi iterativly http://stackoverflow.com/questions/39395/how-do-i-calculate-pi-in-c를 계산하는 방법을 보여줍니다. 경우에 따라 다른 반복 알고리즘이 있습니다. – gregory561

+1

이것은 다소 임의적이지만'piTerm()'에서 사용되는'powerMod()'함수에 대한 코드를 가지고 있습니까? –

답변

10

필자가 볼 수있는 한, (n-1) 번째 자릿수를 알지 못하고 pi의 n 번째 자릿수를 계산하는 것은 Bailey-Borwein-Plouffe-Algorithm입니다. 파이의 표현은 16 진수입니다. http://crd-legacy.lbl.gov/~dhbailey/

+0

대단히 감사합니다! –