题目:点击打开链接

题意:给定一个64位整数,问是否为质数,如果不是,则输出其最小因子。

分析:miller_rabbin素数判定+pollard_rho分解质因子模板题。

Pollard_rho算法的大致流程是 先判断当前数是否是素数(Miller_rabin)了,如果是则直接返回。如果不是素数的话,试图找到当前数的一个因子(可以不是质因子)。然后递归对该因子和约去这个因子的另一个因子进行分解。我们假设要找的因子为p,他是随机取一个x1,由x1构造x2,使得{p可以整除x1-x2 && x1-x2不能整除n}则p=gcd(x1-x2,n),结果可能是1也可能不是1。如果不是1就找寻成功了一个因子,返回因子;如果是1就寻找失败,那么我们就要不断调整x2,具体的办法通常是x2=x2*x2+c(c是自己定的)直到出现x2出现了循环==x1了表示x1选取失败重新选取x1重复上述过程。还存在一个每次找寻范围*2的优化,但是不太懂。Pollard-rho分解的素数会有重复!可以用set去重。

代码:

#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<stdlib.h>
#include<time.h>
#define times 20
using namespace std;
#define ll long long
ll total;
ll factor[110];
ll qmul(ll a,ll b,ll M){a%=M;b%=M;ll ans=0;while (b){if (b&1){ans=(ans+a)%M;}a=(a<<=1)%M;b>>=1;}return ans%M;
}///快乘,因为两个longlong的数相乘可能会溢出,所以这里转乘法为加法,思想和快速幂相似
ll qpow(ll a,ll b,ll int M){ll ans=1;ll k=a;while(b){if(b&1)ans=qmul(ans,k,M)%M;k=qmul(k,k,M)%M;b>>=1;}return ans%M;
}
bool witness(ll a,ll n,ll x,ll sum){ll judge=qpow(a,x,n);if (judge==n-1||judge==1)return 1;while (sum--){judge=qmul(judge,judge,n);if (judge==n-1)return 1;}return 0;
}
bool miller(ll n){ ///判断素数if (n<2)return 0;if (n==2)return 1;if ((n&1)==0)return 0;ll x=n-1;ll sum=0;while (x%2==0){x>>=1;sum++;}for (ll i=1;i<=times;i++){ll a=rand()%(n-1)+1;if (!witness(a,n,x,sum))return 0; ///费马小定理的随机数检验}return 1;
}
ll gcd(ll a,ll b){return b==0?a:gcd(b,a%b);
}
ll pollard(ll n,ll c){ll x,y,d,i=1,k=2;x=rand()%n;y=x;while (1){i++;x=(qmul(x,x,n)+c)%n; ///不断调整xd=gcd(y-x,n);if (d<0)d=-d;if (d>1&&d<n)return d; ///找到因子if (y==x)return n; ///找到循环,返回n,重新来if (i==k){ ///一个优化y=x;k<<=1;}}
}
void find(ll n){///寻找这个数的素因子,并存起来if (miller(n)){factor[++total]=n;return ;}ll p=n;while (p>=n) p=pollard(p,rand()%(n-1)+1); ///不断找因子,知道找到为止,返回n说明没找到find(n/p);find(p);
}
int main(){ll n,m,i,t;scanf("%lld",&t);while (t--){scanf("%lld",&n);if (miller(n)) printf("Prime\n");else {memset(factor,0,sizeof(factor));total=0;find(n);sort(factor+1,factor+total+1);printf("%lld\n",factor[1]);}}
}

Pollard-Rho算法模板(POJ 1811 Prime Test)相关推荐

  1. Poj 1811 Prime Test 素数测试 Miller-Rabin 与 整数的因子分解 Pollard rho

    随机化算法,想尝试自己写一下,最后还是变成了抄代码... 代码参考了:POJ 1811 Prime Test(大素数判断和素因子分解) - kuangbin - 博客园 学习链接: Miller-Ra ...

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

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

  3. POJ 1811 Prime Test (Rabin-Miller强伪素数测试 和Pollard-rho 因数分解)

    题目链接 Description Given a big integer number, you are required to find out whether it's a prime numbe ...

  4. c语言用rho函数求复数模长,Pollard Rho 算法简介

    $\text{update 2019.8.18}$ 由于本人将大部分精力花在了cnblogs上,而不是洛谷博客,评论区提出的一些问题直到今天才解决. 下面给出的Pollard Rho函数已给出散点图. ...

  5. POJ 1811 Prime Test

    题意:对于一个大整数,判断是否质数,如果不是质数输出最小质因子. 解法:判断质数使用Miller-Rabin测试,分解质因子使用Pollard-Rho,Miller-Rabin测试用的红书模板,将测试 ...

  6. BZOJ 5330 Luogu P4607 [SDOI2018]反回文串 (莫比乌斯反演、Pollard Rho算法)

    题目链接 (BZOJ) https://www.lydsy.com/JudgeOnline/problem.php?id=5330 (Luogu) https://www.luogu.org/prob ...

  7. POJ 1811 Prime Test

    Miller-Rabin测试 + Pollard-rho因子分解.关于Pollard-rho的总结以后会写上,Miller-Tabin测试见:http://www.cnblogs.com/vongan ...

  8. 因数分解 Pollard rho

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

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

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

  10. 【快速因数分解】Pollard's Rho 算法

    算法目的 给一个数n,快速提取n的一个因数. 算法根据:生日悖论 讲生日悖论之前,先看一个东西. 给出[1-1000]的数,从中任意选出一个数为k的概率是110001\over 100010001​. ...

最新文章

  1. Python统计字符串中的中英文字符、数字空格,特殊字符
  2. Visual C++2005库的十项突破性变化
  3. CAS 服务器端取消 https的配置 方法
  4. Swift数据类型(一)
  5. 应用虚拟化的五大理由
  6. Java学习笔记十五
  7. nagios客户端nrped服务方式启动脚本
  8. JVM—类加载过程学习
  9. ANE 在 Android 上的应用
  10. 双目视觉摄像机的参数标定参考坐标系介绍
  11. LightOJ 1406 Assassin`s Creed
  12. 用python做公众号网页_使用python一步一步搭建微信公众平台(一)
  13. 微信小程序开发者工具的使用
  14. Linux下core文件介绍与使用方法
  15. 订单可视化(智能制造、流程再造、企业信息化) 第七篇 经营班子掌舵,业务与开发分离,走向成功必备条件
  16. 简述API HOOK技术及原理
  17. c/c++: window下安装mingw-w64
  18. 鸿蒙os2.0第一批升级名单,首批升级鸿蒙OS名单终于来了!
  19. 沁路墨彦文集:《闭关与梦的思索》
  20. C#调用斑马打印机打印条码标签(支持COM、LPT、USB、TCP连接方式和ZPL、EPL、CPCL指令)【转】...

热门文章

  1. 拼接播放地址_杰和科技G330六屏拼接主机带来差异化6屏拼接方案
  2. 实现3D 场景——three.js学习篇二之理解基础概念
  3. 学习用PS美化软件界面
  4. JavaEE | 集合2之Map
  5. Python实现特定格式的时间差自动计算
  6. Golang学习(十四)数组
  7. 趋势交易大师php,大道至简——多级别均线共振交易系统
  8. 古诗词在线起名 - 一刀工具箱
  9. java启动临时文件_File.createTempFile创建临时文件的示例详解
  10. js报错“TypeError: ‘stepUp‘ called on an object that does not implement interface HTMLInputElement”