随机拆分,简直机智。

关于过程可以看http://wenku.baidu.com/link?url=JPlP8watmyGVDdjgiLpcytC0lazh4Leg3s53WIx1_Pp_Y6DJTC8QkZZqmiDIxvgFePUzFJ1KF1G5xVVAoUZpxdw9GN-S46eVeiJ6Q-zXdei

看完后,觉得随机生成数然后和n计算gcd,可以将随机的次数根号一下。思想很叼。

对于里面说的birthday trick,在执行次数上我怎么看都只能减一半。只是把平均分布,变成了靠近0的的分布。

不过怎么说,这个好像是大家都公认比较靠谱的。 所以,我就勉强相信了。

/*****************************
大整数拆分模板(long long范围内)
调用Divide(n,222);
返回的结果在divsor中,因子最小值为dmi
注意:复杂度为n^(1/4),多次调用初始化dcnt,dmi
*****************************/ #define INF 1e18 long long divsor[];
int dcnt=;
long long dmi=INF; //输入一个long long 范围内的素数,是素数返回true,否则返回false。定义检测次数TIMES,错误率为(1/4)^TIMES
#define TIMES 10 long long GetRandom(long long n)
{
//cout<<RAND_MAX<<endl;
long long num = (((unsigned long long)rand() + )*rand())%n;
return num+;
} long long Mod_Mul(long long a,long long b,long long mod)
{
long long msum=;
while(b)
{
if(b&) msum = (msum+a)%mod;
b>>=;
a = (a+a)%mod;
}
return msum;
} long long Quk_Mul(long long a,long long b,long long mod)
{
long long qsum=;
while(b)
{
if(b&) qsum=Mod_Mul(qsum,a,mod);
b>>=;
a=Mod_Mul(a,a,mod);
}
return qsum;
} bool Miller_Rabin(long long n)
{
if(n==||n==||n==||n==||n==) return true;
if(n==||n%==||n%==||n%==||n%==||n%==) return false;
int div2=;
long long tn=n-;
while( !(tn%) )
{
div2++;
tn/=;
}
for(int tt=;tt<TIMES;tt++)
{
long long x=GetRandom(n-); //随机得到[1,n-1]
if(x==) continue;
x=Quk_Mul(x,tn,n);
long long pre=x;
for(int j=;j<div2;j++)
{
x = Mod_Mul(x, x, n);
if(x==&&pre!=&&pre!=n-) return false;
pre=x;
}
if(x!=) return false;
}
return true;
} long long gcd(long long a,long long b)
{
if(b==) return a;
return gcd(b,a%b);
} long long pollard_rho(long long dn,long long dc)
{
long long x,y,d,i=,k=;
x = GetRandom(dn-);
y = x;
while()
{
i++;
x = (Mod_Mul(x, x, dn) + dc)%dn;
d = gcd( y-x , dn );
if( < d && d < dn )
return d;
if( y==x ) return dn;
if( i==k )
{
y=x;
k <<= ;
}
}
} void Divide(long long dn,int dk)
{
if(dn==) return ;
if( Miller_Rabin(dn) == true )
{
divsor[dcnt++]=dn;
dmi = min(dmi,dn);
return ;
}
long long dtmp=dn;
while(dtmp>=dn) dtmp = pollard_rho(dtmp,dk--);//随机寻找dn的因子,dtmp
Divide(dtmp, dk);
Divide(dn/dtmp,dk);
} /*
int main() {
int T;
cin>>T;
while(T--)
{
long long n;
cin>>n;
if( Miller_Rabin(n) ) printf("Prime\n");
else
{
dmi=INF;
dcnt=0;
Divide(n,222);
cout<<dmi<<endl;
}
}
return 0;
}
*/

