/*
* 大整数分解到现在都是世界级的难题,但却是一个重要的研究方向,大整数在公共密钥的研究上有着重要的作用
* 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. Scala 系列(一)—— Scala 简介及开发环境配置

    一.Scala简介 1.1 概念 Scala 全称为 Scalable Language,即"可伸缩的语言",之所以这样命名,是因为它的设计目标是希望伴随着用户的需求一起成长.Sc ...

  2. 关于java中是引用传递还是值传递的问题

    关于JAVA中参数传递问题有两种,一种是按值传递(如果是基本类型),另一种是按引用传递(如果是對象).首先以两个例子开始:1)public class Test2 { public static vo ...

  3. 手写ORM入门篇(一)

    对象关系映射(英语:(Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换 . ...

  4. java之aop

    1.AOP:aspect orientied programming 面向切面编程.就是横向编程. 2.面向切面编程是在不改变原有代码的情况下增加新的功能. 3.在spring中面向切面编程有两种应用 ...

  5. EFCore自动迁移

    2019/05/14,EFCore 2.2.4 有两种方式: 使用Migrate()方法 if (DbContext.Database.GetPendingMigrations().Any()) { ...

  6. maven安装本地jar到本地仓库

    注册到本地仓库 mvn install:install-file -DgroupId=cn.endv -DartifactId=endv-api -Dversion=1.0.1 -Dpackaging ...

  7. Mybatis中使用association及collection进行一对多双向关联示例(含XML版与注解版)

    XML版本: 实体类: package com.sunwii.mybatis.bean; import java.util.ArrayList; import java.util.List; impo ...

  8. Git撤销add、commit

    撤销add git status 查看当下更新的文件 git reset HEAD 表示撤销上次add的所有文件 git reset HEAD dir/dir/test.php 撤销指定文件 撤销co ...

  9. 2019-07-22 phpStudy配置虚拟主机

    1.右击 phpStudy ->[打开配置文件]->[vhosts-conf]: 2.在里面加入如下代码,并保存: NameVirtualHost *:80 <VirtualHost ...

  10. Flask框架 请求与响应 & 模板语法

    目录 Flask框架 请求与响应 & 模板语法 简单了解Flask框架 Flask 框架 与 Django 框架对比 简单使用Flask提供服务 Flask 中的 Response(响应) F ...