/*
* 大整数分解到现在都是世界级的难题,但却是一个重要的研究方向,大整数在公共密钥的研究上有着重要的作用
* Pollard Rho算法的原理就是通过某种方法得到两个整数a和b.而待分解的大整数为n,计算p=gcd(abs(a-b),n),直到p不为1或者a,b出现循环为止.
* 然后再判断是否为n,如果p==n||p==1,那么返回n时一个质数
* 否则p就是n的一个因子
* 那么我们又可以递归地计算Pollard(p)和Pollard(n/p).
* 最后就可以推出n的所有质因子
*
* 具体操作中我们常常使用函数 x[i+1]=(x[i]*x[i]+c)%n 来逐步迭代计算a和b的值,通常c取1,即b=a*a+1,在下一次计算中,将b的值赋给a,再次使用上式来计算新的b的值,当a,b出现循环时即可退出判断.(初值自己确定)
* 但是这样的话判断循环比较麻烦,这里给出Floyd(没错又是他)发明的一个聪明而又有趣的算法:
* 假设我们在一个很长很长的圆形轨道上面行走,如何知道自己已经走了一圈了呢?
* 可以让两个人A和B按照 vb = va<<1 从同一起点开始向前走,当B第一次赶上A时,我们就知道B已经走了两圈
* 所以我们可以把x当作B,把y当作A,然后进行循环测试
*
* 对于Pollard Rho算法,它可以在O(sqrt(p))的时间复杂度内找到n的一个小因子p,可见效率还是可以的
* 但是对于一个因子很少或者因子值很大的大整数n来说,这个算法的复杂度依然不是很好
*/
//以下给出Pollard Rho和Miller-Rabin素数测试配合使用的整数分解算法
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
typedef long long ll;
const int counts = ,N = ; ll tot,cnt,fac[N],num[N]; ll gcd(ll a,ll b)
{return b?gcd(b,a%b):a;} ll qpow(ll a,ll x,ll p)
{
ll ret=;
for(;x;x>>=,a=a*a%p)
if(x&)
ret=ret*a%p;
return ret;
} ll multi(ll a,ll b,ll p)
{
ll ans=;
a%=p;
for(;b;b>>=,a=(a<<)%p)
if(b&)
ans=(ans+a)%p;
return ans;
} bool Miller_Rabin(ll n)
{
if(n==)return true;
if(n< || !(n&))return false;
ll m=n-,a,x,y;int k=;
while(!(m&))++k,m>>=;
for(int i=;i<counts;++i)
{
a=rand()%(n-)+;
x=qpow(a,m,n);
y=;
for(int j=;j<k;++j)
{
y=multi(x,x,n);
if(y== && x!=- && x!=n-)return false;
x=y;
}
if(y != -)return false;
}
return true;
} ll Pollard_Rho(ll n,ll c)
{
ll i=,k=,x=rand()%(n-)+,y=x,d;
while("fighting")
{
++i;
x=(multi(x,x,n)+c)%n;
d=gcd((y-x+n),n);
if(<d && d<n)return d;
if(y == x)return n;
if(i == k)y=x,k<<=;
}
} void find(ll n,int c)
{
if(n == )return ;
if(Miller_Rabin(n))
{
fac[tot++]=n;
return ;
}
ll p=n,k=c;
while(p>=n)p=Pollard_Rho(p,c--);
find(p,k);
find(n/p,k);
} int main()
{
ll n;
while(std::cin>>n)
{
tot=;
find(n,);
std::sort(fac,fac+tot);
num[]=;
int k=;
for(int i=;i<tot;++i)
{
if(fac[i] == fac[i-])
++num[k-];
else
{
num[k]=;
fac[k++]=fac[i];
}
}
cnt=k;
for(int i=;i<cnt;++i)
std::cout<<fac[i]<<"^"<<num[i]<<" ";
std::cout<<std::endl;
}
return ;
}

