博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
miller_robin大素数判定
阅读量:5364 次
发布时间:2019-06-15

本文共 1800 字,大约阅读时间需要 6 分钟。

参考了ACdreamer大神的博客

在51nod上看了个10^30范围的素数判定,打表肯定是不行了,应该用miller-robin素数判定加java的BigInteger

首先基于fermat小定理就是gcd(a,p)=1时,a^(p-1)%p=1,所以在生成rand(2,p-1)的随机数后,如果输入的是个素数,那么必有pow(a,p-1)%p=1,这里采用快速幂取模,在一次探查后,若结果不为1,则p必然不是一个素数,否则有75%的概率是素数,那么探查10次有

1-(0.75)^10=0.94369的概率是素数(好像是这样)。当然可以多探查到20次,成功率0.996828

 

在这里还有一个优化,就是根据上面博客叙述的二次探查定理x^2==1(mod p)在p为素数的情况下x必为1或p-1,那么就有一个优化,先滤出p-1的2次幂,假设p-1=m*2^sqr,先计算x=pow(a,m)%p,之后每次平方看是否存在y=x*x%p==1但是x又不为1,p-1的,这就说明p必不是素数

代码如下:

import java.io.*;import java.util.*;import java.math.BigInteger;public class minller{    public static final int iter=10;    public static BigInteger fast_fac(BigInteger a,BigInteger n,BigInteger mod){        BigInteger TWO=BigInteger.valueOf(2),ans;        a=a.mod(mod);        ans=BigInteger.ONE;        while (!(n.equals(BigInteger.ZERO)))        {            if ((n.mod(TWO)).equals(BigInteger.ONE)){                ans=(ans.multiply(a)).mod(mod);                n=n.subtract(BigInteger.ONE);            }            n=n.divide(TWO);            a=(a.multiply(a)).mod(mod);        }        return ans;    }    public static boolean millerRobin(BigInteger p){        BigInteger TWO=BigInteger.valueOf(2),a,x,n,y=BigInteger.ZERO,p_1;        Random rnd=new Random();        p_1=p.subtract(BigInteger.ONE);        if (p.equals(BigInteger.ONE)) return false;        if (p.equals(TWO)) return true;        if ((p.mod(TWO)).equals(BigInteger.ZERO)) return false;                int MAX,sqr=0;        //滤出2的次方        n=p.subtract(BigInteger.ONE);        while ((n.mod(TWO)).equals(BigInteger.ZERO)){            ++sqr;            n=n.divide(TWO);        }                if (n.compareTo(BigInteger.valueOf(10000))==1)            MAX=10000;        else MAX=n.intValue();                        for (int i=0;i

转载于:https://www.cnblogs.com/mintmy/p/4047170.html

你可能感兴趣的文章
php环境搭建脚本
查看>>
php 编译常见错误
查看>>
MES架构
查看>>
高性能JavaScript-JS脚本加载与执行对性能的影响
查看>>
hdu 2767(tarjan)
查看>>
sklearn之分类模型混淆矩阵和分类报告
查看>>
MySQL各存储引擎
查看>>
项目--简单导出CSV文件
查看>>
Oracle session相关数据字典(一)
查看>>
织梦文章内容提取第一张或者多张图片输出
查看>>
C#用正则表达式 获取网页源代码标签的属性或值
查看>>
BZOJ 3399 [Usaco2009 Mar]Sand Castle城堡(贪心)
查看>>
WCF(一) 简单的认知
查看>>
[MFC][DShow]简单例子
查看>>
js onclick事件传参
查看>>
WiCloud 商业Wi-Fi管理平台
查看>>
团队项目--未完待续
查看>>
双重标准,我该怎么解决
查看>>
python中的网页标签等字符处理
查看>>
Linux常用命令(十二)
查看>>