埃式质数筛及性质

本文涉及的产品
性能测试 PTS,5000VUM额度
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: 【10月更文挑战第8天】本文介绍质数,或素数,指大于1且仅能被1和自身整除的自然数。它们在数学中有独特地位,如算术基本定理指出任何大于1的自然数可唯一分解为质数乘积。质数的寻找方法多样,包括试除法、埃拉托斯特尼筛法等,后者通过筛除合数高效找出质数。质数在密码学中尤为重要,如RSA加密算法依赖大质数的乘积安全性。此外,还有多种算法和理论,如欧拉筛法、费马小定理、梅森质数等,丰富了质数的研究领域。

1 简介

质数,也称素数,是指在大于1的自然数中,除了1和它本身外,不能被其他自然数整除的数。质数有以下性质:

质数的约数只有两个:1和它本身。
算术基本定理表明,任何一个大于1的自然数都可以唯一分解成有限个质数的乘积。
质数的个数是无限的,这是由欧几里得证明的。
除了2以外,所有的质数都是奇数。
所有大于2的质数都可以表示为6n±1的形式。
任何不是1的自然数至少存在一个质数约数。
寻找质数的方法有很多,以下是一些知名的算法:

在实际应用中,选择哪种算法取决于所需的精确度和效率。

例如,在密码学中,通常会需要非常大的质数,这时就需要使用更高效的算法来生成。质数在密码学领域扮演着重要的角色,特别是在公钥密码学中,如RSA加密算法,它使用了大质数的乘积作为公钥和私钥的一部分。

计算质数的乘积很简单,但是将大合数分解为质因数非常困难,这保证了RSA加密算法的安全性.

coffe大海.jpg

2 寻找质数

试除法:对每一个自然数n,从2开始试除到sqrt(n),如果都无法整除,则n是质数。

埃拉托斯特尼筛法(Sieve of Eratosthenes):这是一种高效的生成一定范围内所有质数的算法。它通过逐步筛除合数来找出质数。例如,找出100以内的所有质数,先把2的倍数筛掉(保留2),再把3的倍数筛掉(保留3),如此重复下去,直到7的倍数被筛掉,剩下的就是100以内的质数。

这种生成素数的想法是由希腊数学家埃拉托色尼提出的。该算法通过将数组中的所有数字标记为素数,然后划掉所有倍数(非素数)。

使用该方法的质数产生器一般也称之为埃式筛。它将目标范围的平方根内的全部非质数排除后,剩下的作为质数输出。

什么是素数 素数.“p”是一个只有两个因数的自然数,1 和数本身,即 p。即素数不能分解为超过 2 个自然数。

示例:2、3、5、7、9,...

素数的性质

除 2 外,所有质数都是奇数。
除 2 和 3 外的所有素数均为 6n+1 或 6n-1。

示例:31 = 6 * 5 + 1
示例:941 = 6 * 157 - 1

[梅森的素数]如果表格中的数字2^N-1是素数.那么 'n' 必须是素数,但不能相反(如果n为素数,2^N-1不一定是)。

示例:数字 31 是素数。它的形式是 2^5-1,那么 5 必须是素数,它。
示例:数字 11 是素数。但这并不能使 2^11-1 (2047) 素数。2047 可以被 23 和 89 整除

Prime Sieve Algorithm的时间复杂度为O(N log log N)

我们将数组中的数字标记为非素数(复合)的次数是 n/2 + n/3 + n/5 + n/7 + ....最多 N。
N/2 + N/3 + N/5 + N/7 + N/11.....最多 n = n 。(1/2 + 1/3 + 1/5 + 1/7 + 1/11 + ….最多 n)。
数学证明 1/2 + 1/3 + 1/5 + 1/7 + 1/11 + ....最多 n = ln ln n。
因此,n.(1/2 + 1/3 + 1/5 + 1/7 + 1/11 + ....最多 n) 为:n ln ln n i.e n log l

其他方法:

试除法:对每一个自然数n,从2开始试除到sqrt(n),如果都无法整除,则n是质数。

