前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >判断一个数是不是素数

判断一个数是不是素数

作者头像
恋喵大鲤鱼
发布于 2020-12-08 01:55:29
发布于 2020-12-08 01:55:29
2.3K00
代码可运行
举报
文章被收录于专栏:C/C++基础C/C++基础
运行总次数:0
代码可运行

1.素数的定义

素数又名质数,指除了 1 和本身外不再有其他因数的自然数。

特别规定 0 和 1 既不是质数也不是合数。最小的质数是 2,最小的合数是 4。

下面给出常见判断方法,效率依次提升,以 Golang 为例给出实现。

2.直接法

给定数 n(n>2),根据质数的定义,很容易想到遍历 [2,n-1] 看是否存在某个数可以整除它,如果存在则不是素数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// isPrime 判断某个数是否是素数
func isPrime(n uint64) bool {
	if n <= 2 {
		return n == 2
	}
	for i := uint64(2); i < n; i++ {
		if n%i == 0 {
			return false
		}
	}
	return true
}

这里特殊处理不大于 2 的数,因为遍历 [2,n-1] 需要 n>2。

算法时间复杂度为 O(n),是最慢的实现。

3.初步优化

假如 n 是合数,必然存在非 1 的两个约数 p1 和 p2,其中p1<=sqrt(n),p2>=sqrt(n)。由此我们可以改进上述方法优化循环次数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func isPrime(n uint64) bool {
	if n <= 2 {
		return n == 2
	}
	sqrt := math.Sqrt(float64(n))
	for i := uint64(2); i <= uint64(sqrt); i++ {
		if n%i == 0 {
			return false
		}
	}
	return true
}

算法时间复杂度为 O(sqrt(n))。

4.继续优化

继续分析,其实质数还有一个特点,除了 2 和 3,它总是等于 6x-1 或者 6x+1,其中 x 是大于等于1的自然数。

上面的结论证明如下: (1)6x 能被 6 整除; (2)6x+2 能被 2 整除; (3)6x+3 能被 3 整除; (4)6x+4 能被 2 整除。 那么,就只有 6x+1 和 6x+5 (即等同于6x-1) 可能是质数了。

又因为合数有个性质,合数肯定有一个小于或等于根号的质因数,所以如果 n 能被 6 倍数两侧的数(才有可能是质数)整除,那么 n 是合数,否则 n 是素数。所以循环的步长可以设为 6,然后每次只判断 6 两侧的数能否整除 n 即可。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func isPrime(n uint64) bool {
	if n < 5 {
		return n == 2 || n == 3
	}
	// 不在6的倍数两侧的一定不是质数
	if n%6 != 1 && n%6 != 5 {
		return false
	}
	sqrt := math.Sqrt(float64(n))
	for i := uint64(5); i <= uint64(sqrt); i += 6 {
		// 是否是合数
		if n%i == 0 || n%(i+2) == 0 {
			return false
		}
	}
	return true
}

算法时间复杂度为 O(sqrt(n)/6)。

5.Miller-Rabin 概率素性测试算法

尽管上面的 O(sqrt(n)/6) 的算法已经非常优秀了,但是面对更高数量级的“大数”却会显得力不从心,所以上面朴素简单的算法一般不会用于工程实践中,一般使用 Miller-Rabin 算法。

Miller-Rabin 的理论基础来源于费马小定理,利用随机化算法判断一个数是合数还是可能是素数。关于 Miller-Rabin 算法原理这里不详细展开。

Golang 标准库基于 Miller-Rabin 已经实现了素性判断的方法,下面看下如何使用。

对于小于 2^64 的数,可以使用 big.ProbablyPrime(0),这种素性测试是100%准确的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const n = 1212121
if big.NewInt(n).ProbablyPrime(0) {
    fmt.Println(n, "is prime")
} else {
    fmt.Println(n, "is not prime")
}

输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1212121 is prime

对于较大的数字,需要为 ProbablyPrime(n) 提供所需数量的测试 。对于 n 次测试,对于随机选择的非素数,返回 true 的概率最多为 (1/4)^n。一个常见的选择是使用 n = 20,这时误判概性率约为 0.000,000,000,001,基本可以认为是准确的了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
z := new(big.Int)
fmt.Sscan("170141183460469231731687303715884105727", z)
if z.ProbablyPrime(20) {
    fmt.Println(z, "is probably prime")
} else {
    fmt.Println(z, "is not prime")
}

输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
170141183460469231731687303715884105727 is probably prime

其时间复杂度上界为 O(klog2​(n)),其中 k 为检测的轮数。增大 k 可以提高 Miller-Rabin 算法的准确度。

另外 Solovay–Strassen 也是工程中使用的概率素性判断算法,还有确定性算法 AKS,可在在多项式时间之内,决定一个给定整数是素数或者合数,感兴趣的同学可以了解一下这两个算法。

参考文献

