**图姆-库克算法**（英語：），有时也被称为**Toom-3算法**，由安德鲁·图姆命名，他提出了这种算法的基本原理，而斯蒂芬·库克则最先用简洁的形式描述并改进了这种算法，将其作为大整数的乘法算法。

图姆-库克算法的原理是：对于给定的两个大整数a和b ，将a和b分成k个较小的部分，每个部分的长度为l ，并对这些部分执行运算。随着k的增长，可以组合许多乘法子运算，从而降低算法的整体复杂度，然后再次使用图姆-库克算法递归计算乘法子运算，依此类推。Toom-3和图姆-库克两个术语有时会被错误的混用，但事实上Toom-3只是图姆-库克算法在{\displaystyle k=3}时的特例。

Toom-3将9次乘法降低至仅需5次，使其在{\displaystyle \Theta (n^{\log(5)/\log(3)})\approx \Theta (n^{1.46})}的时间里运行。通常，Toom-k的时间复杂度为{\displaystyle \Theta (c(k)n^{e})} ，其中{\displaystyle e=\log(2k-1)/\log(k)}。{\displaystyle n^{e}}是在乘法子运算上花费的时间，c则是花费在对小常数进行的加法和乘法运算上的时间。著名的Karatsuba算法实际上是图姆-库克算法的特例，在Karatsuba算法中，原始乘数被拆分成两个较小的数，而原本的4次乘法运算缩减为3次，使之在{\displaystyle \Theta (n^{\log(3)/\log(2)})\approx \Theta (n^{1.58})}的时间内完成运算。Toom-1等价于普通的长乘法，具有\Theta (n^{2})的复杂度。

尽管可以通过增加k来使指数e任意接近1，但函数c增长速度非常快。混合级别图姆-库克算法的增长率直到2005年仍然是一个广为研究的开放性问题。根据高德纳所描述算法的一种实现，其复杂度可降低至{\displaystyle \Theta (n2^{\sqrt {2\log n}}\log n)}。

由于工作时的开销，当乘数包括较小的数时，图姆-库克算法会比长乘法更慢，因此它适用于中等规模的乘法。对于更大规模的数据，则有渐进更快的史恩哈格·施特拉森算法（复杂度为{\displaystyle \Theta (n\log n\log \log n)}）。

这一算法由安德鲁·图姆1963年首次描述，并在斯蒂芬·库克1966年的博士学位论文中得到渐进等效的改进。

细节
--

本节将讨论对于任意给定 k 值， Toom-k究竟是如何运作的，这是马可·波德拉托对图姆-库克多项式乘法的简化描述。这个算法包括五个主要步骤：

1. 拆分
2. 求值
3. 点乘
4. 插值
5. 重组

在典型的大整数实现中，每个整数都表示为b进制的数字序列（b通常取较大的数）。在此示例中，{\displaystyle b=10000}，因此每个数字序列对应一组十进制数字（在实践中，b通常取2的幂）。设要相乘的两个大整数m 、 n分别是：

|  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- |
| m | = | 12 | {\displaystyle 3456} | {\displaystyle 7890} | {\displaystyle 1234} | {\displaystyle 5678} | {\displaystyle 9012} |
| n | = | 9 | {\displaystyle 8765} | {\displaystyle 4321} | {\displaystyle 9876} | {\displaystyle 5432} | {\displaystyle 1098} |

这对乘数实际上比图姆-库克算法通常要处理的数据小很多，在此使用学校里学习的普通乘法可能会更快，但这个示例仍有助于说明图姆-库克算法的工作原理。

### 拆分

第一步是选择基数{\displaystyle B=b^{i}}，使得两个数字m和n可以分成k段大小不超过B的数字（例如在Toom-3算法中，拆分段数应至多为3）。i常常根据如下公式求得：

{\displaystyle i=\max \left\{\left\lfloor {\frac {\left\lfloor \log \_{b}m\right\rfloor }{k}}\right\rfloor ,\left\lfloor {\frac {\left\lfloor \log \_{b}n\right\rfloor }{k}}\right\rfloor \right\}+1.}
我们的示例将演绎Toom-3算法的运算过程，因此确定{\displaystyle B=b^{2}=10^{8}}，接着把m和n拆分为3段，即m\_{i}和n\_i，则有：

