Miller-Rabin大数素性测试
2015-10-17 17:12
169 查看
素性测试是检验一个给定的整数是否为质数的测试。
对于确定型算法试除法,即尝试从2到√N的整数是否整除N,若N较大,则算法无法在如今大多数机器上一个可以忍耐的时间内结给出结果。使用随机化算法Miller-Rabin素性测试 则可以在极短的时间内得到一个较准确的结果,并且可以通过综合多次随机测试结果将错误概率降为可以忽略不计。
Miller-Rabin素性测试 基于费马小定理
费马小定理:假如p是质数,且gcd(a,p)=1,那么 a^(p-1)≡1(mod p)。
即:假如a是整数,p是质数,且a,p互质(即两者只有一个公约数1),那么a的(p-1)次方除以p的余数恒等于1。
对于费马小定理,其近似逆命题
若a^(p-1)≡1(mod p),且a属于集合{1,2,3,…,p-1},则p为质数
几乎成立。
若能判断所有属于集合{1,2,3,…,p-1}的a都满足a^(p-1)≡1(mod p),即可确定p为质数,然而若p为合数,只有很少的a属于集合{1,2,3,…,p-1}会使a^(p-1)≡1(mod p)成立。据此可以设计算法:随机选取a属于集合{1,2,3,…,p-1},若a^(p-1)≡1(mod p)不成立,可 确定 p为合数,否则可以 几乎确定 p为质数,多次随机选取a增加判断的准确率。
算法实现:
该算法实际运行时的准确率远高于预期,测试结果:
100000000内数据测试100000000次单次测试times设为1错误率0%
对于确定型算法试除法,即尝试从2到√N的整数是否整除N,若N较大,则算法无法在如今大多数机器上一个可以忍耐的时间内结给出结果。使用随机化算法Miller-Rabin素性测试 则可以在极短的时间内得到一个较准确的结果,并且可以通过综合多次随机测试结果将错误概率降为可以忽略不计。
Miller-Rabin素性测试 基于费马小定理
费马小定理:假如p是质数,且gcd(a,p)=1,那么 a^(p-1)≡1(mod p)。
即:假如a是整数,p是质数,且a,p互质(即两者只有一个公约数1),那么a的(p-1)次方除以p的余数恒等于1。
对于费马小定理,其近似逆命题
若a^(p-1)≡1(mod p),且a属于集合{1,2,3,…,p-1},则p为质数
几乎成立。
若能判断所有属于集合{1,2,3,…,p-1}的a都满足a^(p-1)≡1(mod p),即可确定p为质数,然而若p为合数,只有很少的a属于集合{1,2,3,…,p-1}会使a^(p-1)≡1(mod p)成立。据此可以设计算法:随机选取a属于集合{1,2,3,…,p-1},若a^(p-1)≡1(mod p)不成立,可 确定 p为合数,否则可以 几乎确定 p为质数,多次随机选取a增加判断的准确率。
算法实现:
int isPrime(long long x,int times){ /* x为待测试数,times为测试次数 */ long long a,b,r; for (srand(x+rand()); times--;){ a = ((x-2)*rand()*1./RAND_MAX)+2; b = x - 1; for (r = 1; b; b >>= 1){ b&1?r=r*a%x:0; a=a*a%x; } if (r%x!=1) return 0; } return 1; }
该算法实际运行时的准确率远高于预期,测试结果:
100000000内数据测试100000000次单次测试times设为1错误率0%
相关文章推荐
- 动态消息转发机制实例
- 面向对象五大原则
- 方法的重载
- eclipse配置文件的导出
- NGUI实现输入框和进度条
- hdu4394Digital Square(优先队列+广搜+__int64)
- 第一篇 UEditor入门部署和体验
- Servlet中的过滤器Filter详解
- strlen、strcpy、strcat等字符串处理函数的实现
- Cocos2d-x 游戏开发 - 代码与CocosBuilder绑定
- 内部类和匿名内部类
- switch语句作用域
- 大道至简第三章读后感
- C#中字符串转换成二进制流
- 功能测试-UFT 工具
- POJ 1050 To the Max(简单DP)
- 队列
- linux环境变量设置详解
- 自定义Xib奔溃处理方法
- tomcat作为windows服务无法启动如何解决,报错:参考特定服务错误代码0