Jean-Luc Arnaud on Wed, 19 Mar 2025 18:35:26 +0100


[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]

I need help for parallel optimization


Hi all,

I've coded a GP Script calculating Pi digits based en Chudnovski algorithm.

It works very well and fast (≈ 1 min 43 s for 1 000 000 digits) but I'd like to optimize it with parallel calculation.

I tried parsum, pareval, vecsum with parapply, all these tests work very fast but results are false after the 13th digit.

Would anyone be so kind as to modify my script in order to use parallel calculation with exact result?

In addition any explanation about this parallel script be highly appreciated.

Thanks a lot

Jean-Luc

===============================

addhelp(ChudnovskyNew,"ChudnovskyNew(n, print_flag) recherche les n décimales de Pi par l'algorithme de Chudnovsky. print_flag = 1 -> impression du résultat.")

/*

// a_k = a_k * (-(6*n-5)*(2*n-1)*(6*n-1))
// n^3 / C3_OVER_24
// a_k = a_k / n^3 / C3_OVER_24
// a_sum = a_sum + a_k
// b_sum = b_sum + n * a_k
// Total = 13591409*a_sum + 545140134*b_sum then Pi = (426880*fpSqrt(10005)) / total

*/

ChudnovskyNew(n, print_flag) =
{default(realprecision,n+2); /* Précision fixée au nombre de décimales+1 */
my(
a_k=1.0,
a_sum=1.,
b_sum=0.,
iter=(n+2)/14.1816474627254776555,
C=640320,
C3=C^3/24
);

/* Compute values with Formule de Chudnovsky */

for(i=1, iter,
    a_k = a_k*(-(6*i-5)*(2*i-1)*(6*i-1)) / i^3 / C3;
    a_sum = a_sum + a_k; b_sum = b_sum + i*a_k
    );

  myPi = (426880*sqrt(10005))/(13591409 * a_sum + 545140134 * b_sum);

  if (print_flag==1, print(n," premières décimales de Pi: ",myPi))

};