[1] CSDN.判断一个数是不是质数(素数),3种方式介绍 [2] 知乎.Go语言中检测一个数是否为素数

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/12/04 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
MongoDB与python交互1.Pymongo2.安装3.使用4.mongoDB其它操作5.Mongodb与python交互6.完成命令行项目:学生信息管理(基于Python2.7)
PyMongo是Mongodb的Python接口开发包,是使用python和Mongodb的推荐方式。
Python攻城狮
2018/08/23
1.1K0
MongoDB与python交互1.Pymongo2.安装3.使用4.mongoDB其它操作5.Mongodb与python交互6.完成命令行项目:学生信息管理(基于Python2.7)
MongoDB Python驱动
MongoDB以JSON格式存储和显示数据。在pymongo中以字典的方式显示数据。
py3study
2020/01/13
9790
爬虫(105)pymongo, 这一篇文章够了,值得收藏
学了那么多的爬虫库,怎么能没有数据库这个东东呢?在开发过程中,数据是必不可少的,数据库也是应运而生了,数据和数据库这两个兄弟是缺一不可的
公众号---人生代码
2020/05/16
1.5K0
Python 基于pymongo操作Mongodb学习总结
如果连接用户名和密码包含诸如':', '/', '+' 及'@'保留字符,则使用前应该先进行编码,如下:
授客
2024/01/29
4150
Python基础教程(二十六):对接MongoDB
MongoDB是一种流行的NoSQL数据库,以其高性能、高可用性和灵活的数据模型著称。Python作为一种强大的编程语言,提供了与MongoDB无缝集成的能力,使得数据的读写、查询和管理变得更加便捷。本文将深入探讨如何使用Python与MongoDB进行交互,包括安装配置、基本操作、高级查询和实战案例。
用户11147438
2024/06/22
8490
在Python应用中使用MongoDB
目录[-] Python是开发社区中用于许多不同类型应用的强大编程语言。很多人都知道它是可以处理几乎任何任务的灵活语言。因此,在Python应用中需要一个什么样的与语言本身一样灵活的数据库呢?那就是NoSQL,比如MongoDB。 英文原文:https://realpython.com/blog/python/introduction-to-mongodb-and-python 1、SQL vs NoSQL 如果你不是很熟悉NoSQL这个概念,MongoDB就是一个NoSQL数据库。近几年来它越
jhao104
2018/03/20
2.6K0
MongoDB的数据清理
对于保留固定时间窗口的collection,通常是使用 Capped Collections 类型的集合。
保持热爱奔赴山海
2024/09/03
2350
python-Python与MongoDB数据库-使用Python执行MongoDB查询(一)
Python是一种强大的编程语言,广泛用于各种领域的开发。而MongoDB则是一种流行的NoSQL数据库,用于存储非结构化数据。在Python中使用MongoDB进行数据查询和操作,可以快速地构建高效的应用程序。
玖叁叁
2023/04/22
1.5K0
Python也能操作MongoDB数据库
作为非关系数据库的代表--Mongo,可以说是让人又爱又恨,让人爱的是它的便捷性,让人恨的是它的配置,实在是坑多。那么今天我们就来深入剖析它吧。
Python进阶者
2021/08/20
7060
python—连接mongodb
一、安装pymongo库     pip install pymongo 二、使用pymongo模块连接mongoDB数据库 #! /usr/bin/env python # -*- coding:utf-8 -*- from pymongo import MongoClient client = MongoClient('192.168.2.230',27017)     #建立MongoDB数据库连接 db=client.admin                                 
py3study
2020/01/07
1.2K0
MongoDB教程(十):Python集成mongoDB
💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快!
用户11147438
2024/07/20
1750
Python小姿势 - Python操作MongoDB数据库
MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。
不吃西红柿
2023/04/28
4520
Python爬虫之mongodb和python交互
pymongo 提供了mongdb和python交互的所有方法 安装方式: pip install pymongo
海仔
2020/09/23
8060
用Python操作MongoDB,看这一篇就够了
MongoDB 是一个基于分布式存储的数据库,由 C++ 语言编写的NoSQL非关系数据库。非关系型数据库NoSQL,即Not Only SQL,意即“不仅仅是SQL”,通常指数据以对象的形式存储在数据库中,而对象之间的关系通过每个对象自身的属性来决定。
吾非同
2021/06/01
2.6K0
用Python操作MongoDB,看这一篇就够了
pymongo:Python下 MongoDB 的存储操作
pymongo 3.x版本中,insert()方法官方已不推荐使用,推荐使用insert_one()和insert_many()将插入单条和多条记录分开。
luckpunk
2023/09/29
3870
Python连接MongoDB数据库并执
官网:https://pypi.python.org/pypi/pymongo/(按需下载)
py3study
2020/01/07
6510
Python连接MongoDB数据库并执
MongoDB与python交互
PyMongo是Mongodb的Python接口开发包,是使用python和Mongodb的推荐方式。 官方文档
周小董
2019/03/25
8210
MongoDB与python交互
pyMongo操作指南:增/删/改/查/合并/统计与数据处理
一文教你如何通过 Docker 快速搭建各种测试环境这篇超帅,教你阿里云服务器快速安装,redis、mysql、mongoDB、elesticsearch等,而且比较全,刚好满足最近笔者的所有需求。
悟乙己
2020/03/27
11.5K0
微信公号DIY:MongoDB 简易ORM & 公号记账数据库设计
介绍了如何使用搭建&训练聊天机器人以及让公号支持图片上传到七牛,把公号变成一个七牛图片上传客户端。这一篇将继续开发公号,让公号变成一个更加实用的工具账本(理财从记账开始)。
goodspeed
2020/12/22
1.5K0
微信公号DIY:MongoDB 简易ORM & 公号记账数据库设计
MongoDB和pandas的数据分析入门极简教程
导读:MongoDB是一个开源文档数据库,旨在实现卓越的性能、易用性和自动扩展。Pandas是受R数据框架概念启发形成的框架。
MongoDB中文社区
2019/08/26
1.8K0
MongoDB和pandas的数据分析入门极简教程
推荐阅读
相关推荐
MongoDB与python交互1.Pymongo2.安装3.使用4.mongoDB其它操作5.Mongodb与python交互6.完成命令行项目:学生信息管理(基于Python2.7)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验