大整数分解 优质资源汇总

网上有些OIer的文章,水平参差。知乎有些答主甚至感觉没有基本的数论知识。
本文整理了一些可能有用的资料,方便苦恼于课程任务(笔者这年是写nfs)的信息安全学生。

比较全面的整数分解理论介绍

http://mathmu.github.io/MTCAS/doc/IntegerFactorization.html#
这篇文章是我目前看到的最好、最全面的理论介绍,没有一句废话,引用资料翔实。而且明显可以感觉到作者数学功底深厚。

python大整数分解库

https://pypi.org/project/primefac/
该模块并行运行以下四种分解方法,博采众长:

  • brent改进后的pollard-rho
  • pollard p-1
  • ECM(椭圆曲线方法)
  • 二次筛法

想研究上述算法的代码实现,或者直接调用上述算法的话,可以访问上面的链接进一步了解。

二次筛法的详细介绍

https://bbs.pediy.com/thread-224471.htm
此处做一些提要、注解。
附录中提到,难点是寻找x和y,为此,定义:
在这里插入图片描述
则有:
在这里插入图片描述
则有:
在这里插入图片描述
右边已经是平方式,现在希望左边也是平方式。
因子基一般是小素数集合,要求被分解的数是元素的二次剩余(在下例中是2、17等)。
按顺序列举Q(1) ~ Q(1000),对每一个Q(xi),按顺序除尽因子基,如果最终得到1,说明光滑。
列出所有的光滑Q和他们的指数矩阵,接下来的问题是选择合适的xi,使得每一个指数都是偶数,这样连乘的结果就是平方数。
在这里插入图片描述
上例中,Q(3)的每一个指数已经为偶数。为了说明计算过程,我们特意绕远路,用其它四个xi来凑偶数(每个xi对应下图矩阵的一行)。
在这里插入图片描述
解得R=[1,1,0,1],也就是说我们选Q(1),Q(4),Q(72)可以凑出平方数。

在线整数分解工具

70位以下的在线分解,连调包代码都不用写。
https://zh.numberempire.com/numberfactorizer.php

nfs的基本过程

https://www.docin.com/p-1037060136.html
总结一下上文:
在这里插入图片描述

  • 选多项式f1,f2(学界研究点之一)
  • 选择合适的(a,b),使a+bm和a+bα平滑(有线性筛法和格筛法)
  • 矩阵求解
  • 求平方根

gnfs是二次筛法的扩展,所以有一些相同点:

  • 基本原理与二次筛法相同(平方同余)
  • 筛得之后,凑的过程相同(也就是解矩阵、凑偶数次幂这一过程)

附录

这部分不敢自称优质,个人理解仅供参考。

平方同余的理论基础

分解大整数N,等价于找到x,y,满足: x2 ≡ y2 mod N
难点在于找到x,y。找到之后,
x2 - y2 ≡ 0 mod N
(x+y)(x-y) = kN = kpq (x,y确定后k确定)
如果x+y=pq或者x-y=pq,就重新找x和y。
否则,x+y和x-y各包含p、q中的一个。不妨设p | x+y,q | x-y。
则gcd(x+y, pq)一定等于p,而不会是p的倍数(不然无法整除pq),当然也不会是p的因子(p为素数)。

求gcd用的是欧几里得算法,括号内两个数轮流减小,每次都能减少另一个数的任意倍。这个操作是非常快的。

为什么要选因子基,为什么要从小开始选因子基

随机给定整数,有小于x的因子的概率是在这里插入图片描述
所以,如果想用尽可能小的成本,获得尽可能大的整数表示潜力,肯定是从小开始选因子基。
注意,这里我们不是想生成n=pq(安全的p、q应该都是大数),我们这里是想生成尽可能多的(a,b)对。

nfs为什么要选多项式

回想起来,二次筛法一开始就设了一个Q(x),是一个二次多项式。
这被称为基本二次筛法,只使用一个二次多项式。后来还提出了多重二次筛法MPQS。
而nfs则允许使用超过2次的多项式。
用二次多项式的好处在于,对系数稍加限制,我们就能保证连乘式右边直接就是平方数,说明如下:
在这里插入图片描述

为什么代码实现中用到了对数

是为了以减法代替除法。
二次筛法中,筛平滑的过程需要很多次Q(xi)/pi的除法计算,占据了大部分的时间。对各个Q(xi)和各个因子基提前算好对数,除法就可以变成减法。精度损失是可以接受的,只要比较接近0就说明除尽了。
nfs中也用到了这个思想。

nfs中的环同态的探讨

环同态,即两个环之间的同态。
Z[α] 和 Zn之间的同态。
前者未必是唯一分解整环,如Z[根号-5]。

  • 13
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值