埃拉托斯特尼筛法(Sieve of Eratosthenes):这是一种高效的生成一定范围内所有质数的算法。它通过逐步筛除合数来找出质数。例如,找出100以内的所有质数,先把2的倍数筛掉(保留2),再把3的倍数筛掉(保留3),如此重复下去,直到7的倍数被筛掉,剩下的就是100以内的质数。

欧拉筛法:这是一种优化的埃拉托斯特尼筛法,它利用了前缀和的概念,可以在更短的时间内找出一定范围内的所有质数。

费马小定理:这是一个关于质数的数论定理,可以用来检测一个数是否为质数。

梅森质数:梅森质数是形式为2^p-1的质数,其中p本身也是一个质数。

哥德巴赫猜想:每个不小于6的偶数都可以表示为两个质数之和,尽管这是一个猜想,但它也启发了一些寻找质数的方法。

黎曼猜想:虽然它是一个未解决的数学问题,但它与质数分布有着密切的关系。

质数定理:描述了质数在自然数中的分布情况。

2 带发生器的埃式质数筛

具有动态类型功能的 Mypy

        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)

具有静态类型的 Mypy

    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)
  • 埃式质数筛的另一个实现版本

计算函数接受定义一个名为GeneratePrimes的函数,参数是num_range,表示要生成素数的范围。

    import math

    def GeneratePrimes (num_range) :

        # Mark all numbers as prime
        #创建一个布尔值列表list_numbers,长度为num_range,初始值全部为True,表示所有数字都是素数。
        list_numbers = num_range * [True] 

        # Cross out 0, 1 as they are not primes
        # 剔除0和1,将索引为0和1的元素设为False,因为0和1不是素数。
        list_numbers[0] = list_numbers[1] = False

计算num_range的平方根,并将结果转换为整数,赋值给square_root。这个值是用来减少内循环的计算量。

             square_root = int(math.sqrt(num_range))

        #循环从0到square_root(不包括square_root)。
        for p in range(square_root) :
            # 检查list_numbers中的第p个元素是否为True,即判断当前数字p是否为素数。
            if (list_numbers[p] == True) :
                #如果p是素数,从p的平方开始,标记所有p的倍数为非素数。
                #range(p*p, num_range, p)表示从p*p开始,以p为步长,到num_range结束。
                for i in range (p*p, num_range, p) : 
                    # 将list_numbers中索引为i的元素设为False,标记为非素数。

                    # 因为 任何一个数的平方加上这个数本身不可能是素数 p**2 + p, 
                    # 等同于 p(p+1), (这违背了素数的定义,只能被1和自身整除)。
                    # Cross out non primes by marking them false
                    list_numbers[i] = False

        # 打印一条消息,表示将显示到num_range的素数。
        print ("Primes upto "+str(num_range)+" :")
        # 初始化一个变量total,用于计数素数的总数。
        total = 0
        # 循环遍历list_numbers列表的每个索引。
        for p in range(len(list_numbers)) :
            # 检查list_numbers中的第p个元素是否为True,即判断当前数字p是否为素数。
            if(list_numbers[p] == True) :
                # 如果p是素数,打印p,并在末尾加一个空格(而不是换行)。
               print (p, end = ' ')
               # 将total加1,表示找到一个素数。
               total += 1

        # 打印一个换行符,然后打印素数的总数total。
        print("\n total:\n", total) 

    if __name__ == "__main__":
        GeneratePrimes(100)
        GeneratePrimes(1000)
        GeneratePrimes(10000)

3 小结

