随机拆分,简直机智。

关于过程可以看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. WEB安全漏洞与防范

    1.XSS 原理是攻击者向有XSS漏洞的网站中输入(传入)恶意的HTML代码,当用户浏览该网站时,这段HTML代码会自动执行,从而达到攻击的目的.如,盗取用户Cookie信息.破坏页面结构.重定向到其 ...

  2. PC-LINT

    静态代码检查工具PC-Lint(一) 2006-12-07 23:50   C/C++语言的语法拥有其它语言所没有的灵活性,这种灵活性带来了代码效率的提升,但相应增加了代码中存在隐患的可能性.静态代码 ...

  3. POJ 2983-Is the Information Reliable?(差分约束系统)

    题目地址:POJ 2983 题意:有N个车站.给出一些点的精确信息和模糊信息.精确信息给出两点的位置和距离.模糊信息给出两点的位置.但距离大于等于一.试确定是否全部的信息满足条件. 思路:事实上就是让 ...

  4. JStorm的Metrics含义

    附录:Metrics含义 MemoryUsed cluster/topology/worker使用到的物理内存HeapMemory cluster/topology/worker JVM使用到的堆内存 ...

  5. 编译和安装在Windows上橡胶树 (Compiling and Installing Yate on Windows)

    编译和安装在Windows上橡胶树     有两种方法来安装橡胶树下窗口: 下载并安装橡胶树 下载后页面设置. 另一个选择是下载橡胶树从SVN并编译它. 内容 ( 隐藏] 1 安装使用设置橡胶树 2  ...

  6. hibernate学习系列-----(1)开发环境搭建

    其实一两个月前就在了解hibernate方面的知识了,但一直以来,都没有好好的总结,而且一直使用的是myeclipse,感觉有些傻瓜式的操作就可以搭建起hibernate的开发环境,但这样一点都不好, ...

  7. JAVA Eclipse如何开发Android的多页面程序

    Fragment可以认为是Activity的一个界面的组成部分,Fragment必须依存于Activity.   在layout文件夹中新建一个xml文件,布局方式采用RelativeLayout,注 ...

  8. C++003基础

    1.C++对C的扩展 1简单的C++程序 1.1求圆的周长和面积 数据描写叙述: 半径.周长,面积均用实型数表示 数据处理: 输入半径 r. 计算周长 = 2*π*r : 计算面积 = π* r2 . ...

  9. NodeJS中的循环陷阱

    Node.js的异步机制由事件和回调函数实现,一開始接触可能会感觉违反常规,但习惯以后就会发现还是非常easy的. 然而这之中事实上暗藏不少陷阱.一个非常easy遇到的问题就是回到循环的回调函数. e ...

  10. Java Learning Path(五)资源篇

    Java Learning Path(五)资源篇 1. http://java.sun.com/ (英文) Sun的Java网站,是一个应该经常去看的地方.不用多说. 2.http://www-900 ...