{\displaystyle {\begin{aligned}m\_{2}&{}=123456\\m\_{1}&{}=78901234\\m\_{0}&{}=56789012\\n\_{2}&{}=98765\\n\_{1}&{}=43219876\\n\_{0}&{}=54321098\end{aligned}}}
然后，我们把这些数作为{\displaystyle (k-1)}阶多项式p和q的系数，with the property that {\displaystyle p(B)=m} and {\displaystyle q(B)=n}：

{\displaystyle p(x)=m\_{2}x^{2}+m\_{1}x+m\_{0}=123456x^{2}+78901234x+56789012\,}
{\displaystyle q(x)=n\_{2}x^{2}+n\_{1}x+n\_{0}=98765x^{2}+43219876x+54321098\,}
定义这些多项式的目的在于：如果计算出它们的乘积{\displaystyle r(x)=p(x)q(x)}，我们的答案就会是{\displaystyle r(B)=m\times n}。

如果乘数位数不同，对于m、n分别取不同的k值十分有用，我们将其称为k\_{m}和k\_n。例如，算法"Toom-2.5"是指{\displaystyle k\_{m}=3}且{\displaystyle k\_{n}=2}时的图姆-库克算法。这时{\displaystyle B=b^{i}}中的i通常被确定为：

{\displaystyle i=\max \left\{\left\lfloor {\frac {\left\lceil \log \_{b}m\right\rceil }{k\_{m}}}\right\rfloor ,\left\lfloor {\frac {\left\lceil \log \_{b}n\right\rceil }{k\_{n}}}\right\rfloor \right\}.}
### 求值

图姆-库克算法包含一种常用的方法，来计算多项式p(x)、q(x)的乘积。注意，次数为d的多项式可以通过{\displaystyle d+1}个空间中的点确定（例如一次多项式是一条直线，它由两个点确定）。这个方法是在各个点上求值{\displaystyle p(\cdot )}和{\displaystyle q(\cdot )}，然后把这些点相乘以获得多项式乘积上的点，最后进行插值以找到其系数。

由于{\displaystyle \deg(pq)=\deg(p)+\deg(q)}，我们将需要{\displaystyle \deg(p)+\deg(q)+1=k\_{m}+k\_{n}-1}个点来确定最终结果d。在Toom-3的情况下，{\displaystyle d=5}。无论选择什么点，该算法都可以工作（有一些小例外，请参阅插值中的矩阵可逆性约束），但为了简化算法，最好选择较小的整数值，例如{\displaystyle 0} 、1 、-1和{\displaystyle -2}。

无穷大是一个常被使用的不寻常点，其记作\infty或{\displaystyle 1/0}。求多项式p在无穷大时的值，实际上意味着令{\displaystyle p(x)/x^{\deg p}}的上限为x 且趋向无穷大。因此，{\displaystyle p(\infty )}总是其高阶系数的值（m\_{2}是上文中的系数）。

在我们的Toom-3示例中，我们将使用点{\displaystyle 0} 、 1 、 -1 、 {\displaystyle -2}和\infty，这些选择简化了求值，如下式子：

{\displaystyle {\begin{array}{lrlrl}p(0)&=&m\_{0}+m\_{1}(0)+m\_{2}(0)^{2}&=&m\_{0}\\p(1)&=&m\_{0}+m\_{1}(1)+m\_{2}(1)^{2}&=&m\_{0}+m\_{1}+m\_{2}\\p(-1)&=&m\_{0}+m\_{1}(-1)+m\_{2}(-1)^{2}&=&m\_{0}-m\_{1}+m\_{2}\\p(-2)&=&m\_{0}+m\_{1}(-2)+m\_{2}(-2)^{2}&=&m\_{0}-2m\_{1}+4m\_{2}\\p(\infty )&=&m\_{2}&&\end{array}}}
对于q也是如此。在示例中，我们得到的值是：

