素数的一般筛法和快速线性筛法

一般筛法:

1 void prime() {
2     memset(vis, true, sizeof(vis));
3     vis[0] = vis[1] = false;
4     for (int i = 2; i < maxn; i++) {
5         for (int j = 2; i * j < maxn; j++) {
6             vis[i * j] = false;
7         }
8     }
9 }

快速线性筛法:

 1 int prime[N] = {0};
 2 bool isNotPrime[N] = {1, 1};
 3 int num_prime = 0;
 4
 5 void quick_prime()
 6 {
 7          for(int i = 2 ; i < N ; i ++)
 8            {
 9         if(! isNotPrime[i]) //i是合数的话,i = p1 * p2 * p3 * ···
10              prime[num_prime ++] = i;
11         for(int j = 0 ; j < num_prime && i * prime[j] <  N ; j ++)
12             {
13                   isNotPrime[i * prime[j]] = 1;
14               if( !(i % prime[j] ) ) // 当p1 == prime[j]时,筛除终止。筛出不大于p1的素数*i
15                 break;
16         }
17     }
18 }  

原文地址:https://www.cnblogs.com/xiaohanghuo/p/11621461.html

时间: 2024-10-11 11:40:18

素数的一般筛法和快速线性筛法的相关文章

一般筛法求素数+快速线性筛法求素数

素数总是一个比较常涉及到的内容,掌握求素数的方法是一项基本功. 基本原则就是题目如果只需要判断少量数字是否为素数,直接枚举因子2 ..N^(0.5) ,看看能否整除N. 如果需要判断的次数较多,则先用下面介绍的办法预处理. 一般的线性筛法 首先先介绍一般的线性筛法求素数 void make_prime() { memset(prime, 1, sizeof(prime)); prime[0]=false; prime[1]=false; int N=31700; for (int i=2; i<

【转载】一般筛法求素数+快速线性筛法求素数

素数总是一个比较常涉及到的内容,掌握求素数的方法是一项基本功. 基本原则就是题目如果只需要判断少量数字是否为素数,直接枚举因子2 ..N^(0.5) ,看看能否整除N. 如果需要判断的次数较多,则先用下面介绍的办法预处理. 一般的线性筛法 首先先介绍一般的线性筛法求素数 void make_prime() { memset(prime, 1, sizeof(prime)); prime[0]=false; prime[1]=false; int N=31700; for (int i=2; i<

线性筛法求素数

为什么称为线性,因为普通的筛法重复了好多次,冗余,而线性筛法避免了冗余. ①如果 i 都是是素数的话,那简单,一个大的素数 i 乘以不大于 i 的素数,这样筛除的数跟之前的是不会重复的.筛出的数都是 N=p1*p2的形式, p1,p2之间不相等 ②如果 i 是合数,此时 i 可以表示成递增素数相乘 i=p1*p2*...*pn, pi都是素数(2<=i<=n),  pi<=pj  ( i<=j )p1是最小的系数. 根据“关键处2”的定义,当p1==prime[j] 的时候,筛除就

欧拉线性筛法求素数(顺便实现欧拉函数的求值)

我们先来看一下最经典的埃拉特斯特尼筛法.时间复杂度为O(n loglog n) int ans[MAXN]; void Prime(int n) { int cnt=0; memset(prime,1,sizeof(prime)); prime[0]=prime[1]=0; for(int i=2;i<n;i++) { if(vis[i]) { ans[cnt++]=i;//保存素数 for(int j=i*i;j<n;j+=i)//i*i开始进行了稍微的优化 prime[j]=0;//不是素

【数学】【数论】素数的线性筛法

写在前面 记录了个人的学习过程,同时方便复习 素数的线性筛法 有时候需要筛出来一张素数表,即1~n范围内的所有素数 一个个枚举判断是否为素数显然太慢 于是经过仔细的研究之后,发现如果存在正整数k(k>2)不是素数,那么它的因子里面一定包含之前的素数 这样的话,开一个boolean数组标记一下不是素数的数,筛到它们的时候跳过就好 详见埃拉托斯特尼筛法 但是如果这样筛,显然会有重复的筛除啊 比如6筛去了42,7也筛去了42 这样的情况还有很多很多,十分影响效率,时间上并不是线性的 但如果按照一个数的

线性筛法(欧拉筛法)求素数

写$\text{O}\left( n \log{\log{n}}\right)$的筛法很长时间了,我却从来没想过它的优化.偶然间看到线性筛法,心想大约是不错的优化,于是便爬去学习下. 首先,$\text{O}\left( n \log{\log{n}}\right)$的筛法肯定要比$\text{O}\left( n\right)$的慢,虽然在现在的机子上不明显.还是不要将$\text{O}\left( n \log{\log{n}}\right)$比较靠谱.但是线性筛法有着它自己的用途.

线性筛法

关于线性筛法 线性是指O(n)内筛掉所有合数,还有一种方法叫埃氏筛法,我先证明埃氏筛法效率低,也就是会有重复. 证明如下: 埃氏筛法的原理是找到一个素数后,它的1~n倍就会被筛掉,任何一个合数都可以被拆成一个质数*合数的形式,我们对每一个质数对应的可能的(合)数都枚举了,这就保证了所有可能的合数都被筛掉了.为什么不是最优呢?问题出在那个质数上,对于一个合数m,m=h*P,P是质数且P>m的最小质因数,那么m也可以表示为m=H*p,(H是个比h大的合数,p是m的最小质因数),这样我们在枚举p的倍数

数论 - 线性筛法与积性函数

首先以求1000000以内的素数为例来探讨筛法 Eratosthenes筛法(埃拉托斯特尼筛法) 时间复杂度:O(N*loglogN) 空间复杂度:O(N) 代码: #include <map> #include <set> #include <list> #include <cmath> #include <deque> #include <queue> #include <stack> #include <bit

POJ-2689 Prime Distance(线性筛法)

Prime Distance Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 17021   Accepted: 4536 Description The branch of mathematics called number theory is about properties of numbers. One of the areas that has captured the interest of number th