/*
题目:给出一个数 如果是prime 输出prime 否则输出他的最小质因子
Miller Rabin +Poller Rho 大素数判定+大数找质因子
后面这个算法嘛 基于Birthday Paradox
简单点说就是 在 1到100 内去一个数 ai ai==42的概率很小
但是如果取两个数 ai bi ai-bi==42 的概率就会变大
应用到找素因子上 就不用像试除法那样一个一个的试
但是如果枚举ai bi 显然也很slow 那么有一个非常好使(奇怪)的函数
f(x)=x*x+c 这样将x和f(x)%p作为两个数 看看x-f(x) 与p的关系
这里我们不是试试 p%(x-f(x))==0来找 而是 gcd一下 d=(p,(x-f(x)))
d显然是p的因子 然后分解d 这样就ok了 */
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<ctime>
#include<cmath>
#define ll long long
using namespace std;
ll T,ans[],tot;
ll init()
{
ll x=;char s;s=getchar();
while(s<''||s>'')s=getchar();
while(s>=''&&s<=''){x=x*+s-'';s=getchar();}
return x;
}
ll gcd(ll a,ll b)
{
return !b?a:gcd(b,a%b);
}
ll slow_mul(ll a,ll b,ll c)//防止爆掉
{
a=a%c;b=b%c;
ll an=;
while(b)
{
if(b&)
{
b--;
an=an+a;
an=an%c;
}
a<<=;a=a%c;b>>=;
}
return an;
}
ll Mi(ll a,ll m,ll p)
{
if(m==)return ;
ll x=Mi(a,m/,p)%p;
x=slow_mul(x,x,p);
if(m&)x=slow_mul(x,a,p);
return x;
}
ll Pollard_rho(ll p,ll c)
{
ll i=,k=;
ll x=rand()%(p-)+;
ll fx=x;
while()
{
i++;
x=(slow_mul(x,x,p)+c)%p;
ll g=gcd(fx-x+p,p);//防止fx-x<0
if(g!=&&g!=p)return g;//找到一个因子
if(x==fx)return p;//进入环 换一个随机数
if(i==k)
{
k=k+k;
fx=x;
}
}
}
bool Miller_Rabin(ll n)
{
if(n==)return ;
if(n==||!(n&))return ;
ll m=n-,j=;
while(!(m&))
{
j++;
m=m>>;
}
//srand(unsigned(time(0)));丫丫的poj用srand会RE 我看了好久0.0
for(int i=;i<=;i++)
{
ll a=rand()%(n-)+;
ll x=Mi(a,m,n);
for(int k=;k<=j;k++)
{
ll y=slow_mul(x,x,n);
if(y==&&x!=&&x!=n-)return ;
x=y;
}
if(x!=)return ;
}
return ;
}
void findpri(ll n)//质因数分解n
{
if(n<=)return;
if(Miller_Rabin(n))
{
ans[++tot]=n;
return ;
}
ll p=n;
while(p==n)//可能生成的随机数不合适
p=Pollard_rho(p,rand()%(n-)+);//返回n的一个因子
findpri(p);
findpri(n/p);
}
int main()
{
T=init();
while(T--)
{
ll n=init();
if(Miller_Rabin(n))//素数先来个判断
{
printf("Prime\n");
continue;
}
memset(ans,,sizeof(ans));//所有质因子
tot=;
findpri(n);//找质因子
ll an=ans[];
for(int i=;i<=tot;i++)
an=min(an,ans[i]);
printf("%lld\n",an);
}
return ;
}

poj 1811 Pallor Rho +Miller Rabin的更多相关文章

  1. POJ1811_Prime Test【Miller Rabin素数测试】【Pollar Rho整数分解】

    Prime Test Time Limit: 6000MS Memory Limit: 65536K Total Submissions: 29193 Accepted: 7392 Case Time ...

  2. POJ2429_GCD &amp; LCM Inverse【Miller Rabin素数測试】【Pollar Rho整数分解】

    GCD & LCM Inverse Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 9756Accepted: 1819 ...

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

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

  4. POJ1811_Prime Test【Miller Rabin素数測试】【Pollar Rho整数分解】

    Prime Test Time Limit: 6000MS Memory Limit: 65536K Total Submissions: 29193 Accepted: 7392 Case Time ...

  5. POJ2429 - GCD & LCM Inverse(Miller–Rabin+Pollard's rho)

    题目大意 给定两个数a,b的GCD和LCM,要求你求出a+b最小的a,b 题解 GCD(a,b)=G GCD(a/G,b/G)=1 LCM(a/G,b/G)=a/G*b/G=a*b/G^2=L/G 这 ...

  6. POJ1811- Prime Test(Miller–Rabin+Pollard's rho)

    题目大意 给你一个非常大的整数,判断它是不是素数,如果不是则输出它的最小的因子 题解 看了一整天<初等数论及其应用>相关部分,终于把Miller–Rabin和Pollard's rho这两 ...

  7. HDU1164_Eddy&#39;s research I【Miller Rabin素数测试】【Pollar Rho整数分解】

    Eddy's research I Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

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

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

  9. HDU 3864 D_num Miller Rabin 质数推断+Pollard Rho大整数分解

    链接:http://acm.hdu.edu.cn/showproblem.php? pid=3864 题意:给出一个数N(1<=N<10^18).假设N仅仅有四个约数.就输出除1外的三个约 ...

随机推荐

  1. mysql数据库管理备份运维常用命令

    登陆mysql: mysql -u root -p password 远程访问开启((%)表示任何主机连接,可以换固定IP来访问远程连接): GRANT ALL ON *.* TO root@'%' ...

  2. ALAsset和ALAssetRepresentation

    ALAsset类代表相册中的每个资源文件,可以通过它获取资源文件的相关信息还能修改和新建资源文件,ALAssetRepresentation类代表相册中每个资源文件的详细信息,可以通过它获取资源的大小 ...

  3. SQL语句の集锦

    6.删除数据后根据主键从备份表中恢复 insert  sameTable_1 (name,dz) select name,dz from sameTable_1_bak where not exist ...

  4. Unix/Linux运维首选工具Xmanager Enterprise 3.0的使用教程

    管理Uinx和Linux服务器的兄弟们应该很熟悉Xmanager,一个窗口可以同时控制上百台Linux和Unix服务器,功能非常强大!^_^请看: manager是一个简单易用的高性能的运行在Wind ...

  5. 数据结构(动态树):UOJ 207 共价大爷游长沙

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABHwAAAJZCAIAAABUW7XHAAAgAElEQVR4nOy93cstx5Xm2f9TXh2EOe

  6. 使用DateDiff方法获取日期时间的间隔数

    一:用DateDiff方法获取日期时间的间隔数,截图 二:代码 using System; using System.Windows.Forms; using Microsoft.VisualBasi ...

  7. QTP自传之测试报告

    前言 测试报告是测试阶段的最后产出,也是最重要的产出,自动化测试报告也是如此.前期所做的工作,添加对象.编写脚本等都是为了可以生成一份正确.严谨的测试报告.我作为一款功能全面的自动化测试工具,毫无疑问 ...

  8. HDOJ(HDU) 2143 box(简单的多次判断-用的卫条件)

    Problem Description One day, winnie received a box and a letter. In the letter, there are three inte ...

  9. 数学概念——A 几何概型

    You are going from Dhaka to Chittagong by train and you came to know one of your old friends is goin ...

  10. Sum It Up(搜索)

    http://acm.hdu.edu.cn/showproblem.php?pid=1258 include include include include using namespace std; ...