POJ1811 Prime Test(miller素数判断&&pollar_rho大数分解)
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大数分解)的更多相关文章
- POJ3126 Prime Path (bfs+素数判断)
POJ3126 Prime Path 一开始想通过终点值双向查找,从最高位开始依次递减或递增,每次找到最接近终点值的素数,后来发现这样找,即使找到,也可能不是最短路径, 而且代码实现起来特别麻烦,后来 ...
- poj 1811 随机素数和大数分解(模板)
Sample Input 2 5 10 Sample Output Prime 2 模板学习: 判断是否是素数,数据很大,所以用miller,不是的话再用pollard rho分解 miller : ...
- POJ 1811 大素数判断
数据范围很大,用米勒罗宾测试和Pollard_Rho法可以分解大数. 模板在代码中 O.O #include <iostream> #include <cstdio> #inc ...
- 有关素数判断的一些算法(总结&&对比)
素性测试是数论题中比较常用的一个技巧.它可以很基础,也可以很高级(哲学).这次主要要介绍一下有关素数判断的奇技淫巧 素数的判断主要分为两种:范围筛选型&&单个判断型 我们先从范围筛选型 ...
- 数论 - Miller_Rabin素数测试 + pollard_rho算法分解质因数 ---- poj 1811 : Prime Test
Prime Test Time Limit: 6000MS Memory Limit: 65536K Total Submissions: 29046 Accepted: 7342 Case ...
- JAVA语言的素数判断,随机数,函数调用
近来刚学JAVA,就从JAVA写起吧,JAVA判别素数,其实方法和C/C++没什么区别,主要就是想谈一下,其中包括的3个点. (1)JAVA语言产生随机数,random函数,定义参数max的作用是给出 ...
- POJ 3126 Prime Path(素数路径)
POJ 3126 Prime Path(素数路径) Time Limit: 1000MS Memory Limit: 65536K Description - 题目描述 The minister ...
- #C++初学记录(素数判断2)
素数判断2 比较简单的算法,没有技术含量 A prime number is a natural number which has exactly two distinct natural numbe ...
- #C++初学记录(素数判断)
练习题目二 素数判断 A prime number is a natural number which has exactly two distinct natural number divisors ...
随机推荐
- 发布web项目时,忽略指定文件夹或文件
参考:http://blogs.msdn.com/b/webdev/archive/2010/04/22/web-deployment-excluding-files-and-folders-via- ...
- C语言如何 实现 下雪效果
题外话 前言 1.本文主要围绕 如何 在 控制台上 下起 一场 只有自己能看见的雪 2.是个简易跨平台的,主要是C语言 3.动画 采用 1s 40帧, 雪花具有 x轴速度和y轴速度 4.比较简单,可 ...
- makefile复习时发现的编写makefile规则注意事项
博客中关于makefile的博文数不胜数,比较经典的都很相似,下面这一片,很全面,只是很长,可以作为参考资料:http://blog.csdn.net/liang13664759/article/de ...
- iOS9之Bitcode
Bitcode是被编译程序的一种中间形式的代码. 更新Xcode7后需要将”Build Settings”->”Enable Bitcode”设为NO,保证第三方库能真机运行项目. ...
- Modal的跳转方法为什么会显得那么奇怪
初学Modal Segue的时候,并不能理解它为什么要做成这样.从A界面跳转到B界面还算正常,但是从B界面返回A界面,就显得略显猎奇了.必须先在A界面的Controller中自己造个方法@IBActi ...
- json转换对象
JSON.parse(jsonstr); //可以将json字符串转换成json对象 JSON.stringify(jsonobj); //可以将json对象转换成json对符串
- MongoDB学习笔记-创建、更新、删除文档
创建 MongoDB中使用insert方法来向集合插入文档,然后保存到MongoDB中. db.foo.insert({"hehe":"呵呵"} ...
- Centos 安装 p7zip,即Linux下的7z
Centos 无法直接通过yum安装7z,我们一般通过repoforge,rpmforge的软件包进行安装,你只需要下载一个对应的包,直接安装就可以 p7zip-9.20.1-1.el4.rf.i38 ...
- sharepoint 2010 找不到搜索不到ad里的用户
前提条件: 1.这个用户是在ad中存在的. 2.这个用户也同步到了userprofile中. 问题现象: 在sharepoint的人员选择器中,搜索不到已经添加的用户. 可能原因: 1.有人说需要将 ...
- UIGestureRecongnizer 手势检测 swift
// // ViewController.swift // UILabelTest // // Created by mac on 15/6/23. // Copyright (c) 2015年 fa ...