算法——素数判定方法

素数判定的一些讨论(Miller-Rabin算法) 很久没有写博客了。。。最近军训加开学,感觉刷题速度有降低,要补一补。 回归正题,正式进入数论阶段,讨论一下关于素数判定的那些事。 一类问题: 判定一个整数n(n>1)是否为素数。 算法1: 直接根据素数的定义枚举ii从22到(n−1)(n-1),如果n%i==0nn为合数。 时间复杂度:O(n)O(n) bool is_prime(int n) { int i; 阅读详情

原始版素数表


最初刚接触算法的时候,使用了原始的方法来输出素数表:

void originalPrime()
{
    long p, d, input;
    int isPrime;
    
    printf("input a number:");
    scanf("%li", &input);
    
    for (p = 2; p <= input; p++) {
        isPrime = 1;
        for (d = 2; d < p; d++) {
            if (0 == p % d) {
                isPrime = 0;
            }
        }
        if (isPrime) {
            printf("%li\n", p);
        }
    }
}

这个就是简单的for循环嵌套,来寻找素数。
不过这个算法效率比较低,时间复杂是O(n * n!)。

改进版素数表


后来知道了如果一个数是合数,那么它的最大质因子不会大于它的平方根——sqrt(x)。

(质因子的概念
质因子(或质因子)在数论里是指能整除给定正整数的质数。两个没有共同质因子的正整数称为互质。因为1没有质因子,1与任何正整数(包括1本身)都是互质。正整数的因数分解可将正整数表示为一连串的质因子相乘,质因子如重复可以指数表示。根据算术基本定理,任何正整数皆有独一无二的质因子分解式。只有一个质因子的正整数为质数。)

于是,算法改进了下:

void increPrime()
{
    long p, d, input;
    int isPrime;
    
    printf("input a number:");
    scanf("%li", &input);
    
    for (p = 2; p <= input; p++) {
        isPrime = 1;
        for (d = 2; d <= sqrt(p) ; d++) {
            if (0 == p % d) {
                isPrime = 0;
            }
        }
        if (1 == isPrime) {
            printf ("%li\n", p);
        }
    }
}


这里不再判断d到p的所有值了 ,只到p的平方根即可,速度提升了一些。

筛选法素数判定


还有效率超高的,就是筛选法。
筛选法先初始化一个数组prime[]用来表示是否为素数,里面存放0或1来进行逻辑判断。
先筛选掉所有偶数
for (i = 3; i <= input; i++) {
        if (i % 2 == 0) {
            prime[i] = 0;
        } else {
            prime[i] = 1;
        }
    }


之后的思想是如果i是素数,那么i加任意个i的数则是合数。举一个30以内的例子:
i=3; 由于prime[3]=1, 把prime[6], [9], [12], [15], [18], [21], [24], [27], [30]标为0.
i=4; 由于prime[4]=0,不在继续筛法步骤。
i=5; 由于prime[5]=1, 把prime[10],[15],[20],[25],[30]标为0.

完整的算法:

void primeFilter()
{
    long i, j, input;
    
    printf("input a number:");
    scanf("%li", &input);
    int prime[input + 1];
    
    prime[2] = 1;
    for (i = 3; i <= input; i++) {
        if (i % 2 == 0) {
            prime[i] = 0;
        } else {
            prime[i] = 1;
        }
    }
    for (i = 3; i <= sqrt(input); i++) {
        if (prime[i]) {
            for (j = i + i; j < input; j += i) {
                prime[j] = 0;
            }
        }
    }
    for (i = 2; i <= input; i++) {
        if (prime[i]) {
            printf("%li\n", i);
        }
    }
}

如果输入的数不是很大的时候,那么其实三个算法效果差别不大,但是如果数很大,比如100000,那么输出结果的时间可以相差好几秒。而且筛选法的时间非常快。
算法 - 判定素数的四种方法 如何判定一个数为素数,素数概念,判定素数的四种方法,时间复杂度 阅读详情

相关推荐

《算法零基础100讲》(第07讲) 素数判定

数论的基础概念,素数判定

英雄哪里出来 2728

【C语言】判断素数函数

这里写代码片 方法一:2~m-1有没有能整除的 int prime(int m) { int i; for(i=2;i

mengzhizhizhi的博客 4万+

学习Ultralytics (下载)

Ultralytics由创立,最初是为了简化目标检测模型的开发和应用,专注于构建高效、易用、性能卓越的深度学习框架。其主要产品之一是 YOLO 系列模型,尤其是最新的YOLOv5和YOLOv8,因其在精度、速度和可扩展性方面的出色表现而广受欢迎。

2301_76846375的博客 2864

大素数判定

先粘个题:http://hihocoder.com/problemset/problem/1287再粘个martix67大牛的博客:http://www.matrix67.com/blog/archives/234看明白这个题这俩基本就会了接下来是笔者的瞎bb:Miller-Rabin算法过程:将p-1转化成d*2^r的形式计算a^dmod p(a可选2,3,5,7,11……越多结果越准确)如果p...

风语之城的博客 2799

基于Spring Boot框架的网上蛋糕销售系统

随着互联网的普及和电子商务的迅猛发展,网上购物已经成为人们日常生活的一部分。蛋糕作为一种受欢迎的食品,其销售市场也逐渐向网络化方向发展。网上蛋糕销售系统能够打破时间和地域的限制,让消费者随时随地浏览和购买蛋糕,同时也为蛋糕商家提供了一个展示和销售产品的平台。该系统的开发旨在提高蛋糕预定和销售的便捷性,节约时间和经济成本,并推动蛋糕市场的进一步发展。开发语言:Java,一种面向对象的编程语言,具有跨平台性、稳定性和安全性等特点,适用于构建大型、复杂的Web应用程序。 框架:Spring Boot,一个基于Sp

2301_81127431的博客 996

Advanced Installer打包避坑指南:如何正确配置64位系统下的Java环境与注册表条件(以15.7版本为例)

本文详细解析了使用Advanced Installer 15.7版本在64位系统下打包Java应用时的常见问题与解决方案。重点介绍了注册表重定向机制、Java环境检测的双保险策略、环境变量设置的隐藏坑以及权限管理的进阶技巧,帮助开发者避免安装包在用户机器上无法运行的幽灵问题。

weixin_28676289的博客 322

素数判定方法

目录素数素数判断优化一优化二(强推)埃拉托斯特尼筛法欧拉筛法 素数 素数判断 素数是指在大于111的自然数中,除了1和它本身之外不再有其他因数的自然数 判断一个数nnn是否为素数自然可以利用这一点来,使用循环从2到n-1的位置,依次判断能否被这个数整除。 bool is_prime (int x) { if(x < 2) return false; for(int i = 2; ...

Psychosocial的博客 1254

中科蓝讯蓝牙开发:从源码到固件的自动化构建链路解析

本文详细解析了中科蓝讯AB530X蓝牙芯片从源码到最终固件的完整自动化构建链路。通过剖析prebuild.bat、GCC编译、postbuild.bat等关键环节,阐述了资源打包、配置生成、代码编译与固件合成的全过程,并重点介绍了如何实现一键编译与自动下载,为开发者高效进行嵌入式蓝牙开发提供清晰指南。

weixin_29193259的博客 121

判断素数的几种方法的总结

素数,又称质数,定义是:除了1和它本身以外不再有其他的除数整除。方法一按照定义,从2到n-1判断有没有能整除n的数。如果有,则不是素数,否则,是素数bool is_prime(int n){ if (n < 2){ return false; } int i; for (i = 2; i < n; i++){ if (n%i == 0)

long-long-ago 5万+

基于近场动力学的二维疲劳裂纹扩展模型_近场动力学数值模拟的程序实现(1)——引言...

参考书目W. H. Gerstle. 2015. Introduction to Practical Peridynamic: Computational Solid Mechanics Without Stress and Strain.E.Madenci, A.Barut, M.Dorduncu. Peridynamic Differential Operator for Numerical ...

weixin_39764603的博客 1202

dToF直方图之美

上面视频里如果你能看懂,那么就能理解对于dToF单点的测距问题,对于大部分的描述在AMS和ST里的手册都非常的详细,有疑问的可以后台来找我探讨,今天我们单纯从上层讨论成像的问题。作为dToF算法工程师,应该是对直方图敏感的,直方图的每个Count峰都会表征出问题,因为dToF的输出只有直方图,观察直方图能够逆推出dToF的很多东西,这也是大多数公司不愿意开放直方图和Raw data的缘故。以上是一个小面阵的分辨率,第一张是直方图,后面是基于直方图寻峰出来的成像ToF图,Peak图,以及噪声Noise图。

dream it possible 2991

算法—素数的判断

算法—素数的判断 1.判断一个数是否为素数 bool judge01(int num) { for (int i = 2; i <= sqrt(num); i++) { if (num % i == 0) { return false; } } return true; } 2.筛法生成素数表 #include <iostream> #include<math.h> #define max 2000 using namespace std; int num

一个专注于客户端开发的技术er,不定期更新Android,Flutter,HormonyOS等方向的使用心得和感悟 960

ComfyUI 局部重绘工作流示例

本文介绍了使用ComfyUI进行图像局部重绘的基础工作流程,重点讲解如何修改人物眼睛颜色和表情。主要内容包括:1.准备工作(可选下载DreamShaperv8模型);2.加载素材图片和工作流文件;3.使用遮罩编辑器绘制需要修改的区域;4.修改提示词控制生成内容;5.调整denoise参数优化效果。教程提供了详细的提示词示例(如"smile,blackeyes"等)和参数设置建议,帮助用户通过多次尝试获得理想效果。该工作流适用于修改图像局部区域而不影响整体画面。

云域A的博客 331

MonteCarlo算法+改进的Fermat判定素数方法

/* * Abstract: * PPT147,EX10. MonteCarlo算法素数测定与确定性算法求素数的比较, * 并给出100~10000以内的错误的比例。 * * Author : Ace.Ma * Date : 2012/9/28 * Version: 0.1 */ #include #include #include #inc

艾斯 1533

【系统分析师】高分论文:论面向对象设计方法及应用

本文以某市职业院校合并后的信息化系统建设项目为例,探讨了面向对象设计方法在系统开发中的应用。作为系统分析师,作者在415.6万元、6个月工期的项目中,通过遵循单一职责原则(简化构件库)、依赖倒置原则(开发公共接口)和开闭原则(构件扩展)等设计原则,成功完成了5个子系统融合改造和4个智慧实训室建设。项目采用J2EE分层设计和SOA架构,最终在2022年11月顺利上线,提升了教学管理效率,获得用户好评。文章总结了设计原则对提高系统复用性、可维护性的重要作用,同时也反思了部署过程中的经验教训。

数据知道的博客 7954

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

一些普通的素数判断方法至素数判定Miller_Rabin 算法详解

素数判定Miller_Rabin  算法详解 上次说好的要把素数判定和大数分解(见另一篇博文)的快速随机化算法解决了,于是乎今天就来解决,不得不说理解起来真的有困难。我只能大概的将思路理一下,若有错漏还请担待。 转载自大佬的博客:点击打开链接 首先相信有一些数学和编程经验的读者应该知道,最简单直观简单的素数判定方法就是试除法。对于判断数n是否是素数,我们从2开始一直到sqrt

qq_36782366的博客 578

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

关于素数(适用于新手)【素数判定】【素数打表,素数筛】【欧拉函数】

一、素(质)数定义 定义: 质数(prime number)又称素数,有无限个。 质数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数。 此处一定要注意,1不是素数,在素数判定中,1不是素数。 以下对于十的N次方数,全部表示为1eN 二、素(质)数判定 1.根据素数的定义,我们可以直到素数的因子只能为1和他本身。所以我们可以根据这个思想:只要他...

一只酷酷光儿的博客 1557

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

素数判定算法优化

代码没有“最好”只有“更好”,根据实际需求选择适宜的算法和相应的“代码表现形式”,才是“代码编撰”最正确的打开方式。回页目录。

m0_57158496的博客 1582

素数知识总结

素数 一、素数的定义: ​ 素数又称质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。 ​ ◼ 素数有无限个 如2、3、5、7、11、13、17、19… ​ ◼ 所有素数只有两个约数 :1和它本身 素数没有真约数 ​ ◼ 和 1 既不是素数也不是合数 最小的素数是 2 二、素数的判定方法: (1)试除法:若自然数n不能被[2, ????]内的所有数整除,则n是素数 ​ ◼ 加速技巧:大于4的素数总是等于 6x+1 或 6x-1 ​ ◼ 如何

cjx2774952383的博客 4254

nefu 120 梅森素数 Lucas-Lehmer判定法

定义:如果m是一个正整数,且2^m-1是一个素数,则m必是素数.反之,如果m是一个正整数,素数且Mm=2^m-1成为第m个梅森数;如果p是一个素数,并且Mp=2^p-1也是素数,那么Mp=2^p-1也是素数,那么Mp就称为梅森素数. Lucas-Lehmer判定方法. 设p是素数,第p个梅森数为Mp=2^p-1,r1=4; 对于k>=2,利用rk=((r(k-1))^2-1)%Mp,0 可

Bysen32 2532

利用辛达拉姆筛进行素数判定

1 常规判定方法        素数判定问题就是对给定的正整数n判定是否为素数。所谓素数,是指恰好有2个约数的整数。因为n的约数都不超过n,所以只需要检查2~n-1的所有整数是否整除n就能判定是不是素数。不过,我们还能进一步优化。如果d是n的约数,那么n/d也是n的约数。由n=d*n/d可知min(d,n/d),所以只需要检查2~的所有整数就足够了。此时,素数判定的复杂度为O()。代码实现如下:

姚光超的专栏 4293

素数判定算法

地址:http://www.cnblogs.com/mycapple/archive/2012/08/07/2626898.html 1. 素数判定问题 素数判定问题是一个非常常见的问题,本文介绍了常用的几种判定方法。 2. 原始算法 素数的定义是,除了能被1和它本身整除而不能被其他任何数整除的数。根据素数定义 只需要用2到n-1去除n,如果都除不尽,则n是素数,否则,只要

梧桐下的四叶草 790

素数判定

路漫漫其修远兮,吾将上下而求索! 素数判定算法 1. 素数判定问题 素数判定问题是一个非常常见的问题,本文介绍了常用的几种判定方法。 2. 原始算法 素数的定义是,除了能被1和它本身整除而不能被其他任何数整除的数。根据素数定义 只需要用2到n-1去除n,如果都除不尽,则n是素数,否则,只要其中有一个数能整除则n不是素数。 ? 1 2 3

逆水行舟 1048

素数、大素数的素性判定

素数判定/寻找的一些方法整理记录:仍在进行的基于全世界计算机的分布式计算寻找素数项目:

iTuring_Zhou的专栏 919

深入理解和实现素数判定的高效算法

素数是指大于1的自然数,且除了1和它本身以外,没有其他正整数因子的数。常见的素数包括:2、3、5、7、11等。方法时间复杂度适用范围特点暴力法( O(n) )小整数简单直观,但效率低下检查到平方根中等范围性能较好,适合大多数情况跳过偶数优化中等范围进一步提升效率埃拉托色尼筛法大规模素数生成批量处理,生成素数列表最佳Miller-Rabin算法超大整数检测随机算法,适合加密学场景。

zhaoshanshan168的博客 1777

梅森素数 判定总结 - Lucas-Lehmer算法 & Miller-rabin算法

梅森素数 定义: if m是一个正整数 and 2^m-1是一个素数 then m是素数 if m是一个正整数 and m是一个素数 then M(m)=2^m-1被称为第m个梅森数 if p是一个素数 and M(p)是一个素数 then M(p)被称为梅森素数 Lucas-Lehmer判定法:判定一个梅森数是否是梅森素数 设p是素数,第p个梅森数为M(p)为2^p-1,r1 = 4,对于k...

weixin_30824277的博客 464
上一篇: C语言中 对变量内存关系的探讨
下一篇: 数据结构——队列
RannieR
博客等级 码龄14年 180粉丝 68原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值