数字的魅力之情有独钟的素数

情有独钟的素数

什么是素数

素数(Prime number)也称为质数,是指在非0自然数中,除了1与其本身之外不拥有其他因数的自然数。也就是说,素数需要满足两个条件:

  • 大于1的整数;
  • 只拥有1和其自身两个因数。

例子1

本文章的任务就是输出100以内的所有素数,如2、3、5、7、11、13…
先理清一下思路:
(1)需要有一个2~100的外循环,还要有一个小于当前数的因子内循环;
(2)需要有一个判断是否可整除的i语句(整除就是余数为0)。
求100以内的素数的思路如下图所示。
在这里插入图片描述

代码实现

实现代码如下:
Python

# 100以内的素数算法
prime = []
#从2开始遍厉到100
for i in range (2,101) :flag =1 #i是否力素数的标记# 因数应该是大于1小于自身的数for j in range (2, i):if i%j ==0: #一旦取模(余数)为0flag = 0 # 更改标记为0break   # 直接跳出本循环if flag == 1: # 标记为 1,则为素数prime.append(i) # 添加到 prime 列表
print("100以内的素数:",prime)

Java

 List<Integer> arr = new ArrayList<>();int flag ;for(int i=2;i<101;i++){flag =1;for (int j=2;j<i;j++){if(i%j==0){flag =0;break;}}if(flag==1){arr.add(i);}}System.out.println(arr);

输出结果如下:

在这里插入图片描述

例子2 “优化素数计算:从暴力求解到开方优化”

只要解决了问题就结束了吗?这可不是学习的态度。《诗经》有云:“如切如磋,如琢如磨。”其斯之谓与?我们可要精益求精啊。这段代码虽实现了我们的任务,但它的时间复杂度太大,100 以内的素数还可以,如果是1000或10000呢?
可是要怎样使时间复杂度变小呢?只有两个地方可以下手——要么是外循环,要么是内循环。我们知道:任意数若等于两个非0自然数的乘积,则这两个因子中至少有一个小于该数的二分之一。
当然,我们还可以再缩小一下范围,把“二分之一”缩减为“开方”,这样就大大缩减了内循环的运行时间。思路如下图所示。
在这里插入图片描述

代码实现

实现代码如下:
Python

# -*- coding: utf-8 -*-
import math#100以内的素数算法二
prime = []
#从2开始遍历到 100
for i in range (2,101) :#因数应该是大于1小于自身的开方+1for j in range(2,int(math.sqrt(i))+1):#一旦取模(余数)为0if i%j == 0:break   #直接跳出本循环# 若余数均不0,则为素数else:prime.append(i) # 添加到 prime 列表中print("100以内的全部素数:",prime)

Java

 	List<Integer> arr = new ArrayList<>();int j;for(int i=2;i<101;i++){for (j=2;j<(int)Math.sqrt(i)+1;j++){if(i%j==0){break;}}if(j==(int)Math.sqrt(i)+1){arr.add(i);}}System.out.println(arr);

注意:例子二的内循环范围记得加1,否则输出结果错误

输出结果如下:

在这里插入图片描述

看,我们只改了一个值,便大大缩短了算法的运行时间,这就是思维逻辑的重要性。只要逻辑捋顺了,代码实现就很容易了。

例子3

观察结果发现,5+1=6,7-1=6,11+1=12,13-1=12, 17+1=18,19-1=18,23+1=24…这些都是6的倍数,那我们当不是可以利用(6n-1)和(6n+1)两个公式便可以得到质数的排列了?那么下一个质数必该是6×4+1=35,再下个质数就是6×5-1=29,但是25并不是质数,因此排列的规律还需要我们一步步地分析。
我们先不看2和3,从5开始往后数,所有的素数都分布在6n(n≥1)左右两侧,即(6n-1)与(6n+1)。那以6为间距的其他数又是如何分布的呢?6n %6=0,(6n+2)%2=0,(6n+3)%3=0,(6n+4)%2=0,(6n+5)则又回到了(6n-1),一个循环结束了。
我们发现:除去2和3以外,所有的素数都是符合(6n-1)和(6n+1)规律的,但符合这两个公式的数字不一定就是素数,因此这是一个充分非必要条件,而不是充要条件。
据此,我们可以进一步缩小因子范围,思路如下图所示。
在这里插入图片描述

代码实现

实现代码如下:
Python

# -*- coding: utf-8 -*-
import math# 100 以内的素数算法三
prime = []
prime. extend([2, 3]) #已知2和3 是素数
# 从5开始遍历到 100
for i in range (5,101) :# 非素数时if i % 2 == 0 or i%3 ==0 :continue # 跳过后续操作,直接进入下一循环# 因数应该是大于1小于自身的开方+2,以6为单位for j in range(6, int(math.sqrt(i))+2,6):# 当可以整除6 的倍数时两侧的数字也为非素数if i%(j-1) == 0 or i%(j+1) ==0:break # 直接跳出本循环# 若余数均不为O,则为素数else:prime.append(i)
# 添加到 prime 列表中
print("100以内的全部素数:",prime)

