zoukankan      html  css  js  c++  java
  • Miller-Rabbin素数测试

    前言

    (Miller-Rabbin) 素数测试可以判断比较大的数是不是素数。
    但是判断的结果可能是伪素数。

    前置知识

    费马小定理:

    [若p为素数是,满足 a^{p-1} equiv 1(mod p) ]

    二次探测定理:

    [若p为奇素数且 x^2 equiv 1(mod p);\则x equiv 1(mod p)或者 x equiv p-1(mod p) ]

    思路

    判断一个数 n 是不是素数,随机一个数 x (2 ≤ x < n),
    先对 x 的 n-1 次方进行 n 取模
    在运用二次探测定理判断结果是否为 1 或者 n-1,
    满足则为素数。
    其中当x=2时需要进行特判

    代码

    Code:
    inline bool millerRabbin(ll n){
        if(n<3)return n==2;
        ll a=n-1,b=0;
        while(a%2==0)a/=2,++b;
        for(int i=0,j;i<testTime;++i){
        	ll x=rand()%(n-2)+2,v=binpow(x,a,n);
    		if(v==1||v==n-1)continue;
    		for(j=0;j<b;++j){
    	    	v=multi(v,v,n);
    	    	if(v==n-1)break;
    		}
    		if(j>=b)return false;
        }
        return true;
    }
    
    新赛季的开始
  • 相关阅读:
    C#4.0,支持动态语言?
    宁波.NET俱乐部第二次聚会WCF讲稿
    在线学习新编程
    mysql常用函数
    PHP 连接Mysql数据库
    Unix网络编程进阶计划
    RabbitMQ 安装
    Golang 变量
    Golang 结构体
    Golang 指针
  • 原文地址:https://www.cnblogs.com/VagrantAC/p/12555066.html
Copyright © 2011-2022 走看看