首先说一下对不是很大的整数n的拆分,首先将2~sqrt(n)的所有素数打表,然后对应素数表一一试除,试除后,如果n>1,此时n也是素因子。

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1164

代码:

#include <iostream>
#include <cstdio>
#include <vector>
#include <cmath>using namespace std;const int N=300;int nprime,prime[N];
bool isprime[N];void doprime()
{nprime=0;long long i,j;for(i=1;i<N;i+=2)isprime[i]=true;isprime[2]=true;long long k=sqrt(1.0*N)+1;for(i=2;i<N;i++){if(isprime[i]){prime[nprime++]=i;for(j=i*i;j<N;j+=i)isprime[j]=false;}}
}void solve(int n)
{vector <int> vt;int k=sqrt(1.0*n)+1;int i;for(i=0;prime[i]<=k;i++){while(n%prime[i]==0){vt.push_back(prime[i]);n/=prime[i];}}if(n>1)vt.push_back(n);if(vt.size()==1){printf("%d\n",vt[0]);return ;}for(i=0;i<vt.size()-1;i++)printf("%d*",vt[i]);printf("%d\n",vt[i]);
}int main()
{doprime();int x;while(cin>>x)solve(x);return 0;
}

Pollard rho整数分解法用于对比较大的整数分解。


算法原理:生成两个整数a和b,计算p=gcd(a-b,n),直到p不为1或者a,b出现循环为止,若p=n,则n为质数,否则p为n的一个约数,选取一个小的随机数x1,迭代生成xi=x(i-1)^2+k,一般去k=1,若序列出现循环,则退出,计算p=gcd(xi-1-xi,n),若p=1,返回上一步,直到p>1为止,若p=n,则n为素数,否则p为n的一个约数并递归分解p和n/p。

代码:

#define TIMES 5
#define RHO 501
typedef long long LL;vector <LL> factor; //将素因子放在factor里面,注意因子是无序的LL random(LL n)
{  return (LL)((double) rand()/RAND_MAX*n+0.5);
}LL gcd(LL a,LL b)
{return b==0?a:gcd(b,a%b);
}LL multi(LL a,LL b,LL mod) //a*b%mod
{LL ans=0;while(b){if(b&1){ans+=a;if(ans>mod)ans-=mod;}b>>=1;a=(a<<1)%mod;}return ans;
}LL kpow(LL a,LL n,LL mod) //a^n%mod
{  LL ans=1;  while(n)  {  if(n&1)  ans=multi(ans,a,mod);  n>>=1;  a=multi(a,a,mod);}  return ans;
}  bool witness(LL a,LL n)  //二次探测 以a为基,n-1=x*2^t,检验n是不是合数
{  LL m=n-1;  LL j=0;  while(! (m&1))  {  j++;  m>>=1;  }  LL x=kpow(a,m,n);  if(x==1 || x==n-1)  return false;  while(j--)  {  x=x*x;if(x>n)x%=n; if(x==n-1)  return false;  }  return true;
}  bool miller_rabin(LL n)
{  if(n<2) return false;if(n==2) return true;  if(!(n&1)) return false;  for(LL i=1;i<=TIMES;i++)  {  LL a=random(n-2)+1;  if(witness(a,n))  return false;  }  return true;
}  LL pollard_rho(LL n,int c)
{LL x,y,d,i=1,k=2;x=random(n-1)+1;y=x;while(1){i++;x=(multi(x,x,n)+c)%n;d=gcd(y-x+n,n);if(1<d && d<n)return d;if(y==x)return n;if(i==k){y=x;k<<=1;}}
}void find(LL n,int k)
{if(n==1)return ;if(miller_rabin(n)){factor.push_back(n);return ; }LL p=n;while(p>=n)p=pollard_rho(p,k--);find(p,k);find(n/p,k);
}

