safe保险一点5吧。我是MR:

 const int Safe=;
int gcd(int a,int b){return !b?a:gcd(b,a%b);}
int mul(int a,int b,int p){
int tmp=(a*b-(int)((double)a/p*b+1e-)*p);
return tmp<?tmp+p:tmp;
}
int pow(int a,int b,int p){
int ans=;a%=p;
for(int i=b;i;i>>=,a=mul(a,a,p))
if(i&)ans=mul(ans,a,p);
return ans;
}
bool check(int a,int n,int r,int s){
int ans=pow(a,r,n),p=ans;
for(int i=;i<=s;i++){
ans=mul(ans,ans,n);
if(ans==&&p!=&&p!=n-) return true;
p=ans;
} if(ans!=)return true;return false;
}
bool MR(int n){
if(n<=) return false;
if(n==) return true;
if(!(n&)) return false;
int r=n-,s=;
while(!(r&)) r>>=,s++;
for(int i=;i<Safe;i++)
if(check(rand()%(n-)+,n,r,s)) return false;
return true;
}

我是rho:

 #include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#define ll long long
#define inf 1000000000
#define Safe 5
using namespace std;
ll gcd(ll a, ll b){
return b == ? a : gcd(b, a % b);
}
ll n, x, mx;
ll mul(ll a, ll b, ll p){
ll tmp = (a * b - (ll)((long double)a / p * b + 1e-) * p);
return tmp < ? tmp + p : tmp;
}
ll pow(ll a, ll b, ll p){
ll ans = ; a %= p;
for(ll i = b; i; i >>= , a = mul(a, a, p))
if(i & ) ans = mul(ans, a, p);
return ans;
}
bool check(ll a, ll n, ll r, ll s){
ll ans = pow(a, r, n), p = ans;
for(int i = ; i <= s; i ++){
ans = mul(ans, ans, n);
if(ans == && p != && p != n - ) return true;
p = ans;
}
if(ans != )return true;
return false;
}
bool MR(ll n){
if(n <= ) return false;
if(n == ) return true;
if(n % == ) return false;
ll r = n - , s = ;
while(r % == ) r /= , s ++;
for(int i = ; i < Safe; i ++)
if(check(rand() % (n - ) + , n, r, s)) return false;
return true;
}
ll rho(ll n, ll c){
ll k = , x = rand() % n, y = x, p = ;
for(ll i = ; p == ; i ++){
x = (mul(x, x, n) + c) % n;
p = y > x ? y - x : x - y;
p=gcd(n, p);
if(i == k) y = x, k += k;
}
return p;
}
void solve(ll n){
if(n == ) return;
if(MR(n)) { mx = max(n, mx); return; }
ll t = n;
while(t == n) t = rho(n, rand() % (n - ) + );
solve(t); solve(n / t);
}
void read(ll &x){
x = ; ll sig = ; char ch = getchar();
while(!isdigit(ch)) { if(ch == '-') sig = -; ch = getchar(); }
while(isdigit(ch)) x = * x + ch - '', ch = getchar();
x *= sig; return ;
}
ll cnt = ;
void init(){
read(n);
cnt = ;
return ;
}
void work(){
while(n --){
read(x);
if(MR(x)) cnt ++;
mx = ; solve(x);
if(mx == x) puts("Prime");
else printf("%lld\n", mx);
}
return ;
}
void print(){
printf("%lld\n", cnt);
return ;
}
int main(){
init();
work();
print();
return ;
}