Pollard-Rho大整数拆分模板的更多相关文章

  1. POJ 1811 Prime Test (Pollard rho 大整数分解)

    题意:给出一个N,若N为素数,输出Prime.若为合数,输出最小的素因子.思路:Pollard rho大整数分解,模板题 #include <iostream> #include < ...

  2. Miller-Rabin 素性测试 与 Pollard Rho 大整数分解

    \(\\\) Miller-Rabin 素性测试 考虑如何检验一个数字是否为素数. 经典的试除法复杂度 \(O(\sqrt N)\) 适用于询问 \(N\le 10^{16}\) 的时候. 如果我们要 ...

  3. 整数(质因子)分解(Pollard rho大整数分解)

    整数分解,又称质因子分解.在数学中,整数分解问题是指:给出一个正整数,将其写成几个素数的乘积的形式. (每个合数都可以写成几个质数相乘的形式,这几个质数就都叫做这个合数的质因数.) .试除法(适用于范 ...

  4. HDU 3864 D_num Miller Rabin 质数推断+Pollard Rho大整数分解

    链接:http://acm.hdu.edu.cn/showproblem.php? pid=3864 题意:给出一个数N(1<=N<10^18).假设N仅仅有四个约数.就输出除1外的三个约 ...

  5. Pollard Rho大质数分解学习笔记

    目录 问题 流程 代码 生日悖论 end 问题 给定n,要求对n质因数分解 普通的试除法已经不能应用于大整数了,我们需要更快的算法 流程 大概就是找出\(n=c*d\) 如果\(c\)是素数,结束,不 ...

  6. C++ BigInteger 大整数类模板(转)

    #include <deque> #include <vector> #include <iostream> #include <string> #in ...

  7. C++大整数类模板

    参考 :http://172.21.85.56/oj/resource/reportdetail?report_id=1678 支持 =.abs().pow().+=.-= *=./=.%=.+.-. ...

  8. poj2389-Bull Math(大整数乘法)

    一,题意: 大整数乘法模板题二,思路: 1,模拟乘法(注意"逢十进一") 2,倒序输出(注意首位0不输出) 三,步骤: 如:555 x 35 = 19425  5 5 5  5 5 ...

  9. OpenJudge 2980 大整数乘法

    链接地址:http://bailian.openjudge.cn/practice/2980/ 题目: 总时间限制: 1000ms 内存限制: 65536kB 描述 求两个不超过200位的非负整数的积 ...

随机推荐

  1. win10 安装java

    https://jingyan.baidu.com/article/fea4511a12b158f7bb9125b9.html 一 下载java SE 官网 二设置环境变量 JAVA_HOME PAT ...

  2. 关于http和https淘宝支付宝跨域解决方法研究

    关于http和http跨域淘宝解决方式研究: http://buyer.trade.taobao.com/trade/pay.htm?spm=a1z01.2.3.4.0.wZAGp9&bizO ...

  3. 配置 FIS 来适配 go revel 框架以优化前端缓存策略

    对于前端工程师来说,浏览器缓存优化是个永远的话题.前几天看了知乎上的一个问答:<大公司里怎样开发和部署前端代码?>,深以为然,所以决心使用 FIS 来优化自身的前端文件. 我们的项目使用了 ...

  4. Angular 学习笔记——shop

    <!DOCTYPE html> <html lang="en" ng-app> <head> <meta charset="UT ...

  5. scrapy 安装详解

    一. Scrapy简介 Scrapy is a fast high-level screen scraping and web crawling framework, used to crawl we ...

  6. jquery ui widget 源代码分析

    jquery ui 的全部组件都是基于一个简单,可重用的widget. 这个widget是jquery ui的核心部分,有用它能实现一致的API.创建有状态的插件,而无需关心插件的内部转换. $.wi ...

  7. 【BIEE】07_调整BIEE柱子的显示顺序

    现在有报表如下: 但是我们觉得这种显示不好看,想把非优秀员工的柱子放在前边显示,那么如何调整呢? 调整步骤: [编辑分析] 我们将此处条形图下的两个标签顺序重新调整一下 从上图可以看出,效果明显!

  8. Hbase笔记1-2

    吴超1.1 Hbase是Hadoop中的数据库,Hadoop还需要数据库吗?我们学的Hadoop是一个分布式的存储和计算的平台为什么要在他上面建一个数据库呢,数据库是干什么的呢,数据库是一个管理系统( ...

  9. Android下 布局加边框 指定背景色 半透明

    背景设置为自定义的shape文件: <!-- <?xml version="1.0" encoding="utf-8"?><shape ...

  10. Https所涉及名词及相关后缀名解释

    HTTPS: HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版.即 ...