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. 文字保护纱-Material Design

    Ok,关于这个Material Design 都快被说烂了,他被开发者越来越熟悉的程度,却与市场上的单薄身影形成了鲜明的对比,以至于每当我提及Material Design时就像祥林嫂附身一样. 有些 ...

  2. [转] HTML中调用JavaScript的几种情况和规范写法

    比较简单,基础. 一.引用外部文件中的js脚本 <script type="text/javascript" src="ext.js"></s ...

  3. C#读取Word文档内容代码

    首先要添加引用com组件:然后引用: using Word = Microsoft.Office.Interop.Word; 获取内容: /// /// 读取 word文档 返回内容 /// //// ...

  4. Android Studio学习随笔-模拟耗时操作(sleep)

    在这里我申明一点,因为我是挂着VPN去YOUTOBE看的尚学堂的高明鑫老师讲的Android基础学习视频,有些东西他没有讲,而我也没办法,只能等两个星期后学校请老师来的时候进行询问,当然我也会将一些问 ...

  5. Codeforces 540D Bad Luck Island - 概率+记忆化搜索

    [题意] 一个岛上有三种生物A,B,C,各有多少只在输入中会告诉你,每种最多100只 A与B碰面,A会吃掉B, B与C碰面,B会吃掉C, C与A碰面,C会吃掉A...忍不住想吐槽这种环形食物链 碰面是 ...

  6. python面对对象编程---------6:抽象基类

    抽象基本类的几大特点: 1:要定义但是并不完整的实现所有方法 2:基本的意思是作为父类 3:父类需要明确表示出那些方法的特征,这样在写子类时更加简单明白 用抽象基本类的地方: 1:用作父类 2:用作检 ...

  7. Linq101-Grouping Operators

    using System; using System.Collections.Generic; using System.Linq; namespace Linq101 { class Groupin ...

  8. 各版本 linux(转)

    Linux各种版本下载 ftp://ftp.linuxforum.net/ISO/Redhat7.3/valhalla-i386-disc1.iso ftp://ftp.linuxforum.net/ ...

  9. 最全ASCLL码

    结果 描述 实体编号   space ! exclamation mark ! " quotation mark " # number sign # $ dollar sign $ ...

  10. iOS子线程操作UI问题检查

    iOS开发中,因为大部分函数都不是线程安全的,所以UI子线程中操作UI是非常危险的事,但是有时候因为开发者经验不足,不知道子线程中不能UI,或者知道但是写代码的时候没注意,或者不知道那些函数操作UI了 ...