貝利 波爾溫 普勞夫公式（BBP 公式）提供了一個計算圓周率 π 的第 n 位二進位制數的。這個求和公式是在 1995 年由西蒙普勞夫提出的，並以公佈這個公式的論文作者大衛貝利、和普勞夫的名字命名。在論文發表之前，普勞夫已將此公式在他的網站上公佈。這個公式是： pi sum_k 0inftyleft frac 116k left frac 48k 1 frac 28k 4 frac 18k 5 frac 18k 6 right right 這個公式的發現曾震驚學界。數百年來，求出 π 的第 n 位小數而不求出它的前 n1 位曾被認為是不可能的。 自從這個發現以來，發現了更多的無理數常數的類似公式，它們都有一個類似的形式： alpha sum_k 0inftyleft frac 1bk frac p kq k right 其中 α 是目標常數，p 和 q 是整係數多項式，b 2 是整數的數制。 這種形式的公式被稱為 BBP 式公式（BBPtype formulas）。由特定的 pq 和 b 可組合出一些著名的常數。但至今尚未找出一種系統的演算法來尋找合適的組合，而已知的公式多是透過得出的。 特例 一個已經得出很多解的 BBP 式的特例是： P sbmA sum_k0inftyleft frac 1bk sum_j1mfrac a_jmkjs right 其中 s b 和 m 是整數，A a_1 a_2 dots a_m 是一個整數向量。 使用 P 函式可得到一些解法的省略記法。 已知的 BBP 式 在 BBP 公式發現之前，就已經有些最簡單的此類公式廣為所知。他們使用 P 函式的省略記法如下： begin align lnfrac 910 frac 110 frac 1200 frac 13 000 frac 140 000 frac 1500 000 cdots sum_k1infty frac 110k cdot k frac 110 sum_k0inftyleft frac 110k left frac 1k1 right right frac 110 Pleft 1 10 1 1 right end align begin align ln 2 frac 12 frac 12 cdot 22 frac 13 cdot 23 frac 14 cdot 24 frac 15 cdot 25 cdots sum_k1inftyfrac 12k cdot k frac 12 sum_k0inftyleft frac 12k left frac 1k 1 right right frac 12 Pleft 1 2 1 1 right end align 普勞夫也對這種形式的反正切函式的級數展開感興趣（P 記法還可以泛化為 b 不是整數的情形） begin align arctanfrac 1b frac 1b frac 1b3 3 frac 1b5 5 frac 1b7 7 frac 1b9 9 cdots sum_k1inftyleft frac 1bk frac sinfrac kpi2 k right frac 1b sum_k0inftyleft frac 1b4k left frac 14k1 frac 14k3 right right frac 1b Pleft 1 b4 4 1 0 1 0 right end align 尋找新的等式 使用上述 P 函式，令 s 1 m 1 可得出已知的 π 的最簡單公式。很多已知的公式是令 b 是 2 或 3 的冪，m 是 2 的冪或者其他多因子的值，並令向量 A 等於零。在計算了一些類似的和之後，這類發現引發了使用計算機搜尋類似線性組合的嘗試。搜尋程式為每個引數，s b m 分別選擇一個定義域，然後求和並檢查值，並使用，例如的 PSLQ 演算法，來找到一個向量 A 使得這些中間值可以加在一起得到一個著名的常數（A 也可能是零）。 π 的 BBP 公式 原始的 BBP π 求和公式是在 1995 年由 Plouffe 使用發現的。它同樣可由上述 P 函式表示： begin alignpi sum_k 0inftyleft frac 116k left frac 48k 1 frac 28k 4 frac 18k 5 frac 18k 6 right right Pleft 1 16 8 4 0 0 2 1 1 0 0 right end align 這個公式也可以使用下述兩個多項式的商來表示： pi sum_k 0inftyleft frac 116k left frac 120k2 151k 47512k4 1024k3 712k2 194k 15 right right 這個等式可以用一個較為簡單的方式嚴格證明。 π 的 BBP 位抽取演算法 這個公式給出一個抽取 π 的十六進位制位數值的演算法。首先我們需要將這個公式化為： pi 4 sum_k 0infty frac 116k8k1 2 sum_k 0infty frac 116k8k4 sum_k 0infty frac 116k8k5 sum_k 0infty frac 116k8k6。 在使用此公式實現一個 spigot 演算法之前，還需做一些改動。我們想要找出 π 在十六進位制下的第 n 位，所以首先我們需要將該求和序列拆為 n 之前和 n 之後兩部分。對於前述公式的第一項而言， sum_k 0infty frac 116k8k1 sum_k 0n frac 116k8k1 sum_k n 1infty frac 116k8k1。 我們再將等式兩邊乘以 16 n，使得小數點恰好落在第 n 位。 sum_k 0infty frac 16nk8k1 sum_k 0n frac 16nk8k1 sum_k n 1infty frac 16nk8k1。 由於我們關心的是小數部分，我們觀察這個式子的兩項，會發現僅有第一項能夠出現整數部分，而第二項不會出現整數部分。因為第二項中 k n 第二項中的分子一定小於分母。由此我們需要一個使用一種技巧來從第一項中除去整數。那就是要 mod 8k 1。於是原式第一項的小數部分的公式就是： sum_k 0n frac 16nk mod 8k18k1 sum_k n 1infty frac 16nk8k1。 注意模運算將保證只有小數部分的和會被保留下來。想要快速有效的計算 16 n k mod 8k 1 可使用。 對公式的其餘項使用相同的處理辦法，並根據原式求出最後的結果。 4 Sigma_1 2 Sigma_2 Sigma_3 Sigma_4 由於僅有小數部分是準確的，想要抽取特定的小數位需要去掉最終結果的整數部分，並乘 16 來跳過這一個 16 進位制位（理論上說在精度範圍內這一位下面的幾個小數位仍然是準確的）。 這個過程類似於長整數乘法，但只需對一些中間列進行求和。由於有些進位沒有被計算，而我們只關心最重要的位，計算機通常對很多位（32 或者 64）同時進行計算。存在一種極低的可能性，就是當極端情況出現，可能會將一個小數（比如 1）加到 999999999999999 上，然後這個錯誤將會影響最重要的那個位。但在最終計算結果的時候，這種情況如果要發生，那也會是顯而易見的。 這個演算法被廣為應用並有多種程式實現。 使用 BBP 演算法計算 π 的好處 這個演算法無需自定義一種包含數千甚至數億數字的 大數 資料型別。這種演算法計算第 n 位而無需計算前 n1 位，因此可以採用簡單有效的資料型別。 這種演算法對於計算 π 的第 n 位（或者第 n 位的附近幾位）是最快最有效的，但使用大資料型別來計算 π 的前 n 位的演算法仍然比這個演算法更快。 推廣 DJ 布拉德赫斯特提出了一種 BBP 演算法的泛化形式。DJ Broadhurst Polylogarithmic ladders hypergeometric series and the ten millionth digits of ζ3 and ζ5 1998 arXiv mathCA9803067 這種形式可以用於在接近線性時間和對數空間下求很多其他的常數。例如卡塔蘭常數，pi3，log32，阿培裡常數 zeta 3（其中 zeta x 是黎曼 ζ 函式），pi4，log42，log52，zeta 5，還有很多 pi 和 log2 的不同冪次。這些結果主要是使用多重對數函式得到的。 參考資料 外部連結 Cooks Class Contains Pi Category 圓周率演算法