円周率の計算(級数形式の計算節約と計算時間の比較)

(2015.11.6作成)
細かい(節約の)話です。
ラマヌジャン、マチンの公式の様な級数形式の計算では、従来の計算方法によれば必要な桁数精度が得られる項で計算を打ち切ればいいのですが、2項ずつまとめる計算方法では、2の累乗個数の項を計算しないと、ピラミッドの積み上げで最後の1項が求まりません。そのため必要精度以上の項を無駄に計算しなくてはなりません。

再度ラマヌジャンの公式を例としてみます。級数は


と整理でき、括弧を1つ除いて級数の隣り合う偶数項と奇数項をまとめると、


2項ずつのまとめ計算を、1項だけになるまで繰り返します。最後に


の形になって結果が求まります。
ここで、必要精度が求まる項より後の項については、An=0、Bn=1、Cn=1として計算します。まとめ計算の相手が0や1の場合、実際の加算や乗算を省略でき、計算時間を短縮できます。

これを十進BASICで作ると次のようになります(偶数項、奇数項ともに配列に記憶する方法で作成してあります)。

OPTION BASE 0
OPTION ARITHMETIC RATIONAL
DIM a(16,2)
DIM b(16,2)
DIM c(16,2)

LET nd=5000
LET n0=INT(nd/5.8)
LET nn=2^INT(LOG2(n0)+1)
PRINT "LOOP ";n0;"/";nn

LET a(0,0)=1123
LET b(0,0)=(-1)*3*2*1
LET c(0,0)=1
FOR i=1 TO nn-1
   LET u=MOD(i,2)
   IF i<=n0 THEN
      LET a(0,u)=1123+21460*i
      LET b(0,u)=(-1)*(4*i+3)*(4*i+2)*(4*i+1)
      LET c(0,u)=7056^2*i^3
   ELSE
      LET a(0,u)=0
      LET b(0,u)=1
      LET c(0,u)=1
   END IF
   IF u=1 THEN
      FOR j=1 TO 15
         LET v=MOD(INT(i/2^j),2)
         LET a(j,v)=a(j-1,0)*c(j-1,1)+a(j-1,1)*b(j-1,0)
         LET b(j,v)=b(j-1,0)*b(j-1,1)
         LET c(j,v)=c(j-1,0)*c(j-1,1)
         IF v=0 THEN EXIT FOR
      NEXT j
   END IF
NEXT i
LET PP=3528*c(j,0)/a(j,0)

PRINT "        3."
LET PP=PP-3
LET iz=INT(nd/50)-1
FOR i=0 TO iz
   PRINT USING "-----%: ":i*50;
   FOR j=0 TO 4
      LET pp=pp*10000000000
      LET pp1=INT(pp)
      LET pp=pp-pp1
      PRINT USING "%%%%%%%%%% ":pp1;
   NEXT j
   PRINT
NEXT i
END