|  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- |
| {\displaystyle p(0)} | = | m\_{0} | = | {\displaystyle 56789012} | = | {\displaystyle 56789012} |
| {\displaystyle p(1)} | = | {\displaystyle m\_{0}+m\_{1}+m\_{2}} | = | {\displaystyle 56789012+78901234+123456} | = | {\displaystyle 135813702} |
| {\displaystyle p(-1)} | = | {\displaystyle m\_{0}-m\_{1}+m\_{2}} | = | {\displaystyle 56789012-78901234+123456} | = | {\displaystyle -21988766} |
| {\displaystyle p(-2)} | = | {\displaystyle m\_{0}-2m\_{1}+4m\_{2}} | = | {\displaystyle 56789012-2\times 78901234+4\times 123456} | = | {\displaystyle -100519632} |
| {\displaystyle p(\infty )} | = | m\_{2} | = | {\displaystyle 123456} | = | {\displaystyle 123456} |
| {\displaystyle q(0)} | = | n\_0 | = | {\displaystyle 54321098} | = | {\displaystyle 54321098} |
| {\displaystyle q(1)} | = | {\displaystyle n\_{0}+n\_{1}+n\_{2}} | = | {\displaystyle 54321098+43219876+98765} | = | {\displaystyle 97639739} |
| {\displaystyle q(-1)} | = | {\displaystyle n\_{0}-n\_{1}+n\_{2}} | = | {\displaystyle 54321098-43219876+98765} | = | {\displaystyle 11199987} |
| {\displaystyle q(-2)} | = | {\displaystyle n\_{0}-2n\_{1}+4n\_{2}} | = | {\displaystyle 54321098-2\times 43219876+4\times 98765} | = | {\displaystyle -31723594} |
| {\displaystyle q(\infty )} | = | n\_{2} | = | {\displaystyle 98765} | = | {\displaystyle 98765}. |

如上所示，这些值可以包括负值。

为了下文的阐述，把这个求值过程视作矩阵向量乘法较为有用。其中，矩阵的每一行都包含求值点之一的幂，且向量包含多项式的系数：

{\displaystyle \left({\begin{matrix}p(0)\\p(1)\\p(-1)\\p(-2)\\p(\infty )\end{matrix}}\right)=\left({\begin{matrix}0^{0}&0^{1}&0^{2}\\1^{0}&1^{1}&1^{2}\\(-1)^{0}&(-1)^{1}&(-1)^{2}\\(-2)^{0}&(-2)^{1}&(-2)^{2}\\0&0&1\end{matrix}}\right)\left({\begin{matrix}m\_{0}\\m\_{1}\\m\_{2}\end{matrix}}\right)=\left({\begin{matrix}1&0&0\\1&1&1\\1&-1&1\\1&-2&4\\0&0&1\end{matrix}}\right)\left({\begin{matrix}m\_{0}\\m\_{1}\\m\_{2}\end{matrix}}\right).}
The dimensions of the matrix are  d by  k\_{m} for  p and  d by  k\_n for  q。除最后一列的 1 以外，无穷大的行总是{\displaystyle 0}。

#### 更快的求值

与上述公式相比，多点求值可能会减少基本运算（加、减）的次数，更快获得需要的结果。波德拉托 为Toom-3给出的序列如下所示，它是在运行示例的第一个操作数（多项式p上进行的）：

|  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- |
| p\_{0} | \leftarrow  | {\displaystyle m\_{0}+m\_{2}} | = | {\displaystyle 56789012+123456} | = | {\displaystyle 56912468} |
| {\displaystyle p(0)} | = | m\_{0} | = | {\displaystyle 56789012} | = | **解析失败 (SVG（MathML可通过浏览器插件启用）：从服务器"http://localhost:6011/zh.wikipedia.org/v1/"返回无效的响应（"Math extension cannot connect to Restbase."）：): {\displaystyle 56789012}**
 |
