poj 1811 Pallor Rho +Miller Rabin
/*
题目:给出一个数 如果是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的更多相关文章
- POJ1811_Prime Test【Miller Rabin素数测试】【Pollar Rho整数分解】
Prime Test Time Limit: 6000MS Memory Limit: 65536K Total Submissions: 29193 Accepted: 7392 Case Time ...
- POJ2429_GCD & LCM Inverse【Miller Rabin素数測试】【Pollar Rho整数分解】
GCD & LCM Inverse Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 9756Accepted: 1819 ...
- Pollard rho算法+Miller Rabin算法 BZOJ 3668 Rabin-Miller算法
BZOJ 3667: Rabin-Miller算法 Time Limit: 60 Sec Memory Limit: 512 MBSubmit: 1044 Solved: 322[Submit][ ...
- POJ1811_Prime Test【Miller Rabin素数測试】【Pollar Rho整数分解】
Prime Test Time Limit: 6000MS Memory Limit: 65536K Total Submissions: 29193 Accepted: 7392 Case Time ...
- 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 这 ...
- POJ1811- Prime Test(Miller–Rabin+Pollard's rho)
题目大意 给你一个非常大的整数,判断它是不是素数,如果不是则输出它的最小的因子 题解 看了一整天<初等数论及其应用>相关部分,终于把Miller–Rabin和Pollard's rho这两 ...
- HDU1164_Eddy'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 ...
- Miller Rabin素数检测与Pollard Rho算法
一些前置知识可以看一下我的联赛前数学知识 如何判断一个数是否为质数 方法一:试除法 扫描\(2\sim \sqrt{n}\)之间的所有整数,依次检查它们能否整除\(n\),若都不能整除,则\(n\)是 ...
- HDU 3864 D_num Miller Rabin 质数推断+Pollard Rho大整数分解
链接:http://acm.hdu.edu.cn/showproblem.php? pid=3864 题意:给出一个数N(1<=N<10^18).假设N仅仅有四个约数.就输出除1外的三个约 ...
随机推荐
- 再次探究Android ListView缓存机制
概述 虽然现在5.0后Google推出了RecycleView,但在5.0 Lollipop普及前Listview仍会被广泛使用,所以打算再次探究一下Listview的源码,了解一下Listview ...
- 从ipad相机相册读取相片并保存
以下是从实际项目中截取的例子,从一个button中启动获得相片 -(IBAction)blumbtnTap:(id)sender { // 判断是否支持相机 // UIAlertView *alert ...
- 『安全科普』WEB安全之渗透测试流程
熟悉渗透流程,攻击会像摆积木一样简单! 0x 01:信息收集 收集网站信息对渗透测试非常重要,收集到的信息往往会让你在渗透中获得意外惊喜. 1. 网站结构 可以使用扫描工具扫描目录,主要扫出网站管理员 ...
- oracle 对象权限 系统权限 角色权限
系统权限: 允许用户执行特定的数据库动作,如创建表.创建索引.连接实例等 对象权限: 允许用户操纵一些特定的对象,如读取视图,可更新某些列.执行存储过程等 select * from user_sys ...
- sublime text3入门笔记以及屏蔽sublime自动升级检测更新
两个月前学习python的时候,有人推荐这个程序员最好用的编辑器,我下载了之后,发现比notepad++要好用很多,目前来说,网上成熟的版本是sublime text2简体中文版,插件也是很兼容,我用 ...
- Cow Exhibition
poj2184:http://poj.org/problem?id=2184 题意:给你n头牛,每头牛有一个S值和一个F值,现在的问题是,要你选出其中的一些牛求出S+T的最大值.但是要保证总的s> ...
- oracle中的exists 和not exists 用法详解(转)
有两个简单例子,以说明 “exists”和“in”的效率问题 1) select * from T1 where exists(select 1 from T2 where T1.a=T2.a) ; ...
- c++ explicit
C++ explicit关键字用来修饰类的构造函数,表明该构造函数是显式的,既然有"显式"那么必然就有"隐式",那么什么是显示而什么又是隐式的呢? 如果c++类 ...
- BZOJ 1059 [ZJOI2007]矩阵游戏
1059: [ZJOI2007]矩阵游戏 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2707 Solved: 1322[Submit][Stat ...
- 【转】Any way to implement BLE notifications in Android-L preview----不错
原文网址:http://stackoverflow.com/questions/24865120/any-way-to-implement-ble-notifications-in-android-l ...