在数学上，**有理筛选法**是一种将整数分解的通用算法。它是一般数域筛选法的特例。虽然它比一般的数域筛选法效率低，但它在概念上更简单，对理解后续的数域筛选法的原理起到重要的铺垫作用。相对于后续的数域筛选法的过程，该算法在数域处理的过程中本质上只涉及到了有理数域，因此其名称可能来源于此特性。

方法
--

假设我们试图分解合数*n* .我们选择一个边界*B* , 并确定*B*对应的因数基底（我们将称为*P* ），即小于等于*B*的所有素数的集合。接下来，我们搜索正整数*z*使得*z*和*z+n*都是*B*平滑的—即它们的所有素因子都在*P*中。因此有：

{\displaystyle z=\prod \_{p\_{i}\in P}p\_{i}^{a\_{i}}}

其中a\_{i}是p\_{i}对应的幂次。同样， 我们有

{\displaystyle z+n=\prod \_{p\_{i}\in P}p\_{i}^{b\_{i}}} .

其中b\_{i}为p\_{i}对应的幂次。 但z和{\displaystyle z+n}在模n意义下相等 ，所以对于每一个这样的整数*z,* 我们找到了*P*的元素之间产生的一个模n的乘法关系 ，即

{\displaystyle \prod \_{p\_{i}\in P}p\_{i}^{a\_{i}}\equiv \prod \_{p\_{i}\in P}p\_{i}^{b\_{i}}{\pmod {n}}}
（其中*ai*和*bi*是非负整数。 )

当我们生成了足够多的这些关系时（关系的数量通常比集合*P*的大小多几个通常就足够了），我们可以使用线性代数的方法将这些不同的关系相乘，使得这些素数p\_{i}的幂次都是偶数（我们只关心幂次的奇偶性，这时相当于将幂次对2取模，视为二元域（英语：）F\_{2}上的整数，所有素数p\_{i}的幂次总体可以视为一个向量，幂次全为偶数相当于向量的分量全为0, 得到该结果的过程即为在二元域F\_{2}的运算规则下将向量的分量全部消为0的过程）。这样就能够产生一个平方同余关系：a2 ≡b2 (mod *n*), 从而得到*n*的一个因式分解*：n =* gcd(*a*-*b*,*n*)×gcd(*a*+*b*, *n*). 这种因式分解可能会产生平凡的结果（即*n*=*n*×1），这种情况下需要再次尝试使用不同的关系组合，如果运气足够好，最后就能够得到一对非平凡的*n*因子，成功将*n*分解，算法结束。

例子
--

下面使用有理筛选法分解整数*n* = 187. 首先随便选取*B* = 7作为尝试，这时因子基*P* = {2,3,5,7}. 第一步先是测试*n*是否可以被*P*的每个成员整除，如果是这样的话那么我们就直接找到了*n*的一个因子，这样就成功将*n*分解无需继续了。但现在187并不能被 2,3,5或7整除，所以接下来就应该继续，开始寻找合适的*z*值；前几个是 2,5,9和56. *z*的四个合适的值给出了四个模187意义下的乘法关系：

|  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- |
| {\displaystyle 2^{1}3^{0}5^{0}7^{0}=2\equiv 189=2^{0}3^{3}5^{0}7^{1}} | 

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

 | **(**1**)** |

|  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- |
| {\displaystyle 2^{0}3^{0}5^{1}7^{0}=5\equiv 192=2^{6}3^{1}5^{0}7^{0}} | 

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

 | **(**2**)** |

|  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- |
| {\displaystyle 2^{0}3^{2}5^{0}7^{0}=9\equiv 196=2^{2}3^{0}5^{0}7^{2}} | 

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

 | **(**3**)** |

|  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- |
| {\displaystyle 2^{3}3^{0}5^{0}7^{1}=56\equiv 243=2^{0}3^{5}5^{0}7^{0}} | 

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

 | **(**4**)** |

现在有几种本质上不同的方法可以将这些组合起来并最终得到全部为偶数的幂次。例如，

* (1)×(4): 在将这些相乘并消去共同的因子 7 之后（其它的一般情况下**不能**直接消去，本算法的过程中是一定可以的，原因是因为 7 已经确定与*n*互素 ），关系式简化为了24 ≡ 38 (mod *n*)，或 42 ≡ 812(mod *n*)。结果分解为 187 = gcd(81-4,187) × gcd(81+4,187) = 11×17.

或者，等式(3)本身已经是我们想要的形式：

* (3)：32 ≡ 142 (mod *n* )，得到因式分解 187 = gcd(14-3,187) × gcd(14+3,187) = 11×17.

局限性
---

有理筛选法与一般数域筛选法一样，不能因式分解*pm*形式的数字，其中*p*是素数，*m*是整数。不过，这根本不是什么问题，因为要分解的整数基本不可能会是这种数，并且已经有简单而快速的方法来事先检查给定的数字是否属于这种数字。可能最简洁实用的方法是利用整数版本的求方根的牛顿法，检查是否存在(1, log2(n)]范围内的整数*b*使得{\displaystyle \lfloor n^{1/b}\rfloor ^{b}=n}成立。

最大的问题是找到足够数量的*z*使得*z*和*z* + *n*都是*B*平滑的。对于任意一个固定的*B* ，随着数字数值的增大，符合要求的*B*平滑数字的比例会迅速下降。因此，如果*n*很大（例如，一百多位数），则很难或者根本不可能找到足够多的*z*, 这样这个算法就不太可行了。而后续的一般数域筛选法的优点是要找的光滑数的大小只需要在*n*1/*d*（*d*通常为3或5的整数）这个数量级左右，而不是这里的*n*的数量级。

参考文献
----

1. ↑  A. K. Lenstra; H. W. Lenstra; Jr.; M. S. Manasse; J. M. Pollard.  (PDF). Math. Comp. 1993, **61**: 319–349  [2022-02-22]. （原始内容存档 (PDF)于2022-02-22）.
2. ↑  A. K. Lenstra, H. W. Lenstra, Jr. (eds.)..  **1554**. New York: Springer-Verlag. 1993. ISBN 9783540570134.
3. ↑  R. Crandall; J. Papadopoulos.  (PDF).  [2022-02-22]. （原始内容存档 (PDF)于2012-10-05）.

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

| * 
* 论
* 编
数论算法 |
| --- |
|  |
| 素数测试 | 
* 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（英语：）
* 特拉亨伯格系統（英语：）

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

 |

 |