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的 素数与素性测试 素因子分解利用 ...
 
随机推荐
- 生产上数据库大量的latch free 导致的CPU资源耗尽的问题的解决
			
中午的时候,我们生产上的某个数据库,cpu一直居高不下 通过例如以下的sql语句,我们查看当时数据库的等待,争用的情况: select s.SID, s.SERIAL#, 'kill -9 ' || ...
 - ZOJ 1654 Place the Robots(最大匹配)
			
Robert is a famous engineer. One day he was given a task by his boss. The background of the task was ...
 - Thinking in Java:容器深入研究
			
1.虚线框表示Abstract类,图中大量的类的名字都是以Abstract开头的,它们仅仅是部分实现了特定接口的工具,因此创建时能够选择从Abstract继承. Collections中的实用方法:挑 ...
 - Warning: File `src/core/nginx.h' has modification time 1.2e+07 s in the future
			
Nginx安装时Warning: File `src/core/nginx.h' has modification time 1.2e+07 s in the future问题的解决方法 问题场景: ...
 - Linux shell脚本中shift的用法说明【转】
			
本文转载自:http://blog.csdn.net/zhu_xun/article/details/24796235 Linux shell脚本中shift的用法说明 shift命令用于对参数的移动 ...
 - 怎样在Android.mk上加宏定义【转】
			
本文转载自:http://blog.csdn.net/ttxgz/article/details/7591282 很简单, LOCAL_CFLAGS += -DWHATEVERDEFINE 就可以了
 - B1260 [CQOI2007]涂色paint  区间dp
			
这个题和我一开始想的区别不是很大,但是要我独自做出来还是有一些难度. 每一次涂色 只有这两种可能: 1) 把一段未被 覆盖过的区间 涂成 * 色 2) 把一段被一种颜色覆盖的区间涂成 * 色 (并且 ...
 - md5  c# unicode 互换(原创)
			
php 代码 $input='中国'; $result= md5($input); $temp=iconv("UTF-8", "UTF16LE", $input ...
 - mysqls,为node.js而编写的sql语句生成插件 (crud for mysql).
			
It is written in JavaScript,crud for mysql.You can also use transactions very easily. mysqls 一款专为nod ...
 - let,const,var三者之间的区别
			
在ES6中新增了两种定义变量的命令let和const,在这之前相信大家都对var定义变量很熟悉,那么在了解ES6方法前, 1.我们先来回顾一下var定义变量的方法. 下面来看这段代码: for (va ...