Miller_Rabin素数判断,rho的更多相关文章

  1. [模板] Miller_Rabin素数判断代码实现存档

    就是....存存代码吧. Miller_Rabin的最核心部分在于二次探测定理和费马小定理.后者在同余/逆元的题目里面或多或少都有提及吧.....前者也很简单. 总而言之,Miller_Rabin不算 ...

  2. POJ 1811 大素数判断

    数据范围很大,用米勒罗宾测试和Pollard_Rho法可以分解大数. 模板在代码中 O.O #include <iostream> #include <cstdio> #inc ...

  3. 有关素数判断的一些算法(总结&&对比)

    素性测试是数论题中比较常用的一个技巧.它可以很基础,也可以很高级(哲学).这次主要要介绍一下有关素数判断的奇技淫巧 素数的判断主要分为两种:范围筛选型&&单个判断型 我们先从范围筛选型 ...

  4. POJ3641 Pseudoprime numbers(快速幂+素数判断)

    POJ3641 Pseudoprime numbers p是Pseudoprime numbers的条件: p是合数,(p^a)%p=a;所以首先要进行素数判断,再快速幂. 此题是大白P122 Car ...

  5. JAVA语言的素数判断,随机数,函数调用

    近来刚学JAVA,就从JAVA写起吧,JAVA判别素数,其实方法和C/C++没什么区别,主要就是想谈一下,其中包括的3个点. (1)JAVA语言产生随机数,random函数,定义参数max的作用是给出 ...

  6. #C++初学记录(素数判断2)

    素数判断2 比较简单的算法,没有技术含量 A prime number is a natural number which has exactly two distinct natural numbe ...

  7. #C++初学记录(素数判断)

    练习题目二 素数判断 A prime number is a natural number which has exactly two distinct natural number divisors ...

  8. C语言 · 素数判断

     算法提高 素数判断   时间限制:1.0s   内存限制:512.0MB      编写一函数IsPrime,判断某个大于2的正整数是否为素数. 样例输入: 5样例输出:yes 样例输入: 9样例输 ...

  9. HDU 2138 How many prime numbers(Miller_Rabin法判断素数 【*模板】 用到了快速幂算法 )

    How many prime numbers Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/O ...

随机推荐

  1. linux查看cpu温度

      分类: linux系统 一.安装  sudo apt-get install lm-sensors   二.查看 linux@cdyemail:~$ sensors k10temp-pci-00c ...

  2. troubleshooting tools in JDK 7--转载

    This chapter describes in detail the troubleshooting tools that are available in JDK 7. In addition, ...

  3. C++转换函数

    1. 赋值操作时把右操作数隐式转化为左操作数2. 通过普通单参数构造函数把其他类型的对象隐式转换为我们的类类型3. 通过转换函数operator type()这种成员函数可以把类类型转成其他类型,这样 ...

  4. JAVA IDE基本操作常识

    快捷键: Ctrl+/   选中区单行注释和 取消 选中区单行注释和 Alt + / 代码辅助 shift + Ctrl +/ 选中区多行注释 shift + Ctrl +\ 取消选中区多行注释 Ct ...

  5. mui.pushToRefresh组件下拉回调函数中this指向问题

    先看一段代码 (function($) { //阻尼系数 var deceleration = mui.os.ios ? 0.003 : 0.0009; $('.mui-scroll-wrapper' ...

  6. codevs2059逃出克隆岛(传送门bfs)

    /* 和普通的迷宫问题类似只是多了一个叫传送门的东西 对于传送门的处理: 每当跑到传送门就把其余所有传送门周围的点都入队 传送门之间不花费时间并且从不是传送门的点走到传送门 也不花费时间花费时间的(好 ...

  7. NPOI从数据库中导出数据到Excel

    首先要添加NPOI.dll程序集 https://yunpan.cn/cMeSTELJSXmJJ  访问密码 8d83 把里面的程序集都添加到引用里 下面的代码是从数据库导出到Excel { //pa ...

  8. 简单图片banner轮播

    /**************[css]****************/   <style type="text/css">        *{margin:0px; ...

  9. Struts2 删除后直接直接到List显示页面

    package com.sun; import java.util.List; import java.util.Map; import org.hibernate.Session; import o ...

  10. (转)C#文件操作

    原文连接:http://www.cnblogs.com/wangshenhe/archive/2012/05/09/2490438.html 文件与文件夹操作主要用到以下几个类: 1.File类: 提 ...