筛法求素数真的很快
生成素数的算法

生成素数的算法素数,也称质数,是指只能被1和自身整除的正整数。
在数学中,素数是一种非常重要的数,因为任何一个正整数都可以唯一地分解成若干个素数的积。
因此,生成素数一直是数学研究的一个重要课题,也是计算机科学中的一个基本算法问题。
本文将介绍几种生成素数的算法,包括朴素算法、埃氏筛法、欧拉筛法等。
1. 朴素算法朴素算法,又叫试除法,是一种最简单直接的方法。
它的基本思路是:依次枚举正整数,判断它是否为素数。
若这个数能被除了1和自身外的其他数整除,则不是素数,否则就是素数。
下面是朴素算法的Java代码实现:```public static boolean isPrime(int num) {if (num <= 1)return false;for (int i = 2; i <= Math.sqrt(num); i++) {if (num % i == 0)return false;}return true;}```从代码中可以看出,朴素算法的时间复杂度为O(sqrt(n)),空间复杂度为O(1)。
缺点是效率较低,无法处理大数据量,容易被攻击。
2. 埃氏筛法埃氏筛法是一种非常经典的生成素数的算法,也称为“筛法”。
它的基本思路是:从2开始,每次找出一个素数,并将其倍数全部标记为合数。
这样不断找素数、标记合数,就可以得到所有不大于一个给定整数n的素数。
最终没有被标记的数字就是素数。
```public static int[] sieveOfEratosthenes(int n) {boolean[] isPrime = new boolean[n + 1];Arrays.fill(isPrime, true);for (int i = 2; i * i <= n; i++) {if (isPrime[i]) {for (int j = i * i; j <= n; j += i) {isPrime[j] = false;}}}int count = 0;for (int i = 2; i <= n; i++) {if (isPrime[i]) {count++;}}int[] primes = new int[count];int idx = 0;for (int i = 2; i <= n; i++) {if (isPrime[i]) {primes[idx++] = i;}}return primes;}```埃氏筛法的时间复杂度为O(nloglogn),空间复杂度为O(n)。
筛法求素数

筛法求素数一,确定素数。
二,以此数为圆心,作对称轴。
三,逐步减去该圆周长的一半,直至结果为素数。
四,看哪个素数与对称轴之积最大,则是这个素数。
如上面所示: 16与15的差=1,这样,很快就能看出这个素数是1。
五,如果不符合条件,那么必须重新开始。
找到符合条件的数后,再用筛法。
…我的老师——赵老师为了表示大自然对我们的恩泽,便出了一道题给我们做。
我听到了这个消息时,高兴得两只手抓住了头发,感觉头发都快掉光了。
“太棒了!我终于可以摆脱他们啦!”找出来,每天除了吃饭、睡觉,其余的时间我都花在寻找素数和合数上面了。
我把找素数和合数当成游戏一般,玩耍一番。
我去问爸爸妈妈,我从她们那里得知方程就是求未知数的值的,我很惊奇,便去查资料。
方程是一种解决数学问题的等式,是比较重要的数学模型之一。
它既是一种等式,又是一个未知数。
同时也是具有等号左边的值和右边的未知数的等式。
有时候,我感觉很难理解它的含义。
我去翻阅书本,书上写着:“方程就是用一个未知数和一个已知数表示出两个数之间的关系。
例如: X+Y=Y,则X和Y就叫做方程的未知数,X和Y就叫做方程的两个数,而方程里的未知数,等于方程两边的数的总和。
”书上讲的是那么的清晰,我渐渐地明白了方程的意思。
“接下来就是探索素数和合数的奥秘了。
”老师说道。
随着老师这一声令下,同学们又在火热的研究素数和合数的道路上狂奔。
我问同学们,他们问了一些同学,我一点也没想到一道简单的题,可以出现这么多问题。
由于没有经验,我研究了很久,还是没能解决。
老师走过来,亲切地对我说:“你怎么了?这道题目是这样做的,为什么不会呢?”“对啊,你能告诉我吗?”我回答道。
老师不紧不慢地说:“好吧,这样做吧!”说完,老师便教我做这道题。
老师解释道:“这样的做法:素数÷1÷2÷3÷4÷5,同理,合数也是这样算的。
”我恍然大悟,原来做题可以这么简单。
在我们班上,还有一位特殊的数学家——罗嘉东,同学们都尊敬地称呼他为“罗爷”。
数论——素数筛选法与整数的素因子分解