LOOP  862 / 1024 
        3.
     0: 1415926535 8979323846 2643383279 5028841971 6939937510 
    50: 5820974944 5923078164 0628620899 8628034825 3421170679 
   100: 8214808651 3282306647 0938446095 5058223172 5359408128 
   150: 4811174502 8410270193 8521105559 6446229489 5493038196 
   200: 4428810975 6659334461 2847564823 3786783165 2712019091 
   250: 4564856692 3460348610 4543266482 1339360726 0249141273 
   300: 7245870066 0631558817 4881520920 9628292540 9171536436 
   350: 7892590360 0113305305 4882046652 1384146951 9415116094 
   400: 3305727036 5759591953 0921861173 8193261179 3105118548 
   450: 0744623799 6274956735 1885752724 8912279381 8301194912 
   500: 9833673362 4406566430 8602139494 6395224737 1907021798 
   550: 6094370277 0539217176 2931767523 8467481846 7669405132 
   600: 0005681271 4526356082 7785771342 7577896091 7363717872 
   650: 1468440901 2249534301 4654958537 1050792279 6892589235 
   700: 4201995611 2129021960 8640344181 5981362977 4771309960 
   750: 5187072113 4999999837 2978049951 0597317328 1609631859 
   800: 5024459455 3469083026 4252230825 3344685035 2619311881 
   850: 7101000313 7838752886 5875332083 8142061717 7669147303 
   900: 5982534904 2875546873 1159562863 8823537875 9375195778 
   950: 1857780532 1712268066 1300192787 6611195909 2164201989 
  1000: 3809525720 1065485863 2788659361 5338182796 8230301952 
  1050: 0353018529 6899577362 2599413891 2497217752 8347913151 
  1100: 5574857242 4541506959 5082953311 6861727855 8890750983 
  1150: 8175463746 4939319255 0604009277 0167113900 9848824012 
  1200: 8583616035 6370766010 4710181942 9555961989 4676783744 
  1250: 9448255379 7747268471 0404753464 6208046684 2590694912 
  1300: 9331367702 8989152104 7521620569 6602405803 8150193511 
  1350: 2533824300 3558764024 7496473263 9141992726 0426992279 
  1400: 6782354781 6360093417 2164121992 4586315030 2861829745 
  1450: 5570674983 8505494588 5869269956 9092721079 7509302955 
  1500: 3211653449 8720275596 0236480665 4991198818 3479775356 
  1550: 6369807426 5425278625 5181841757 4672890977 7727938000 
  1600: 8164706001 6145249192 1732172147 7235014144 1973568548 
  1650: 1613611573 5255213347 5741849468 4385233239 0739414333 
  1700: 4547762416 8625189835 6948556209 9219222184 2725502542 
  1750: 5688767179 0494601653 4668049886 2723279178 6085784383 
  1800: 8279679766 8145410095 3883786360 9506800642 2512520511 
  1850: 7392984896 0841284886 2694560424 1965285022 2106611863 
  1900: 0674427862 2039194945 0471237137 8696095636 4371917287 
  1950: 4677646575 7396241389 0865832645 9958133904 7802759009 
  2000: 9465764078 9512694683 9835259570 9825822620 5224894077 
  2050: 2671947826 8482601476 9909026401 3639443745 5305068203 
  2100: 4962524517 4939965143 1429809190 6592509372 2169646151 
  2150: 5709858387 4105978859 5977297549 8930161753 9284681382 
  2200: 6868386894 2774155991 8559252459 5395943104 9972524680 
  2250: 8459872736 4469584865 3836736222 6260991246 0805124388 
  2300: 4390451244 1365497627 8079771569 1435997700 1296160894 
  2350: 4169486855 5848406353 4220722258 2848864815 8456028506 
  2400: 0168427394 5226746767 8895252138 5225499546 6672782398 
  2450: 6456596116 3548862305 7745649803 5593634568 1743241125 
  2500: 1507606947 9451096596 0940252288 7971089314 5669136867 
  2550: 2287489405 6010150330 8617928680 9208747609 1782493858 
  2600: 9009714909 6759852613 6554978189 3129784821 6829989487 
  2650: 2265880485 7564014270 4775551323 7964145152 3746234364 
  2700: 5428584447 9526586782 1051141354 7357395231 1342716610 
  2750: 2135969536 2314429524 8493718711 0145765403 5902799344 
  2800: 0374200731 0578539062 1983874478 0847848968 3321445713 
  2850: 8687519435 0643021845 3191048481 0053706146 8067491927 
  2900: 8191197939 9520614196 6342875444 0643745123 7181921799 
  2950: 9839101591 9561814675 1426912397 4894090718 6494231961 
  3000: 5679452080 9514655022 5231603881 9301420937 6213785595 
  3050: 6638937787 0830390697 9207734672 2182562599 6615014215 
  3100: 0306803844 7734549202 6054146659 2520149744 2850732518 
  3150: 6660021324 3408819071 0486331734 6496514539 0579626856 
  3200: 1005508106 6587969981 6357473638 4052571459 1028970641 
  3250: 4011097120 6280439039 7595156771 5770042033 7869936007 
  3300: 2305587631 7635942187 3125147120 5329281918 2618612586 
  3350: 7321579198 4148488291 6447060957 5270695722 0917567116 
  3400: 7229109816 9091528017 3506712748 5832228718 3520935396 
  3450: 5725121083 5791513698 8209144421 0067510334 6711031412 
  3500: 6711136990 8658516398 3150197016 5151168517 1437657618 
  3550: 3515565088 4909989859 9823873455 2833163550 7647918535 
  3600: 8932261854 8963213293 3089857064 2046752590 7091548141 
  3650: 6549859461 6371802709 8199430992 4488957571 2828905923 
  3700: 2332609729 9712084433 5732654893 8239119325 9746366730 
  3750: 5836041428 1388303203 8249037589 8524374417 0291327656 
  3800: 1809377344 4030707469 2112019130 2033038019 7621101100 
  3850: 4492932151 6084244485 9637669838 9522868478 3123552658 
  3900: 2131449576 8572624334 4189303968 6426243410 7732269780 
  3950: 2807318915 4411010446 8232527162 0105265227 2111660396 
  4000: 6655730925 4711055785 3763466820 6531098965 2691862056 
  4050: 4769312570 5863566201 8558100729 3606598764 8611791045 
  4100: 3348850346 1136576867 5324944166 8039626579 7877185560 
  4150: 8455296541 2665408530 6143444318 5867697514 5661406800 
  4200: 7002378776 5913440171 2749470420 5622305389 9456131407 
  4250: 1127000407 8547332699 3908145466 4645880797 2708266830 
  4300: 6343285878 5698305235 8089330657 5740679545 7163775254 
  4350: 2021149557 6158140025 0126228594 1302164715 5097925923 
  4400: 0990796547 3761255176 5675135751 7829666454 7791745011 
  4450: 2996148903 0463994713 2962107340 4375189573 5961458901 
  4500: 9389713111 7904297828 5647503203 1986915140 2870808599 
  4550: 0480109412 1472213179 4764777262 2414254854 5403321571 
  4600: 8530614228 8137585043 0633217518 2979866223 7172159160 
  4650: 7716692547 4873898665 4949450114 6540628433 6639379003 
  4700: 9769265672 1463853067 3609657120 9180763832 7166416274 
  4750: 8888007869 2560290228 4721040317 2118608204 1900042296 
  4800: 6171196377 9213375751 1495950156 6049631862 9472654736 
  4850: 4252308177 0367515906 7350235072 8354056704 0386743513 
  4900: 6222247715 8915049530 9844489333 0963408780 7693259939 
  4950: 7805419341 4473774418 4263129860 8099888687 4132604721 

