В методе Монте-Карло , как уже упоминалось, применяются некоторые замечательные концепции, но он, очевидно, не самый быстрый, ни в дальнем плане, ни в какой-либо разумной мере. Кроме того, все зависит от того, какую точность вы ищете. Самый быстрый π, который я знаю, это тот, у которого цифры жестко запрограммированы. Глядя на Pi и Pi [PDF] , есть много формул.
Вот метод, который быстро сходится - около 14 цифр за итерацию. PiFast , самое быстрое текущее приложение, использует эту формулу с БПФ. Я просто напишу формулу, так как код прост. Эта формула была почти найдена Рамануджаном и обнаружена Чудновским . Это на самом деле, как он вычислил несколько миллиардов цифр числа, так что это не метод игнорировать. Формула быстро переполнится, и, поскольку мы делим факториалы, было бы целесообразно отложить такие вычисления, чтобы удалить термины.
, где
Ниже приведен алгоритм Брента – Саламина . В Википедии упоминается, что когда a и b"достаточно близки", то (a + b) ² / 4t будет приближением π. Я не уверен, что означает «достаточно близко», но из моих тестов одна итерация получила 2 цифры, две - 7, а три - 15, конечно это с двойными числами, поэтому может возникнуть ошибка, основанная на ее представлении и true расчет может быть более точным.
let pi_2 iters =
let rec loop_ a b t p i =
if i = 0 then a,b,t,p
else
let a_n = (a +. b) /. 2.0
and b_n = sqrt (a*.b)
and p_n = 2.0 *. p in
let t_n = t -. (p *. (a -. a_n) *. (a -. a_n)) in
loop_ a_n b_n t_n p_n (i - 1)
in
let a,b,t,p = loop_ (1.0) (1.0 /. (sqrt 2.0)) (1.0/.4.0) (1.0) iters in
(a +. b) *. (a +. b) /. (4.0 *. t)
Наконец, как насчет пи-гольфа (800 цифр)? 160 символов!
int a=10000,b,c=2800,d,e,f[2801],g;main(){for(;b-c;)f[b++]=a/5;for(;d=0,g=c*2;c-=14,printf("%.4d",e+d/a),e=d%a)for(b=c;d+=f[b]*a,f[b]=d%--g,d/=g--,--b;d*=b);}