Java

List<Integer> arr = new ArrayList<>();arr.add(2);arr.add(3);int j;for(int i=5;i<101;i++){if (i%2==0 || i%3==0)continue;for (j=6;j<(int)Math.sqrt(i)+2;j+=6){if(i%(j-1)==0 || i%(j+1)==0){break;}}if(j>=(int)Math.sqrt(i)+2){arr.add(i);}}System.out.println(arr);

注意:continue 和 break 非常好用,不熟悉它们的用法的读者请务必掌握。

输出结果如下:

在这里插入图片描述

“素数的广泛应用与未解决的数学难题”

这么一看果然“顺眼”多了,虽然思路让人不好理解,但多看几遍还是能理解的。一般来说,实现相同功能的不同代码,越简洁的就越晦涩,运行时间越少的也越难懂。当然,素数的检测算法远不止于此,还有费马素性测试(Fermat primality test)、米勒-拉宾素性测试 (Miller-Rabin primality test)、Solovay-Strassen 测试、卢卡斯-菜默素性测试 (Lucas-Lehmer primality test)和埃拉托斯特尼筛法等。素数在自然数中的分布极其复架,其被广泛应用到密码学中,即在公钥中插入素数并进行编码,以此达到提高破译难度的目的。
同时,素数领域还存在许多数学家们一直无法解决的难题,最著名的莫过于“哥德巴赫猜想”和“黎曼猜想”。哥德巴赫和黎曼在数学界都是举足轻重的人物。哥德巴赫猜想是:“是否每个大于2的偶数都可写成两个素数之和?”娶曼猜想是:“素数出现的频率与黎曼 ζ \zeta ζ函数紧密相关。”这两个猜想虽然未能被完全验证,但已经被广泛应用,黎曼猜想甚至已经成为当今数学文献中一千多条数学命题的前提。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/683507.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

精读Relational Embedding for Few-Shot Classification (ICCV 2021)

Relational Embedding for Few-Shot Classification (ICCV 2021) 一、摘要 该研究提出了一种针对少样本分类问题的新方法&#xff0c;通过元学习策略来学习“观察什么”和“在哪里关注”。这种方法依赖于两个关键模块&#xff1a;自相关表示&#xff08;SCR&#xff09;和交叉…

统一数据返回格式 及 可能遇到的问题;统一异常处理

统一数据返回格式 统一数据返回格式就像我们寄快递一样&#xff0c;不管你需要寄的东西具体是什么都需要将它打包到统一的快递箱中。 此时我们需要一个“快递箱”用来将返回的数据“装”在里面。这个类是根据业务情况来自行定义的。 Data public class Resp<T> {//200…

[嵌入式AI从0开始到入土]14_orangepi_aipro小修补含yolov7多线程案例

[嵌入式AI从0开始到入土]嵌入式AI系列教程 注&#xff1a;等我摸完鱼再把链接补上 可以关注我的B站号工具人呵呵的个人空间&#xff0c;后期会考虑出视频教程&#xff0c;务必催更&#xff0c;以防我变身鸽王。 第1期 昇腾Altas 200 DK上手 第2期 下载昇腾案例并运行 第3期 官…

PHP毕业设计图片分享网站76t17

图片分享网站主要是为了提高工作人员的工作效率和更方便快捷的满足用户&#xff0c;更好存储所有数据信息及快速方便的检索功能&#xff0c;对系统的各个模块是通过许多今天的发达系统做出合理的分析来确定考虑用户的可操作性&#xff0c;遵循开发的系统优化的原则&#xff0c;…

【C语言】Linux内核bind系统调用代码