欧拉筛法(Euler's Sieve)和埃拉托斯特尼筛法(Sieve of Eratosthenes)都是寻找范围内所有质数的经典算法。两者的共同目标是高效地生成质数,但它们在实现细节上有所不同,导致在效率上有一些差异。
我们以后将继续讨论其优点和实现的方法。

目录
相关文章
|
2天前
|
SQL 人工智能 安全
【灵码助力安全1】——利用通义灵码辅助快速代码审计的最佳实践
本文介绍了作者在数据安全比赛中遇到的一个开源框架的代码审计过程。作者使用了多种工具,特别是“通义灵码”,帮助发现了多个高危漏洞,包括路径遍历、文件上传、目录删除、SQL注入和XSS漏洞。文章详细描述了如何利用这些工具进行漏洞定位和验证,并分享了使用“通义灵码”的心得和体验。最后,作者总结了AI在代码审计中的优势和不足,并展望了未来的发展方向。
|
9天前
|
编解码 Java 程序员
写代码还有专业的编程显示器?
写代码已经十个年头了, 一直都是习惯直接用一台Mac电脑写代码 偶尔接一个显示器, 但是可能因为公司配的显示器不怎么样, 还要接转接头 搞得桌面杂乱无章,分辨率也低,感觉屏幕还是Mac自带的看着舒服
|
11天前
|
存储 缓存 关系型数据库
MySQL事务日志-Redo Log工作原理分析
事务的隔离性和原子性分别通过锁和事务日志实现,而持久性则依赖于事务日志中的`Redo Log`。在MySQL中,`Redo Log`确保已提交事务的数据能持久保存,即使系统崩溃也能通过重做日志恢复数据。其工作原理是记录数据在内存中的更改,待事务提交时写入磁盘。此外,`Redo Log`采用简单的物理日志格式和高效的顺序IO,确保快速提交。通过不同的落盘策略,可在性能和安全性之间做出权衡。
1575 11
|
16天前
|
存储 人工智能 缓存
AI助理直击要害,从繁复中提炼精华——使用CDN加速访问OSS存储的图片
本案例介绍如何利用AI助理快速实现OSS存储的图片接入CDN,以加速图片访问。通过AI助理提炼关键操作步骤,避免在复杂文档中寻找解决方案。主要步骤包括开通CDN、添加加速域名、配置CNAME等。实测显示,接入CDN后图片加载时间显著缩短,验证了加速效果。此方法大幅提高了操作效率,降低了学习成本。
2276 7
|
3天前
|
人工智能 关系型数据库 Serverless
1024,致开发者们——希望和你一起用技术人独有的方式,庆祝你的主场
阿里云开发者社区推出“1024·云上见”程序员节专题活动,包括云上实操、开发者测评和征文三个分会场,提供14个实操活动、3个解决方案、3 个产品方案的测评及征文比赛,旨在帮助开发者提升技能、分享经验,共筑技术梦想。
630 85
|
1月前
|
弹性计算 人工智能 架构师
阿里云携手Altair共拓云上工业仿真新机遇
2024年9月12日,「2024 Altair 技术大会杭州站」成功召开,阿里云弹性计算产品运营与生态负责人何川,与Altair中国技术总监赵阳在会上联合发布了最新的“云上CAE一体机”。
阿里云携手Altair共拓云上工业仿真新机遇
|
16天前
|
人工智能 Serverless API
AI助理精准匹配,为您推荐方案——如何快速在网站上增加一个AI助手
通过向AI助理提问的方式,生成一个技术方案:在网站上增加一个AI助手,提供7*24的全天候服务,即时回答用户的问题和解决他们可能遇到的问题,无需等待人工客服上班,显著提升用户体验。
1417 9
|
1天前
|
人工智能 自然语言处理 程序员
提交通义灵码创新实践文章,重磅好礼只等你来!
通义灵码创新实践征集赛正式开启,发布征文有机会获得重磅好礼+流量福利,快来参加吧!
183 6
|
15天前
|
人工智能 Rust Java
10月更文挑战赛火热启动,坚持热爱坚持创作!
开发者社区10月更文挑战,寻找热爱技术内容创作的你,欢迎来创作!
853 28
|
9天前
|
并行计算 PyTorch TensorFlow
Ubuntu安装笔记(一):安装显卡驱动、cuda/cudnn、Anaconda、Pytorch、Tensorflow、Opencv、Visdom、FFMPEG、卸载一些不必要的预装软件
这篇文章是关于如何在Ubuntu操作系统上安装显卡驱动、CUDA、CUDNN、Anaconda、PyTorch、TensorFlow、OpenCV、FFMPEG以及卸载不必要的预装软件的详细指南。
674 3