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

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

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


常规范围内(比如 ≤ 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(多轮)⚠️ 概率性可自定义轮数

相关文章:

  • HTML简单语法标签(后续实操:云备份项目)
  • Vue3的命名规范
  • Python60日基础学习打卡D12【虫豸版】
  • 文档外发安全:企业数据防护的最后一道防线
  • Odoo 18 安全组与访问权限管理指南
  • 015枚举之滑动窗口——算法备赛
  • Matlab 单机无穷大系统故障
  • 什么是户用光储一体化,开启家庭用电新时代、智能电表 | 新能源发电系统配套电表 | 家用储能电表 | 防逆流监测电表
  • 【日撸 Java 三百行】Day 13(链表)
  • 关系实验课--笛卡尔积
  • Blueprints - Gameplay Message Subsystem
  • 274、H指数
  • PyCharm历史版本下载说明
  • 软件安全之内存泄漏
  • 电商平台一站式网络安全架构设计指南
  • 从PNG到矢量图:星云智控Logo的商用矢量转换全解析-优雅草卓伊凡
  • 掌握函数(二)嵌套使用与链式访问以及函数的声明与定义
  • 基于 Nexus 在 Dockerfile 配置 yum, conda, pip 仓库的方法和参考
  • 1.4 无穷小与无穷大
  • 计算机网络核心技术解析:从基础架构到应用实践
  • 泽连斯基批准美乌矿产协议
  • 江苏省委社会工作部部长等多人拟在省志愿服务联合会任职
  • 马克思主义理论研究教学名师系列访谈|董雅华:让学生感知马克思主义理论存在于社会生活中
  • 美英达成贸易协议,美股集体收涨
  • 我驻苏丹使馆建议在苏中国公民尽快撤离
  • 马上评|比余华与史铁生的友情更动人的是什么