/** This class is an example of using the BinarySplitting.frink file to calculate pi to arbitrary precision. It follows the algorithm described in: "Fast multiprecision evaluation of series of rational numbers" by Bruno Hible and Thomas Papanikolaou: https://ginac.de/CLN/binsplit.pdf See the references in that paper for discussion of the parameters. The parameters from the paper are not really optimal (and really aren't the Chudnovsky's parameters) this should not be used in production. A highly-optimized version is found in pi.frink or pi2.frink. Call BinarySplittingPi.pi[digits] to calculate the specified number of digits. */ use BinarySplitting.frink class BinarySplittingPi implements ParamProvider { class var A = 13591409 class var B = 545140134 class var C = 640320 class var C3over24 = C^3/24 class var digitsPerIteration = 14.1816474627254776555 class var INSTANCE = new BinarySplittingPi[] /** Call this method with the number of digits of pi you want to calculate. */ class pi[digits] := { // Find number of terms to calculate n2 = floor[digits/digitsPerIteration] origPrec = getPrecision[] try { setPrecision[digits+3] sqrtC = sqrt[C^3, digits+3] return 1./(12/sqrtC * BinarySplitting.calc[INSTANCE, 0, n2, digits]) } finally setPrecision[origPrec] } /** Implementation of the ParamProvider interface. */ a[n] := A + n B b[n] := 1 p[n] := { if n == 0 return 1 else return -(6n-5)(2n-1)(6n-1) } q[n] := { if n == 0 return 1 else return n^3 C3over24 } }