数论——素数筛选法与整数的素因⼦分解筛选法求出n以内的素数,最快的应该是筛选法。
筛选法的思路是:要求10000以内的素数,把1-10000都列出来,1不是素数,划掉;2是素数,所有2的倍数都不是素数,划掉;取出下⼀个幸存的数,划掉它的所有倍数;直到所有素数找完为⽌。
这种做法的空间复杂度是O(n),时间复杂度O(n/logn)。
1 const int Max = 1000005;2 bool prime[Max]={0};//0表⽰素数,1为⾮素数34 //筛选n以内的素数5 void getPrime(int n)6 {7 int i,j;8 int t;9 for(i = 2; i <= n; i++)10 {11 if(!prime[i])12 {13 for(j = 2; (t=j*i) <= n; j++)14 prime[t] = 1;15 }16 }17 }分解素因⼦唯⼀质因⼦分解定理:任意⼀个合数a仅能以⼀种⽅式,写成如下的乘积形式:a = p1^e1*p2^e2*...*pr^er其中pi为素数,p1<p2<...<pr,且ei为正整数。
例如数6000=2^4*3*5^3。
素因⼦的分解技巧:⾸先a的某两个素因⼦不可能同时⼤于sqrt(a),这样,先⽤筛选法求出sqrt(a)以内的所有素数,然后⽤a依次去mod这些素数,若能整除,则找到素因⼦,将素因⼦去掉,再继续找。
最后若a>1,则a也是它的素因⼦。
1 const int Max = 100005;2 int isPrime[Max]={0};3 int prime[Max/5],num=0;4 int factors[100],s=0;56 void getPrime(int n)7 {8 int i,j;9 int t;10 for(i = 2; i <= n; i++)11 {12 if(!isPrime[i])13 {14 prime[num++] = i;15 for(j = 2; (t=i*j) <= n; j++)16 isPrime[t] = 1;17 }18 }19 }2021 void decompose(int n, int* factors)22 {23 int te = (int)sqrt(n*1.0);24 for(int i = 0; i<num&&prime[i]<=te; i++)25 {26 if(n%prime[i]==0)27 {28 factors[s++] = prime[i];29 while(n%prime[i]==0)30 n = n/prime[i];31 }32 }33 if(n > 1)34 factors[s++] = n;35 }。
c语言求素数最快方法

c语言求素数最快方法摘要:1.引言2.最快方法:埃拉托斯特尼筛法(Sieve of Eratosthenes)3.算法原理4.C语言实现5.代码解析6.性能测试与优化7.结论正文:**引言**在计算机科学和编程领域,寻找素数是一种常见的任务。
素数是指大于1的自然数中,除了1和它本身以外,不能被其他自然数整除的数。
求解素数问题有助于理解数论、密码学等领域。
本文将介绍求解素数的最快方法——埃拉托斯特尼筛法(Sieve of Eratosthenes)及其C语言实现。
**最快方法:埃拉托斯特尼筛法(Sieve of Eratosthenes)**埃拉托斯特尼筛法是一种基于二维数组的算法,用于找出小于等于上限的素数。
该算法利用了素数的性质:如果一个数是素数,那么它的平方模小于等于上限的数也是素数。
通过不断标记数组中的素数,最终得到小于等于上限的素数。
**算法原理**1.创建一个二维数组,用于存储小于等于上限的数。
2.初始化数组中的所有元素为1,表示都是素数。
3.从2开始,遍历数组,将数组中的所有素数两两相乘,得到的结果大于上限的,将其对应的元素标记为0,表示该数不是素数。
4.重复步骤3,直到数组中的所有元素都被标记或遍历到上限。
**C语言实现**以下是一个简单的C语言实现:```c#include <stdio.h>#include <stdbool.h>void sieve_of_eratosthenes(int limit) {bool *prime = (bool *)malloc((limit + 1) * sizeof(bool));for (int i = 0; i <= limit; i++) {prime[i] = true;}for (int p = 2; p * p <= limit; p++) {if (prime[p]) {for (int i = p * p; i <= limit; i += p) {prime[i] = false;}}}for (int i = 2; i <= limit; i++) {if (prime[i]) {printf("%d ", i);}}free(prime);}int main() {int limit;printf("请输入一个上限:");scanf("%d", &limit);sieve_of_eratosthenes(limit);return 0;}```**代码解析**1.首先,我们需要一个布尔数组来存储小于等于上限的数是否为素数。
筛法求素数真的很快

