二次筛选法

二次筛选（）演算法是一个整数分解演算法，在实际用途中为已知第二快的方法（目前第一快为普通数域筛选法）。但对于大约 100 位数以内的整数，它仍然是最快的算法，而且比起普通数域筛选法来说简洁得多。&lt;br&gt;
这是一个通用的整数分解演算法，意即其运算时间完全取决于欲分解的整数本身位数的大小，而不是在于特殊结构或特性。 
二次筛选法是由卡尔·帕梅朗斯在1981年所发明，并作为理查德·施罗佩尔的线性筛法之改良版。
基础目标.
此演算法试图去建立一个模 formula_1 （formula_1为欲分解的数）下的平方同余，这往往即是formula_1的因数分解。演算法有两个阶段：「数据收集」，在此阶段收集可能可以找到一个平方同余的资料；以及「数据处理」，它把所有收集的数据放进一个矩阵里，并解决、获得一个平方同余数。 
数据收集的阶段可以很轻易地使用多个处理器去平行化。但数据处理阶段需要大量的记忆体，并且在多个运算节点之间有效地平行化相当困难，也可能每个运算节点的记忆体不够足以储存整个阵列。而可以使用在一些可以保存阵列的系统。
要找到一个平方同余，一个较天然的方法便是随机挑选数字，将其平方，并希望模formula_1之后的非负余数是一个完全平方数。 例如：formula_5 模 formula_6，同时也是formula_7。
这种方法对很大的formula_1值而言，可以找到一个同余的平方数的情况很罕见。但是当真的找到了一个时，在大多数情况下，同余数为非平凡解而整数分解便完成了。这大致上即是费马因式分解法（Fermat's factorization method）的核心。
而二次筛选法改良自。
一般来说，二次筛选法的执行时间（去质数分解一个整数formula_1时）为
参见 L-符号。
上式常数 e 为自然对数之底数。
解决方法.
令 formula_11 模 formula_12 表示为 formula_11 除以 formula_12 之后所剩的余数。 为了分解整数 formula_15， 牵涉到需要寻找一个数字 formula_16（formula_17是一个完全平方数。 但这些formula_16值相当难找到。 二次筛选法包括对于好几个formula_16值去计算了formula_20，然后在formula_16值与formula_20的集合中找到一个子集，当中的元素之乘积为完全平方数。 而产生出一个平方同余。
例如：formula_23 模 formula_24、formula_25 模 formula_26 以及 formula_27 模 formula_28 为 formula_29。 在这些数字（32、115、200）当中皆无完全平方数，但存在一乘积formula_30是一个平方数。 模1649 之后，这个乘积formula_31（因为 formula_32 模 formula_33）。formula_34 的观察因而给出了一个平方同余：formula_35 (模 formula_28)。 
但是，如何将以下问题解决呢？「给予一组数字，找到一个子集使其乘积是平方数。」该解决方案使用了指数向量的概念。而指数向量，例如根据算术基本定理，504 可分解为 formula_37。
这表示可以借由指数向量 formula_38，代表 formula_39 在因式分解的指数值。490 会同样可分解为指数向量 formula_40。将这些数字相乘相当余把其指数向量的对应值一一相加：formula_41 得一向量 formula_42。
有一些数字为平方数，其满足每个在其指数向量的各个数字为偶数。 例如，向量 formula_43、formula_44 之和为 formula_45，因此 56 乘以 126 是一个平方数。 找寻一个平方数只需对于向量里数字之的奇偶性之知识，所以有可能将整个向量简化为模 2 的形式并作模 2 下的加法: formula_46。 在实作中，这相当地有效率，因其可以表示为一位元集（bitsets）且模 2 之加法将变为位元运算互斥或（XOR）。
于是此问题变化为：「给予一个 0, 1向量构成的集合，找到一个子集，其中所有向量之和为模 2 的零向量。」而这是一个线性代数的问题；且该解答为线性相依的。
线性相依是线性代数中的一个定理：当有比每个向量中含有的元素还要多的向量时，这种相依关系必然存在。而它可以被高效率地找到，例如：把所有向量一列一列地排在一个矩阵里 ，然后使用高斯消去法。比起实数来说，此方法尤其容易套用到模 2 后的整数上。而此演算法所需的平方数即是那些向量所对应的数字之积。
然而，纯粹地只去将一堆随机数字平方并模 formula_1 会产生很大量的、不同的质因数，也因此会产生出很长的向量以及一个非常大的矩阵。解决方法是去找到一些特别的数字 formula_16，使得 formula_49 模 formula_1 之值只由很小的质因数组成（它们都是光滑数）。此种数字很难被找到，但是若仅使用光滑数将可以保持向量和矩阵之尺寸更小、更容易处理。
而二次筛选法使用一种之后会提及名为「筛法」（sieving）的技巧去找寻光滑数，也就是此演算法的命名由来。
演算法.
总地来说，二次筛算法基本有以下主要的步骤：
本文的剩余部分将解释这个基本演算法的细节和延伸。
二次筛法（QS）如何最佳化找寻同余.
二次筛选法试图找到一整数对 formula_11 和 formula_83 （其中 formula_83 为 formula_11 的函数）其满足比 formula_86模 formula_57 还要弱得多的条件。它选择一些质数作为一集合作为「"因数基底"」，并试图找到 formula_11 ，使得 formula_89 模 formula_1 之值的质因数只会在此因数基底。 此时可称 formula_12 值：对于此因数基底是"光滑的"。
formula_83 的其中一个值之因式分解（为因数基底的一部分），跟 formula_11 一起，被称为「"关系"」（"relation"）。 二次筛选法借由采取接近 formula_1 的平方根之 formula_11 值，以加速寻找这类「关系」的过程。 这将确保 formula_83 会较小，因而具有更大的可能性是光滑的。
这意味著， formula_12 在 formula_100 的数量级上.。然而，这也意味著 formula_12 的增长幅度与 formula_11 乘以 (formula_1的平方根) 成正比。
另一个可以增加光滑的可能性是，即是单纯地增大因数基底的大小。 然而，比起因数基底的质数数量，至少找到一个光滑的「关系」还是必要许多，其确保存在一个线性相依。
「部分关系」以及循环.
即使对于某些「关系」来说， formula_83 并非光滑的。但如果两个 formula_12 刚好是由因数基底以外的相同质数之乘积，也可能可以合并这两个"部分「关系」" ，以形成一个完整的「关系」。 [注：此形同于因数基底的扩展。]
例如：如果因数基底为formula_106和 formula_107，存在「部分关系」（partial relations）：
将上面两式乘在一起：
并将等号两边皆乘上 formula_111 模 formula_112。而 formula_113 对 formula_112 取模为 formula_115，所以：
即产生了一个完整的「关系」。 这样的一个完整的「关系」（借由结合「部分关系」所获得的）称为"循环"。 有时候，从两个「部份关系」形成的循环，可以直接导向一个平方同余，但是此情况非常罕见。
借由筛选来检查光滑度.
有好几种方法可以 formula_12 值们的光滑度。 最直觉的是借由试除法，尽管这样会增加数据收集阶段的运行时间。 
另一个方法较能被接受的方法是（ECM）。
而在实作中，称为"筛选"的方法比较会被经常使用。 设 formula_119 为多项式 formula_120 我们得：
因此解决出 formula_125模 formula_126对于某个 formula_11 值，将产生出一整个序列，当中的每个数值 formula_128 皆可被 formula_129 整除。 此问题便是对某个质数取模下找到一个平方根，对其存在著高效率的演算法，例如的。（这便是二次筛法的名称来由： formula_12 是一个 formula_11 的二次多项式且筛选过程中的运算类似埃拉托斯特尼筛法。）
筛选一开始将一个大阵列 formula_132 每个「元」（entry）的每个位元组设为零。 对于每一个 formula_129 ，去解决模formula_129 下的二次方程式并得到两个根 formula_135 和 formula_136，然后在每个 formula_137 模 formula_129「元」之中加入一个近似于 formula_139 之值……也就是 formula_140 和 formula_141。 为了辨识数字是否可被因数基底中的质数之平方所整除，解决几个模 ( formula_129 的小次方) 下的二次方程式也是必要的。
在因数基底的尾端，任何 formula_132 有包含一个值超过大约为 formula_144 的临界值，将会对应到一个 formula_83 值，其由因数基底的部分组成。 那些包含了确定 formula_83 可以被哪些质数整除的资讯已经遗失掉了，但是因为其只包含一些小的因数，而且已知有很多优良的演算法可以去分解那些已知只有小因数的数字。例如小质数的试除法、SQUFOF、波拉德 ρ，以及ECM，以上是经常作为一起使用的方法。
基本上很多 formula_83 值都会是可行的，因此因式分解过程的尾声不需要是完全可信的；通常此过程大约有 5% 的输入会出现异常，此时需要做少量的额外筛选。
基本筛选的例子.
以下例子将演示没有作对数优化或是质数次方的标准的二次筛法。 令要分解的数为 formula_148，因此平方根 formula_149 无条件进位为124。 由于 formula_149 很小，因此基本的多项式即足够了： formula_151。
数据收集.
因为 formula_149 为小数字，所以只需 4 个质数。 满足在模 formula_129 下 15347 有一平方根的前 4 个质数 formula_129 为 2、17、23 以及 29(换句话说，对这些质数来说，15347是一个模这些数字的二次剩余)。 这些质数将是筛选的基础。
现在我们要建造出我们的筛选 formula_155从 formula_156并开始对基底里每个质数进行筛选，以下选择筛出 formula_157 的那些 formula_158：
下一步即是去作筛选的动作。 对于我们的质数基底 formula_160中的每一个质数 formula_129 值去解决以下方程式：
找到阵列 formula_163 之中可被 formula_129 所整除的那些「元」。
对于 formula_165 解出 formula_166 得到了 formula_167。
所以，从 formula_168 开始每次 formula_169，每个「元」可被 2 整除。把那些元除以 2 之后得到：
同理，对于剩下的质数 formula_129 formula_172 方程式formula_173 也解决了。 
值得注意的是，对于每一个 formula_174，因为有两个模平方根，因此得到 2 个线性方程式。
每个方程式 formula_176 导致 formula_177 从 formula_178 和之后每一次递增一个 formula_129 值的那些项次皆可被 formula_129 整除。 把 formula_163 中的 formula_16、formula_183、formula_184、formula_185等等的位置除以 formula_129 , 如此对于每个在基底中的质数可以找到为相异质数的乘积（一次方）之光滑数。
在 formula_163 之中的值等于一的那些「元」皆对应到一个光滑数。 因为 formula_189, formula_190， formula_191 等于一，因此对应到：
矩阵处理.
由于根据 formula_192的性质我们已经找到平滑数 formula_193 ，而演算法接著的剩余部分等同于狄克森因式分解法中的任何变体。
将方程式中的一个子集里的指数乘积
转为一个矩阵形式 （在模 2 下）得到以下方程式：
此方程式可由零空间（null space）的概念所给出一个解，为：
因此三个方程式的乘积产生了一个平方数（模 formula_149 之下）：
以及
所以此演算法找到了 
测试其结果得到 formula_201，为 15347 的一个非平凡因数，而另一个为149。
而以上恰好显示出，二次筛法只适用于 formula_1 值较大时。 对于例如像 15347 这类的小数字，此演算法显得过犹不及。 试除法或是波拉德 ρ都可以在少量许多的计算之下找到一个因数。
倍数多项式.
在实际用途上，有许多相异的多项式用在 formula_12 上，因为仅仅一个多项式通常不足以产生出对于因数基底的光滑数对 formula_204。 使用的多项式使用必须要有一个特别形式，因为它们需要为模 formula_1. 下的平方数。 多项式必定会与原始的 formula_206 有类似的形式：
假设 formula_208 是 formula_209 的一个倍数，则 formula_210 且多项式 formula_83 可以被写作 formula_212。而如果 formula_209 为一个完全平方数，则只需考虑 formula_214的部分。
此方式（称为 MPQS，倍数多项式二次筛选法（Multiple Polynomial Quadratic Sieve））非常适合平行运算，因为每一个处理因式分解的处理器可以单纯的给入 formula_1 、因数基底以及多项式的集合，且直到运算完多项式之前都不须跟中央处理器作任何传输。
大质数.
单一的大质数.
如果在除以所有小于 formula_209 的因数之后，剩余的数字（余因子）小于 formula_217，那么这个余因子必为质数。 实际上，借由对于余因子去排序「关系」表，则它可以添加进因数基底里。如果 formula_218 且 formula_219, 则 formula_220。 此可以降低以上完整执行因式分解的筛选阵列之「元」的临界值。
更多的大质数.
甚至更进一步去降低临界值，并且使用一个高效处理将 formula_83 之值分解为一些更大的质数之积（ECM 适合处理这样子的东西）可以找到因数大多在因数基底，但有两个甚至三个大质数的「关系」。 循环的寻找过程因此允许一个共享好几个质数的「关系」集合，合并成为单一的「关系」。
实际例子下的参数.
为了展示在一个有包含多个多项式以及大质数优化下的实作方式去跑实际例子，会有的典型参数选取， 将一个 267 位元的半质数输入进 msieve 中，产出了以下的参数：
整数分解的纪录.
直到发现普通数体筛选法（number field sieve, 简称 NFS）之前，二次筛法（QS）曾是已知渐近最快的通用整数分解演算法。 现在， 具有跟 QS 有相同的渐近运行时间（在 formula_1 由两个相同大小级别的质数相乘所得的情况下），但在实际情况中，QS 速度更快，因为它采用的是单精度浮点数操作而不是椭圆曲线所使用的高精度计算。
在 1994 年的 4 月，RSA-129 的因数分解借由 QS 完成了。 其为一个由两个大质数相乘的129 位数数字一个因数为 64 位长而另一个为 65 位。 此因数分解的因数基底包含了 524339 个质数。 数据收集阶段花了 5000 个 MIPS 年，其完成于网际网路上的分散式计算。 数据收集总量为 2 GB。 数据处理花了45个小时在 Bellcore ( 现为 Telcordia 科技公司) 的 MasPar （大规模的平行化）超级电脑。 这曾是最大的、借由通用演算法的公开分解，直至 NFS 被用于分解 RSA-130，于 1996 年 4 月 10 日 完成。 所有自此以后分解的 RSA号码 皆使用 NFS。
目前 QS 的纪录是 formula_223 的一个 135 位数长之余因子，其为 formula_224的一个 Aurifeuillian因数 ，在 2001 年分解为 66 位以及 69 位数长的质因数。