| {\displaystyle p(1)} | = | {\displaystyle p\_{0}+m\_{1}} | = | {\displaystyle 56912468+78901234} | = | {\displaystyle 135813702} |
| {\displaystyle p(-1)} | = | {\displaystyle p\_{0}-m\_{1}} | = | {\displaystyle 56912468-78901234} | = | {\displaystyle -21988766} |
| {\displaystyle p(-2)} | = | {\displaystyle (p(-1)+m\_{2})\times 2-m\_{0}} | = | {\displaystyle (-21988766+123456)\times 2-56789012} | = | {\displaystyle -100519632} |
| {\displaystyle p(\infty )} | = | m\_{2} | = | {\displaystyle 123456} | = | {\displaystyle 123456} |

此序列需要进行五次加/减运算，比简单求值少一次，同时节省了在计算{\displaystyle p(-2)}时乘以4的开销。

### 点乘

与对多项式{\displaystyle p(\cdot )}和{\displaystyle q(\cdot )}所进行的乘法不同，将{\displaystyle p(a)} 和{\displaystyle q(a)}被求出的值相乘仅涉及整数相乘——这是原始问题的较小实例。我们递归调用我们的乘法过程来使每对已求值的点相乘。在实践中，随着乘数减小，算法将逐渐过渡为教科书长乘法。令r为多项式乘积，我们将得到：

|  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- |
| {\displaystyle r(0)} | = | {\displaystyle p(0)q(0)} | = | {\displaystyle 56789012\times 54321098} | = | {\displaystyle 3084841486175176} |
| {\displaystyle r(1)} | = | {\displaystyle p(1)q(1)} | = | {\displaystyle 135813702\times 97639739} | = | {\displaystyle 13260814415903778} |
| {\displaystyle r(-1)} | = | {\displaystyle p(-1)q(-1)} | = | {\displaystyle -21988766\times 11199987} | = | {\displaystyle -246273893346042} |
| {\displaystyle r(-2)} | = | {\displaystyle p(-2)q(-2)} | = | {\displaystyle -100519632\times -31723594} | = | {\displaystyle 3188843994597408} |
| {\displaystyle r(\infty )} | = | {\displaystyle p(\infty )q(\infty )} | = | {\displaystyle 123456\times 98765} | = | {\displaystyle 12193131840} |

如上所示，这些值也可以是负数。对于足够大的数值，这里是最昂贵的、唯一与m、n大小不成线性关系的步骤。

### 插值

这一步最为复杂。与求值相反：给定多项式乘积{\displaystyle r(\cdot )}上的d点，我们需要确定其系数。换句话说，我们要在右侧求解其向量的矩阵方程：

{\displaystyle {\begin{aligned}\left({\begin{matrix}r(0)\\r(1)\\r(-1)\\r(-2)\\r(\infty )\end{matrix}}\right)&{}=\left({\begin{matrix}0^{0}&0^{1}&0^{2}&0^{3}&0^{4}\\1^{0}&1^{1}&1^{2}&1^{3}&1^{4}\\(-1)^{0}&(-1)^{1}&(-1)^{2}&(-1)^{3}&(-1)^{4}\\(-2)^{0}&(-2)^{1}&(-2)^{2}&(-2)^{3}&(-2)^{4}\\0&0&0&0&1\end{matrix}}\right)\left({\begin{matrix}r\_{0}\\r\_{1}\\r\_{2}\\r\_{3}\\r\_{4}\end{matrix}}\right)\\&{}=\left({\begin{matrix}1&0&0&0&0\\1&1&1&1&1\\1&-1&1&-1&1\\1&-2&4&-8&16\\0&0&0&0&1\end{matrix}}\right)\left({\begin{matrix}r\_{0}\\r\_{1}\\r\_{2}\\r\_{3}\\r\_{4}\end{matrix}}\right).\end{aligned}}}
此矩阵的构造与求值步骤中的矩阵相同，不过它是{\displaystyle d\times d}的。我们可以用高斯消元法来求出方程的解，但这样非常昂贵。根据以下事实：只要求值点的选择合适，这个矩阵就是可逆的。因此我们有：

