素数专题

素数专题


素数是一个经常的涉及到得内容,所以有必要整理出有关解决素数相关问题的算法

学习资料:Eratosthenes筛法和欧拉筛法对比  一般筛法求素数+快速线性筛法求素数  数学技巧之素数筛选

 1 /*
 2     约数枚举,复杂度O (sqrt(n))
 3     By TiaoZhan
 4 */
 5 vector<int> divisor(int n)
 6 {
 7     vector<int> res;
 8     for (int i=1; i*i<=n; ++i)
 9     {
10         if (n % i == 0)
11         {
12             res.push_back (i);
13             if (n / i != i)    res.push_back (n / i);
14         }
15     }
16
17     return res;
18 }
 1 /*
 2     整数分解,复杂度O(sqrt(n))
 3     By TiaoZhan
 4 */
 5 map<int, int> prime_factor(int n)
 6 {
 7     map<int, int> res;
 8     for (int i=2; i*i<=n; ++i)
 9     {
10         while (n % i == 0)    {++res[i];    n /= i;}
11     }
12     if (n != 1)    res[n] = 1;
13
14     return res;
15 }
 1 /*
 2     素性测试,输入正数,复杂度O (sqrt(n))
 3     By TiaoZhan
 4 */
 5 bool is_prime(int n)
 6 {
 7     for (int i=2; i*i<=n; ++i)
 8     {
 9         if (n % i == 0)    return false;
10     }
11     return n != 1;    //1例外
12 }

 1 /*
 2     此算法在小范围(1e5)内判素数个数以及单个数判素数有奇效,不适用于大范围判素数
 3 */
 4 bool is_prime(int x)    {
 5     if (x == 2 || x == 3)   return true;
 6     if (x % 6 != 1 && x % 6 != 5)   return false;
 7     for (int i=5; i*i<=x; i+=6) {
 8         if (x % i == 0 || x % (i + 2) == 0) return false;
 9     }
10     return true;
11 }

更高效的素性测试

 1 /*
 2     埃氏筛法:返回n以内素数的个数, 复杂度O (nloglogn)
 3     By TiaoZhan
 4 */
 5 int seive(int n)    {        //Eratosthenes (埃氏筛法)
 6     int p = 0;
 7     memset (is_prime, true, sizeof (is_prime));
 8     for (int i=2; i<=n; ++i)    {
 9         if (is_prime[i])    {
10             prime[++p] = i;
11             for (int j=2*i; j<=n; j+=i)    is_prime[j] = false;
12         }
13     }
14     return p;
15 }

 1 /*
 2     欧拉筛法:返回n以内素数的个数, 复杂度O (n)
 3 */
 4 int seive2(int n)    {        //Euler (欧拉筛法)
 5     int p = 0;
 6     memset (is_prime, true, sizeof (is_prime));
 7     for (int i=2; i<=n; ++i)    {
 8         if (is_prime[i])    prime[++p] = i;
 9         for (int j=1; j<=p && i*prime[j]<=n; ++j)    {
10             is_prime[i*prime[j]] = false;
11             if (i % prime[j] == 0)    break;
12         }
13     }
14     return p;
15 }

更高效的素数筛法

附上比较两种筛法的测试结果

时间: 2024-11-12 06:28:02

素数专题的相关文章

素数 专题

素数性质总结: 小于x的素数个数(随着x逐渐增大),与x/lnx近似: 素数测试方法,诶拉托色尼筛法:如果n是一个合数,那么n一定有一个不超过sqrt(n)的素因子:6N±1法:对于任何一个自然数,都可以表示为如下形式之一:6N,6N+1,6N+2,6N+3,6N+4,6N+5(N=0,1,2,3...)显然,当N>=1时,只有形如6N+1,6N+5的自然数有可能是素数(代码后面贴上) n!的素因子分解中的素数p的幂为 n/p+n/p2+n/p3+...... 梅森素数:如果m是一个正整数,且2

【算法】素数专题

