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

判断一个数是不是素数的最高效的算法

判断一个数是否是素数,有从简单到复杂多种方法。最高效的算法取决于输入规模(是几个亿以内的数,还是上百位的大整数),我会按实用场景分类讲解:


常规范围内(比如 ≤ 1e12)判断素数的最高效方法

使用试除法优化版 + 6k±1 检查法

import mathdef is_prime(n):if n <= 1:return Falseif n <= 3:return Trueif n % 2 == 0 or n % 3 == 0:return False# 只检查 6k±1 的数(跳过能被2或3整除的数)i = 5while i * i <= n:if n % i == 0 or n % (i + 2) == 0:return Falsei += 6return True
  • 时间复杂度:O(√n),比普通的 i += 1 快大约 3 倍以上。
  • 在 64 位整数范围(最多约 1e18)内表现优良。

更高效但更复杂的方法:Miller-Rabin 素性测试(确定性/概率性)

适用于 更大的整数(如 64 位整数、甚至上百位)

✅ Python 中的 Miller-Rabin 判断(64位内确定性版本):

def is_prime_miller_rabin(n):if n < 2:return Falsefor p in [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37]:if n % p == 0:return n == pd = n - 1r = 0while d % 2 == 0:d //= 2r += 1def try_composite(a):x = pow(a, d, n)if x == 1 or x == n - 1:return Falsefor _ in range(r - 1):x = pow(x, 2, n)if x == n - 1:return Falsereturn True  # compositefor a in [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37]:if try_composite(a):return Falsereturn True
  • 时间复杂度:O(k * log n),其中 k 是轮数,pow() 是快速幂。
  • 经过这些 a 值验证,对于 n < 2^64 是确定性的

🧠 总结:选择最优算法依据规模

数值范围建议算法是否确定性Python 实现
≤ 10^126k±1 优化试除法✅ 是快速、简单
≤ 2^64Miller-Rabin(特定基底)✅ 是快速、安全
任意大整数Miller-Rabin(多轮)⚠️ 概率性可自定义轮数

http://www.xdnf.cn/news/5581.html

相关文章:

  • 在Fortran中输出类似Markdown的表格
  • Python Day23 学习
  • [pgsql]未认可的配置参数 “database_mode“
  • AutoDL租用服务器教程
  • 各类大豆相关数据集大合集
  • 动手学深度学习12.3.自动并行-笔记练习(PyTorch)
  • 四、SpringMVC实战:构建高效表述层框架
  • 【AutoGen深度解析】下一代AI代理编程框架实战指南
  • 日语学习-日语知识点小记-构建基础-JLPT-N4阶段(19):て形/ないで
  • SAP学习笔记 - 开发09 - BTP简介,BTP在SAP产品中的位置
  • 代码随想录算法训练营第三十八天|动态规划part6(完全背包2)
  • 莒县第六实验小学开展全国“防灾减灾日”防震演练活动
  • vue3+dhtmlx-gantt实现甘特图展示
  • react项目阅读记录
  • 打破产品思维--被讨厌的勇气--实战5
  • phpstorm2024.3 设置中文
  • 《Vue.js》阅读之响应式数据与副作用函数
  • Hive HA配置高可用
  • 无线定位之 二 SX1302 网关源码 thread_down 线程详解
  • 奇次谐波和偶次谐波【EMC】
  • RabbitMQ ③-Spring使用RabbitMQ
  • 基于 Spring Boot 瑞吉外卖系统开发(十二)
  • labview硬件驱动——测试软件的安装(基于win11系统)
  • 支持向量机算法
  • K8s进阶之一文搞懂PV,PVC及SC
  • 修改网页标签处文字
  • kubuntu系统详解
  • 【RabbitMQ】应用问题、仲裁队列(Raft算法)和HAProxy负载均衡
  • 类和对象(1)--《Hello C++ Wrold!》(3)--(C/C++)
  • 【Linux笔记】——进程信号的保存