{\displaystyle {\begin{aligned}\left({\begin{matrix}r\_{0}\\r\_{1}\\r\_{2}\\r\_{3}\\r\_{4}\end{matrix}}\right)&{}=\left({\begin{matrix}1&0&0&0&0\\1&1&1&1&1\\1&-1&1&-1&1\\1&-2&4&-8&16\\0&0&0&0&1\end{matrix}}\right)^{-1}\left({\begin{matrix}r(0)\\r(1)\\r(-1)\\r(-2)\\r(\infty )\end{matrix}}\right)\\&{}=\left({\begin{matrix}1&0&0&0&0\\{\tfrac {1}{2}}&{\tfrac {1}{3}}&-1&{\tfrac {1}{6}}&-2\\-1&{\tfrac {1}{2}}&{\tfrac {1}{2}}&0&-1\\-{\tfrac {1}{2}}&{\tfrac {1}{6}}&{\tfrac {1}{2}}&-{\tfrac {1}{6}}&2\\0&0&0&0&1\end{matrix}}\right)\left({\begin{matrix}r(0)\\r(1)\\r(-1)\\r(-2)\\r(\infty )\end{matrix}}\right).\end{aligned}}}
接下来即要求得该矩阵的向量积。尽管矩阵中包含分数，但所得的系数却是整数——因此所有这些都可以在整数算术中完成，仅仅是与小常数进行加减乘除。图姆-库克设计时面临的一个困难挑战就是找到有效的操作顺序来计算该乘积。下面是波德拉托为Toom-3找到的一组顺序，通过上面的示例演示：

|  |  |  |  |  |
| --- | --- | --- | --- | --- |
| r\_{0} | \leftarrow  | {\displaystyle r(0)} | = | {\displaystyle 3084841486175176} |
| {\displaystyle r\_{4}} | \leftarrow  | {\displaystyle r(\infty )} | = | {\displaystyle 12193131840} |
| {\displaystyle r\_{3}} | \leftarrow  | {\displaystyle (r(-2)-r(1))/3} | = | {\displaystyle (3188843994597408-13260814415903778)/3} |
|  |  |  | = | {\displaystyle -3357323473768790} |
| r\_{1} | \leftarrow  | {\displaystyle (r(1)-r(-1))/2} | = | {\displaystyle (13260814415903778-(-246273893346042))/2} |
|  |  |  | = | {\displaystyle 6753544154624910} |
| r\_{2} | \leftarrow  | {\displaystyle r(-1)-r(0)} | = | {\displaystyle -246273893346042-3084841486175176} |
|  |  |  | = | {\displaystyle -3331115379521218} |
| {\displaystyle r\_{3}} | \leftarrow  | {\displaystyle (r\_{2}-r\_{3})/2+2r(\infty )} | = | {\displaystyle (-3331115379521218-(-3357323473768790))/2+2\times 12193131840} |
|  |  |  | = | {\displaystyle 13128433387466} |
| r\_{2} | \leftarrow  | {\displaystyle r\_{2}+r\_{1}-r\_{4}} | = | {\displaystyle -3331115379521218+6753544154624910-12193131840} |
|  |  |  | = | {\displaystyle 3422416581971852} |
| r\_{1} | \leftarrow  | {\displaystyle r\_{1}-r\_{3}} | = | {\displaystyle 6753544154624910-13128433387466} |
|  |  |  | = | {\displaystyle 6740415721237444.} |

现在我们知道多项式乘积r：

{\displaystyle {\begin{array}{rrr}r(x)=&{}&3084841486175176\\&+&6740415721237444x\\&+&3422416581971852x^{2}\\&+&13128433387466x^{3}\\&+&12193131840x^{4}\end{array}}}
如果我们使用不同的k\_{m}、k\_n或求值点，矩阵和我们的插值将改变。但是它不依赖于输入，因此可以对任何给定的参数集进行硬编码。

### 重组