一、Linux 4.9内核bind系统调用代码注释 int __sys_bind(int fd, struct sockaddr __user *umyaddr, int addrlen) {struct socket *sock; // 定义socket对象的指针struct sockaddr_storage address; // 用于存储从用户空间复制过来的地址int err…

谷歌搜索技巧与 ChatGPT 实用指南:提升你的在线生产力

探索谷歌搜索技巧&#xff0c;提升搜索效率 前言 在搜索三巨头百度、必应、谷歌中&#xff0c;谷歌在搜索精确度以及多语言兼容性方面有明显的优势。其次在国内想要使用谷歌搜索你需要会科学上网&#xff08;这里不说&#xff09;。 一.排除干扰内容&#xff08;广告&#xff…

vue-进阶语法(四)

目录 v-model原理 v-model应用于组件 sync修饰符 ref 和 $refs&#xff08;重点&#xff09; $nextTick v-model原理 原理&#xff1a;v-model本质上是一个语法糖。例如应用在输入框上&#xff0c;就是 value属性 和 input事件 的合写。 作用&#xff1a;提供数据的双向…

压缩PDF的大小-Adobe Acrobat Pro

经常遇到上传的pdf太大&#xff0c;无法成功上传。 今天找到一个方法&#xff1a; 打开Adobe Acrobat Pro软件 → 文件 → 另存为其他&#xff08;H&#xff09;... →缩小大小的PDF 版本选择 4.0 最低的版本。 文件由9M变为1.5M。

Codeforces Round 924 (Div. 2) B - D

B. Equalize 题目&#xff1a; 思路&#xff1a;首先排序然后去重&#xff08;可以用set来去重&#xff09;&#xff0c;我们可以肯定的是&#xff0c;如果连续k个数最大值最小值的差小于等于n的话&#xff0c;那么这个长度为k的区间就符合答案要求&#xff0c;那么k就和答案…

###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯

前言&#xff1a;感谢您的关注哦&#xff0c;我会持续更新编程相关知识&#xff0c;愿您在这里有所收获。如果有任何问题&#xff0c;欢迎沟通交流&#xff01;期待与您在学习编程的道路上共同进步。 目录 一. 延时函数的生成 1.通过延时计算器得到延时函数 2.可赋值改变…

Linux释放内存

free -m是Linux上查看内存的指令&#xff0c;其中-m是以兆&#xff08;MB&#xff09;为单位&#xff0c;如果不加则以KB为单位。 如下图表示&#xff0c;&#xff08;total&#xff09;总物理内存是809MB&#xff0c;&#xff08;used&#xff09;已使用167MB&#xff0c;&…

【AI视野·今日NLP 自然语言处理论文速览 第七十九期】Thu, 18 Jan 2024

AI视野今日CS.NLP 自然语言处理论文速览 Thu, 18 Jan 2024 Totally 35 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers Deciphering Textual Authenticity: A Generalized Strategy through the Lens of Large Language Semantics …

【Py/Java/C++三种语言详解】LeetCode每日一题240215【二叉树BFS】LeetCode107、二叉树的层序遍历II

有LeetCode交流群/华为OD考试扣扣交流群可加&#xff1a;948025485 可上全网独家的 欧弟OJ系统 练习华子OD、大厂真题 绿色聊天软件戳 od1336了解算法冲刺训练 文章目录 题目链接题目描述解题思路DFS和BFS异同用队列维护的BFS 代码PythonJavaC时空复杂度 相关习题华为OD算法/大…

计算机视觉基础:获取图像的ROI

在图像处理过程中&#xff0c;我们可能会对图像的某一个特定区域感兴趣&#xff0c;该区域被称为感兴趣区域&#xff08;Region of Interest&#xff0c;ROI&#xff09;。在设定感兴趣区域ROI后&#xff0c;就可以对该区域进行整体操作。 Python实现代码如下&#xff1a; # -…

[职场] 花园管家是做什么的 #笔记#学习方法

花园管家是做什么的 一、工作内容职责&#xff1a; 1.管理花园内的活动和工作&#xff0c;协调各方资源&#xff0c;确保活动的顺利进行&#xff1b; 2.提供优质的客户服务和接待工作&#xff0c;解决客户问题&#xff0c;处理投诉&#xff0c;提高客户满意度&#xff1b; …

(03)Hive的相关概念——分区表、分桶表

目录 一、Hive分区表 1.1 分区表的概念 1.2 分区表的创建 1.3 分区表数据加载及查询 1.3.1 静态分区 1.3.2 动态分区 1.4 分区表的本质及使用 1.5 分区表的注意事项 1.6 多重分区表 二、Hive分桶表 2.1 分桶表的概念 2.2 分桶表的创建 2.3 分桶表的数据加载 2.4 …

操作系统(14)----文件系统的结构

目录 一.文件系统的层次结构 1.用户接口&#xff1a; 2.文件目录系统&#xff1a; 3.存取控制模块&#xff1a; 4.逻辑文件系统与文件信息缓冲区&#xff1a; 5.物理文件系统&#xff1a; 二.文件系统的全局结构 1.文件系统在外存中的结构 &#xff08;1&#xff09;物…

Mermaid绘制UML图教程

Mermaid 是一种轻量级的图形描述语言&#xff0c;用于绘制流程图、时序图、甘特图等各种图表。它采用简单的文本语法&#xff0c;使得用户能够快速绘制各种复杂图表&#xff0c;而无需深入学习图形绘制工具。 一、安装Mermaid Mermaid 可以在浏览器中直接使用&#xff0c;也可…

剑指offer——数值的整数次方

目录 1. 题目描述2. 一般思路2.1 有问题的思路2.2 全面但不高效的思路2.3 面试小提示 3. 全面又高效的思路 1. 题目描述 题目:实现函数 double Power(double base,int exponent)&#xff0c;求base 的exponent 次方。不得使用库函数&#xff0c;同时不需要考虑大数问题 2. 一般…

第13讲创建图文投票

创建图文投票实现 图文投票和文字投票基本一样&#xff0c;就是在投票选项里面&#xff0c;多了一个选项图片&#xff1b;、 <view class"option_item" v-for"(item,index) in options" :key"item.id"><view class"option_input&…