我的编程空间,编程开发者的网络收藏夹
学习永远不晚

python高效的素数判断算法

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

python高效的素数判断算法

高效素数判断算法

算法概述

此算法将其他博主对基本素数算法的一些改进进行了整合,其中主要整合了如下三条规则:

1.大于3的素数一定在6的倍数前一个或后一个(如素数37在36的后面)

2.要判断n是否为素数,只需要让n从2开始,依次除到根号n即可

3.在进行“让n从2开始,依次除到根号n”过程中,若n除以2的余数不为0,可以直接跳过[2, sqrt(n)]里面的所有偶数

博主语文素养不高,表达不是很准确,在后面会对这三条规则进行解释。

规则详解

1.大于3的素数一定在6的倍数前一个或后一个(如素数37在36的后面)

  • 数学证明:

任意一个整数n可以表示为n = 6a + b ( 0 <= b <= 5, a >= 0 ),接下来依次讲当n等于0到5的情况,以对此结论进行证明:

当n = 6a + 0 = 6a时,n有一个不为1及其本身的因数(素数判断条件)6,此类数不为素数

当n = 6a + 2 = 2( 3a + 1 )时,n有一个不为1及其本身的因数(素数判断条件)2,此类数不为素数

当n = 6a + 3 = 3( 2a + 1 )时,同上,有一因数3,此类数也不为素数

当n = 6a + 4 = 2( 3a + 2 )时,有一因数2, 此类数也不为素数

而当n = 6a + 1 或 n = 6a + 5时,不能绝对确定n是否为素数,需要考虑a的取值,显然此时的数值n就是分布在6的倍数前一个或后一个

总结:大于3的素数一定分布在6的倍数前后

  • 此规则可以直接对素数进行初步筛选,不符合此规则的数可直接判定为非素数,直接减少了2/3的运算量,效率提高肉眼可见
  • 注意小于等于3的素数(2, 3)需要另外判断

2.要判断n是否为素数,只需要让n从2开始,依次除到根号n即可

最基本的素数判断方法是:让n从2开始除,依次除到n - 1,如果每次除出来的结果余数皆不为0,那么此数n即为素数
实际上并不需要从除以[2, n - 1]区间的所有整数,只需除以[2, sqrt(n)]

3.在进行让n除以[2, sqrt(n)]区间内的所有整数操作时,如果2不是n的一个因数,那么之后可以不判断[2, sqrt(n)]区间的所有偶数

数学证明:当n/2除不尽时,n除以[2, sqrt(n)]区间内的所有偶数都除不尽

因此如果n不能将2除尽,那么之后的偶数一样除不尽,可以直接不除
如果将2除尽了,n就不是素数,直接排除
如果没有将2除尽,之后的计算量直接减半,肉眼可见的效率提升

算法时间复杂度复杂度

1.最基础的算法:也就是让n从2开始判断,一直到n-1

若遇到的数是素数时,此时需要进行n-2次判断
当遇到的不是素数时,要进行a(2<a<n-2)次判断
也就是说时间复杂度为n

2.改进后的算法:

根据规则二,判断素数只要从[2,sqrt(n)]即可,此时复杂度为sqrt(n)
根据规则3,无论如何都可以不判断2之后的偶数(当n大于2,当n除尽2时,n不为素数,之后不需要判断,如果n除不尽2时,之后的偶数不要判断)
假设n可以除尽2和不可以除尽2概率相等,那此时复杂度为sqrt(n)/4
根据规则一,只有1/3的数要进行判断,此时复杂度为sqrt(n)/12
也就是说时间复杂度为sqrt(n)/12

在计算过程中做出的假设以及计算过程并不那么严谨,此结果仅供参考

Python代码实现


def primeJudge(n):
 #先将数分为三类, 小于等于1,大于1小于5,和大于等于5
 #非整数统统不是素数
 if not isinstance(n, int): return False
 #小于1等于的都不是素数
 if n <= 1: return False
 #大于1小于5
 elif n == 2 or n == 3: return True
 #大于等于5
 elif n >= 5:
  #先判断是否在6的附近
  if n % 6 == 5 or n % 6 == 1:
   #再判断是否可以将2除尽
   #可以的话不是素数
   if n % 2 == 0: return False
   else:
    #不可除尽2,直接跳过所有偶数
    for i in range(3, int(sqrt(n) + 1), 2):
     if n % i == 0: return False
    #经过筛选即为素数
    return True
  #不在6的附近不是素数
  else: return False

以上就是python高效的素数判断算法的详细内容,更多关于python素数算法的资料请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