最后，我们将求出{\displaystyle r(B)}的值以获得最终结果。很显然，由于B是b的幂，因此对B的幂的乘法同样也可以应用于所有以b为底数的数值。在这个示例中，{\displaystyle b=10^{4}}且{\displaystyle B=b^{2}=10^{8}}。

|  |  |  |  |  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
|  |  |  |  |  |  |  |  | {\displaystyle 3084} | {\displaystyle 8414} | {\displaystyle 8617} | {\displaystyle 5176} |
|  |  |  |  |  |  | {\displaystyle 6740} | {\displaystyle 4157} | {\displaystyle 2123} | {\displaystyle 7444} |  |  |
|  |  |  |  | {\displaystyle 3422} | {\displaystyle 4165} | {\displaystyle 8197} | {\displaystyle 1852} |  |  |  |  |
|  |  | 13 | {\displaystyle 1284} | {\displaystyle 3338} | {\displaystyle 7466} |  |  |  |  |  |  |
| + | {\displaystyle 121} | {\displaystyle 9313} | {\displaystyle 1840} |  |  |  |  |  |  |  |  |
| 

---

 |
|  | {\displaystyle 121} | {\displaystyle 9326} | {\displaystyle 3124} | {\displaystyle 6761} | {\displaystyle 1632} | {\displaystyle 4937} | {\displaystyle 6009} | {\displaystyle 5208} | {\displaystyle 5858} | {\displaystyle 8617} | {\displaystyle 5176} |

这实际上是{\displaystyle 1234567890123456789012}与{\displaystyle 987654321987654321098}的乘积。

k在其他取值时的插值矩阵
------------

这里我们给出了几种k\_{m}和k\_n取常见较小值的插值矩阵。

### Toom-1

Toom-1（{\displaystyle k\_{m}=k\_{n}=1}）需要一个求值点，这里选择{\displaystyle 0}。它退化为长乘法，并且使用恒等矩阵的插值矩阵。

{\displaystyle \left({\begin{matrix}1\end{matrix}}\right)^{-1}=\left({\begin{matrix}1\end{matrix}}\right).}
### Toom-1.5

Toom-1.5（{\displaystyle k\_{m}=2,k\_{n}=1}）需要两个求值点，这里选择{\displaystyle 0}和\infty，且其插值矩阵就是恒等矩阵。

{\displaystyle \left({\begin{matrix}1&0\\0&1\end{matrix}}\right)^{-1}=\left({\begin{matrix}1&0\\0&1\end{matrix}}\right).}
这里亦退化为长乘法：一个因数的两个系数都乘以另一个因数的两个系数。

### Toom-2

Toom-2（{\displaystyle k\_{m}=2,k\_{n}=2}）需要三个求值点，这里选择{\displaystyle 0}、1和\infty。它与 Karatsuba 算法相同，其插值矩阵为：

{\displaystyle \left({\begin{matrix}1&0&0\\1&1&1\\0&0&1\end{matrix}}\right)^{-1}=\left({\begin{matrix}1&0&0\\-1&1&-1\\0&0&1\end{matrix}}\right).}
### Toom-2.5

Toom-2.5（{\displaystyle k\_{m}=3,k\_{n}=2}）需要四个求值点，这里选择{\displaystyle 0}、1、-1和\infty。它的插值矩阵为：

{\displaystyle \left({\begin{matrix}1&0&0&0\\1&1&1&1\\1&-1&1&-1\\0&0&0&1\end{matrix}}\right)^{-1}=\left({\begin{matrix}1&0&0&0\\0&{\tfrac {1}{2}}&-{\tfrac {1}{2}}&-1\\-1&{\tfrac {1}{2}}&{\tfrac {1}{2}}&0\\0&0&0&1\end{matrix}}\right).}

另见
--

* 乘法算法
* 任意精度整数
* 长乘法
* Karatsuba 算法
* 施特拉森算法
* 富尔算法

参考资料
----