end.
用我那台烂电脑测筛法求素数的效率都如此之高,所以这个……必须要熟练掌握啊!
var i,j,k,n:longint;
l:array[1..1000000]of boolean;
su:array[1..500000]of longint;
begin
k:=0;
fillchar(l,sizeof(l),true);
求100万以内所有素数用时008求1000万以内所有素数用时11用我那台烂电脑测筛法求素数的效率都如此之高所以这个
筛法求素数真的很快,具体有多快?今天测了一下:
求10万以内所有素数,用时0.01秒之内;
求100万以内所有素数,用时0.08秒;
求1000万以内所有素数,用时1.1秒;
求1亿以内所有素数,用时约13秒。
readln(n);
for i:=2 to trunc(sqrt(n)) do
div i do l[i*j]:=false;
for i:=2 to n do if l[i] then begin
inc(k);
su[k]:=i;
end;
writeln(k);
素数判断最快方法

素数判断最快方法素数是大于1的自然数中,只有1和它本身两个因数的数。
在数学中,素数是一个重要的概念,它们在很多领域中都有广泛的应用。
判断一个数是否为素数是素数计算中的一个常见问题。
下面介绍几种最快的判断素数的方法。
方法一:试除法试除法是判断一个数是否为素数的常用方法之一。
具体步骤如下:1. 将待判断的数除以1到它的最大因数n(n小于等于6),并记录下每次除到的数。
2. 如果每次除到的数都是n,那么该数就是素数;否则,该数不是素数。
这种方法的优点是简单易行,但是效率较低,需要反复进行除法运算。
方法二:筛法筛法是判断一个数是否为素数的另一种常用方法。
具体步骤如下:1. 将待判断的数从1到它的最大因数n(n小于等于6)依次除以每个小于等于它的因数,并记录下每次除到的数。
2. 如果每次除到的数都是n,那么该数就是素数;否则,该数不是素数。
这种方法的优点是速度快,只需要进行因数分解即可,但是需要记住每个小于等于它的因数的情况。
方法三:埃氏筛法埃氏筛法是判断一个数是否为素数的第三种常用方法。
具体步骤如下:1. 将待判断的数从1到n(n小于等于6)依次排列,并将它们划分为素数和合数两部分。
2. 选取一个小于等于n的随机数i,然后将待判断的数i从素数部分中取出,并继续从1到i的平方根范围内选取一个数j,然后将待判断的数j从合数部分中取出。
3. 如果i等于j的平方根,那么该数就是素数;否则,该数不是素数。
埃氏筛法是一种高效的算法,可以进行因数分解,并且适用于较大的数的判断。
但是需要记住每个数的情况,并且选取随机数的时间复杂度较高。
以上是几种常用的判断素数的方法,每种方法都有其优缺点和适用范围,需要根据具体情况选择。
在实际计算中,通常需要根据具体情况综合使用多种方法,以提高判断素数的效率。
素数快速筛法及公式

