当前位置: 首页 > news >正文

python巧用定理判断素数

目录

判断一个数n是否是素数

求一个数的素因数个数

求大于等于指定数的最小素数


在数论中有三个非常重要的关于素数的定理

1、任何数都可以表示成若干个素数的乘积

2、任意数的素因子一个大于根号n的自然数,另一个与其对应的因子则必小于根号n。

3、除了2和3以外的所有素数都是6k±1型(k=1、2、3、...),这里要反过来是不成立的,也就是说6k±1型的不一定都是素数,例如35是6k-1型,但它不是素数

判断一个数n是否是素数

方法1:遍历从2到n-1的所有因子,时间复杂度O(n)

def is_prime(n):if n < 2:    # 小于2的肯定不是素数return 0for i in range(2, n):if n % i == 0:    #如果存在2到n的因子,则不是素数return 0return 1    #如果2到n遍历完后都没有,则是素数

方法2:使用性质2,我们其实可以只遍历从2到根号n,此时时间复杂度降为O(\sqrt{n})

def is_prime(n):if n < 2:    # 小于2的肯定不是素数return 0for i in range(2, int(n**0.5)+1):    #这里int会向下取整,所以加1消除误差if n % i == 0:   return 0return 1    

方法3:使用性质2和性质3,从2到根号n,然后每隔6个数遍历,此时时间复杂度降为O(\frac{1}{6}\sqrt{n})

def is_prime(n):if n < 2: return 0if n <= 3:  # 2或3肯定是素数return 1if n % 2 == 0 or n % 3 == 0:    # 如果能整除2或3,则不是素数return 0for i in range(5, int(n ** 0.5) + 1, 6):#从5开始,步长为6if n % i == 0 or n % (i + 2) == 0:    # i表示6k-1,i+2表示6k+1return 0return 1

求一个数的素因数个数

根据定理1,任意数都可以表示为若干个素数的乘积,写一个程序,要求计算一个数的素因子个数

题目链接

https://www.lanqiao.cn/problems/2155/learning/?page=1&first_category_id=1&sort=students_count&category_id=3&name=%E8%B4%A8%E5%9B%A0%E6%95%B0

ans = 0
n = int(input())
# 2和3单独讨论
for i in [2, 3]:if n % i == 0:  # 如果可以整除i,即含有素因子ians = ans + 1  # 计数加1while n % i == 0:  # 将n一直除以i,直到n中没有因子in = n // ifor i in range(5, int(n ** 0.5) + 1, 6):  for j in [i, i + 2]:  # j分别表示6k-1和6k+1# 以下过程与上面同理if n % j == 0:ans = ans + 1while n % j == 0:n = n // jif n != 1:  # 如果最后除出来结果不是1,说明还剩个素因数,还需要再加1ans = ans + 1print(ans)

输入396,结果为3,因为396有2、3、11三个素因子

求大于等于指定数的最小素数

def is_prime(n):if n < 2:return 0if n <= 3:return 1if n % 2 == 0 or n % 3 == 0:return 0for i in range(5, int(n ** 0.5) + 1, 6):if n % i == 0 or n % (i + 2) == 0:return 0return 1n = int(input())if is_prime(n):  # 如果是素数则直接输出print(n)
else:for j in range(1, 7):  # 根据性质,最多隔6位肯定会有素数,所以一直给n加1,直到n是素数则输出n = n + 1if is_prime(n):print(n)break

输入17

输入35

http://www.lryc.cn/news/297326.html

相关文章:

  • 2023年总结
  • Git中为常用指令配置别名
  • STM32内部Flash
  • html5 audio video
  • LoveWall v2.0Pro社区型校园表白墙源码
  • Flink cdc3.0动态变更表结构——源码解析
  • WWW 2024 | 时间序列(Time Series)和时空数据(Spatial-Temporal)论文总结
  • 代码随想录算法——数组
  • Linux第45步_通过搭建“DNS服务器”学习图形化配置工具
  • 【Linux取经路】探寻shell的实现原理
  • 【MATLAB】使用随机森林在回归预测任务中进行特征选择(深度学习的数据集处理)
  • 2024Node.js零基础教程(小白友好型),nodejs新手到高手,(六)NodeJS入门——http模块
  • 【数据结构与算法】(5)基础数据结构之队列 链表实现、环形数组实现详细代码示例讲解
  • (注解配置AOP)学习Spring的第十七天
  • [C++] opencv + qt 创建带滚动条的图像显示窗口代替imshow
  • C#用Array类的Reverse方法反转数组中元素
  • iOS AlDente 1.0自动防过充, 拯救电池健康度
  • 春晚刘谦魔术——约瑟夫环
  • itextpdf使用:使用PdfReader添加图片水印
  • 如何为Kafka加上账号密码(二)
  • 【大数据】Flink on YARN,如何确定 TaskManager 数
  • ES节点故障的容错方案
  • 【Flink】FlinkSQL实现数据从Kafka到MySQL
  • Unity GC
  • Vue源码系列讲解——变化侦测篇【下】(Array的变化侦测)
  • 【机器学习笔记】贝叶斯学习
  • ElasticSearch之倒排索引
  • win11安装mysql8.3.0压缩包版 240206
  • 数据库索引与优化:深入了解索引的种类、使用与优化
  • React 错误边界组件 react-error-boundary 源码解析