1. 1 2  Knuth, p. 296
2. ↑  Crandall & Pomerance, p. 474
3. ↑  Crandall & Pomerance, p. 536
4. ↑  Knuth, p. 302
5. ↑  [http：//cr.yp.to/bib/1966/cook.html Positive Results], chapter III of Stephen A. Cook: *On the Minimum Computation Time of Functions*.
6. 1 2  Marco Bodrato. Towards Optimal Toom-Cook Algorithms for Univariate and Multivariate Polynomials in Characteristic 2 and 0. In *WAIFI'07 proceedings*, volume 4547 of LNCS, pages 116–133. June 21–22, 2007. [http：//bodrato.it/papers/#WAIFI2007 author website]

引用
--

* D. Knuth. *The Art of Computer Programming*, Volume 2. Third Edition, Addison-Wesley, 1997. Section 4.3.3.A： Digital methods, pg.294.
* R. Crandall & C. Pomerance. *Prime Numbers – A Computational Perspective*. Second Edition, Springer, 2005. Section 9.5.1： Karatsuba and Toom–Cook methods, pg.473.
* M. Bodrato. *Toward Optimal Toom-Cook （页面存档备份，存于）*. In WAIFI'07, Springer, 2007.

外部链接
----

* icon数学主题

* 

|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 

| * 
* 论
* 编
数论算法 |
| --- |
|  |
| 素数测试 | 
* AKS
* APR（英语：）
* Baillie–PSW（英语：）
* 椭圆曲线（英语：）
* Pocklington（英语：）
* 费马
* 卢卡斯（英语：）
* *卢卡斯-莱默*
* *Lucas–Lehmer–Riesel（英语：）*
* *普罗斯*
* *Pépin（英语：）*
* 二次Frobenius（英语：）
* Solovay–Strassen（英语：）
* 米勒-拉宾

 |
|  |
| 質數生成（英语：） | 
* 阿特金筛法（英语：）
* 埃拉托斯特尼筛法
* Pritchard筛法（英语：）
* Sundaram筛法（英语：）
* 輪式因數分解法（英语：）

 |
|  |
| 整数分解 | 
* 連分數分解 (CFRAC)（英语：）
* Dixon's（英语：）
* Lenstra橢圓曲線 (ECM)（英语：）
* 欧拉因式分解法（英语：）
* 波拉德ρ算法（英语：）
* *p* − 1（英语：）
* *p* + 1（英语：）
* 二次篩選法
* 普通数域筛选法
* *特殊數域篩選法 (SNFS)（英语：）*
* 有理筛选法
* 费马因式分解法（英语：）
* Shanks二次形式（英语：）
* 试除法
* 秀爾演算法

 |
|  |
| 乘法算法 | 
* 古埃及乘算（英语：）
* 長乘法
* 卡拉楚巴算法
* 图姆-库克算法
* 頌哈吉-施特拉森演算法
* 富尔算法（英语：）

 |
|  |
| 歐幾里德除法除法算法 | 
* 二進制（英语：）
* 倍塊法（英语：）
* Fourier（英语：）
* Goldschmidt（英语：）
* Newton-Raphson（英语：）
* 長除法
* 短除法
* SRT

 |
|  |
| 离散对数 | 
* 大步小步算法
* 波拉德ρ算法
* Pollard kangaroo（英语：）
* Pohlig–Hellman（英语：）
* Index calculus（英语：）
* Function field sieve（英语：）

 |
|  |
| 最大公因數 | 
* 二进制最大公因数算法（英语：）
* 輾轉相除法
* 扩展欧几里得算法
* Lehmer's（英语：）

 |
|  |
| 二次剩余 | 
* Cipolla（英语：）
* Pocklington's（英语：）
* Tonelli–Shanks（英语：）
* Berlekamp（英语：）
* Kunerth（英语：）

 |
|  |
| 其他算法 | 
* Chakravala（英语：）
* Cornacchia（英语：）
* 整數關係（英语：）（LLL（英语：）；KZ（英语：））
* 平方求冪
* 整数平方根
* 模幂运算
* 蒙哥马利算法
* Schoof（英语：）
* 特拉亨伯格系統（英语：）

 |
|  |
| 
* *斜体*表示该算法只适用于特殊形式的数字

 |

 |