zoukankan      html  css  js  c++  java
  • 【hiho】92-93--素数【数论】

    miller_rabin质数筛法

    RP(Random polynomial)的时间复杂度

    板子

    /*
    判断一个大整数是否为素数,基于 米勒-拉宾素性检验
    input   :   long long 范围内的一个整数
    output  :   true or flase
    */
    
    #include <bits/stdc++.h>
    using namespace std;
    #define N 10
    typedef long long LL;
    LL random(LL n) {
    	return (LL)((double)rand()/RAND_MAX*n+0.5);
    }
    LL multi(LL a,LL b,LL m) { //计算a*b%m
    	LL ret=0;
    	while(b) {
    		if(b&1) ret=(ret+a)%m;
    		b>>=1;
    		a=(a<<1)%m;
    	}
    	return ret;
    }
    LL quick_mod(LL a,LL b,LL m) { //计算a^b%m
    	LL ans=1;
    	while(b) {
    		if(b&1) {
    			ans=multi(ans,a,m);
    			b--;
    		}
    		b>>=1;
    		a=multi(a,a,m);
    	}
    	return ans;
    }
    bool miller_rabin(LL n) {
    	if(n==2) return true;
    	if(n<2||!(n&1)) return false;
    	LL m=n-1;
    	int k=0;
    	while((m&1)==0) {
    		k++;
    		m>>=1;
    	}
    	for(int i=0; i<N; i++) {
    		LL a=rand()%(n - 1)+1;
    		LL x=quick_mod(a,m,n);
    		LL y=0;
    		for(int j=0; j<k; j++) {
    			y=multi(x,x,n);
    			if(y==1&&x!=1&&x!=n-1) return false;
    			x=y;
    		}
    		if(y!=1) return false;
    	}
    	return true;
    }
    int main() {
    	LL n;
    	int T;
    	cin>>T;
    	while(T--) {
    		cin>>n;
    		if(miller_rabin(n)) puts("Yes");
    		else puts("No");
    	}
    	return 0;
    }
    
  • 相关阅读:
    Hello World
    查找字符串 fiand
    stdou,write与print()
    python 中 按位 与 & ,| ,^ ,~,
    3*3元素主对角元素之和
    Python random() 函数
    文本颜色设计
    if __name__=="__main__
    join函数
    ProGAN论文的翻译+学习体会
  • 原文地址:https://www.cnblogs.com/shengwang/p/9718382.html
Copyright © 2011-2022 走看看