二次筛选法

✍ dations ◷ 2024-09-20 16:40:56 #整数分解算法

二次筛选(Quadratic Sieve)算法是一个整数分解算法,在实际用途中为已知第二快的方法(目前第一快为普通数体筛选法)。但对于大约 100 位数以内的整数,它仍然是最快的算法,而且比起普通数体筛选法来说简洁得多。这是一个通用的整数分解算法,意即其运算时间完全取决于欲分解的整数本身值的大小,而不是在于特殊结构或特性。

二次筛选法是由卡尔·帕梅朗斯(英语:Carl Pomerance)在1981年所发明,并作为理查德·施罗佩尔的线性筛法之改良版。

此算法试图去建立一个模 ( n 为欲分解的数)下的平方同余,这往往即是 的因数分解。算法有两个阶段:“数据收集”,在此阶段收集可能可以找到一个平方同余的资料;以及“数据处理”,它把所有收集的数据放进一个矩阵里,并解决、获得一个平方同余数。

数据收集的阶段可以很轻易地使用多个处理器去平行化。但数据处理阶段需要大量的内存,并且在多个运算节点之间有效地平行化相当困难,也可能每个运算节点的内存不够足以储存整个阵列。而Block Wiedemann算法(英语:Block Wiedemann algorithm)可以使用在一些可以保存阵列的系统。

要找到一个平方同余,一个较天然的方法便是随机挑选数字,将其平方,并希望模 之后的非负余数是一个完全平方数。 例如:802 模 5959 = 441,同时也是 212。

