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. java.lang.ClassCastException: android.view.ViewGroup$LayoutParams cannot be cast to android.widget.L(转)

    09-09 10:19:59.979: E/AndroidRuntime(2767): FATAL EXCEPTION: main09-09 10:19:59.979: E/AndroidRuntim ...

  2. Python访问sqlite3数据库取得dictionary的正路!

    [引子] 很多人都知道,Python里是内置了很好用的sqlite3的.但这个库有个缺陷,在执行fetchall()/fetchone()等方法后,得到的是一个tuple.以前吧,做自己的小项目,tu ...

  3. dede 标签调用

    调用当前栏目名字 {dede:type}[field:typename /]{/dede:type} 调用某栏目名字 {dede:type typeid='1'}[field:typename /]{ ...

  4. 正则表达式中/i,/g,/m的作用

    一./i (ignorCase)忽略大小写,注意仅是忽略大小写,并不忽略全半角. 二./g (globle)全文查找出现的所有匹配字符 三./m 1.(mutiple)多行查找2.m 影响 ^.$.3 ...

  5. java常见错误的列表

    ava常见错误列表: 找不到符号(symbol) 类X是public的,应该被声明在名为X.java的文件中 缺失类.接口或枚举类型 缺失X 缺失标识符 非法的表达式开头 类型不兼容 非法的方法声明; ...

  6. RESTful Web Services简单介绍

    近几年,RESTful Web Services渐渐开始流行,大量用于解决异构系统间的通信问题.很多网站和应用提供的API,都是基于RESTful风格的Web Services,比较著名的包括Twit ...

  7. Google2016开发者大会

    Android主讲: 一.吴晶:android笔记博主(博客:http://www.race604.com/) 主题:Android低功耗蓝牙(BLE)实践 低功耗蓝牙在可穿戴和智能家居里边用的比较多 ...

  8. 自定义android精美聊天界面

    编写精美聊天界面,那就肯定要有收到的消息和发送的消息. 首先还是编写主界面,修改activity_chat.xml中的代码,如下所示: <?xml version="1.0" ...

  9. 使用WebUploader使用,及使用后测试横拍或竖拍图片图片方向不对等解决方案

    WebUploader是由Baidu WebFE(FEX)团队开发的一个简单的以HTML5为主,FLASH为辅的现代文件上传组件.在现代的浏览器里面能充分发挥HTML5的优势,同时又不摒弃主流IE浏览 ...

  10. propertychange input change

    IE678 支持propertychange事件,可以监听所有属性(包括自定义属性)的改变事件,包括手动修改输入框文本以及js修改输入框文本. propertychange事件有个特点就是不支持冒泡, ...