Binary Splitting
Binary Splitting Method
ããã¦æ¥æ¬èªã§è¨ããªããäºåå²æ³ãã¨ã§ããããããããªããã ç¾ç¶æ¥æ¬èªã§ã®è¨åããBinary SplittingãããBS æ³ã ã¨è¨åãããã°ããã§ããã ååºã®è«æã§ãã [FT05] ã«ããã¨åé¢æ°ãå®æ°ã«ã¤ãã¦ããã° Karatsuba ãåæ§ã®æ¦å¿µãææ¡ãã¦ãããããï¼
$n$ æ¡ä¹ç®ã®è¨ç®éã $M(n)$ ã¨ããã¨ããåå²çµ±æ²»ãè¡ããã¨ã§ æçç´æ°ã $O(\log n\cdot M(n\log n))$ ã®è¨ç®éã§è¨ç®ã§ããææ³ã§ããã [FT06] ç¾å¨ $M(n)=O(n\log n)$ ã¨ããã¦ããã®ã§ã$O(n(\log n)^3)$ ã«ãªãã
ç°¡æç
ã¾ãã¯åºã使ããã¦ããå½¢å¼ãç´¹ä»ããã è¨ç®ãããã¨ãã対象ã \[ \frac{P(0,N)}{Q(0,N)} = \sum_{n=0}^{N-1} \frac{a(n)}{b(n)} \frac{p(0)\cdots p(n)}{q(0)\cdots q(n)} \]
ã®ãããªå½¢ã«ãªãããã é©åãªå¼ $P(l,u)$ã$Q(l,u)$ã$R(l,u)$ ãè¨å®ããã (å ·ä½ä¾ã¯ä¸è¨) ããã¨ãããã®å ·ä½çè¨ç®ã«ã¤ãã¦ã¯ $l\le m\lt u$ ã¨ãªã $m$ ãç¨ãã¦ä»¥ä¸ã®ããã«å帰è¨ç®ãã§ããã $l+1=u$ ã¨ãªãå ´åã¯å®ç¾©å¼($a(n)$ ãªã©)ã« $n=u$ ãä»£å ¥ããã
\[ \begin{eqnarray} P(l, u) &=& P(l, m)Q(m, u) + R(l, m)P(m, u)\\ Q(l, u) &=& Q(l, m)Q(m, u)\\ R(l, u) &=& R(l, m)R(m, u) \end{eqnarray} \]ãã®ã¨ãã$m\simeq \left\lfloor\dfrac{l+u}{2}\right\rfloor$ ã¨ãããã¨ã§ä¸è¨ã®ãããªè¨ç®éã«è½ã¡çãã
å ·ä½ä¾ã®å¼ç¨ã¨ã㦠$\arctan(1/x)$ ã®è¨ç®ããã¯ãã¼ãªã³å±éè¨ç®ãåãã \[ \arctan\frac{1}{x} \simeq \frac{P(0,N)}{Q(0,N)} =\sum_{k=0}^{N-1}\frac{(-1)^k}{(2k+1)x^{2k+1}} \] \[ \Rightarrow \left\{ \begin{eqnarray} P(l, u) &=& R(l, u) \sum_{k=l}^{u-1} (-1)^{k+1} \frac{x^{u-1-k}}{2k+3}\\ Q(l,u) &=& x^{2(u-l)} \prod_{k=l}^{u-1}(2k+3)\\ R(l,u) &=& \prod_{k=l}^{u-1}(2k+3) \end{eqnarray} \right. \]
詳細ç
BS æ³ã¯ä¸è¨ã®å½¢ãããç¥ããã¦ããããæ¬æ¥ã¯ããåºç¯å²ã«é©ç¨ã§ããã¢ã«ã´ãªãºã ã§ããã [FT05]
æ±ãããã¨ããç´æ°ã \[ S = \sum_{n=0}^{\infty} \frac{a(n)}{b(n)} \frac{p(0)\cdots p(n)}{q(0)\cdots q(n)} \quad {\rm ã¾ãã¯}\quad U = \sum_{n=0}^{\infty} \frac{a(n)}{b(n)} \left(\frac{c(0)}{d(0)}+\cdots+\frac{c(n)}{d(n)}\right) \frac{p(0)\cdots p(n)}{q(0)\cdots q(n)} \]
ã®å½¢ã§è¡¨ãããã¦ããã¨ããããã®ã¨ãããã®é¨åç´æ° \[ S = \sum_{n_1 \lt n\lt n_2} \frac{a(n)}{b(n)} \frac{p(n_1)\cdots p(n)}{q(n_1)\cdots q(n)} \quad {\rm ã¾ãã¯}\quad U = \sum_{n_1 \lt n \lt n_2} \frac{a(n)}{b(n)} \left(\frac{c(n_1)}{d(n_1)}+\cdots+\frac{c(n)}{d(n)}\right) \frac{p(n_1)\cdots p(n)}{q(n_1)\cdots q(n)} \]
ãç´æ¥è¨ç®ããã®ã§ã¯ãªã $P=p(n_1)\cdots p(n_2-1)$ã$Q=q(n_1)\cdots q(n_2-1)$ã $B=b(n_1)\cdots b(n_2-1)$ã$D=d(n_1)\cdots d(n_2-1)$ã $C=D(c(n_1)/d(n_1)+\cdots+c(n_2-1)/d(n_2-1))$ ãèã㦠$T=BQS$ ã $V=DBQU$ ãæ±ãã¦ãã $S=R/BQ$ ã $U=V/DBQ$ ãå°ãã $m=\lfloor(n_1+n_2)/2\rfloor$ ã¨ã㦠$n_1\leqq n\lt m$ ã«å±ããé ã $B_l$ã$P_l$ã$Q_l$ã$T_l$ã$D_l$ã$C_l$ã$V_l$ã éã« $m\leqq n\lt n_2$ ã«å±ããé ã $B_r$ã$P_r$ã$Q_r$ã$T_r$ã$D_r$ã$C_r$ã$V_r$ã ã¨ããã¨ã
\[ B = B_lB_r,\ P = P_lP_r,\ Q = Q_lQ_r,\ T = B_rQ_rT_l + B_lP_lT_r \] \[ D = D_lD_r,\ C = C_lD_r + C_rD_l,\ V = D_rB_rQ_rV_l + D_rC_lB_lP_lT_r + D_lB_lP_lV_r \]ã§å帰çã«è¨ç®ããã ã¾ã以ä¸ã®ãã㪠C++ ã«ãããµã³ãã«ã³ã¼ãï¼ã³ã¡ã³ãé¨åã¯æ¥æ¬èªè¨³ï¼ãæ²è¼ããã¦ããã[FT05]
// S ãè¨ç®ããæ¹ // ã¦ã¼ã¶ã¼ãåæå¤ãå ¥ãããã®ã¨ãã struct { bigint *a, *b, *p, *q; } abpq_series; // åæ°ã®å½¢ã§çµæãä¿æãã struct { bigint P, Q, B, T; } abpq_series_result; // Binary Splitting ã«ããè¨ç® void sum_abpq(abpq_series_result& r, int n1, int n2, const abpq_series& arg) { switch(n2 - n1) { // ç´æ°ã®é·ãã§åé¡ case 0: error_handler("summation devide", "n2-n1 should be > 0."); break; case 1: // the result at the point n1 r.P = arg.p[n1]; r.Q = arg.q[n1]; r.B = arg.b[n1]; r.T = arg.a[n1] * arg.p[n1]; break; // case 2, 3, 4 ã¯ç°¡ç¥åã®ããçç¥ default: // ä¸è¬ã®å ´å abpq_series_result L, R; int nm = (n1 + n2) / 2; sum_abpq(L, n1, nm, arg); sum_abpq(R, nm, n2, arg); r.P = L.P * R.P; r.Q = L.Q * R.Q; r.B = L.B * R.B; r.T = R.B * R.Q * L.T + L.B * L.P * R.T; break; } }
// U ãè¨ç®ããæ¹ // ã¦ã¼ã¶ã¼ãåæå¤ãå ¥ãããã®ã¨ãã struct { bigint *a, *b, *p, *q, *c, *d; } abpqcd_series; // åæ°ã®å½¢ã§çµæãä¿æãã struct { bigint P, Q, B, T, C, D, V; } abpqcd_series_result; // binary splitting ã«ããè¨ç® void sum_abpqcd(abpqcd_series_result& r, int n1, int n2, const abpqcd_series& arg) { switch(n2 - n1) { // ç´æ°ã®é·ãã§åé¡ case 0: error_handler("summation devide", "n2-n1 should be > 0."); break; case 1: // the result at the point n1 r.P = arg.p[n1]; r.Q = arg.q[n1]; r.B = arg.b[n1]; r.T = arg.a[n1] * arg.p[n1]; r.C = arg.c[n1]; r.D = arg.d[n1]; r.V = arg.a[n1] * arg.c[n1] * arg.p[n1]; break; // case 2, 3, 4 ã¯ç°¡ç¥åã®ããçç¥ default: // ä¸è¬ã®å ´å abpqcd_series_result L, R; int nm = (n1 + n2) / 2; sum_abpqcd(L, n1, nm, arg); sum_abpqcd(R, nm, n2, arg); r.P = L.P * R.P; r.Q = L.Q * R.Q; r.B = L.B * R.B; bigint tmp = L.B * L.P * R.T; r.T = R.B * R.Q * L.T + tmp; r.D = L.D * R.D; r.C = L.C * R.D + R.C * L.D; r.V = R.B * (R.B * R.Q * L.V + L.C * tmp) + L.D * L.B * L.P * R.V; break; } }
åé¢æ°ã«å¯¾å¿ããé
ä¸è¨ã®å½¢ã§æ¸ããã¦ãä»ä¸ã¤é
ãè¦ããªãâ¦ã¨ããããåããã¥ããã®ã§
[FT05] ä¸ã«ããé
ã表ã«ã¾ã¨ãã¦ã¿ãã
表ã®ä¸ã«ç¾ããå¤æ° $x$ ã¯æçæ°ã§ $x=u/v$ ã¨è¡¨ããããã®ã¨ããã
ã¾ãã$p(n)$ ã $q(n)$ 㯠$n=0$ ã§ç¹æ®ãªå¤ãåããã¨ãå¤ãã®ã§å¥é
ãç«ã¦ããã
ä¸è¬é
ã§è¨è¿°å¯è½ãªå ´å㯠-
ãå
¥ãã¦ããã
$f(x)$ | $a(n)$ | $b(n)$ | $p(0)$ | $q(0)$ | $p(n)$ | $q(n)$ | åè |
---|---|---|---|---|---|---|---|
$\exp(x)$ | 1 | 1 | 1 | 1 | $u$ | $nv$ | |
$\ln(1+x)$ | 1 | $n+1$ | $u$ | - | $-u$ | $v$ | |
$\sin(x)$ | 1 | 1 | $u$ | $v$ | $-u^2$ | $2n(2n+1)v^2$ | |
$\cos(x)$ | 1 | 1 | 1 | 1 | $-u^2$ | $2n(2n-1)v^2$ | |
$\arctan(x)$ | 1 | $2n+1$ | $x$ | - | $-x^2$ | 1 | ä½æ ã $u$ã$v$ ã使ã£ãå½¢ã§ä¸ãããã¦ãªã |
$\dfrac{\sqrt{C}}{12\pi}$ | $A+nB$ | 1 | 1 | 1 | $-(6n-5)(2n-1)(6n-1)$ | $n^3C/24$ | Chudnovskyã®å
¬å¼ã åå®æ°ã¯ãªã³ã¯å ã¨ä¸ç·ã |
ã«ã¿ã©ã³æ° $G$â»1 | 1 | $2n+1$ | 1 | 1 | $n$ | $4n+2$ | â»1 |
$2\zeta(3)$ â»2 | $205n^2+250n+77$ | 1 | 1 | - | $-n^5$ | $32(2n+1)^5$ |
- â»1 $G=\dfrac{3}{8}{\displaystyle \sum_{n=0}^{\infty}}\dfrac{1}{\left(2n \atop n\right)(2n+1)^2}+\dfrac{\pi}{8}\log(2+\sqrt{3})$ ã® $\sum$ é¨åã ããæ±ãã¦ããã