python高效的素数判断算法

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python判断素数并输出的方法是什么

判断一个数是否为素数的一种常见方法是使用试除法。试除法的基本思路是,对于每个可能的除数,检查它是否能整除给定的数。如果存在一个除数能整除该数,则该数不是素数;如果不存在这样的除数,则该数是素数。以下是一个使用试除法来判断素数的Python代
2023-08-23

Golang实战:判断字符是否为字母的高效算法

Golang实战:判断字符是否为字母的高效算法,需要具体代码示例引言:在处理文本数据时,常常需要对字符进行判断和处理。其中一个常见的需求就是判断一个字符是否为字母。然而,由于字符编码的复杂性和多样性,传统的方法往往效率较低。本文将介绍一种高
Golang实战:判断字符是否为字母的高效算法
2023-12-23

使用Python判断质数(素数)的简单方法讲解

质数又称素数。指在一个大于1的自然数中,除了1和此整数自身外,不能被其他自然数整除的数。素数在数论中有着很重要的地位。比1大但不是素数的数称为合数。1和0既非素数也非合数。质数是与合数相对立的两个概念,二者构成了数论当中最基础的定义之一。基
2022-06-04

java判断素数的方法有哪些

判断一个数是否为素数的常用方法有以下几种:1. 暴力法:从2开始逐个判断该数能否被整除,如果能被除以2至该数之前的任意数整除,则该数不是素数,否则是素数。```javapublic static boolean isPrime(int n)
2023-08-24

python质数的判断方法

这篇文章将为大家详细讲解有关python质数的判断方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。python质数判断的方法:首先运用python的数学函数;然后单行程序扫描素数,代码为【[ p for
2023-06-08

java判断是否为素数(质数)的方法

质数的定义:对于大于1的数,如果除了1和它本身,它不能再被其它正整数整除,那么我们说它是一个质数。判断一个数是否为质数(素数)方法:如果是偶数,直接返回;然后从3开始,步长为2,一直到n的算术平方根为止,都除不尽则为质数。Java程序:(推荐:java视频教程
java判断是否为素数(质数)的方法
2014-11-06

Python 判断是否为质数或素数的实例

一个大于1的自然数,除了1和它本身外,不能被其他自然数(质数)整除(2, 3, 5, 7等),换句话说就是该数除了1和它本身以外不再有其他的因数。 首先我们来第一个传统的判断思路:def handlerNum(num):# 质数大于 1if
2022-06-04

Python编程判断一个正整数是否为素数的方法

本文实例讲述了Python编程判断一个正整数是否为素数的方法。分享给大家供大家参考,具体如下:import string import math #判断是否素数的函数 def isPrime(n):if(n<2):return False;
2022-06-04

python判断回文数的方法

这篇文章给大家分享的是有关python判断回文数的方法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。python判断回文数的方法:首先将数组转为字符串;然后设置两个指针,一个从左往右遍历字符串,一个从右往左遍历,
2023-06-08

c语言素数的判断方法有哪些

判断一个数是否为素数的常见方法有以下几种:1. 蛮力法:该方法是最简单直接的方法,即对于给定的数n,从2开始遍历到n-1,判断n是否能被其它数整除。如果n不能被任何数整除,则它是素数。2. 试除法:在蛮力法的基础上进行优化。首先判断n是否能
2023-10-20

python判断质数的方法有哪些

判断质数的方法有以下几种:简单的方法是遍历从2到n-1的所有整数,判断n是否能被这些整数整除。如果n能被任何一个整数整除,则n不是质数。这种方法的时间复杂度为O(n)。def is_prime(n):if n 优化的方法是只需要遍历从2到n
2023-10-22

python判断是否为整数的方法

这篇文章给大家分享的是有关python判断是否为整数的方法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。python判断是否为整数的方法:1、使用【type()】函数判断,代码为【type(name, bases
2023-06-08

java中判断数组是否包含某元素的方法

有两种方法可以判断数组是否包含元素:方法1, 将数组转换为list,然后使用list的contains方法来判断:Arrays.asList(...).contains(...)java.lang.String.contains() 方法返回true,当且仅当
java中判断数组是否包含某元素的方法
2016-05-11

python奇偶数判断的方法有哪些

在Python中,可以使用以下几种方法来判断一个数是奇数还是偶数:1. 使用取模运算符(%):将给定的数与2进行取模运算,如果余数为0,则为偶数,否则为奇数。```pythonnum = int(input("请输入一个整数:"))if n
2023-08-23

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录