POJ 1811 Prime Test( Pollard-rho整数分解经典题 )
**链接:****传送门 **
题意:输入 n ,判断 n 是否为素数,如果是合数输出 n 的最素因子
思路:Pollard-rho经典题
/*************************************************************************
> File Name: Pollard_rho_Test.cpp
> Author: WArobot
> Blog: http://www.cnblogs.com/WArobot/
> Created Time: 2017年05月24日 星期三 10时55分04秒
************************************************************************/
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstdlib>
using namespace std;
#define ll long long
#define TIME 30
const int MAX_N = 1000;
const int C = 201;
ll number = 0 , MIN ;
int List[MAX_N];
// --------------------Miller_Rabin素数测试-------------------------
ll RANDOM(ll n){ return (ll)((double)rand()/RAND_MAX * n + 0.5); }
ll quick_multi(ll a,ll b,ll Mod){ // 快速计算 a * b % Mod
ll ret = 0;
while(b){
if(b&1) ret = (ret + a) % Mod;
a = ( a << 1 ) % Mod;
b >>= 1;
}
return ret % Mod;
}
ll quick_pow(ll a,ll x,ll Mod){ // 快速计算 a^x % Mod
ll ret = 1;
while(x){
if(x&1) { ret = quick_multi( ret , a , Mod); x--; }
x >>= 1;
a = quick_multi( a , a , Mod );
}
return ret % Mod;
}
bool Witness(ll a,ll n){ // Miller_Rabin 二次探测
ll tmp = n - 1;
int j = 0;
while( !( tmp & 1 ) ){ tmp >>= 1; j++; }
ll x = quick_pow( a , tmp , n );
if( x == 1 || x == n-1 ) return false;
while( j-- ){
x = x*x % n ;
if( x == n-1 ) return false;
}
return true;
}
bool Miller_Rabin(ll n){ // 检测n是否为素数
if( n < 2 ) return false;
if( n == 2 ) return true;
if( !(n&1) ) return false;
for(int i = 1 ; i <= TIME ; i++){
ll a = RANDOM( n - 2 ) + 1; // 得到随机底数
if( Witness( a , n ) ) return false;
}
return true;
}
// --------------------Pollard_rho大整数分解-------------------------
ll gcd(ll a,ll b){ return b == 0 ? a : gcd( b , a%b ); }
ll Pollard_rho(ll n,ll c){ // 找到n的一个因子
ll x , y , d , i = 1 , k = 2;
x = RANDOM( n - 1 ) + 1;
y = x;
while(true){
i++;
x = ( quick_multi( x , x , n ) + c ) % n;
d = gcd( y - x , n );
if( 1 < d && d < n ) return d;
if( y == x ) return n;
if( i == k ){
y = x; k <<= 1;
}
}
}
void find(ll n,ll c){
if( n == 1 ) return;
if( Miller_Rabin(n) ){
List[ number++ ] = n ;
MIN = min( MIN , n );
return;
}
ll p = n ;
while( p >= n ) p = Pollard_rho( p , c-- );
find( p , c );
find( n/p , c );
}
int main(){
int T; ll tar , tmp = pow(2,54)-1;
scanf("%d",&T);
while(T--){
scanf("%lld",&tar);
if( Miller_Rabin(tar) ) printf("Prime\n");
else{
MIN = tmp;
find( tar , C );
printf("%lld\n",MIN);
}
}
return 0;
}
POJ 1811 Prime Test( Pollard-rho整数分解经典题 )的更多相关文章
- POJ 2429 GCD & LCM Inverse (Pollard rho整数分解+dfs枚举)
题意:给出a和b的gcd和lcm,让你求a和b.按升序输出a和b.若有多组满足条件的a和b,那么输出a+b最小的.思路:lcm=a*b/gcd lcm/gcd=a/gcd*b/gcd 可知a/gc ...
- POJ1811_Prime Test【Miller Rabin素数测试】【Pollar Rho整数分解】
Prime Test Time Limit: 6000MS Memory Limit: 65536K Total Submissions: 29193 Accepted: 7392 Case Time ...
- 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 ...
- 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算法 POJ 1811 Prime Test
POJ 1811 Prime Test Time Limit: 6000MS Memory Limit: 65536K Total Submissions: 32534 Accepted: 8 ...
- POJ 1811 Prime Test (Pollard rho 大整数分解)
题意:给出一个N,若N为素数,输出Prime.若为合数,输出最小的素因子.思路:Pollard rho大整数分解,模板题 #include <iostream> #include < ...
- Miller&&Pollard POJ 1811 Prime Test
题目传送门 题意:素性测试和大整数分解, N (2 <= N < 254). 分析:没啥好讲的,套个模板,POJ上C++提交 收获:写完这题得到模板 代码: /************** ...
- POJ 1811 Prime Test 素性测试 分解素因子
题意: 给你一个数n(n <= 2^54),判断n是不是素数,如果是输出Prime,否则输出n最小的素因子 解题思路: 自然数素性测试可以看看Matrix67的 素数与素性测试 素因子分解利用 ...
随机推荐
- Elasticsearch顶尖高手系列课程推荐
Elasticsearch,是目前行业中非常热门的一个技术.Elasticsearch是一种分布式的海量数据搜索与分析的技术,可以用于电商网站.门户网站.企业IT系统等各种场景下的搜索引擎,也可以用于 ...
- android 集成支付宝app支付(原生态)-包括android前端与java后台
本文讲解了 android开发的原生态app集成了支付宝支付, 还提供了java后台服务器处理支付宝支付的加密代码, app前端与java后台服务器使用json数据格式交互信息,java后台服务主要用 ...
- POJ 1279
发现好多半平面交用N^2的增量法都能过诶... #include <iostream> #include <cstdio> #include <cstring> # ...
- springboot集成grpc
gRPC 简介 gRPC 是一个现代开源的高性能 RPC 框架,可以在任何环境下运行.它可以有效地将数据中心内和跨数据中心的服务与可插拔支持进行负载均衡.跟踪.健康检查和认证.它也适用于分布式计算,将 ...
- 学习 java netty (一) -- java nio
前言:近期在研究java netty这个网络框架,第一篇先介绍java的nio. java nio在jdk1.4引入,事实上也算比較早的了.主要引入非堵塞io和io多路复用.内部基于reactor模式 ...
- luogu3953 逛公园
正解:SPFA+DP 将POJ3463中maxDist(Target)由minDist(Target)+1改为minDist(Target+K)即可.判断0环,需要对每个节点建立下标为maxDist- ...
- Visio的安装教程
1.下载地址:https://msdn.itellyou.cn/ 2.输入关键字:Visio,选择想要下载的版本,展开详细信息,并复制 3.(我下载的13) ed2k://|file|cn_visio ...
- linux udev 机制【转】
本文转载自:http://blog.csdn.net/yyt8yyt8/article/details/8020154 1. Linux的热插拔事件由kernel通过中断发现(比如,USB设备插入系统 ...
- 0x58 数据结构优化DP
补写一下 poj3171 设f[i]表示覆盖L~i的最小花费,把区间按左端点排序,枚举区间,f[a[i].r]=min{f[a[i].l~(a[top].r-1)]}+a[i].c (当然还要和原值比 ...
- python spark 通过key来统计不同values个数
>>> rdd = sc.parallelize([("), ("b", 1), ("a", 1), ("a", ...