5000桁を求めるためには概ね862項(1000桁を求めるためには172項)までの計算で済むので、それ以降は節約計算を行います。
ただし十進BASICの言語処理では、これが計算時間の節約になっているかどうかは分かりません。

これをチュドノフスキーの公式を使用した計算(2^281*125 + 1を法とする整数環FFTとKARATSUBAの併用)に組み込んで、約8000万桁の計算に約44分かかりましたが、以前の計算では約1時間かかりましたので、25%計算が節約できたことになります。
  使用PC: PCショップオリジナル(WinXP(32bit)、CPUはAMD Athlon 64X2 Dual Core Proc 5400+ CLK 2.8GHz)

ついでに、他のプログラムと比較してみました(自作版は全て、2^281*125 + 1を法とする整数環FFTとKARATSUBAの併用による計算)。
・自作 チュドノフスキーの公式の計算 2000万桁: 約500秒
・自作 サラミンとブレントの公式(2次収束 改良版)の計算 2000万桁: 約1510秒
・自作 サラミンとブレントの公式(4次収束 変形版)の計算 2000万桁: 約1580秒
・Super π for Windows(Ver 1.1) (©Kanada Labo. University of Tokyo)1677万桁: 約850秒
・y-cruncher v0.5.5 Build 9180 (fix 2) ( www.numberworld.org )
    © 2008-2011 Alexander J. Yee ( a-yee@u.northwestern.edu ) 2500万桁: 約120秒

素人の作りとしてまずまずではないでしょうか。
まだやれる事は残っていますが、ここで一旦区切りをつけておきます。強烈な手法が学べたら、改めて挑戦することにします。

(注)上記掲載の公式、式の変形、プログラム等に関して、誤りが含まれている可能性が有りますので、そのままご利用なさらないで下さい。

≪参考文献・記事≫
「円周率の公式と計算法」 大浦拓哉
「円周率の公式集」 編集:松元隆二