素数快速筛法及公式素数快速筛法及公式梅生林安徽合肥2012.07.12摘要:在素数的研究中,总结出素数快速筛法及公式,在这个基础上扩展了素数的一些关系、性质。
关键词:素数快速筛法,素数通式,质数筛法公式1.引言素数(Prime Number)是指自然数中那些只能被1和本身整除的数,依次为2、3、5、7、11、13、17、19、23、29…。
前人已证明:素数有无限多个。
一直到现在人们判定、寻找素数的方法,还是古希腊的数学家艾拉托斯芬(Eratosthenes)提出过的筛式方法,简称“艾氏筛法”。
即在任意有限自然数N以内判定素数时,先把N一个不漏的写下来,然后划掉根号N()内所有素数的倍数,我们就能得到N以内的全部素数。
艾氏筛法判定素数的过程机械,也未能表示素数公式和一些性质。
关于寻找判定表示素数的方法公式,以前众多数学家进行了艰辛探索,也提出了很多关于素数的猜想和问题。
欧拉(Euler)就提出二项式公式n2-n+41能生成一部分素数的数型公式,直到现在,素数研究中仍然还有许多未解问题。
本文通过素数快速筛法及公式,总结出一些素数的新理论,使素数筛法及公式等都将是一次质变,将为素数研究抛砖引玉,也可能为数论增添上新的一页。
2.素数的快速筛法原理及公式当我们用艾氏筛法是要划掉每个合数,只2的倍数就差不多要划掉一半自然数,越往后面合数越多,而留下的素数越少。
我们能不能利用数学原理、公式去掉大部分合数呢?答案是肯定的。
2.1 当我们想去掉第一个素数2的倍数时,我们可能会想到用:2N+1 (N≥1)N为大于等于1的自然数,以下公式同上。
2.2 去掉2、3的倍数时,用2*3的倍数加上同为2、3互质的数:6N±12.3 去掉2、3、5的倍数时,用2*3*5的倍数加上同为2、3、5互质的数:30N±1,30N±7,30N±11,30N±13,2.4 去掉2、3、5、7的倍数时,同上的方法:210N±1,210N±11,210N±13,210N±17,210N±19,210N±23,210N±29,210N±31,210N±37,210N±41,210N±43,210N±47,210N±53,210N±59,210N±61,210N±67,210N±71,210N±73,210N±79,210N±83,210N±89,210N±97,210N±101,210N±103,2.5 去掉2、3、5、7、11的倍数时,同上的方法:2310N±1,2310N±13,2310N±17,2310N±19,……2310N±1139,2310N±1147,2310N±1151,2310N±1153,我们可以一直做下去,就会去掉从前面开始的素数倍数,划掉的合数比例将越来越少。
埃氏筛求素数

埃氏筛求素数埃氏筛是一种用于求解素数的经典算法,它的原理非常巧妙,可以高效地筛选出一定范围内的素数。
本文将介绍埃氏筛的算法原理和实现方法,帮助读者更好地理解和应用这一算法。
我们需要明确什么是素数。
素数是指只能被1和自身整除的自然数,比如2、3、5、7等。
而非素数则是能够被其他数整除的数。
求解素数的问题一直以来都是数论中的重要研究领域,埃氏筛就是其中一种经典方法。
埃氏筛的算法思想很简单,首先我们需要一个布尔数组来标记每个数是否为素数。
假设我们要求解不超过n的素数,那么我们可以创建一个长度为n+1的布尔数组,初始化为True。
然后从2开始,将其所有的倍数都标记为False,因为它们不可能是素数。
接下来,再找到下一个未被标记为False的数,重复上述步骤,直到找不到下一个未被标记的数为止。
最后,所有未被标记的数即为素数。
具体来说,我们可以用如下伪代码表示埃氏筛的实现过程:```def sieve(n):is_prime = [True] * (n+1)is_prime[0] = is_prime[1] = Falsefor i in range(2, int(n**0.5)+1):if is_prime[i]:for j in range(i*i, n+1, i):is_prime[j] = Falseprimes = [i for i in range(n+1) if is_prime[i]]return primes```以上就是埃氏筛的核心算法。
接下来我们来看一个例子,以帮助读者更好地理解:假设我们要求解不超过30的素数,按照埃氏筛的算法流程,首先创建一个长度为31的布尔数组,并将所有元素初始化为True。
然后从2开始,将其所有的倍数标记为False。
接下来找到下一个未被标记为False的数,即3,将其所有的倍数标记为False。
再找到下一个未被标记的数,即5,将其所有的倍数标记为False。
依次类推,直到找不到下一个未被标记的数。