• 欧拉(线性)筛 && Miller_Rabin 测试素数


    void make_prime()//欧拉筛
    {
        is_prime[1]=is_prime[0]=true;
        for(int i=2;i<=1e6;i++)
        {
            if(!is_prime[i])
            {
                prime[++tot]=i;
            }
            for(int j=1;j<=tot&&i*prime[j]<=1e6;j++)
            {
                is_prime[i*prime[j]]=true;
                if(i%prime[j]==0)
                {
                    break;
                }
            }
        }
    }

    Miller_Rabin 测试素数:https://www.cnblogs.com/Norlan/p/5350243.html

    模板:https://cn.vjudge.net/problem/HihoCoder-1287

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<algorithm>
    #include<queue>
    #include<map>
    
    #define mem(a,b) memset(a,b,sizeof(a))
    #define int long long
    
    using namespace std;
    
    const int maxn=1e8+10;
    //10000000
    
    int mul(int a,int b,int mod)
    {
        int s=0;
        while(b)
        {
            if(b&1) s=(s+a)%mod;
            a=(a*2)%mod;
            b>>=1;
        }
        return s;
    }
    
    int smul(int a,int b,int mod)
    {
        int s=1;
        while(b)
        {
            if(b&1) s=mul(s,a,mod);
            a=mul(a,a,mod);
            b>>=1;
        }
        return s;
    }
    
    int make_prime[15]={0,2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37};//底数
    
    int Miller_Rabin(int p)
    {
        int is_p=1;
        if(p==1) return 0;
        for(int i=1;i<=12;i++)//保证a与底数互质特判
        {
            if(!(p%make_prime[i])) return 0;
            if(p==make_prime[i]) return 1;
        }
        for(int i=1;i<=12;i++)
        {
            int now=p-1,s;
            while((s=smul(make_prime[i],now,p))==1)//a^(p-1)=1(%p);
            {
                if(!(now%2))//每次去除2的因子知道没有2为止
                    now/=2;
                else
                    break;
            }
            if(s==1||s==p-1) continue;//若s==1||p-1通过测试
            is_p=0;break;
        }
        return is_p;
    }
    
    #undef int
    int main(){
    #define int long long
        int a,t;
        scanf("%lld",&t);
        while(t--)
        {
            scanf("%lld",&a);
            printf("%s
    ",(Miller_Rabin(a)?"Yes":"No"));
        }
        return 0;
    }
    
  • 相关阅读:
    9个开源支付项目,用来学习如何实现支付功能
    documentdb
    Azure Redis
    Azure Diagnostics
    Content Delivery Network (CDN)
    MVVM design pattern
    Azure Cloud Application Design and Implementation Guidance performance-optimization
    Azure Nosql
    设计原则与模式
    C# Yield
  • 原文地址:https://www.cnblogs.com/minun/p/10473754.html
Copyright © 2020-2023  润新知