素数(Prime Number),又称质数,一个大于1的自然数,除了1和它自身外,不能整除其他自然数的数叫做质数;否则,称为合数(Composite Number)。1既不是素数,也不是合数。

如2、3、5、7、11都是素数,因为找不到除了1和其本身之外的约数;而4、6、8都是合数,因为4可以整除2,6可以整除2和3,8可以整除2和4。

而一个数的约数必然是不超过该数的,加上素数必需是只有1和本身是其约数的条件。于是,我们可以通过枚举小于该数,并且大于1的整数,来判断该数是否是素数。

假设有一个正整数a,则其可以被写成任意两个正整数之积,即a = p * q。假设p < q,那么正整数p和q都是a的约数。注意到,如果我们知道p是a的约数,那么可以通过q = a / p快速求得另外一个约数q。同样的道理,如果某个数p不是a的约数,那么q也不是a的约数。这就意味着我们在枚举约数的时候,只需要枚举2到不大于sqrt(a)的正整数即可。

虽然通过上述方法,已经能让我们在根号级别的复杂度内,判断一个正整数是否为素数。但是我们其实还可以做得更快!回到我们最初的起点,我们之所以要枚举这些数,就是想找出原数的约数。然后除1外,任何一个正整数都能写成多个素数的乘积的形式,所以我们枚举特定范围内的所有素数,也能达到相同的效果,而且数字范围越大,其区间内素数个数和区间长度之比也将越来越小,大家可以看看下面不同区间内的素数统计结果:

从上图的统计结果我们可以发现,我们用区间内的素数去判断一个整数是否素数,比较的次数相较之前来说更少。虽然就单次判断一个素数来说,这样的算法可能并没有优势,因为还需要时间去求出该区间内的所有素数。但是如果需要判断的数字很多,那么先把该区间内的所有素数求出来,无疑是个更好的选择。

而求不超过某个正整数x内的所有素数,有一个著名的算法——埃拉托斯特尼筛法。其算法描述为:

先用一个数组vis,把不大于该正整数x的所有正整数标记为0,表示没有访问;然后从第一个素数2开始遍历整个区间,如果当前访问的数没有访问过,则可以认为它是一个素数。那么就将它在该区间内所有的倍数,全部标记为已访问,这样就保证外部的循环发现的没有访问过的数都是素数。其具体实现如下述代码所示:

埃拉托斯特尼筛法

然而,除了上述筛法,还有其他高效的筛法,比如欧拉筛法,这里只给出其代码实现,希望大家能仔细去体会。

欧拉筛法

那么Python如何判断一个正整数是否是素数?我在这里用math模块实现

python怎么判断一个数是不是正整数_Python如何判断一个正整数是否是素数?相关推荐

  1. 判断一个数的二进制形式是否只有一个1,是的话就输出

    // 判断一个数的二进制形式是否只有一个1,是的话就输出#include "stdafx.h" #include <stdlib.h>int main(int argc ...

  2. python 用if判断一个数是不是整数_Python基础教程07-函数和模块的使用

    在讲解本章节的内容之前,我们先来研究一道数学题,请说出下面的方程有多少组正整数解. x1+x2+x3+x4=8 事实上,上面的问题等同于将8个苹果分成四组每组至少一个苹果有多少种方案.想到这一点问题的 ...

  3. python如何判断一个数为小数_python判断是否是小数

    一.判断一个数是否为小数 1.有且仅有一个小数点 2.小数点的左边可能为正数或负数 3.小数点的右边为正数 二.实现代码def is_float(str): if str.count('.') == ...

  4. python 如何判断一个数为整数?(判断整数,没有小数)(取余)判断整型 isinstance()

    方法1 判断是否为整数(即使不为整型) # -*- coding: utf-8 -*- """ @File : test.py @Time : 2020/6/25 11: ...

  5. python判断ip地址是否合法_python实现判断一个字符串是否是合法IP地址的示例

    一个刚结束的笔试题目,简单贴一下吧,下面是具体实现: #!usr/bin/env python #encoding:utf-8 ''' __Author__:沂水寒城 功能:判断一个字符串是否是合法I ...

  6. python判断是否包含某数字_python如何判断数组里是否有某个数字

    Python 3语言开发教程.Python 3语言in操作符使用教程.Python 3语言如何判断数组内是否存在某一个元素? 工具/原料 电脑 Editplus 方法/步骤 1 在Python语言中, ...

  7. python变量隔一个数取出来_Python(二):变量、常量,字符串操作

    变量&常量 变量和常量都是存储值的内存区域,"变量"就是说值可以改变,"常量"就是说这个值不能改,是只读的,关于常量不详细介绍了 命名 上一次说过命名规 ...

  8. python判断两个数是否相等_python比较两浮点数是否相等的方法

    python如何比较两个浮点数是否相等? float 类型不能比较相等或不等,但可以比较>,<,>=,<= 用==从语法上说没错,但是本来应该相等的两个浮点数由于计算机内部表示 ...

  9. python判断几个数最大最小_python 找出list中最大或者最小几个数的索引方法

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

最新文章

  1. 详细的聊聊接口性能优化的11个小技巧 不收藏对不起我
  2. DAG添加第二台主机报超时
  3. deinstall 卸载grid_卸载Oracle 11g的Grid小计
  4. android长截屏代码,android长截屏原理及实现代码
  5. oracle vm中的xp添加共享文件夹
  6. C++经典面试题汇总
  7. vue 调用webservice_js跨域调用WebService的简单实例
  8. 物联网搜集大量数据协助制定业务策略 成为银行业竞争利器
  9. Ignite与Spark内存计算平台对比分析
  10. mysql+instr查询,mysql中使用instr进行模糊查询方法介绍
  11. linux内核奇遇记之md源代码解读之七阵列同步一
  12. 强大好看的dz论坛社区源码手机端
  13. java常见异常和代码演示
  14. 微博话题墙 html,Js仿微博插入话题功能
  15. 求职必看:后端工程师就业公司选择解析
  16. Linux Qt cannot find -lGL
  17. Type-c引脚定义
  18. Go入门系列(十七) go并发之基于共享变量的并发
  19. Java第十一天笔记01——多线程编程
  20. LeetCode 36. Valid Sudoku(九宫格数独)

热门文章

  1. Linux终端的用户体验增强方案
  2. 外观设计需具备什么要素才能申请专利?要准备什么申请材料?
  3. flink CEP检测温度事件微型示例
  4. linux 系统下的static变量
  5. 基础数据类型转换和深浅拷贝
  6. git rev-list从A到B之间的所有提交
  7. 快速开发跨平台应用之Xamarin技术
  8. 检测到错误页面web应用服务器版本信息泄露
  9. 工厂模式(简单工厂模式和工厂方法模式)详解
  10. 毛哥的快乐生活(10) 深藏不漏的美工妹子