Pollard rho整数分解法
首先说一下对不是很大的整数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整数分解法相关推荐
- 大整数分解——Pollard Rho算法
延续上一篇,这次来讲一讲大整数分解算法的应用. 要解决的问题很简单,对一个整数进行分解质因数. 首先还是效率非常低的暴力算法,相信大家都会,不多提. 和上次一样,当数达到非常大的时候,分解将变得非常困 ...
- 连分数分解法寻找整数的因子(Python)
首先,先讲个小故事. 1903年10月,科尔(Cole)在纽约参加美国数学(AMS)的一个会议,议程里有他的一篇题目平淡的论文:"关于一个大数的分解".大会主席请他宣读论文时,一向 ...
- 整数的素因子分解:Pollard rho method
参考: 1.CLRS<算法导论> 2.http://www.csh.rit.edu/~pat/math/quickies/rho/#algorithm Pollard rho方法是随机算法 ...
- 简述大数分解算法Pollard Rho和Pollard p-1
大数分解问题其实至今都是一个世界级难题,最常见的分解法是从2一直找到sqr(N),作为一个密码学专业的学生,每次看到别人这么做来进行因子分解,自己都控制不住想要制止他,因为这个算法的效率简直太太太太太 ...
- 64位以内Rabin-Miller 强伪素数测试和Pollard rho 因数分解解析
在求解POJ1811题Prime Test中应用到的两个重要算法是Rabin-Miller强伪素数测试和Pollard r因数分解算法.前者可以在的时间内以很高的成功概率判断一个整数是否是素数.后者可 ...
- python整数分节输出_pyfactor
pyfactor 基于python的整数分解工具 介绍 pyfactor是一个完全使用python编写的整数分解工具,最大可以分解十进制60位以内的RSA数n=pq. 这个工具是我的毕业设计作品,纯粹 ...
- 因数分解 Pollard rho
因数分解 Pollard rho 算法思路 随机生成两个数a,ba,ba,b,然后求gcd(n,a−b)\gcd\pod{n,a-b}gcd(n,a−b),如果其值不为111,则这个数就是nnn的一 ...
- 素数判定质因数分解(数论)(Miller Rabin)(Pollard Rho)
太玄学了! 我真的被概率的魅力折服了.此前我认为1便是1,0.9999999999-便是0.9999999999-. 但实际上它们有着千丝万缕的关系. 试想,如果一件事发生的概率是0.99999999 ...
- 黑盒测试之功能分解法
功能分解法 前言 概念 需求示例 测试用例分析设计 总结 前言 首先和各位道个歉,最近事情比较多,本来计划的一周一更推迟了这么久.今天咱们继续,开始黑盒测试方法部分的分享. 概念 在学习软件测试的时候 ...
- 矩阵的直接LU分解法
上篇博文由高斯消去法的矩阵形式推出了矩阵的LU分解:矩阵的三角分解法: 实际上,可以直接处理矩阵,得到矩阵的LU分解,这就是矩阵的直接LU分解:直接通过矩阵的元素得到计算LU元素的递推公式,不需要任何 ...
最新文章
- 河北省医疗卫生数据中心案例简介
- ML基石_1_LearningProblem
- 实现接口Controller定义控制器
- 2021阿里巴巴大数据技术公开课第一季:外部工具连接SaaS模式云数仓MaxCompute实战
- Windows7无损分区
- 160523、Oracle建立表空间和用户
- MATLAB读写Excel数据
- 计算机系统结构安全检测,信息安全体系结构安全测评实验报告.doc
- SpringMVC框架----请求参数的绑定
- python5000行代码项目_5000行python代码+可视化60W数据,告诉你知乎用户不为人知的事...
- 当前时间时间戳以及10分钟后的时间戳
- HTML 制作简单的个人简历
- (web前端每日一练)用JS制作一个能够在桌面运行的倒计时插件
- 【C语言基础学习笔记】一、初始C语言(总结篇)
- Python基础教程
- 怎么理解token,tokenize,tokenizer.
- Android Parcel对象详解
- android平板评测,最火7吋Android平板 三星P1010全面评测
- 【VS 生成exe程序添加程序图标】
- 【R语言数据科学】(十八):系统聚类和K-Means聚类
热门文章
- ae镜头光晕插件Optical Flares
- 科幻3D场景必备要素—地球篇
- 朋友会触动我们的心灵
- 【Flask】学习笔记 #12 —— JinJa2模板继承与引入
- 2022华为机试真题 C++ 实现【统计射击比赛成绩】
- python使用 Captcha 模块来生成验证码图片
- java实现Word文件转换成PDF
- Python中的函数(二)--提高篇
- 【Mysql 第11章_数据处理之增删改】
- linux x99 测试,超频测试总结 - 技嘉X99 Phoenix SLI主板评测:综合素质爆表的主板 - 超能网...