zoukankan      html  css  js  c++  java
  • 【模板】质数判断(Miller_Rabin)

    题意简述

    给定一个范围N,你需要处理M个某数字是否为质数的询问(每个数字均在范围1-N内)

    题解思路

    费马小定理: n是一个奇素数,a是任何整数((1≤ a≤n-1)) ,则(a^{p-1}≡1(mod p))
    推论:如果n是一个奇素数,则方程(x^2 ≡ 1 (mod n))只有±1两个解

    代码

    #include <cstdio>
    using namespace std;
    const int t[5] = {0, 2, 7, 61};
    int n, m, x;
    int ksm(int a, int r, int mod)
    {
    	if (r == 0)
    		return 1;
    	if (r == 1)
    		return a;
    	int x = ksm(a, r >> 1, mod) % mod;
    	if (r & 1)
    		return ((long long) x * x * a) % mod; 
    	else return ((long long) x * x) % mod;
    }
    bool mr(int x)
    {
    	if (x == 1) 
    		return 0;
    	int cnt = 0, p1 = x - 1;
    	while (p1 % 2 == 0)
    	{
    		++cnt;
    		p1 /= 2;
    	}
    	for (int i = 1; i <= 3; ++i)
    	{
    		if (x == t[i])
    			return 1;
    		int xx = ksm(t[i], p1, x);
    		if (xx % x != 1 && xx % x != x - 1)
    		{
    			bool flag = 0;
    			for (int j = 1; j <= cnt; ++j)
    			{
    				xx = (long long) xx * xx % x;
    				if (xx == x - 1)
    				{
    					flag = 1; 
    					break;
    				}
    			}
    			if (!flag)
    				return 0;
    		} 
    	}
    	return 1;
    }
    int main()
    {
    	scanf("%d%d", &n, &m);
    	for (int i = 1; i <= m; ++i)
    	{
    		scanf("%d", &x);
    		if (mr(x)) puts("Yes");
    		else puts("No");
    	}
    }
    
  • 相关阅读:
    2020 浏览器市场份额
    Web高级 JavaScript中的算法
    Web高级 JavaScript中的数据结构
    JavaScript 集合对象
    Web高级 网站安全
    Web高级 HTTP报文
    Web高级 Eventloop和事件执行顺序
    Web高级 Ajax和跨域CORS
    javaScript 继承
    JavaScript 事件基础
  • 原文地址:https://www.cnblogs.com/xuyixuan/p/9428203.html
Copyright © 2011-2022 走看看