Pollard-Rho算法求大数质因子的更多相关文章

  1. cf 151 C. Win or Freeze (博弈 求大数质因子)

    题目 题意: 给一个数N,两人轮流操作每次将N变为一个N的非1非自身的因数,第一个无法进行操作的人获胜问先手是否有必胜策略,如果有的话在第二行输出第一步换成哪个数,如果第一步就不能操作则输出0数据规模 ...

  2. Pollard Rho 算法简介

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

  3. Miller Rabin素数检测与Pollard Rho算法

    一些前置知识可以看一下我的联赛前数学知识 如何判断一个数是否为质数 方法一:试除法 扫描\(2\sim \sqrt{n}\)之间的所有整数,依次检查它们能否整除\(n\),若都不能整除,则\(n\)是 ...

  4. Pollard rho算法+Miller Rabin算法 BZOJ 3668 Rabin-Miller算法

    BZOJ 3667: Rabin-Miller算法 Time Limit: 60 Sec  Memory Limit: 512 MBSubmit: 1044  Solved: 322[Submit][ ...

  5. 初学Pollard Rho算法

    前言 \(Pollard\ Rho\)是一个著名的大数质因数分解算法,它的实现基于一个神奇的算法:\(MillerRabin\)素数测试(关于\(MillerRabin\),可以参考这篇博客:初学Mi ...

  6. Pollard Rho算法浅谈

    Pollard Rho介绍 Pollard Rho算法是Pollard[1]在1975年[2]发明的一种将大整数因数分解的算法 其中Pollard来源于发明者Pollard的姓,Rho则来自内部伪随机 ...

  7. Java实现 蓝桥杯 算法提高 Monday-Saturday质因子

    试题 算法提高 Monday-Saturday质因子 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 这个问题是个简单的与数论有关的题目,看起来似乎是"求正整数的所有质因子 ...

  8. 大整数分解质因数(Pollard rho算法)

    #include <iostream> #include <cstring> #include <cstdlib> #include <stdio.h> ...

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

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

随机推荐

  1. 1.将控制器添加到 ASP.NET Core MVC 应用

    模型-视图-控制器 (MVC) 体系结构模式将应用分成 3 个主要组件:模型 (M).视图 (V) 和控制器 (C). 模型(M):表示应用数据的类. 模型类使用验证逻辑来对该数据强制实施业务规则. ...

  2. igel udc2 config

    igel udc2 config 系统安装盘下载地址 http://www.myigel.biz/?forcedownload /config/bin/igelone_config #!/bin/sh ...

  3. python安装和pycharm安装与笔记

    目录 计算机的基础知识 python安装和使用 pycharm安装和使用 [TOC] 计算机的基础知识 计算机是由什么组成的 cpu-----大脑 主板----身体 电源----心脏 内存----临时 ...

  4. html5的基本介绍

    前言 (1)什么是HTML? 指超文本标记语言(Hyper Text Markup Language); 是用来描述网页的一种语言: 不是编程语言,是一种标记语言: (更多详细内容,百度:https: ...

  5. localStorage的增删改查

    var _localStorage = window.localStorage; undefined /* 增 */ _localStorage.name = '张泰松' "张泰松" ...

  6. MySQL 统计上一周从周一到周日的用户

    这个功能按理说很常见,奇怪的是很难搜索到一个合适的.稍微整理了下,具体的就不展开了,注意这个表中的时间为毫秒,这条语句拷贝复制就能用.照顾大部分的无脑码农. SELECT case when FROM ...

  7. dom4j 解析字符串成树形结构

    引入maven依赖: <dependency> <groupId>dom4j</groupId> <artifactId>dom4j</artif ...

  8. MySQL每天产生了多大容量的binlog,用SQL语句能查到吗?

    首先,这是个假设性命题(又一个钓鱼题). 这个需求完全可以通过系统层命令,配合MySQL中的"FLUSH BINARY LOGS"快速完成. 运行SHOW MASTER/BINAR ...

  9. K8S 部署 ingress-nginx 配置 https

    生成证书 mkdir cert && cd cert # 生成私钥 tls.key, 密钥位数是 2048 openssl genrsa -out tls.key 2048 # 使用 ...

  10. WSL quick overview

    简介 WSL,是Windows Subsystem for Linux的缩写,字面意义上理解就是WIndows下的Linux子系统.WSL 由Microsoft Windows内核团队创建,目前如果最 ...