Pollard rho整数分解法相关推荐

  1. 大整数分解——Pollard Rho算法

    延续上一篇,这次来讲一讲大整数分解算法的应用. 要解决的问题很简单,对一个整数进行分解质因数. 首先还是效率非常低的暴力算法,相信大家都会,不多提. 和上次一样,当数达到非常大的时候,分解将变得非常困 ...

  2. 连分数分解法寻找整数的因子(Python)

    首先,先讲个小故事. 1903年10月,科尔(Cole)在纽约参加美国数学(AMS)的一个会议,议程里有他的一篇题目平淡的论文:"关于一个大数的分解".大会主席请他宣读论文时,一向 ...

  3. 整数的素因子分解:Pollard rho method

    参考: 1.CLRS<算法导论> 2.http://www.csh.rit.edu/~pat/math/quickies/rho/#algorithm Pollard rho方法是随机算法 ...

  4. 简述大数分解算法Pollard Rho和Pollard p-1

    大数分解问题其实至今都是一个世界级难题,最常见的分解法是从2一直找到sqr(N),作为一个密码学专业的学生,每次看到别人这么做来进行因子分解,自己都控制不住想要制止他,因为这个算法的效率简直太太太太太 ...

  5. 64位以内Rabin-Miller 强伪素数测试和Pollard rho 因数分解解析

    在求解POJ1811题Prime Test中应用到的两个重要算法是Rabin-Miller强伪素数测试和Pollard r因数分解算法.前者可以在的时间内以很高的成功概率判断一个整数是否是素数.后者可 ...

  6. python整数分节输出_pyfactor

    pyfactor 基于python的整数分解工具 介绍 pyfactor是一个完全使用python编写的整数分解工具,最大可以分解十进制60位以内的RSA数n=pq. 这个工具是我的毕业设计作品,纯粹 ...

  7. 因数分解 Pollard rho

    因数分解 Pollard rho 算法思路 随机生成两个数a,ba,ba,b,然后求gcd⁡(n,a−b)\gcd\pod{n,a-b}gcd(n,a−b),如果其值不为111,则这个数就是nnn的一 ...

  8. 素数判定质因数分解(数论)(Miller Rabin)(Pollard Rho)

    太玄学了! 我真的被概率的魅力折服了.此前我认为1便是1,0.9999999999-便是0.9999999999-. 但实际上它们有着千丝万缕的关系. 试想,如果一件事发生的概率是0.99999999 ...

  9. 黑盒测试之功能分解法

    功能分解法 前言 概念 需求示例 测试用例分析设计 总结 前言 首先和各位道个歉,最近事情比较多,本来计划的一周一更推迟了这么久.今天咱们继续,开始黑盒测试方法部分的分享. 概念 在学习软件测试的时候 ...

  10. 矩阵的直接LU分解法

    上篇博文由高斯消去法的矩阵形式推出了矩阵的LU分解:矩阵的三角分解法: 实际上,可以直接处理矩阵,得到矩阵的LU分解,这就是矩阵的直接LU分解:直接通过矩阵的元素得到计算LU元素的递推公式,不需要任何 ...

最新文章

  1. 河北省医疗卫生数据中心案例简介
  2. ML基石_1_LearningProblem
  3. 实现接口Controller定义控制器
  4. 2021阿里巴巴大数据技术公开课第一季:外部工具连接SaaS模式云数仓MaxCompute实战
  5. Windows7无损分区
  6. 160523、Oracle建立表空间和用户
  7. MATLAB读写Excel数据
  8. 计算机系统结构安全检测,信息安全体系结构安全测评实验报告.doc
  9. SpringMVC框架----请求参数的绑定
  10. python5000行代码项目_5000行python代码+可视化60W数据,告诉你知乎用户不为人知的事...
  11. 当前时间时间戳以及10分钟后的时间戳
  12. HTML 制作简单的个人简历
  13. (web前端每日一练)用JS制作一个能够在桌面运行的倒计时插件
  14. 【C语言基础学习笔记】一、初始C语言(总结篇)
  15. Python基础教程
  16. 怎么理解token,tokenize,tokenizer.
  17. Android Parcel对象详解
  18. android平板评测,最火7吋Android平板 三星P1010全面评测
  19. 【VS 生成exe程序添加程序图标】
  20. 【R语言数据科学】(十八):系统聚类和K-Means聚类

热门文章

  1. ae镜头光晕插件Optical Flares
  2. 科幻3D场景必备要素—地球篇
  3. 朋友会触动我们的心灵
  4. 【Flask】学习笔记 #12 —— JinJa2模板继承与引入
  5. 2022华为机试真题 C++ 实现【统计射击比赛成绩】
  6. python使用 Captcha 模块来生成验证码图片
  7. java实现Word文件转换成PDF
  8. Python中的函数(二)--提高篇
  9. 【Mysql 第11章_数据处理之增删改】
  10. linux x99 测试,超频测试总结 - 技嘉X99 Phoenix SLI主板评测:综合素质爆表的主板 - 超能网...