[MM32软件] 判断素数的快速算法

[复制链接]
1457|11
 楼主| uiint 发表于 2024-10-31 20:15 | 显示全部楼层 |阅读模式
我们在日常判断素数的程序中常用到如下代码

//判断数num是不是素数
for(i=2;i<num;i++){

    if(num%i==0)
         return 0;

    return 1;
}
这样写无疑是没有问题的,但是我们实际做题可能会有算法时间复杂度的要求,或者说数据大的时候我们会等很久,算法效率低,那么有没有一种好的算法可以更快地判断是不是素数呢?

当然了,先附上代码段

//判断数num是不是素数
for(i=2;i<=sqrt(num);i++){

    if(num%i==0)
         return 0;

    return 1;
}
sqrt()函数是用来判断开根号的,那么我们这样用是为何呢?

比如想判断20是不是素数,我们都知道素数是除了1和数本身没有其他公约数的数,我们看,20可以分成如下公因子:



如果我们用老办法i=2到20一个一个判断是可以,但是没有必要

因为,我们可以使用sqrt来判断

//判断数20是不是素数
for(i=2;i<=sqrt(20);i++){

    if(num%i==0)
         return 0;

    return 1;
}


zhizia4f 发表于 2025-1-17 13:55 | 显示全部楼层
判断一个数是否为素数是计算机科学和数学中的一个经典问题。为了提高效率,通常会使用一些优化的算法。比如试除法
b5z1giu 发表于 2025-1-17 15:07 | 显示全部楼层
Miller-Rabin 素性测试,这是一种概率性算法,基于费马小定理和二次探测定理。它的效率较高,适合大数判断。
w2nme1ai7 发表于 2025-1-17 16:17 | 显示全部楼层
AKS 是一种确定性算法,可以在多项式时间内判断一个数是否为素数。它的理论意义重大,但实际应用中效率不如 Miller-Rabin
lamanius 发表于 2025-1-17 18:11 | 显示全部楼层
埃拉托斯特尼筛法,这是一种用于生成素数列表的算法,适合判断一定范围内的素数
tax2r6c 发表于 2025-1-17 19:17 | 显示全部楼层
一般就是用所谓的试除法来操作的
l1uyn9b 发表于 2025-1-17 21:27 | 显示全部楼层
一步一步的除法呗,然后用循环操作就好了
t1ngus4 发表于 2025-1-18 09:01 | 显示全部楼层
就是直接判断,然后用循环操作呗
d1ng2x 发表于 2025-1-18 11:52 | 显示全部楼层
话说,数学库里是不是也有这种函数啊?现成的函数
liu96jp 发表于 2025-1-18 13:04 | 显示全部楼层
其实老办法就是麻烦点,当然麻烦的是单片机,也没事儿
lix1yr 发表于 2025-1-18 14:35 | 显示全部楼层
Sqrt这种就是数据库里的吧?

小小蚂蚁举千斤 发表于 2025-1-22 23:08 | 显示全部楼层
判断素数的快速算法
您需要登录后才可以回帖 登录 | 注册

本版积分规则

59

主题

4538

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部