素数判断的多种方法

包括线性筛,朴素判断方法,以及miller-rabin(非加强版)

#include <iostream>
#include <cstdlib>
#include <vector>
#include <map>
using namespace std;

inline bool sqrt_judge(int x)  //复杂度O(sqrt(n))
{
    if(x == 2) return 1;
    if(x == 1) return 0;
    for(int i = 2; i*i <= x; i++) if(x % i == 0) return 0;
    return 1;
}

inline int Pow(int x, int P)
{
    int ans = 1;
    for(int i = 1; i <= P; i++) ans = ans*x%(P+1);
    return ans;
}

inline bool Miller_Rabin(int x)  //不稳定随机判断,复杂度O(1)
{
    if(x == 2) return 1;
    if(x == 1) return 0;
    int p[7] = {2, 3, 5, 7, 11, 13, 17};
    for(int i = 0; i < 7 && p[i] != x; i++) if(Pow(x, p[i]-1) != 1) return 0;
    return 1;
}
vector <int> prime;
map <int, int> check;
void Select()  //素数筛,筛选复杂度O(n),判断复杂度O(1)
{
    prime.clear(); check.clear();
    for(int i = 2; i <= 100000; i++)
    {
        if(! check[i]) prime.push_back(i);
        for(auto x : prime)
        {
            if(i * x > 100000) break;
            check[i * x] = 1;
            if(i % x == 0) break;
        }
    }
}

int main()
{
    Select();
    int n;
    while(cin>>n)
    {
        int ans = 0, i;
        switch(rand()%3)
        {
            case 0: for(i = 1; i < n; i++) if(sqrt_judge(i)) ans += i; break;
            case 1: for(i = 1; i < n; i++) if(Miller_Rabin(i)) ans += i; break;
            case 2: for(auto x : prime) if(x < n) ans += x; else break; break;
        }
        cout<<ans<<endl;
    }
}
时间: 2025-01-07 14:46:22

素数判断的多种方法的相关文章

多种方法实现素数的判断

原文:多种方法实现素数的判断 素数的定义: 指整数在一个大于1的自然数中,除了1和此整数自身外,没法被其他自然数整除的数.换句话说,只有两个正因数(1和自己)的自然数即为素数. 我将给出几种实现对自然数n进行素数的判断方法,主要从代码的执行效率上考虑这个问题. 首先,根据素数的定义,大家都会想到的一个方法就是遍历2~n-1,如果n能被其中的数整除,则n不是素数,否则为素数. 代码: 1 //方法1(遍历) 2 int prime_1(int n) 3 { 4 for(int i=2;i<n;i+

[转] 多种方法实现素数的判断

素数的定义: 指整数在一个大于1的自然数中,除了1和此整数自身外,没法被其他自然数整除的数.换句话说,只有两个正因数(1和自己)的自然数即为素数. 我将给出几种实现对自然数n进行素数的判断方法,主要从代码的执行效率上考虑这个问题. 首先,根据素数的定义,大家都会想到的一个方法就是遍历2~n-1,如果n能被其中的数整除,则n不是素数,否则为素数. 代码: //方法1(遍历)int prime_1(int n){ for(int i=2;i<n;i++) { if( n%i==0 ) return

js判断移动端是否安装某款app的多种方法

第一种方法: 一:判断是那种设备 var isAndroid = u.indexOf('Android') > -1 || u.indexOf('Linux') > -1; //android终端或者uc浏览器 var isiOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); //ios终端 二:安卓设备:原理:判断是否认识这个协议,认识则直接跳转,不认识就在这里下载app android(); if(isAndroid){ function an

筛素数方法(二)—— MR素数判断

前言 \(Miller-Rabin\)素数测试是一个很好的筛素数方法,它的优点在于速度快且准确性较高,但依然有可能出错. 大致思路 \(MR\)素数测试利用费马小定理快速判断一个数是否是素数,但是由于这种方法只是较高概率不出现错误,并不是完全正确的,所以在时间充裕的情况下可不必使用这个方法. 具体实现 因为当\(n\)是素数,且\(gcd(a,n)=1\)时,\(a^{n?1}\equiv1(mod\ n)\). 所以我们可以多随机几个\(a\)(用于增加算法的准确性),然后判断\(a^{n?1

VC开发多语言界面 多种方法(很简单) 有源码

(需源码先留邮箱)先上图 1.通过遍历 得到所有控件ID号与TEXT,得到一个中文语言配置文件 void CVV_485Dlg::getCaptionForWindow() //做程序时用,其它时间不用 { //枚举对话框中所有组件 CWnd *pCtrl = GetWindow(GW_CHILD); while(pCtrl!=NULL) { UINT ctrlID = pCtrl->GetDlgCtrlID(); // setControlCaption(pCtrl,ctrlID); CStr

PHP读取文件多种方法与实例教程

分享下PHP中读取文件的八种方法,收集了很多php读取文件的例子,小而经典,是学习php文件操作的好资料. PHP中读取文件的几个方法,备阅.1.freadstring fread ( int $handle , int $length )fread() 从 handle 指向的文件中读取最多 length 个字节.该函数在读取完最多 length 个字节数,或到达 EOF 的时候,或(对于网络流)当一个包可用时,或(在打开用户空间流之后)已读取了 8192 个字节时就会停止读取文件,视乎先碰到

判断质数的方法

<?php header("Content-type: text/html; charset=utf-8"); /* 一个数,如果只有1和它本身两个因数,这样的数叫做质数(或素数). 例如 2,3,5,7 是质数,而 4,6,8,9 则不是,后者称为合成数或合数. 判断某个自然数是否是素数最常用的方法就是试除法——用比该自然数的平方根小的正整数去除这个自然数, 若该自然数能被整除,则说明其非素数. */ function sushu($a,$b) { for($i=$a;$i&l

php导出excel(多种方法)

php导出excel(多种方法)   分类: php 基本上导出的文件分为两种: 1:类Excel格式,这个其实不是传统意义上的Excel文件,只是因为Excel的兼容能力强,能够正确打开而已.修改这种文件后再保存,通常会提示你是否要转换成Excel文件. 优点:简单. 缺点:难以生成格式,如果用来导入需要自己分别编写相应的程序. 2:Excel格式,与类Excel相对应,这种方法生成的文件更接近于真正的Excel格式. 如果导出中文时出现乱码,可以尝试将字符串转换成gb2312,例如下面就把$

有关素数判断的一些算法(总结&amp;&amp;对比)

素性测试是数论题中比较常用的一个技巧.它可以很基础,也可以很高级(哲学).这次主要要介绍一下有关素数判断的奇技淫巧 素数的判断主要分为两种:范围筛选型&&单个判断型 我们先从范围筛选型这种常用的开始讲起,这里采用模板题Luogu P3383 [模板]线性筛素数来进行测试 1.埃氏筛 这是最常用的筛法了,思路也很简单:任何一个素数的倍数都是合数 然后我们O(n)扫一遍,同时筛去素数的倍数 但是有一些数如6,会被2和3都筛去一次,就造成了效率上的浪费,所以复杂度经证明为**O(n log lo