质数的性质和埃式质数筛
创作时间:
2025-03-18 03:40:03
作者:
@小白创作中心
质数的性质和埃式质数筛
引用
1
来源
1.
https://bbs.huaweicloud.com/blogs/434773
质数,也称素数,是数学中一个非常重要的概念。它们在密码学、计算机科学等领域有着广泛的应用。本文将介绍质数的基本性质,以及如何使用埃拉托斯特尼筛法(埃式筛)高效地寻找质数。
1. 质数简介
质数,也称素数,是指在大于1的自然数中,除了1和它本身外,不能被其他自然数整除的数。质数具有以下性质:
- 质数的约数只有两个:1和它本身。
- 算术基本定理表明,任何一个大于1的自然数都可以唯一分解成有限个质数的乘积。
- 质数的个数是无限的,这是由欧几里得证明的。
- 除了2以外,所有的质数都是奇数。
- 所有大于2的质数都可以表示为6n±1的形式。
- 任何不是1的自然数至少存在一个质数约数。
质数在密码学领域扮演着重要的角色,特别是在公钥密码学中,如RSA加密算法,它使用了大质数的乘积作为公钥和私钥的一部分。计算质数的乘积很简单,但是将大合数分解为质因数非常困难,这保证了RSA加密算法的安全性。
2. 寻找质数的方法
试除法
试除法是最基本的寻找质数的方法。对于每一个自然数n,从2开始试除到sqrt(n),如果都无法整除,则n是质数。
埃拉托斯特尼筛法(埃式筛)
埃拉托斯特尼筛法是一种高效的生成一定范围内所有质数的算法。它通过逐步筛除合数来找出质数。例如,找出100以内的所有质数,先把2的倍数筛掉(保留2),再把3的倍数筛掉(保留3),如此重复下去,直到7的倍数被筛掉,剩下的就是100以内的质数。
这种生成素数的想法是由希腊数学家埃拉托色尼提出的。该算法通过将数组中的所有数字标记为素数,然后划掉所有倍数(非素数)。使用该方法的质数产生器一般也称之为埃式筛。它将目标范围的平方根内的全部非质数排除后,剩下的作为质数输出。
其他方法
- 欧拉筛法:这是一种优化的埃拉托斯特尼筛法,它利用了前缀和的概念,可以在更短的时间内找出一定范围内的所有质数。
- 费马小定理:这是一个关于质数的数论定理,可以用来检测一个数是否为质数。
- 梅森质数:梅森质数是形式为2^p-1的质数,其中p本身也是一个质数。
- 哥德巴赫猜想:每个不小于6的偶数都可以表示为两个质数之和,尽管这是一个猜想,但它也启发了一些寻找质数的方法。
- 黎曼猜想:虽然它是一个未解决的数学问题,但它与质数分布有着密切的关系。
- 质数定理:描述了质数在自然数中的分布情况。
3. 带发生器的埃式质数筛
动态类型实现
import itertools
def iter_primes():
# An iterator of all numbers between 2 and
# +infinity
numbers = itertools.count(2)
# Generate primes forever
while True:
# Get the first number from the iterator
# (always a prime)
prime = next(numbers)
yield prime
# This code iteratively builds up a chain
# of filters...
numbers = filter(prime.__rmod__, numbers)
for p in iter_primes():
if p > 1000:
break
print(p)
静态类型实现
import itertools
from typing import Iterator
def iter_primes() -> Iterator[int]:
# An iterator of all numbers between 2 and
# +infinity
numbers = itertools.count(2)
# Generate primes forever
while True:
# Get the first number from the iterator
# (always a prime)
prime = next(numbers)
yield prime
# This code iteratively builds up a chain
# of filters...
numbers = filter(prime.__rmod__, numbers)
for p in iter_primes():
if p > 1000:
break
print(p)
4. 埃式质数筛的另一种实现版本
import math
def GeneratePrimes (num_range) :
# Mark all numbers as prime
list_numbers = num_range * [True]
# Cross out 0, 1 as they are not primes
list_numbers[0] = list_numbers[1] = False
square_root = int(math.sqrt(num_range))
for p in range(square_root) :
if (list_numbers[p] == True) :
for i in range (p*p, num_range, p) :
list_numbers[i] = False
print ("Primes upto "+str(num_range)+" :")
total = 0
for p in range(len(list_numbers)) :
if(list_numbers[p] == True) :
print (p, end = ' ')
total += 1
print("\n total:\n", total)
if __name__ == "__main__":
GeneratePrimes(100)
GeneratePrimes(1000)
GeneratePrimes(10000)
5. 小结
欧拉筛法(Euler’s Sieve)和埃拉托斯特尼筛法(Sieve of Eratosthenes)都是寻找范围内所有质数的经典算法。两者的共同目标是高效地生成质数,但它们在实现细节上有所不同,导致在效率上有一些差异。我们以后将继续讨论其优点和实现的方法。
热门推荐
漫步长沙,探寻星城的历史与文化底蕴
秋日亲子游:太湖植物园的寓教于乐之旅
冬日鼋头渚:最美日出与日落打卡地
秋冬打卡灵山大佛:88米高佛像与金黄银杏的绝美邂逅
惠山古镇与东林书院:无锡的文化双璧
对电影的期待,不止春节档
秋冬感冒必备:一杯温暖的姜糖饮
首都医科大学推荐:感冒期间怎么吃?
2025央视蛇年春晚回顾:王菲第五次献唱,十大亮点与不足
揭秘明仁宗朱高炽的登基仪式:简朴背后的权力智慧
央视春晚,真的一年不如一年?
各大卫视王牌综艺节目大盘点,谁是天花板,有你的最爱吗?
青岛这些小众打卡地,安静又惬意
手机桌面自定义完全指南:iOS & 安卓通用教程
米其林推荐:保定必尝驴肉火烧
保定自驾游:打卡必去的三大宝藏景点!
探访北师大星:揭秘百年学府的秘密
程序员必会:微信多开技巧大揭秘!
武义旅游必去十大景点推荐:不迷茫,带你领略武义之美!
淄博十大必玩景点:从古村落到现代公园
打卡临淄齐国故城:探寻千年古都的秘密
坐高铁去清远实现景点轻松打卡!
连南原生态“耍歌堂”活动在油岭瑶寨开演
G288国道自驾行前必看:车辆检查清单
水培植物营养液大揭秘:经典配方推荐!
沼液新科技:水培植物的新宠儿?
水培植物营养液配方大揭秘!
掌握水培营养液配制技巧,提升作物产量
连云港必吃的六大特色美食,尝过四种以上算真爱,你试过了吗?
川味嫩炒猪肝,让你秒变大厨!