博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
整数的素因子分解:Pollard rho method
阅读量:5156 次
发布时间:2019-06-13

本文共 2496 字,大约阅读时间需要 8 分钟。

参考:

  1.CLRS《算法导论》

  2.

  Pollard rho方法是随机算法,《算法导论》上说是启发式方法。期望的时间为n的四次方根。关于rho的实现细节《算法导论》和参考2的文章有些不同。《算法导论》计算出x1x2x3...xk ... 序列,每个数xi都要参与验证,即计算gcd( xj - xi , n) ,for all i,其中xj是下标j满足小于等于i,且j2的幂次的最大j对应的xj。参考2文章里也是要一次计算出x1x2x3...xk ... 序列,不过只对下标为偶数的i验证(下标从1开始),即计算gcd( x[i/2] - xi, n )

  Pollard rho方法实现需要考究的地方有两个:

  一是判断出现循环,这需要记录算出的xi序列,并要对新计算的xk+1和前面k个值比对,这比较耗空间和时间,所以我采取了另一种方法,设定循环次数限制,但这会导致时间效率和有效性下降,好处是实现简单。

  二是初始时种子的选取,我固定选取2为种子。种子可以选取多个,即在用某个种子无法分解时,用不同种子再试,实现会复杂一些,不过程序有效性可能有所提高。另外我在实现mul_mod函数时采用高精度,可以对1718左右的大数分解。

  文章代码已经改过,对之前代码错误的问题表示歉意!!!

代码:

1 //zzy2012.7.14  2 #include
3 #include
4 #include
5 #define ll long long 6 using namespace std; 7 8 long long factor[1000],fnum; 9 10 ll mul_mod(const ll &a, ll b, const ll &n) 11 { 12 ll back(0), temp(a % n); 13 b %= n; 14 while ( b > 0 ) 15 { 16 if ( b & 0x1 ) 17 { 18 if ( (back = back + temp) > n ) 19 back -= n; 20 } 21 if ( (temp <<= 1) > n ) 22 temp -= n; 23 b >>= 1; 24 } 25 return back; 26 } 27 28 ll pow_mod(const ll &a, ll b, const ll &n) 29 { 30 ll d(1), dTemp(a % n);//当前二进制位表示的是进制数值 31 while ( b > 0 ) 32 { 33 if ( b & 0x1 ){ 34 d = mul_mod(d, dTemp, n); 35 b ^= 1; 36 } 37 else{ 38 dTemp = mul_mod(dTemp, dTemp, n); 39 b >>= 1; 40 } 41 } 42 return d; 43 } 44 45 bool MillerRabin(long long p,long long a){ 46 long long k=0,q=p-1,m; 47 while(q%2 == 0){ 48 k++; 49 q/=2; 50 } 51 m = pow_mod(a,q,p); 52 53 if(m==1 || m==p-1) 54 return true; 55 for(long long i=1; i
1 && comDiv < num ) 92 return comDiv; 93 if ( i == k ) 94 { 95 y = x; 96 k <<= 1; 97 } 98 }while ( true ); 99 return num;100 }101 void FindFac(const ll &num)102 {103 if (isPrime(num)==true)104 {105 factor[fnum++] = num;106 return;107 }108 ll fac;109 do110 {111 fac=Pollard_rho(rand()%(num-1)+1,num);112 }while (fac>=num);113 FindFac(fac);114 FindFac(num/fac);115 }116 117 int main()118 {119 long long n;120 cin>>n;121 if(isPrime(n) == true)122 cout<
<

 

 

 

转载于:https://www.cnblogs.com/Lattexiaoyu/archive/2012/07/15/2591982.html

你可能感兴趣的文章
Docker环境搭建,K8s
查看>>
Python3爬虫(六) 解析库的使用之Beautiful Soup
查看>>
Python实例:11~20例
查看>>
ORACLE1.13-综合例子应用01
查看>>
js,同意后,才可已点击注册按钮
查看>>
MySQL check the manual that corresponds to your MySQL server version for the right syntax错误
查看>>
[学习总结]6、Android异步消息处理机制完全解析,带你从源码的角度彻底理解
查看>>
java内部类实现多继承
查看>>
python thread 多线程
查看>>
锁类型_ sys.dm_os_wait_stats
查看>>
AR2220 通过cpu-defend policy处理大量大量arp广播的小技巧
查看>>
android-studio于java相关
查看>>
Spring常用注解
查看>>
shell 倒引号
查看>>
伯仲叔季
查看>>
PHP——0128练习相关2——js点击button按钮跳转到另一个新页面
查看>>
ThreadLocal 解决多线程程序的并发问题+事务处理
查看>>
Codeforces Round #459 (Div. 2)题解
查看>>
Git中如何利用生成SSH个人公钥访问git仓库
查看>>
POJ 3280 Cheapest Palindrome(DP)
查看>>