原本是想把这个算法搞懂的,然后在网上看了又看,觉得,还是有时间再来看吧,我错了。

看到了一个大佬的博客,顺带收集一下板子

这个板子可以求大数的最大的因子。

#define LL long long
bool IsPrime(LL);//返回素性测试结果
LL GCD(LL,LL);//返回两个数的GCD
LL Mix(LL,LL,LL);//返回两个数在模运算下的乘积void MaxFactor(LL n,LL &ans)
{if(n==1||n<=ans||IsPrime(n)){return;//判断特殊情况:n为1或素数}for(LL c=rand()%(n-1)+1;;c++){//为防止随机数无效化,使用死循环LL t1=rand()%(n-1)+1,t2=(Mix(t1,t1,n)+c)%n;LL p=1,i=0,g=0;while(t1!=t2){p=Mix(p,abs(t1-t2),n);if(!p){//乘积为0时说明找到了一个因子g=GCD(n,abs(t1-t2));if(g>1&&g<n){MaxFactor(g,ans);MaxFactor(n/g,ans);}return;}++i;if(i==127){//当有127个数时强制测试g=GCD(n,p);if(g>1&&g<n){MaxFactor(g,ans);MaxFactor(n/g,ans);return;}p=1,i=0;}t1=(Mix(t1,t1,n)+c)%n;t2=(Mix(t2,t2,n)+c)%n;t2=(Mix(t2,t2,n)+c)%n;}g=GCD(n,p);if(g>1&&g<n){//循环退出后收尾MaxFactor(g,ans);MaxFactor(n/g,ans);return;}}
}

又找了一个板子,这个好像可以求出所有的因子(保存在数组factor中)

#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]);}}
}

Pollar Rho算法相关推荐

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

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

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

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

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

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

  4. GCD and LCM Aizu - 0005(辗转相除)+GCD LCM Inverse POJ - 2429(java或【Miller Rabin素数測试】+【Pollar Rho整数分解】)

    题目:GCD and LCM Aizu - 0005 Write a program which computes the greatest common divisor (GCD) and the ...

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

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

  6. 数学--数论---P4718 Pollard-Rho算法 大数分解

    P4718 [模板]Pollard-Rho算法 题目描述 MillerRabin算法是一种高效的质数判断方法.虽然是一种不确定的质数判断法,但是在选择多种底数的情况下,正确率是可以接受的.Pollar ...

  7. $PollardRho$ 算法及其优化详解

    \(PollardRho\) 算法总结: Pollard Rho是一个非常玄学的算法,用于在\(O(n^{1/4})\)的期望时间复杂度内计算合数n的某个非平凡因子(除了1和它本身以外能整除它的数). ...

  8. 《算法竞赛中的初等数论》(一)正文 0x00整除、0x10 整除相关(ACM / OI / MO)(十五万字符数论书)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 写在最前面:本文部分内容来自网上各大博客或是各类图书,由我个人整理,增加些许见解,仅做学习交流使用,无 ...

  9. 因数分解 Pollard rho

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

最新文章

  1. 使用迭代查找一个list中最小和最大值,并返回一个tuple。
  2. eclipse类文件无法找到_「Revit技巧」新建项目和族时无法找到样板文件(丢失)?...
  3. koa2 仿知乎笔记
  4. iOS的四种持久化存储
  5. Spring Data R2DBC 响应式数据库操作使用
  6. 深入浅出通信原理知识点8
  7. 利用445 端口渗透
  8. 2012年托福听力真题词汇总结
  9. google账号市场登陆
  10. PS7.0 下雨效果
  11. 阿里任务调度SchedulerX2.0和阿里云大数据任务结合
  12. git 删除本地未提交的内容
  13. 【如何下载钉钉云课堂视频】
  14. 使用MATLAB实现基于BP神经网络训练的手写字母识别程序
  15. hBuilder天蓝主题插件
  16. bg算法 matlab,求助大神,有关BG算法
  17. 网络空间安全相关知识点
  18. VideoCapture通用属性标识符
  19. 浙江工业大学简易绩点计算器c++版
  20. 城市大脑英文论文在2018 IEEE CCSWD会议发表

热门文章

  1. html5有哪些新特性、移除了那些元素?如何处理HTML5新标签的浏览器兼容问题?如何区分 HTML 和 HTML5?...
  2. Python中Dict的查找
  3. Windows 自启动总结《转》
  4. asp.net+mvc+easyui+sqlite 简单用户系统学习之旅(二)—— easyui的简单实用
  5. servlet中文乱码处理
  6. Oracle 查询历史数据(转帖)
  7. 对JSON的一点认识和理解以及JQuery处理JSON
  8. 【转】TeeChart的用法
  9. java jni helloword_JNI入门教程之HelloWorld篇
  10. 计算机原理及应用课程,课程介绍