随笔 - 68  文章 - 57  trackbacks - 0
<2013年7月>
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910

常用链接

留言簿(8)

随笔分类(74)

随笔档案(68)

搜索

  •  

最新评论

阅读排行榜

评论排行榜

  大整数的快速质因子分解,用到pollard-rho启发式算法。
  算法导论上介绍pollard-rho介绍得比较详细,由于小因子的循环节长度很小,通过倍增步长,pollard-rho能够很快的找到一个大整数的一个较小的素因子p,书中说复杂度在O(sqrt(p))内,用的什么概率的分析方法,不懂。实际中pollard-rho的速度还是很快的,当然可能出现死循环。
  这个题目要利用pollard-rho找到一个数的最小素因子,因此还需要Miller-Rabin测试来辅助。原来写的那个Miller-Rabin很快挂掉了,因为没有用到二次探测,判不出来Carmichael数。如果x ^ 2 = 1 (mod n),如果n是质数,那么x只能是1和n - 1;二次探测就是利用这个定理来进行检测。
  POJ的论坛里面更有牛人列出了N多Carmichael数,真不知道他怎么找到的。最初怎么也不知道二次探测加在哪里好,后来参考网上一位大牛的代码,它的方法是计算a ^ b % n的时候,先将b折半到一个奇数b'为止,计算a ^ b',然后倍增b',同时进行二次检测,想想觉得很有道理,因为如果x ^ 2 = 1 mod n成立的话,那么(x ^ 2) ^ 2 = 1 mod n也成立。
  这个题目还有一个trick就是模能达到2 ^ 54,如果这样计算一个数平方的时候,即使long long也会溢出。后来发现可以用快速幂取模的思想弄个"快速积取模",同样将b表示成二进制的形式,倍增的同时加到结果上就行了。这样每次运算的数范围都在2 ^ 54以内,并且都是加操作,不会溢出了。
  POJ上还有一个用pollard-rho做的题是PKU 2429,这个比Prime Test还恶,因为这个题目是彻彻底底进行factorization,而且之后还要枚举一下找最优解,总之我的代码非常的长,而且这个题目数据范围2 ^ 63,必须用unsigned long long才能过。我的代码中间出现了一些减操作,都要特殊处理一下。最后还犯了个低级错误,函数返回值写错了,找了好几遍才找出来。

附PKU 1811代码:

PKU 1811
posted on 2009-04-03 20:06 sdfond 阅读(710) 评论(0)  编辑 收藏 引用 所属分类: Algorithm - Number Theory

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理