http://blog.csdn.net/shiyuankongbu/article/details/9202373

发现自己原来的那份模板是有问题的,而且竟然找不出是哪里的问题,所以就用了上面的链接上的一份代码,下面只是寄存一下这份代码,以后打印出来当模板好了。

#pragma warning(disable:4996)
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <map>
#include <cstdlib>
#include <cstdio>
using namespace std; #define Times 10
map<long long, int>m;
long long mi;
long long random(long long n)
{
return ((double)rand() / RAND_MAX*n + 0.5);
} long long multi(long long a, long long b, long long mod)
{
long long ans = 0;
while (b){
if (b & 1) ans = (ans + a) % mod;
b >>= 1;
a = (a << 1) % mod;
}
return ans;
}
long long Pow(long long a, long long b, long long mod)
{
long long ans = 1;
while (b){
if (b & 1) ans = multi(ans, a, mod);
b >>= 1;
a = multi(a, a, mod);
}
return ans;
}
bool witness(long long a, long long n)
{
long long d = n - 1;
while (!(d & 1))
d >>= 1;
long long t = Pow(a, d, n);
while (d != n - 1 && t != 1 && t != n - 1)
{
t = multi(t, t, n);
d <<= 1;
}
return t == n - 1 || d & 1;
}
bool miller_rabin(long long n)
{
if (n == 2)
return true;
if (n<2 || !(n & 1))
return false;
for (int i = 1; i <= Times; i++)
{
long long a = random(n - 2) + 1;
if (!witness(a, n))
return false;
}
return true;
}
long long gcd(long long a, long long b)
{
return a&&b ? gcd(b, a%b) : a + b;
}
long long pollard_rho(long long n, int c)
{
long long x, y, d, i = 1, k = 2;
x = random(n - 2) + 1;
y = x;
while (1){
i++;
x = (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(long long n, int c)
{
if (n == 1)
return;
if (miller_rabin(n)){
m[n]++;
mi = min(mi, n);
return;
}
long long p = n;
while (p >= n)
p = pollard_rho(p, c--);
find(p, c);
find(n / p, c);
}
int main()
{
int t;
scanf("%d", &t);
while (t--)
{
long long n;
scanf("%lld", &n);
mi = n;
if (miller_rabin(n))
cout << "Prime" << endl;
else
{
find(n, 12312);
cout << mi << endl;
}
}
return 0;
}

POJ1811 Prime Test(miller素数判断&&pollar_rho大数分解)的更多相关文章

  1. POJ3126 Prime Path (bfs+素数判断)

    POJ3126 Prime Path 一开始想通过终点值双向查找,从最高位开始依次递减或递增,每次找到最接近终点值的素数,后来发现这样找,即使找到,也可能不是最短路径, 而且代码实现起来特别麻烦,后来 ...

  2. poj 1811 随机素数和大数分解(模板)

    Sample Input 2 5 10 Sample Output Prime 2 模板学习: 判断是否是素数,数据很大,所以用miller,不是的话再用pollard rho分解 miller : ...

  3. POJ 1811 大素数判断

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

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

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

  5. 数论 - Miller_Rabin素数测试 + pollard_rho算法分解质因数 ---- poj 1811 : Prime Test

    Prime Test Time Limit: 6000MS   Memory Limit: 65536K Total Submissions: 29046   Accepted: 7342 Case ...

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

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

  7. POJ 3126 Prime Path(素数路径)

    POJ 3126 Prime Path(素数路径) Time Limit: 1000MS    Memory Limit: 65536K Description - 题目描述 The minister ...

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

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

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

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

随机推荐

  1. Android SDK API (2.2,2.3,3.0)中文版文档

    转的一篇.觉得很有用. Android SDK API (2.2,2.3,3.0)中文版文档 地址:http://android.laoguo.org固定连接:http://www.laoguo.or ...

  2. OpenGL完整实例

    结合上一节的内容,分享完整代码. 先画一个cube,然后通过OnGestureListener去触发onFling使它旋转起来. OnGestureListener相关的方法我已经都加了注释,可以参考 ...

  3. hdu 1509 Windows Message Queue

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1509 Windows Message Queue Description Message queue ...

  4. ubuntu server获取并自动设置最快镜像的方法

    一,安装方法1 add-apt-repository ppa:ossug-hychen/getfastmirrorapt-get install getfastmirror 如果添加了临时源,这样移除 ...

  5. c++ 性能

    http://blog.sina.com.cn/s/blog_4a471ff601013vud.html http://www.linuxidc.com/Linux/2015-06/118874.ht ...

  6. python中的各种排序

    #encoding=utf-8 import random from copy import copy def directInsertSort(seq): """ 直接 ...

  7. 开启Objective-C --- OC基础知识

    一.Objective-C简述      Objective-C通常写作ObjC和较少用的Objective C或Obj-C,是扩充C的面向对象编程语言.Objective-C主要用于:编写iOS操作 ...

  8. CentOS 6.3 安装以及配置Apache php mysql

    准备篇: 1.配置防火墙,开启80端口.3306端口 vi /etc/sysconfig/iptables -A INPUT -m state –state NEW -m tcp -p tcp –dp ...

  9. 34.pad designer警告

    1.Drill hole size is equal or larger than smallest pad size. Pad will be drilled away 原因:钻孔直径太大,直接把p ...

  10. maven属性

    Maven内置了三大特性:属性.Profile和资源过滤来支持构建的灵活性. 内置属性:主要有两个常用内置属性 ${basedir}表示项目根目录,即包含pom.xml文件的目录 ${version} ...