\newcommand{\eps}{\epsilon} \newcommand{\tO}{\widetilde O} \newcommand{\d}{\mathrm d} \newcommand{\hphi}{\widehat \phi} \newcommand{\hPhi}{\widehat \Phi}
前一段时间某群里有人发了一个链接,说的是有人又整出一个新的算 M ( x ) = ∑ n = 1 x μ ( n ) M(x) = \sum\limits_{n=1}^x \mu(n) M ( x ) = n = 1 ∑ x μ ( n ) 的算法了,时间复杂度 \tO ( x 3 / 5 ) \tO(x^{3/5}) \tO ( x 3/5 ) ,空间复杂度 \tO ( x 3 / 10 ) \tO(x^{3/10}) \tO ( x 3/10 ) 。然后有人提到目前最快的算 M ( x ) M(x) M ( x ) 的算法是用解析数论的方法,和 π ( x ) \pi(x) π ( x ) 类似,时间复杂度 \tO ( x 1 / 2 ) \tO(x^{1/2}) \tO ( x 1/2 ) ,空间复杂度 \tO ( x 1 / 4 ) \tO(x^{1/4}) \tO ( x 1/4 ) 。那几篇论文都是针对 π ( x ) \pi(x) π ( x ) ,然后说可以拓展到 M ( x ) M(x) M ( x ) ,我一时兴起就去学习了一下,整一点理性愉悦的东西。
在这个过程中,我读了好几篇 paper,有几篇没读懂,这里差不多就是对那几篇 paper 的 survey 吧……由于这个领域属于 analytic number theory,而我不懂复分析,所以……几乎所有核心定理的证明我都看不懂……所以由于个人能力原因,文章中可能存在不严谨的地方或者错误,大家意思意思一下吧 →_→
由于内容比较多,所以我可能会拆成好几篇文章来写(又可以水了呢 →_→)。
历史
这里我首先介绍一下解析方法数质数这个小领域的历史。首先是 1987 年 [LO] 整了一个算法,说是可以在 \tO ( n 1 / 2 ) \tO(n^{1/2}) \tO ( n 1/2 ) 的时间内算 π ( x ) \pi(x) π ( x ) ,但是由于常数过大,他们并没有实现出来……后来 William Galway 在 UIUC 数学系读博的时候一直研究 [LO] 的算法,做了点小改进,补充了里面的技术细节。然而,Galway 自己也没实现出来……再后来 [FKBJ] 用另外一种思路做了点小改进,然后真的实现出来了![FKBJ] 在假定 Riemann hypothesis 的前提下,花了几千个 CPU hours 算出来 π ( 10 24 ) \pi(10^{24}) π ( 1 0 24 ) 。后来 [Platt] 在 [Galway] 的基础上也做了点小改进,然后实现了代码!他也算了 π ( 10 24 ) \pi(10^{24}) π ( 1 0 24 ) ,在没有 assume RH 的前提下确认了 [FKBJ] 的结果。再后来 [Büthe] 在 [FKBJ] 的基础上又做了点小改进,算出了 π ( 10 25 ) \pi(10^{25}) π ( 1 0 25 ) 。这个 Büthe 也是 FKBJ 里的 B。再后来的事我就没注意了……
主要思路
这里我们先约定:所有字母 p p p 均表示素数。于是 π ( x ) \pi(x) π ( x ) 可以表示为 π ( x ) = ∑ p ≤ x 1 \pi(x) = \sum\limits_{p \leq x} 1 π ( x ) = p ≤ x ∑ 1 ,尽管这样做什么用也没有……文章中所有的 i i i 均为 − 1 \sqrt{-1} − 1 。复杂度里的 O ~ \widetilde O O 和 Ω ~ \widetilde \Omega Ω 里均省略一个 poly log n \text{poly}\log n poly log n ,因为我实在懒得算有多少个 log \log log 了……文中的 log \log log 和 ln \ln ln 混用了。
这一切要从 [LO] 说起……作者之一的 Andrew M. O dlyzko 接下来会出现很多次。但是由于 [LO] 写的比较意识流,我沿用 [Galway] 的思路。
万恶之源是 Mellin 变换:给定一个函数 ϕ ( s ) \phi(s) ϕ ( s ) ,它的 Mellin 变换为
\hphi ( s ) : = ∫ 0 ∞ ϕ ( u ) u s − 1 d u . \hphi(s):= \int_0^\infty \phi(u) u^{s - 1} \d u. \hphi ( s ) := ∫ 0 ∞ ϕ ( u ) u s − 1 d u .
然后就有定理 [Theorem 1.4, Galway] 告诉我们:对于任意一个 定义域内的 σ \sigma σ ,我们有
ϕ ( u + ) + ϕ ( u − ) 2 = 1 2 π i ∫ σ − i ∞ σ + i ∞ \hphi ( s ) u − s d s . \label e q : m e l l i n − i n v \begin{equation}
\frac{\phi(u+) + \phi(u-)}{2} = \frac{1}{2\pi i} \int_{\sigma - i \infty}^{\sigma + i\infty} \hphi(s) u^{-s} \d s. \label{eq:mellin-inv}
\end{equation} 2 ϕ ( u + ) + ϕ ( u − ) = 2 πi 1 ∫ σ − i ∞ σ + i ∞ \hphi ( s ) u − s d s . \label e q : m e ll in − in v
根据我的猜测,这里的 ϕ ( u + ) \phi(u+) ϕ ( u + ) 和 ϕ ( u − ) \phi(u-) ϕ ( u − ) 应该是指 lim δ → 0 + ϕ ( u + δ ) \lim\limits_{\delta \to 0^+}\phi(u + \delta) δ → 0 + lim ϕ ( u + δ ) 和 lim δ → 0 − ϕ ( u + δ ) \lim\limits_{\delta \to 0^-} \phi(u + \delta) δ → 0 − lim ϕ ( u + δ ) 。如果 ϕ ( u ) \phi(u) ϕ ( u ) 性质没那么差,我们就有 ϕ ( u ) = ϕ ( u + ) + ϕ ( u − ) 2 \phi(u) = \frac{\phi(u+) + \phi(u-)}{2} ϕ ( u ) = 2 ϕ ( u + ) + ϕ ( u − ) 。注意这个 ϕ ( u ) \phi(u) ϕ ( u ) 可以是不连续的。这样,\eqref e q : m e l l i n − i n v \eqref{eq:mellin-inv} \eqref e q : m e ll in − in v 可以看成是 Mellin 变换的逆变换。给定一个序列 { a n } n ∈ N + \{a_n\}_{n \in \mathbb{N}^+} { a n } n ∈ N + ,我们对逆变换稍作处理:
∑ n ≥ 1 a n ϕ ( n ) = 1 2 π i ∫ σ − i ∞ σ + i ∞ \hphi ( s ) ∑ n ≥ 1 a n n − s d s . \label e q : w e i g h t e d − m e l l i n \begin{equation}
\sum_{n \geq 1} a_n \phi(n) = \frac{1}{2\pi i} \int_{\sigma - i \infty}^{\sigma + i\infty} \hphi(s) \sum_{n \geq 1} a_n n^{-s} \d s. \label{eq:weighted-mellin}
\end{equation} n ≥ 1 ∑ a n ϕ ( n ) = 2 πi 1 ∫ σ − i ∞ σ + i ∞ \hphi ( s ) n ≥ 1 ∑ a n n − s d s . \label e q : w e i g h t e d − m e ll in
左边看起来平淡无奇,但是右边的 ∑ n ≥ 1 a n n − s \sum\limits_{n \geq 1} a_n n^{-s} n ≥ 1 ∑ a n n − s 不免让人遐想联翩:这不就是 Dirichlet 级数嘛!例如我们令 a n = μ ( n ) a_n = \mu(n) a n = μ ( n ) ,我们有 ∑ n ≥ 1 a n n − s = 1 ζ ( s ) \sum\limits_{n \geq 1} a_n n^{-s} = \frac{1}{\zeta(s)} n ≥ 1 ∑ a n n − s = ζ ( s ) 1 ,那么两边就可以化简成
∑ n ≥ 1 μ ( n ) ϕ ( n ) = 1 2 π i ∫ σ − i ∞ σ + i ∞ \hphi ( s ) ζ ( s ) − 1 d s . \sum_{n \geq 1} \mu(n) \phi(n) = \frac{1}{2\pi i} \int_{\sigma - i \infty}^{\sigma + i \infty} \hphi(s) \zeta(s)^{-1} \d s. n ≥ 1 ∑ μ ( n ) ϕ ( n ) = 2 πi 1 ∫ σ − i ∞ σ + i ∞ \hphi ( s ) ζ ( s ) − 1 d s .
如果我们令 a n a_n a n 表示 n n n 是否为素数,那么这个 Dirichlet 级数还是不好求。没关系,我们可以令 a p m = 1 m a_{p^m} = \frac{1}{m} a p m = m 1 ,其它的 a n = 0 a_n = 0 a n = 0 ,这样就有:
∑ n ≥ 1 a n n − s = ∑ p m 1 m p − m s = ∑ p ∑ m ≥ 1 1 m p − m s = ∑ p ln ( 1 − p − s ) − 1 = ln ∏ p 1 1 − p − s = ln ζ ( s ) . \sum_{n \geq 1} a_n n^{-s} = \sum_{p^m} \frac{1}{m} p^{-ms} = \sum_{p}\sum_{m \geq 1} \frac{1}{m} p^{-ms} = \sum_p \ln (1 - p^{-s})^{-1} = \ln \prod_{p} \frac{1}{1 - p^{-s}} = \ln \zeta(s). n ≥ 1 ∑ a n n − s = p m ∑ m 1 p − m s = p ∑ m ≥ 1 ∑ m 1 p − m s = p ∑ ln ( 1 − p − s ) − 1 = ln p ∏ 1 − p − s 1 = ln ζ ( s ) .
还是可以继续的嘛……于是我们有:
∑ p m 1 m ϕ ( n ) = 1 2 π i ∫ σ − i ∞ σ + i ∞ \hphi ( s ) ln ζ ( s ) d s . \label e q : p i − s t a r − m e l l i n \begin{equation}
\sum_{p^m} \frac{1}{m} \phi(n) = \frac{1}{2\pi i} \int_{\sigma - i \infty}^{\sigma + i \infty} \hphi(s) \ln \zeta(s) \d s. \label{eq:pi-star-mellin}
\end{equation} p m ∑ m 1 ϕ ( n ) = 2 πi 1 ∫ σ − i ∞ σ + i ∞ \hphi ( s ) ln ζ ( s ) d s . \label e q : p i − s t a r − m e ll in
但是这样我们就不再求 π ( x ) \pi(x) π ( x ) ,转而求
π ∗ ( x ) = ∑ p m ≤ x 1 m = ∑ m ≥ 1 1 m π ( x m ) . \label e q : p i − p i ∗ \begin{equation}
\pi^*(x) = \sum_{p^m \leq x} \frac{1}{m} = \sum_{m \geq 1} \frac{1}{m} \pi(\sqrt[m]{x}). \label{eq:pi-pi*}
\end{equation} π ∗ ( x ) = p m ≤ x ∑ m 1 = m ≥ 1 ∑ m 1 π ( m x ) . \label e q : p i − p i ∗
注意到 m > 1 m > 1 m > 1 时,x m \sqrt[m]{x} m x 衰减的很快,可以直接暴力了,所以由 π ∗ ( x ) \pi^*(x) π ∗ ( x ) 推 π ( x ) \pi(x) π ( x ) 问题不大,时间复杂度 \tO ( x 1 / 2 ) \tO(x^{1/2}) \tO ( x 1/2 ) 。比较 \eqref e q : p i − p i ∗ \eqref{eq:pi-pi*} \eqref e q : p i − p i ∗ 和 \eqref e q : p i − s t a r − m e l l i n \eqref{eq:pi-star-mellin} \eqref e q : p i − s t a r − m e ll in ,自然而然,我们就想让 ϕ ( n ) = [ n ≤ x ] \phi(n) = [n \leq x] ϕ ( n ) = [ n ≤ x ] ,然而这让 \hphi ( s ) \hphi(s) \hphi ( s ) 难算,右边的积分积不出来……所以我们需要一个平滑一点的函数([ n ≤ x ] [n \leq x] [ n ≤ x ] 这个函数太阶梯了),满足 ϕ ( n ) \phi(n) ϕ ( n ) 在 ( − ∞ , x l ] (-\infty, x_l] ( − ∞ , x l ] 非常接近于 1,[ x r , ∞ ) [x_r, \infty) [ x r , ∞ ) 上非常接近于 0 , x l ≤ x ≤ x r x_l \leq x \leq x_r x l ≤ x ≤ x r 且 x r − x l x_r - x_l x r − x l 不太大,这样我们还是可以强行算积分,然后暴力把 [ x l , x r ] [x_l, x_r] [ x l , x r ] 里的不同减掉即可。详细说来,我们想找一个 [ n ≤ x ] [n \leq x] [ n ≤ x ] 的近似 ϕ ( u ) \phi(u) ϕ ( u ) ,然后计算
π ∗ ( x ) = ∑ p m 1 m [ p m ≤ x ] = 1 2 π i ∫ σ − i ∞ σ + i ∞ \hphi ( s ) ln ζ ( s ) d s + ∑ p m 1 m ( [ p m ≤ x ] − ϕ ( p m ) ) . \label e q : k e y \begin{equation}
\pi^*(x) = \sum_{p^m} \frac{1}{m} [p^m \leq x] = \frac{1}{2 \pi i} \int_{\sigma - i \infty}^{\sigma + i \infty} \hphi(s) \ln \zeta(s) \d s + \sum_{p^m} \frac{1}{m} \left( [p^m \leq x] - \phi(p^m) \right). \label{eq:key}
\end{equation} π ∗ ( x ) = p m ∑ m 1 [ p m ≤ x ] = 2 πi 1 ∫ σ − i ∞ σ + i ∞ \hphi ( s ) ln ζ ( s ) d s + p m ∑ m 1 ( [ p m ≤ x ] − ϕ ( p m ) ) . \label e q : k ey
右式分为两部分,第一部分为积分,第二部分为用 ϕ ( n ) \phi(n) ϕ ( n ) 来近似 [ n ≤ x ] [n \leq x] [ n ≤ x ] 带来的误差。我们希望 ϕ ( n ) \phi(n) ϕ ( n ) 只在 [ x l , x r ] [x_l, x_r] [ x l , x r ] 上有可能和 [ n ≤ x ] [n \leq x] [ n ≤ x ] 有较大差别,在 ( − ∞ , x l ] (-\infty, x_l] ( − ∞ , x l ] 和 [ x r , ∞ ) [x_r, \infty) [ x r , ∞ ) 上和 [ n ≤ x ] [n \leq x] [ n ≤ x ] 的差距小到可以忽略。请记住 \eqref e q : k e y \eqref{eq:key} \eqref e q : k ey ,这个等式是这一系列算法的核心,所有的算法都围绕等式右边来设计,特别是里面的积分这一项。
到这里,我们总结一下这个算法的思路:
设计一个好的 ϕ ( u ) \phi(u) ϕ ( u ) 使得 \eqref e q : k e y \eqref{eq:key} \eqref e q : k ey 右边两项均可以快速计算;
用 \eqref e q : k e y \eqref{eq:key} \eqref e q : k ey 计算 π ∗ ( x ) \pi^*(x) π ∗ ( x ) ,时间复杂度依赖于 ϕ ( u ) \phi(u) ϕ ( u ) ;
然后用 \eqref e q : p i − p i ∗ \eqref{eq:pi-pi*} \eqref e q : p i − p i ∗ 求 π ( x ) \pi(x) π ( x ) ,这一步时间复杂度 \tO ( x 1 / 2 ) \tO(x^{1/2}) \tO ( x 1/2 ) 。
接下来,[LO] 和 [Galway] 分别设计了自己的 ϕ ( u ) \phi(u) ϕ ( u ) 以及计算 \eqref e q : k e y \eqref{eq:key} \eqref e q : k ey 的算法,复杂度均为 \tO ( x 1 / 2 ) \tO(x^{1/2}) \tO ( x 1/2 ) 。[Platt] 用的是 [Galway] 的 ϕ ( u ) \phi(u) ϕ ( u ) ,但是设计了新的算法来算 \eqref e q : k e y \eqref{eq:key} \eqref e q : k ey 的积分。
[LO] 的 ϕ ( u ) \phi(u) ϕ ( u )
首先我们给出定义:固定 0 < w < x , k 0 < w < x, k 0 < w < x , k ,令 f ( u ; k ) = c − 1 u k ( 1 − u ) k f(u; k) = c^{-1} u^k (1 - u)^k f ( u ; k ) = c − 1 u k ( 1 − u ) k 其中 c = ∫ 0 1 u k ( 1 − u ) k d u c = \int_0^1 u^k (1-u)^k \d u c = ∫ 0 1 u k ( 1 − u ) k d u 为归一化常数,则 ϕ ( u ) \phi(u) ϕ ( u ) 定义为
ϕ ( u ; x , w , k ) = { 1 u ≤ x − w , 0 u ≥ x , ∫ 0 ( x − u ) / w f ( v ; k ) d v x − w < u < x . \phi(u; x, w, k) = \begin{cases} 1 & u \leq x - w, \\ 0 & u \geq x, \\ \int_0^{(x - u)/w} f(v; k) \d v & x - w < u < x. \end{cases} ϕ ( u ; x , w , k ) = ⎩ ⎨ ⎧ 1 0 ∫ 0 ( x − u ) / w f ( v ; k ) d v u ≤ x − w , u ≥ x , x − w < u < x .
其 Mellin 变换为
\hphi ( s ; x , w , k ) = s − 1 ∫ 0 1 ( x − v w ) f ( v ; x , w , k ) d v . \hphi(s; x, w, k) = s^{-1} \int_0^1 (x - vw) f(v; x, w, k) \d v. \hphi ( s ; x , w , k ) = s − 1 ∫ 0 1 ( x − v w ) f ( v ; x , w , k ) d v .
怎么求 ϕ ( u ; x , w , k ) \phi(u; x, w, k) ϕ ( u ; x , w , k ) 我没看懂,paper 里面这一页的排版直接劝退……我猜是 Euler-Maclaurin 算个积分就行了,或者可以整出一个 closed-form 出来……所以只要 x − w ≤ x ≤ x x - w \leq x \leq x x − w ≤ x ≤ x ,算 \eqref e q : k e y \eqref{eq:key} \eqref e q : k ey 第二项就可以在 \tO ( w ) \tO(w) \tO ( w ) 内完成。现在问题的重点就是如何求 \eqref e q : k e y \eqref{eq:key} \eqref e q : k ey 里的积分。方便起见,我们定义 Ψ ( s ; x , w , k ) = \hphi ( s ; x , w , k ) log ζ ( s ) \Psi(s; x, w, k) = \hphi(s; x, w, k) \log \zeta(s) Ψ ( s ; x , w , k ) = \hphi ( s ; x , w , k ) log ζ ( s ) 。再注意到 \hphi ( s ˉ ; x , w , k ) = \hphi ( s ; x , w , k ) ‾ \hphi(\bar s; x, w, k) = \overline{\hphi(s; x, w, k)} \hphi ( s ˉ ; x , w , k ) = \hphi ( s ; x , w , k ) ,ζ ( s ˉ ) = ζ ( s ) ‾ \zeta(\bar s) = \overline{\zeta(s)} ζ ( s ˉ ) = ζ ( s ) ,故有 Ψ ( s ˉ ; x , w , k ) = Ψ ( s ; x , w , k ) ‾ \Psi(\bar s; x, w, k) = \overline{\Psi(s; x, w, k)} Ψ ( s ˉ ; x , w , k ) = Ψ ( s ; x , w , k ) 。由于积分的对称性,我们只需要考虑 ℜ Ψ ( s ; x , w , k ) \Re\Psi(s; x, w, k) ℜΨ ( s ; x , w , k ) 的积分即可。
我们把这个积分的上下限从 ( − ∞ , ∞ ) (-\infty, \infty) ( − ∞ , ∞ ) 截断为 [ − T , T ] [-T, T] [ − T , T ] :
1 2 π i ∫ σ − i ∞ σ + i ∞ ℜ Ψ ( s ; x , w , k ) d s ≈ 1 2 π i ∫ σ − i T σ + i T ℜ Ψ ( s ; x , w , k ) d s + E T , \frac{1}{2 \pi i} \int_{\sigma - i \infty} ^{\sigma + i \infty} \Re \Psi(s; x, w, k) \d s \approx \frac{1}{2 \pi i} \int_{\sigma - i T} ^{\sigma + i T} \Re \Psi(s; x, w, k) \d s + \mathcal{E}_T, 2 πi 1 ∫ σ − i ∞ σ + i ∞ ℜΨ ( s ; x , w , k ) d s ≈ 2 πi 1 ∫ σ − i T σ + i T ℜΨ ( s ; x , w , k ) d s + E T ,
其中 E T \mathcal{E}_T E T 为误差项。[Eq 3.12, LO] 给出了 E T \mathcal{E}_T E T 的 bound:
∣ E T ∣ = \tO ( x 3 / 2 + k ( T w ) − k ) , |\mathcal{E}_T| = \tO(x^{3/2+k} (Tw)^{-k}), ∣ E T ∣ = \tO ( x 3/2 + k ( Tw ) − k ) ,
所以 T = \tO ( x 1 + 3 / ( 2 k ) / w ) T = \tO(x^{1+3/(2k)}/w) T = \tO ( x 1 + 3/ ( 2 k ) / w ) 就可以把截断误差控制住。但是即使截断了,这个积分仍然不好求。[LO] 给出的方法是 Euler-Maclaurin 求和公式:
[Lemma 3, LO] 如果 f ( t ) f(t) f ( t ) 在 [ 0 , T ] [0, T] [ 0 , T ] 上有 2 m 2m 2 m 次导数,那么对于任意 n ∈ N n \in \mathbb{N} n ∈ N 有
∫ 0 T f ( t ) d t = T n [ ∑ j = 0 n f ( T j n ) − g ( 0 ) + g ( T ) 2 ] − ∑ j = 1 m − 1 B 2 j ( 2 j ) ! ( T n ) 2 j − 1 [ g ( 2 j − 1 ) ( T ) − g ( 2 j − 1 ) ( 0 ) ] + R 2 m , \label e q : e u l e r − m a c l a u r i n \begin{equation}
\begin{aligned}
\int_0^T f(t) \d t & = \frac{T}{n} \left[\sum_{j=0}^n f\left(\frac{Tj}{n}\right) - \frac{g(0) + g(T)}{2} \right] \\
& \hspace{4em} - \sum_{j=1}^{m-1} \frac{B_{2j}}{(2j)!} \left( \frac{T}{n} \right)^{2j-1} \left[g^{(2j-1)}(T) - g^{(2j-1)}(0) \right] + R_{2m},
\end{aligned}
\label{eq:euler-maclaurin}
\end{equation} ∫ 0 T f ( t ) d t = n T [ j = 0 ∑ n f ( n T j ) − 2 g ( 0 ) + g ( T ) ] − j = 1 ∑ m − 1 ( 2 j )! B 2 j ( n T ) 2 j − 1 [ g ( 2 j − 1 ) ( T ) − g ( 2 j − 1 ) ( 0 ) ] + R 2 m , \label e q : e u l er − ma c l a u r in
其中 B 2 i B_{2i} B 2 i 为 Bernoulli 数,R 2 m R_{2m} R 2 m 为误差项
R 2 m ≤ n ∣ B 2 m ∣ ( 2 m ) ! ( T n ) 2 m + 1 max t ∈ [ 0 , T ] ∣ g ( 2 m ) ( t ) ∣ . R_{2m} \leq n \frac{|B_{2m}|}{(2m)!} \left( \frac{T}{n} \right)^{2m+1} \max_{t \in [0, T]} \left| g^{(2m)}(t) \right|. R 2 m ≤ n ( 2 m )! ∣ B 2 m ∣ ( n T ) 2 m + 1 t ∈ [ 0 , T ] max g ( 2 m ) ( t ) .
意会一下,我们想通过在 [ 0 , T ] [0, T] [ 0 , T ] 内均匀撒 n n n 个点来求 ∫ 0 T f ( t ) d t \int_0^T f(t) \d t ∫ 0 T f ( t ) d t ,[Lemma 3, LO] 给出了这样的做的误差。可以看到,n n n 越大,误差约小,误差项 R 2 m R_{2m} R 2 m 则和 f ( 2 m ) ( t ) f^{(2m)}(t) f ( 2 m ) ( t ) 的最大值相关。[Lemma 4, LO] 给出了 ℜ Ψ ( σ + i t ; x , w , k ) \Re\Psi(\sigma + it; x, w, k) ℜΨ ( σ + i t ; x , w , k ) 的 m m m 次导数的 bound:
[Lemma 4, LO]
∣ d m d t m ℜ Ψ ( σ + i t ; x , w , k ) ∣ = O ( m ! ( ( σ − 1 ) / 2 ) − m x ( σ + 2 ) / 2 + k ) . \left| \frac{\d^m}{\d t^m} \Re \Psi(\sigma + it; x, w, k) \right| = O\left( m! ((\sigma-1)/2)^{-m} x^{(\sigma+2)/2+k} \right). d t m d m ℜΨ ( σ + i t ; x , w , k ) = O ( m ! (( σ − 1 ) /2 ) − m x ( σ + 2 ) /2 + k ) .
故我们取 σ = 3 / 2 \sigma = 3/2 σ = 3/2 ,m = k 2 m = k^2 m = k 2 , n = \tO ( x 1 + 3 / k / w ) n = \tO(x^{1+3/k}/w) n = \tO ( x 1 + 3/ k / w ) 就能把误差控制在合理范围内。(这句话我瞎 bibi 的,没算。)
很明显, \eqref e q : k e y \eqref{eq:key} \eqref e q : k ey 第二项的复杂度只取决于 w w w ,而假定 Ψ ( s ; x , w , k ) \Psi(s; x, w, k) Ψ ( s ; x , w , k ) 及其 m m m 阶导数能在 \tO ( 1 ) \tO(1) \tO ( 1 ) 的时间内(\tO \tO \tO 内省略了 m m m )求出来的话,第一项积分的复杂度为 \tO ( n ) = \tO ( x 1 + 3 / k / w ) \tO(n) = \tO(x^{1+3/k} / w) \tO ( n ) = \tO ( x 1 + 3/ k / w ) ,取一个足够大的 k k k 就能使得这一项复杂度变为 \tO ( n / w ) \tO(n/w) \tO ( n / w ) 。故为了平衡两边复杂度,我们取 w = \tO ( n 1 / 2 ) w = \tO(n^{1/2}) w = \tO ( n 1/2 ) ,两边时间复杂度就都是 \tO ( x 1 / 2 ) \tO(x^{1/2}) \tO ( x 1/2 ) 。
最后,我们来总结一下 [LO] 算法是如何计算 \eqref e q : k e y \eqref{eq:key} \eqref e q : k ey 的:
第二项直接暴力,复杂度 \tO ( w ) = \tO ( x 1 / 2 ) \tO(w) = \tO(x^{1/2}) \tO ( w ) = \tO ( x 1/2 ) ;
第一项我们先把积分截断到 T = \tO ( x / w ) = \tO ( x 1 / 2 ) T = \tO(x/w) = \tO(x^{1/2}) T = \tO ( x / w ) = \tO ( x 1/2 ) ,再用 Euler-Maclaurin 公式 \eqref e q : e u l e r − m a c l a u r i n \eqref{eq:euler-maclaurin} \eqref e q : e u l er − ma c l a u r in 采 n = \tO ( x 1 + 3 / k / w ) = \tO ( x 1 / 2 ) n = \tO(x^{1+3/k}/w) = \tO(x^{1/2}) n = \tO ( x 1 + 3/ k / w ) = \tO ( x 1/2 ) 个点来计算。
整体时间复杂度 \tO ( x 1 / 2 ) \tO(x^{1/2}) \tO ( x 1/2 ) 。
下面是 paper 某一页的截图……诡异的排版真劝退。
[Galway] 的 ϕ ( u ) \phi(u) ϕ ( u )
[Galway] 沿用了 [LO] 的思路,但是 [Galway] 换了一个 ϕ ( u ) \phi(u) ϕ ( u ) ,他的 ϕ ( u ) \phi(u) ϕ ( u ) 定义如下:
ϕ ( u ; x , λ ) = 1 2 erfc ( ln ( u / x ) 2 λ ) . \phi(u; x, \lambda) = \frac{1}{2} \text{erfc}\left(\frac{\ln (u / x)}{\sqrt{2} \lambda} \right). ϕ ( u ; x , λ ) = 2 1 erfc ( 2 λ ln ( u / x ) ) .
对应的 Mellin 变换 \hphi ( s ) \hphi(s) \hphi ( s ) 为
\hphi ( s ; x , λ ) = e λ 2 s 2 / 2 x s s . \hphi(s; x, \lambda) = e^{\lambda^2 s^2 / 2} \frac{x^s}{s}. \hphi ( s ; x , λ ) = e λ 2 s 2 /2 s x s .
我们再来分析 \eqref e q : k e y \eqref{eq:key} \eqref e q : k ey 的第二项。注意到 erfc ( x ) ≤ e − x 2 \text{erfc}(x) \leq e^{-x^2} erfc ( x ) ≤ e − x 2 ,所以 ϕ ( u ; x , λ ) \phi(u; x, \lambda) ϕ ( u ; x , λ ) 在 u u u 出了 [ x / ( λ log x ) , x λ log x ] [x / (\lambda \sqrt{\log x}), x \lambda \sqrt{\log x}] [ x / ( λ log x ) , x λ log x ] 后衰减的非常快,所以这个函数几乎等价于阶梯函数了,所以我们就暴力把这个区间内的差求个和就行了,复杂度是 \tO ( x λ ) \tO(x\lambda) \tO ( x λ ) 。
现在问题就是如何求 \eqref e q : k e y \eqref{eq:key} \eqref e q : k ey 里的积分了。和上文的分析一样,我们继续定义 Ψ ( s ; x , λ ) = \hphi ( s ; x , λ ) ln ζ ( s ) \Psi(s;x, \lambda) = \hphi(s; x, \lambda) \ln \zeta(s) Ψ ( s ; x , λ ) = \hphi ( s ; x , λ ) ln ζ ( s ) ,于是 \eqref e q : k e y \eqref{eq:key} \eqref e q : k ey 中的积分可以表示为 ∫ 0 ∞ Φ ( σ + i t ) d t \int_0^{\infty} \Phi(\sigma + it) \d t ∫ 0 ∞ Φ ( σ + i t ) d t 。[Galway] 也是用两步来近似这个积分,不过把截断和离散化换了个顺序:
∫ 0 ∞ ℜ Ψ ( σ + i t ; x , λ ) d t ≈ h ∑ k = 0 ∞ ℜ Ψ ( σ + i h t ; x , λ ) ≈ h ∑ k = 0 T / h ℜ Ψ ( σ + i h t ; x , λ ) . \int_0^\infty \Re \Psi(\sigma + it; x, \lambda) \d t \approx h \sum_{k=0}^{\infty} \Re \Psi(\sigma + iht; x, \lambda) \approx h \sum_{k=0}^{T/h} \Re \Psi(\sigma + iht; x, \lambda). ∫ 0 ∞ ℜΨ ( σ + i t ; x , λ ) d t ≈ h k = 0 ∑ ∞ ℜΨ ( σ + ih t ; x , λ ) ≈ h k = 0 ∑ T / h ℜΨ ( σ + ih t ; x , λ ) .
第一步是把积分换成了求和,[Section 3.3, Galway] 证明了只要 h = O ( 1 ln ( x / ε ) ) h = O\left(\frac{1}{\ln (x/\varepsilon)}\right) h = O ( l n ( x / ε ) 1 ) ,那么积分转求和这一步的误差就可以被控制到 ε \varepsilon ε 。第二步是把无限求和转化成有限求和,我们有如下定理:
[Theorem 3.25, Galway] 若 x > 0 , λ > 0 , σ > 1 , h > 0 , T > 0 x > 0, \lambda > 0, \sigma > 1, h > 0, T > 0 x > 0 , λ > 0 , σ > 1 , h > 0 , T > 0 ,则有
h ∑ k > T / h ∣ ℜ Ψ ( σ + i k h ; x , λ ) ∣ ≤ 1 2 e λ 2 σ 2 / 2 ln ζ ( σ ) E 1 ( λ 2 T 2 / 2 ) , h \sum_{k > T/h} |\Re \Psi (\sigma + ikh; x, \lambda)| \leq \frac{1}{2} e^{\lambda^2 \sigma^2 / 2} \ln \zeta(\sigma) E_1(\lambda^2 T^2 / 2), h k > T / h ∑ ∣ℜΨ ( σ + ikh ; x , λ ) ∣ ≤ 2 1 e λ 2 σ 2 /2 ln ζ ( σ ) E 1 ( λ 2 T 2 /2 ) ,
其中 E 1 ( z ) = ∫ z ∞ e − r / r d r E_1(z) = \int_z^\infty e^{-r} / r \d r E 1 ( z ) = ∫ z ∞ e − r / r d r 为指数积分。
所以只要 T = Ω ~ ( λ − 1 ln ϵ − 1 ) T = \widetilde\Omega\left(\lambda^{-1} \sqrt{\ln \epsilon^{-1}}\right) T = Ω ( λ − 1 ln ϵ − 1 ) ,那么这一步的误差也能被控制到 ε \varepsilon ε 。为了使得最后答案准确,我们只要使得这个积分误差不超过一个小常数即可,所以 ε \varepsilon ε 可以认为是常数(例如 0.1)。假定我们能 \tO ( 1 ) \tO(1) \tO ( 1 ) 时间内对 Ψ ( s ; x , λ ) \Psi(s; x, \lambda) Ψ ( s ; x , λ ) 进行一次求值,那么这个积分可以在 \tO ( λ − 1 ) \tO(\lambda^{-1}) \tO ( λ − 1 ) 的时间内做到常数逼近。
综上,这个算法的总体时间为 \tO ( x λ + λ − 1 ) \tO(x\lambda + \lambda^{-1}) \tO ( x λ + λ − 1 ) ,所以令 λ = Θ ~ ( x 1 / 2 ) \lambda = \widetilde \Theta(x^{1/2}) λ = Θ ( x 1/2 ) 可以使得整体复杂度为 \tO ( x 1 / 2 ) \tO(x^{1/2}) \tO ( x 1/2 ) 。不过这里还埋了一个坑:如何在 \tO ( 1 ) \tO(1) \tO ( 1 ) 的时间内求一次 Ψ ( s ; x , λ ) \Psi(s; x, \lambda) Ψ ( s ; x , λ ) ,特别是 Ψ \Psi Ψ 里面还涉及到 ζ ( s ) \zeta(s) ζ ( s ) 。这事可不简单,可以让我再水一篇文章了 23333
[Galway] 还 argue 了一下某种意义上,他 propose 的这个 ϕ ( u ) \phi(u) ϕ ( u ) 是最优的。我没仔细看,以下是我的猜测:我们想要 ϕ ( u ) \phi(u) ϕ ( u ) 和阶梯函数比较像,才能快速算 \eqref e q : k e y \eqref{eq:key} \eqref e q : k ey 里的第二项;我们还想要 \hphi ( s ) \hphi(s) \hphi ( s ) 收敛的快,这样方便算第一项。如果我们把 ϕ ( u ) \phi(u) ϕ ( u ) 表达成 ϕ ( u ) = Φ ( ln ( u / x ) / λ ) \phi(u) = \Phi(\ln(u/x) / \lambda) ϕ ( u ) = Φ ( ln ( u / x ) / λ ) 这样的形式,其中 Φ ( ⋅ ) \Phi(\cdot) Φ ( ⋅ ) 可以是任意函数,那么 \hphi ( s ) \hphi(s) \hphi ( s ) 可以和 Φ ( ⋅ ) \Phi(\cdot) Φ ( ⋅ ) 的 Fourier 级数扯上关系([Eq 2.37, Galway]),所以我们希望 Φ \Phi Φ 和 Φ \Phi Φ 的 Fourier 级数同时快速收敛。在这个意义下,他 propose 的这个 ϕ ( u ) \phi(u) ϕ ( u ) 是使得两者同时收敛最快的函数了。
[Platt] 的积分
首先我要吐槽一下 David Platt 的 writing,看得我实在太难受了,真的是 painful。他就给你列一堆 Lemma、Theorem,中间的联系都不写,每次我都得猜他这个 Lemma 想表达什么意思,是用来解决什么问题的。他写算法就给我罗列了一堆步骤,依次算 abcde 函数,看完了整个算法,我都不知道这个算法输出的是啥,和我们关心的东西有什么联系,abcde 各自有什么意义,为什么要这么做。[LO] 我能轻松跟上 high level idea,但是 David Platt 的 paper 我连 high level idea 都跟不上。要不是他 claim 自己真的码了代码实现了算法,我早就不看了……但也有可能是他文章就不是写给我这种不懂复分析的人看的……
废话不多说,鉴于我也看不懂 [Platt] 的思路,我就直接上公式了。
我直接引用里面最核心的一个定理 [Theorem 4.7, Platt]。
[Theorem 4.7, Platt]
1 2 π i ∫ 2 − i ∞ 2 + i ∞ \hphi ( s ; x , λ ) ln ζ ( s ) d s = \hPhi ( 1 ; x , λ ) − ∑ ρ ℜ \hPhi ( ρ ; x , λ ) − log 2 + 1 2 π i ∫ − 1 − i ∞ − 1 + i ∞ \hphi ( s ; x , λ ) ln ( − ζ ( s ) ) d s . \label e q : p l a t t \begin{equation}
\begin{aligned}
\frac{1}{2 \pi i} \int_{2 - i \infty}^{2 + i \infty} \hphi(s; x, \lambda) \ln \zeta(s) \d s & = \hPhi(1; x, \lambda) - \sum_{\rho} \Re \hPhi(\rho; x, \lambda) - \log 2\\
& \hspace{4em}+ \frac{1}{2\pi i} \int_{-1 - i \infty}^{-1 + i \infty} \hphi(s; x, \lambda) \ln (-\zeta(s)) \d s.
\end{aligned}
\label{eq:platt}
\end{equation} 2 πi 1 ∫ 2 − i ∞ 2 + i ∞ \hphi ( s ; x , λ ) ln ζ ( s ) d s = \hPhi ( 1 ; x , λ ) − ρ ∑ ℜ \hPhi ( ρ ; x , λ ) − log 2 + 2 πi 1 ∫ − 1 − i ∞ − 1 + i ∞ \hphi ( s ; x , λ ) ln ( − ζ ( s )) d s . \label e q : pl a tt
其中 ρ \rho ρ 为 ζ ( s ) \zeta(s) ζ ( s ) 的所有非平凡零点,且 \hPhi \hPhi \hPhi 定义为:对于 t > 0 t > 0 t > 0 有
\hPhi ( σ + i t ; x , λ ) = − ∫ σ + i t σ + i ∞ \hphi ( s ; x , λ ) d s , \hPhi(\sigma + i t; x, \lambda) = -\int_{\sigma + it}^{\sigma + i \infty} \hphi(s; x, \lambda) \d s, \hPhi ( σ + i t ; x , λ ) = − ∫ σ + i t σ + i ∞ \hphi ( s ; x , λ ) d s ,
对于 t < 0 t < 0 t < 0 有 \hPhi ( s ˉ ; x , λ ) = \hPhi ( s ; x , λ ) ‾ \hPhi(\bar s; x, \lambda) = \overline{\hPhi(s; x, \lambda)} \hPhi ( s ˉ ; x , λ ) = \hPhi ( s ; x , λ ) 。
\hPhi \hPhi \hPhi 的准确定义你们可以自己去看 [Lemma 4.6, Platt],我没看懂他的定义(再次吐槽 writing),瞎猜了一个,跑了跑代码似乎问题不大……
Anyway 假设我们的 \hPhi \hPhi \hPhi 定义没问题,我们就可以继续了。这个定理左边就是 \eqref e q : k e y \eqref{eq:key} \eqref e q : k ey 中的积分,只不过直接把 σ \sigma σ 变成了 2 。右边最后一个积分类似于 error term,[Lemma 4.5, Platt] 给出了 error term 的 bound:
[Lemma 4.5, Platt]
∣ 1 2 π i ∫ − 1 − i ∞ − 1 + i ∞ \hphi ( s ; x , λ ) ln ( − ζ ( s ) ) ∣ ≤ e λ 2 / 2 2 π x λ ( 5 2 π + 2 λ − 1 ) . \left| \frac{1}{2 \pi i} \int_{-1 - i \infty}^{-1 + i \infty} \hphi(s; x, \lambda) \ln (-\zeta(s)) \right| \leq \frac{e^{\lambda^2 / 2} }{2 \pi x \lambda} \left( 5 \sqrt{2} \pi + 2 \lambda^{-1}\right). 2 πi 1 ∫ − 1 − i ∞ − 1 + i ∞ \hphi ( s ; x , λ ) ln ( − ζ ( s )) ≤ 2 π x λ e λ 2 /2 ( 5 2 π + 2 λ − 1 ) .
所以只要 λ = Θ ( ( x ε ) − 1 / 2 ) \lambda = \Theta((x \varepsilon)^{-1/2}) λ = Θ (( x ε ) − 1/2 ) ,这一项就能控制在 ε \varepsilon ε 。
继续看 \eqref e q : p l a t t \eqref{eq:platt} \eqref e q : pl a tt ,还有一件事需要处理:ζ ( s ) \zeta(s) ζ ( s ) 的非平凡零点有无数个,我们只能求一部分,怎么办?[Appendix A, Platt] 证明了,如果我们只考虑 ∣ ℑ ρ ∣ ≤ \tO ( λ − 1 ) |\Im \rho| \leq \tO(\lambda^{-1}) ∣ℑ ρ ∣ ≤ \tO ( λ − 1 ) 的 ρ \rho ρ ,问题也不大。我实在懒得分析 [Lemma A.4, Platt] 里的 α T 1 \alpha_{T_1} α T 1 和 N ( T 1 ) N(T_1) N ( T 1 ) 的关系了,这里就当这个差是 \tO ( 1 ) \tO(1) \tO ( 1 ) 了。这样截断误差可以被 bound 住。
另外还有一个问题:\hPhi ( s ; x , λ ) \hPhi(s; x, \lambda) \hPhi ( s ; x , λ ) 怎么求?[Section 6, Platt] 给出的方法很简单:泰勒展开。注意到,对于任意一个 ℜ s 0 ≠ 0 \Re s_0 \neq 0 ℜ s 0 = 0 的点 s 0 s_0 s 0 ,先在 s 0 s_0 s 0 处化简([Lemma 6.1, Platt]):
\hphi ( s 0 + i h ; x , λ ) = \hphi ( s 0 ; x , λ ) exp ( i h ( s 0 λ 2 + ln x ) ) exp ( − λ 2 h 2 / 2 ) 1 + i h s 0 . \hphi(s_0 + ih; x, \lambda) = \hphi(s_0; x, \lambda) \exp\left( ih (s_0 \lambda^2 + \ln x) \right) \frac{\exp(-\lambda^2 h^2/2)}{1 + \frac{ih}{s_0}}. \hphi ( s 0 + ih ; x , λ ) = \hphi ( s 0 ; x , λ ) exp ( ih ( s 0 λ 2 + ln x ) ) 1 + s 0 ih exp ( − λ 2 h 2 /2 ) .
注意到第一项和 h h h 无关,第二项可以认为是 exp ( c 1 h ) \exp(c_1h) exp ( c 1 h ) 其中 c 1 = i ( s 0 λ 2 + ln x ) c_1 = i(s_0 \lambda^2 + \ln x) c 1 = i ( s 0 λ 2 + ln x ) 。不妨设 f ( h ; s 0 , λ ) = exp ( − λ 2 h 2 / 2 ) ( 1 + i h s 0 ) − 1 f(h; s_0, \lambda) = \exp(-\lambda^2 h^2 / 2) \left( 1 + \frac{ih}{s_0} \right)^{-1} f ( h ; s 0 , λ ) = exp ( − λ 2 h 2 /2 ) ( 1 + s 0 ih ) − 1 ,通过简单的分步积分,我们有
∫ exp ( c 1 h ) f ( h ; s 0 , λ ) d h = exp ( c 1 h ) c 1 ∑ k = 0 K − 1 ( − c 1 ) − k f ( k ) ( h ; s 0 , λ ) + ( − c 1 ) − K ∫ exp ( c 1 h ) f ( K ) ( h ; s 0 , λ ) d h . \int \exp(c_1h) f(h; s_0, \lambda) \d h = \frac{\exp(c_1 h)}{c_1} \sum_{k=0}^{K-1} (-c_1)^{-k} f^{(k)}(h; s_0, \lambda) + (-c_1)^{-K} \int \exp(c_1 h) f^{(K)}(h; s_0, \lambda) \d h. ∫ exp ( c 1 h ) f ( h ; s 0 , λ ) d h = c 1 exp ( c 1 h ) k = 0 ∑ K − 1 ( − c 1 ) − k f ( k ) ( h ; s 0 , λ ) + ( − c 1 ) − K ∫ exp ( c 1 h ) f ( K ) ( h ; s 0 , λ ) d h .
这样我们只要 bound 住 max ∣ f ( K ) ( h ; s 0 , λ ) ∣ \max |f^{(K)}(h; s_0, \lambda)| max ∣ f ( K ) ( h ; s 0 , λ ) ∣ 即可。 h h h 太大的话不太好 bound,所以我们希望 h h h 比较小。[Platt] 证明了,如果 λ h < 1 \lambda h < 1 λh < 1 且 ∣ h ∣ < ∣ s 0 ∣ |h| < |s_0| ∣ h ∣ < ∣ s 0 ∣ ,那么 max ∣ f ( K ) ( h ; s 0 , λ ) ∣ \max |f^{(K)} (h; s_0, \lambda)| max ∣ f ( K ) ( h ; s 0 , λ ) ∣ 是可以被 bound 的。所以我们做法是:把整个积分区间 [ t , ∞ ) [t, \infty) [ t , ∞ ) 变成若干个不相交的小区间 [ t 0 , t 1 ) ∪ [ t 1 , t 2 ) ∪ ⋯ [t_0,t _1) \cup [t_1, t_2) \cup \cdots [ t 0 , t 1 ) ∪ [ t 1 , t 2 ) ∪ ⋯ ,每个区间内 h h h 最大是 t j − t j − 1 t_j - t_{j-1} t j − t j − 1 ,每个区间内在 σ + i t j − 1 \sigma + i t_{j-1} σ + i t j − 1 处展开,这样每个区间内都能保证 ∣ λ h ∣ < 1 |\lambda h| < 1 ∣ λh ∣ < 1 和 ∣ h ∣ ≤ ∣ s 0 ∣ |h| \leq |s_0| ∣ h ∣ ≤ ∣ s 0 ∣ ,而且只需要 O ( log λ − 1 ) O(\log \lambda^{-1}) O ( log λ − 1 ) 个区间就能求出 [ t , λ − 1 ] [t, \lambda^{-1}] [ t , λ − 1 ] 的积分,再往上我们就直接舍去了……[Platt] 也没说这样做会引入多少误差……所以算一次 \hPhi ( s ; x , λ ) \hPhi(s; x, \lambda) \hPhi ( s ; x , λ ) 的时间可以控制在 \tO ( 1 ) \tO(1) \tO ( 1 ) 。
(聪明的同学可以去看看 [Section 6, Platt],看是我理解不行还是他写的不行 →_→ 不长,只有一页,notation 都是一样的。)
总结一下 [Platt] 的方法:
[Platt] 提出了一个新的求 \eqref e q : k e y \eqref{eq:key} \eqref e q : k ey 中积分的方法,第二项暂不考虑,可以使用其余的算法;
[Platt] 用 \eqref e q : p l a t t \eqref{eq:platt} \eqref e q : pl a tt 来求积分,最后一项误差项舍去;
在 \eqref e q : p l a t t \eqref{eq:platt} \eqref e q : pl a tt 中,我们需要计算 \hPhi \hPhi \hPhi ,算法上文给出了;
未解决的问题:如何枚举出所有虚部不超过 T T T 的 ζ ( s ) \zeta(s) ζ ( s ) 的非平凡零点?而且为了控制误差,每个零点还得非常精确……
[FKBJ] 和 [Büthe]
看起来思路和 [LO] 不太一样……虽然还是看不懂,但是 [FKBJ] 上是数学上的看不懂,reference 了太多东西一下消化不了;David Platt 的是逻辑上的看不懂,上一段还是活蹦乱跳的一头猪,下一段怎么就变成了美味的小炒肉了呢?
Anyway 这两篇 paper 我就先鸽了,有时间再看 →_→
小结
这篇文章主要介绍了 [LO] 的思路及其设计的 ϕ ( u ) \phi(u) ϕ ( u ) ,以及 [Galway] 和 [Platt] 对其思路的改进。中间还有很多坑没填,例如参数具体该怎么选,\tO \tO \tO 里到底省略了多少个 log \log log (手动 doge),以及最重要的:ζ ( s ) \zeta(s) ζ ( s ) 怎么求?无论是 [LO], [Galway] 还是 [Platt],里面都需要疯狂 evaluate ζ ( s ) \zeta(s) ζ ( s ) ,我都是假定 evaluation 可以在 \tO ( 1 ) \tO(1) \tO ( 1 ) 内搞定。但是具体怎么搞,这是一件非常不显然的事。而且,这几个算法都需要对 ζ ( s ) \zeta(s) ζ ( s ) 的 evaluation 有精度上的要求,下一篇文章,我就准备来说说,我 survey 到的几种求 ζ ( s ) \zeta(s) ζ ( s ) 的方法。
另外,虽然理论上时间复杂度 \tO ( x 1 / 2 ) \tO(x^{1/2}) \tO ( x 1/2 ) 比组合算法(我知道最好的是这篇 ,复杂度 \tO ( x 2 / 3 ) \tO(x^{2/3}) \tO ( x 2/3 ) )优秀,但是实际跑起来嘛,怕不是被吊打(doge)……在 [Platt] 中有这么一段话:
[Platt] …Assuming run time asymptotic to O ( x 2 / 3 ) O(x^{2/3}) O ( x 2/3 ) and O ( x 1 / 2 ) O(x^{1/2}) O ( x 1/2 ) for the combinatorial and analytic algorithms respectively, the crossover at which this implementation of the analytic algorithm would start to beat the combinatorial method would be in the region of x = 4 ⋅ 10 31 x = 4 \cdot 10^{31} x = 4 ⋅ 1 0 31 .
但是现在我们也只算到了 π ( 10 26 ) \pi(10^{26}) π ( 1 0 26 ) ……
有兴趣的朋友可以看一下 StackExchange 上这个问题 ,DanaJ 的回答是比较全的了。
References
[LO] : Lagarias and Odlyzko, “Computing π ( x ) \pi(x) π ( x ) : an analytic method.”
[Galway] : William Floyd Galway, “Analytic Computation of the Prime-Counting Function”,
[FKBJ] : Franke et al., “A Practical Analytic Method for Calculating π ( x ) \pi (x) π ( x ) .”
[Büthe] : Büthe, “An Improved Analytic Method for Calculating π ( x ) \pi(x) π ( x ) .”
[Platt] : Platt, “Computing π ( x ) \pi(x) π ( x ) Analytically.”