[素数判定] 假设输入的都是正数,时间复杂度O(sqrt(n)) bool is_prime(int n){ for(int i = 2;i*i <= n; i++){ if(n % i == 0) return false; } return n != 1; } [因数枚举] 时间复杂度O(sqrt(n)). vector<int> divisor(int n){ vector<int> res; for(int i = 1;i*i <= n; i++){ if(n

素数专题——素数筛法

关于素数的判断,大家最常用的方法估计就是循环判断到sqrt(n)的方法了:(直接上代码) bool isprime(int n) { for(int i=2;i<=sqrt(n);i++) { if(n%i==0) return false; } return true; } 这种素数的判断方法的确直观,但这种算法只对较小数据量适用,当数据量较大时,该方法就不再适用于素数的判定了.因此,我们此处引入一种新的算法——素数筛法. 首先介绍一下什么叫素数筛法: 假设所有待判断的数字的上限是L,声明一个

【专题】素数的判定与筛法

素数的判定与筛法     判定:很简单嘛!暴力大法参上! #include<iostream> #include<cmath> unsigned long int n,i,j,a,b; using namespace std; int main() { cin>>n; j=(int)sqrt(n); for(i=2;i<=j;i++) if(n%i==0) break; if(i>j&&n!=0&&n!=1) cout<

嵌套循环专题 100以内所有的质数(素数) primeNumber

/*100以内的所有质数的输出.质数:素数,只能被1和它本身整除的自然数.-->从2开始,到这个数-1结束为止,都不能被这个数本身整除. 最小的质数是:2*/ 重点  重置flag 设立flag class PrimeNumberTest { public static void main(String[] args) { boolean isFlag = true;//标识i是否被j除尽,一旦除尽,修改其值 for(int i = 2;i <= 100;i++){//遍历100以内的自然数

数论快速入门(同余、扩展欧几里德、中国剩余定理、大素数测定和整数分解、素数三种筛法、欧拉函数以及各种模板)

数学渣渣愉快的玩了一把数论,来总结一下几种常用的算法入门,不过鶸也是刚刚入门, 所以也只是粗略的记录下原理,贴下模板,以及入门题目(感受下模板怎么用的) (PS:文中蓝色字体都可以点进去查看百度原文) 附赠数论入门训练专题:点我打开专题(题目顺序基本正常,用以配套数论入门) 一.同余定理 简单粗暴的说就是:若 a-b == m 那么 a%m == b%m 这个模运算性质一眼看出...直接上入门水题: Reduced ID Numbers 附AC代码(这个也没啥模板....知道就好) #inclu

开源服务专题之------sshd服务安装管理及配置文件理解和安全调优

本专题我将讨论一下开源服务,随着开源社区的日趋丰富,开源软件.开源服务,已经成为人类的一种公共资源,发展势头可谓一日千里,所以不可不知.SSHD服务,在我们的linux服务器上经常用到,很重要,涉及到服务器的安全,对这个服务的安全配置要高度重视.本文将从以下三个方面进行阐述开源服务及ssh服务. 一.学习开源服务的步骤和方法 二.SSHD服务安装.配置.使用 三.设置安全的SSHD服务 一.学习开源服务的步骤和方法: 1. 了解服务的作用:名称,功能,特点 2. 安装 3. 配置文件位置,端口

线段树专题(一)

Acmer可怜啊,根本没有休息,昨天才刚刚完成了矩阵专题,今天又要开线段树专题了.唉,等我以后月薪15K的时候,我要好好享受人生......呃,扯远了.线段树是一个非常重要的数据结构,以前就学习过,但是没有系统的刷过难题,这次我决定将kuangbin先生的专题和NotOnlySuccess大神的专题一起刷掉.因为题目多又难,所以分成几个部分(最多三个把). 对于线段树的话,主要是理解它的树形结构吧,推荐和树状数组一起学习.似乎树状数组就是线段树的退化,树状数组节约了差不多一半的空间,但是必须满足

hdu 2161 Primes 素数打表

在kuangbin带你飞专题看到的,水了一发,但是wa了一次,T了一次,竟然连素数打表都快不会写了. 而且连求素数时候只需到根号n就可以都忘了,假设有因子m大于√n,那么n/m一定小于√n,所以它在√n前面已经被选出来了. 代码: #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<vector>