这种方法对很大的 值而言,可以找到一个同余的平方数的情况很罕见。但是当真的找到了一个时,在大多数情况下,同余数为非平凡解而整数分解便完成了。 这大致上即是费马因式分解法(Fermat's factorization method)的核心。

而二次筛选法改良自狄克森因式分解法(英语:Dixon's factorization method)。

一般来说,二次筛选法的执行时间(去质数分解一个整数 时)为

参见 L-符号。

上式常数 e 为自然对数之底数。

令 模 表示为 x 除以 y 之后所剩的余数。 为了分解整数 , 费马因式分解法(英语:Fermat's factorization method)牵涉到需要寻找一个数字 a( a 使得 a2 mod 是一个完全平方数。 但这些 a 值相当难找到。 二次筛选法包括对于好几个 a 值去计算了 a2 mod ,然后在 a 值与 a2 mod 的集合中找到一个子集,当中的元素之乘积为完全平方数。 而产生出一个平方同余。

例如:412 模 1649 = 32、422 模 1649 = 115 以及 432 模 1649 为 200。 在这些数字(32、115、200)当中皆无完全平方数,但存在一乘积 32 × 200 = 6400 = 802 是一个平方数。 模1649 之后,这个乘积 32 × 200 = (412) × (432) = (41 × 43)2 =1142 (因为 41×43 模 1649 = 114)。 32 × 200 = 802 的观察因而给出了一个平方同余:1142 ≡ 802 (模 1649)。

但是,如何将以下问题解决呢?“给予一组数字,找到一个子集使其乘积是平方数。”该解决方案使用了指数向量的概念。而指数向量,例如根据算术基本定理,504 可分解为 23325071。

这表示可以借由指数向量 (3,2,0,1),代表 2,3,5,7 在因式分解的指数值。490 会同样可分解为指数向量 (1,0,1,2)。将这些数字相乘相当余把其指数向量的对应值一一相加:504×490 得一向量 (4,2,1,3)。

有一些数字为平方数,其满足每个在其指数向量的各个数字为偶数。 例如,向量 (3,0,0,1)、(1,2,0,1) 之和为 (4,2,0,2),因此 56 乘以 126 是一个平方数。 找寻一个平方数只需对于向量里数字之的奇偶性之知识,所以有可能将整个向量简化为模 2 的形式并作模 2 下的加法: (1,0,0,1) + (1,0,0,1) = (0,0,0,0)。 在实作中,这相当地有效率,因其可以表示为一位元集(bitsets)且模 2 之加法将变为位元运算互斥或(XOR)。

于是此问题变化为:“给予一个 0, 1向量构成的集合,找到一个子集,其中所有向量之和为模 2 的零向量。”而这是一个线性代数的问题;且该解答为线性相依的。

线性相依是线性代数中的一个定理:当有比每个向量中含有的元素还要多的向量时,这种相依关系必然存在。而它可以被高效率地找到,例如:把所有向量一列一列地排在一个矩阵里 ,然后使用高斯消去法。比起实数来说,此方法尤其容易套用到模 2 后的整数上。而此算法所需的平方数即是那些向量所对应的数字之积。

然而,纯粹地只去将一堆随机数字平方并模 n 会产生很大量的、不同的质因数,也因此会产生出很长的向量以及一个非常大的矩阵。解决方法是去找到一些特别的数字 ,使得 2 模 n 之值只由很小的质因数组成(它们都是光滑数)。此种数字很难被找到,但是若仅使用光滑数将可以保持向量和矩阵之尺寸更小、更容易处理。

而二次筛选法使用一种之后会提及名为“筛法”(sieving)的技巧去找寻光滑数,也就是此算法的命名由来。

总地来说,二次筛算法基本有以下主要的步骤:

本文的剩余部分将解释这个基本算法的细节和延伸。

二次筛选法试图找到一整数对 和 (其中 为 的函数)其满足比 2 ≡ 2 (模 ) 还要弱得多的条件。它选择一些质数作为一集合作为“”,并试图找到 ,使得 = 2 模 之值的质因数只会在此因数基底。 此时可称 值:对于此因数基底是。

y(x) 的其中一个值之因式分解(为因数基底的一部分),跟 x 一起,被称为“”()。 二次筛选法借由采取接近 的平方根之 x 值,以加速寻找这类“关系”的过程。 这将确保 会较小,因而具有更大的可能性是光滑的。

这意味着, 在 2 的数量级上.。然而,这也意味着 的增长幅度与 x 乘以 (n的平方根) 成正比。

另一个可以增加光滑的可能性是,即是单纯地增大因数基底的大小。 然而,比起因数基底的质数数量,至少找到一个光滑的“关系”还是必要许多,其确保存在一个线性相依。

即使对于某些“关系”来说, 并非光滑的。但如果两个 刚好是由因数基底以外的相同质数之乘积,也可能可以合并这两个 ,以形成一个完整的“关系”。

例如:如果因数基底为{2、3、5、7}和 = 91,存在“部分关系”(partial relations):

将上面两式乘在一起:

并将等号两边皆乘上 (11−1)2 模 91。而 11−1 对 91 取模为 58,所以:

即产生了一个完整的“关系”。 这样的一个完整的“关系”(借由结合“部分关系”所获得的)称为。 有时候,从两个“部分关系”形成的循环,可以直接导向一个平方同余,但是此情况非常罕见。

有好几种方法可以 值们的光滑度。 最直觉的是借由试除法,尽管这样会增加数据收集阶段的运行时间。

另一个方法较能被接受的方法是椭圆曲线因式分解(英语:Lenstra elliptic curve factorization)(ECM)。

而在实作中,称为的方法比较会被经常使用。 设 为多项式 f ( x ) = x 2 n {\displaystyle f(x)=x^{2}-n} ≡ 0 (模 )对于某个 值,将产生出一整个序列,当中的每个数值 ()皆可被 整除。 此问题便是对某个质数取模下找到一个平方根,对其存在着高效率的算法,例如谢克斯–托内里算法(英语:Shanks–Tonelli algorithm)的。(这便是二次筛法的名称来由: 是一个 的二次多项式且筛选过程中的运算类似埃拉托斯特尼筛法。)

筛选一开始将一个大阵列 每个“元”(entry)的每个字节设为零。 对于每一个 ,去解决模  下的二次方程式并得到两个根 和 ,然后在每个 ()=0 模 “元”之中加入一个近似于 log() 之值……也就是 和 。 为了辨识数字是否可被因数基底中的质数之平方所整除,解决几个模 ( 的小次方) 下的二次方程式也是必要的。

在因数基底的尾端,任何 有包含一个值超过大约为 log() 的临界值,将会对应到一个 () 值,其由因数基底的部分组成。 那些包含了确定 () 可以被哪些质数整除的资讯已经遗失掉了,但是因为其只包含一些小的因数,而且已知有很多优良的算法可以去分解那些已知只有小因数的数字。例如小质数的试除法、SQUFOF、波拉德 ρ,以及ECM,以上是经常作为一起使用的方法。

基本上很多 () 值都会是可行的,因此因式分解过程的尾声不需要是完全可信的;通常此过程大约有 5% 的输入会出现异常,此时需要做少量的额外筛选。

以下例子将演示没有作对数优化或是质数次方的标准的二次筛法。 令要分解的数为 = 15347,因此平方根 无条件进位为124。 由于 很小,因此基本的多项式即足够了: ()=( +124)2 − 15347

因为 为小数字,所以只需 4 个质数。 满足在模 下 15347 有一平方根的前 4 个质数 为 2、17、23 以及 29(换句话说,对这些质数来说,15347是一个模这些数字的二次剩余)。 这些质数将是筛选的基础。

现在我们要建造出我们的筛选 V X {\displaystyle V_{X}} 之中可被 所整除的那些“元”。

对于 p = 2 {\displaystyle p=2} { 17 , 23 , 29 } {\displaystyle \lbrace 17,23,29\rbrace } =a 和之后每一次递增一个 值的那些项次皆可被 整除。 把 中的 a、a+ +2 +3等等的位置除以 , 如此对于每个在基底中的质数可以找到为相异质数的乘积(一次方)之光滑数。

在 之中的值等于一的那些“元”皆对应到一个光滑数。 因为 V 0 {\displaystyle V_{0}} ,而算法接着的剩余部分等同于狄克森因式分解法中的任何变体。

将方程式中的一个子集里的指数乘积

转为一个矩阵形式 (在模 2 下)得到以下方程式:

此方程式可由零空间(null space)的概念所给出一个解,为:

因此三个方程式的乘积产生了一个平方数(模 N 之下):

以及

所以此算法找到了

测试其结果得到 GCD(3070860 - 22678, 15347) = 103,为 15347 的一个非平凡因数,而另一个为149。

而以上恰好显示出,二次筛法只适用于 值较大时。 对于例如像 15347 这类的小数字,此算法显得过犹不及。 试除法或是波拉德 ρ都可以在少量许多的计算之下找到一个因数。

在实际用途上,有许多相异的多项式用在 上,因为仅仅一个多项式通常不足以产生出对于因数基底的光滑数对 (, ) 。 使用的多项式使用必须要有一个特别形式,因为它们需要为模 . 下的平方数。 多项式必定会与原始的 ()= 2 − 有类似的形式:

假设 B 2 n {\displaystyle B^{2}-n} 、因数基底以及多项式的集合,且直到运算完多项式之前都不须跟中央处理器作任何传输。

如果在除以所有小于 A 的因数之后,剩余的数字(余因子)小于 A2,那么这个余因子必为质数。 实际上,借由对于余因子去排序“关系”表,则它可以添加进因数基底里。如果 y(a) = 7 × 11 × 23 × 137 且 y(b) = 3 × 5 × 7 × 137, 则 y(a) × y(b) = 3 × 5 × 11 × 23 × 72 × 1372。 此可以降低以上完整执行因式分解的筛选阵列之“元”的临界值。

甚至更进一步去降低临界值,并且使用一个高效处理将 y(x) 之值分解为一些更大的质数之积(ECM 适合处理这样子的东西)可以找到因数大多在因数基底,但有两个甚至三个大质数的“关系”。 循环的寻找过程因此允许一个共享好几个质数的“关系”集合,合并成为单一的“关系”。

为了展示在一个有包含多个多项式以及大质数优化下的实作方式去跑实际例子,会有的典型参数选取, 将一个 267 位元的半质数输入进 msieve 中,产出了以下的参数:

直到发现普通数体筛选法(number field sieve, 简称 NFS)之前,二次筛法(QS)曾是已知渐近最快的通用整数分解算法。 现在, 伦斯特拉椭圆曲线因式分解(英语:Lenstra elliptic curve factorization)具有跟 QS 有相同的渐近运行时间(在 由两个相同大小级别的质数相乘所得的情况下),但在实际情况中,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 的纪录是 2 803 2 402 + 1 {\displaystyle 2^{803}-2^{402}+1} 的一个 135 位数长之余因子,其为 2 1606 + 1 {\displaystyle 2^{1606}+1} 的一个 Aurifeuillian因数 ,在 2001 年分解为 66 位以及 69 位数长的质因数。

相关

  • 法拉利法拉利(意大利语:Ferrari)是一家意大利跑车制造商,现在是世界第二大传统的专做跑车的厂牌,仅次于保时捷的地位。主要制造一级方程式赛车及高性能跑车,1939年由恩佐·法拉利于意大
  • 厌氧细菌厌氧生物,或称厌气生物,是指一种不需要氧气生长的生物。它们大致上可以分为三种,即专性厌氧生物、兼性厌氧生物及耐氧厌氧生物 。人体内的厌氧生物多存在于消化系统中,有些种类
  • 史禄史禄,又称监禄,(?-?)。秦朝人,姓不详,名禄。史系官职名,即监御史。秦始皇灭六国后,派屠睢攻打越人。为运送征服岭南所需的军队和物资,便命史禄在今广西兴安县开凿河渠以沟通湘、漓二水。
  • 装甲战斗车辆装甲战斗车辆(英语:armoured fighting vehicle,缩写:AFV)是指装有装甲及武器的军用战斗车辆。装甲战斗车辆以功能、作战模式及武器装备作分类,而各国在不同时期对相同种类的车辆又
  • 肖松尼人肖松尼(Shoshone)(i/ʃoʊˈʃoʊniː/ or i/ʃəˈʃoʊniː/) 是个曾经活跃于北美洲美国西部与墨西哥北部的大部族,分为三大部落;本族语言是肖松尼语。此语属犹他-阿兹提克语系
  • 佩塔卢马佩塔卢马(英语:Petaluma)是美国加利福尼亚州索诺玛县的一个城市,2010年人口普查后的人口是57,941,其中80.4%为白人,其他种族包括亚洲人、黑人和拉丁裔等。总面积为37.6平方公里,气
  • 陈永康陈永康(1951年-),生于台湾台北,籍贯广东吴川,中华民国海军二级上将退役,现任国防安全研究院战略咨询委员、国家中山科学研究院董事,毕业于美国海军战争学院1997年班,与前行政院退辅会
  • 君士坦丁省 (法属阿尔及利亚)君士坦丁省(法语:Département de Constantine)是法国在法属阿尔及利亚的一个省份,存在于1848-1962年间,省会君士坦丁。 5个海外省及大区
  • 教宗宫教宗宫(法语:Palais des Papes)是座落于法国南部城市阿维尼翁的一座古老宫殿,为欧洲最大、最重要的中世纪哥特式建筑。教宗宫不仅是教宗的宫殿,也是一座要塞。在十四世纪期间,阿维
  • 宣誓宣誓是当一个人或一个团队准备担任某个任务或参加某个组织时,在仪式下当众说出表示决心的话语。在这个过程中,通常有一位或数位负责监誓的人。另外,一些法律文件亦需要当事人宣