很久前在知乎写的一个答案,今天把坑填了,顺便搬过来。

让我们定义dn为:dn=pn+1−pn,其中pi是第i个素数。显然有d1=1,且对于n>1有dn是偶数。
“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。 现给定任意正整数N(<10^5), 请计算不超过N的满足猜想的素数对的个数。

而且题目还限制了400ms时间(有没有搞错(╯‵□′)╯︵┻━┻)

写出的第一个程序在最大值情况下运行时间超过10秒 (;′⌒`)

后来在网上看到了一个人的回答,使用到了初中时学到的数学知识:

假如一个数N是合数,它有一个约数a,那么有a×b=N
则a、b两个数中必有一个大于或等于根号N,一个小于或等于根号N。
因此,只要小于或等于根号N的数(1除外)不能整除N,则N一定是素数。
原谅我数学没学好,依照这个思路 我写了下面这个程序:

import math   #使用 math 模块来开平方
import time   #计算程序运行时间
num = int(input())    #输入一个整数
s = 0                 #计算质数对的个数
start = time.time()    #计算开始时间def f1(n):if n <= 1:return Falseelse:for i in range(2, int(math.sqrt(n)) + 1):   #这里 +1是将开方后的结果包含在内if n % i == 0:return False              return True           for i in range(1, num+1):if f1(i) is True and f1(i + 2) is True and (i + 2) <= num: #最后的条件是限制素数对超过Ns += 1
end = time.time()           #结束时间
print(s)                    #打印素数对个数
print(end - start)          #输出运行时间

嗯 这就是大概的逻辑,最后时间大大缩短,用100000来实验,时间是0.4561。略微超过了400ms。

怎么办…… 于是继续找,总有人跟我遇到一样的问题嘛?

最后还真找到了!

要想继续优化缩短运行时间,就是按照上面的思路来排除多余的工作量。既然我们已经排除了一半,那是不是还能排除跟多呢?

废话!当然可以啦~(不然也不会写到这里)

首先想到的就是偶数! 除了2以外,显然偶数不是素数。好的,又排除了一半。

顺着思路,那么奇数里面能被3,被5整除的也要排除。

顺着这个思路 我们得到这个代码:

import math     # 使用 math 模块来开平方
import time     # 计算程序运行时间
num = int(input())    # 输入一个整数
s = 0                 # 计算质数对的个数
start = time.time()    # 计算开始时间def f1(n):if n <= 1:return Falseelif n % 2 == 0 and n != 2:     # 去除能被2整除的  不包括2(其实也可以包括2,以为2没有素数对)return Falseelif n % 3 == 0 and n != 3:     # 去除能被3整除的  不包括3return Falseelif n % 5 == 0 and n != 5:     # 去除能被5整除的  不包括5return Falseelif n % 7 == 0 and n != 7:     # 去除能被7整除的  不包括7return Falseelse:for i in range(3, int(math.sqrt(n)) + 1, 2):   # 这里 +1是将开方后的结果包含在内if n % i == 0:return Falsereturn Truefor i in range(1, num+1):if f1(i) is True and f1(i + 2) is True and (i + 2) <= num:  # 最后的条件是限制素数对超过Ns += 1
end = time.time()
print(s)
print(end - start)

用 100000 来实验,得到的时间是207ms!!! 合格啦!!! 少了一半多! 但是能不能更少呢?

还真能!

要想再简化,就不得不了解孪生质数的性质和分布规律。

一. 当n≥5时,如果一个n-1,n+1互为孪生质数,则n必定是6的倍数

  • 简要证明:因为:n - 1,n + 1是质数

    • 故 :n - 1 ,n + 1是奇数
    • 可知:n 是 偶数,n 是 2 的倍数。
    • 假设:n 不是 3 的倍数,即 n = 3k + 1 或 n = 3k + 2。
      • (a) 当 n = 3k + 1 时,那么 n - 1 = 3k,已经与 n - 1 是质数矛盾。
      • (b) 当 n = 3k + 2 时, 那么 n +1=3(k + 1),已经与 n + 1是质数矛盾。
      • 故:n 是 3 的倍数。
      • 因为:n既是2的倍数,又是3的倍数
      • 故:n 是6的倍数。

得出:
推论一:当 x >= 1, (6x - 1)或 (6x + 1)不是质数时,即
2(3x) - 1, 3(2x) - 1,
2(3x) + 1, 3(2x) + 1,为合数时,
它们的质因子不包括2和3的倍数。(合数为可分解为多个质数的乘积)

二. 对于大于3的质数,只分布在6x-1和6x+1两数列中(x为非0自然数)。即都在6的倍数的两侧。

也就是说,大于5的质数一定在6x两侧,但是6x的两侧不一定是质数。

6x-1数列中的素数为阴性素数,合数为阴性合数
6x+1数列中的素数为阳性素数,合数为阳性合数

好了,依照之前的和以上两个性质的思路。

可知,对于大于3的孪生质数

  1. 5+6n数列中,素数必定为阴性素数,且合数也不能被2,3整除,所以是否能被2,3整除不用判断
  2. 只需满足5+6n和7+6n同时为素数,即都不能被5或7 整除即可。

代码如下:

import math     # 使用 math 模块来开平方
num = 100000
s = 1  # 默认考虑(3,5)
def f1(n):if n == 5 or n == 7:return Trueelif n % 5 == 0 and n % 7 == 0:return Falseelse:for i in range(3, int(math.sqrt(n)) + 1, 1):   # 这里 +1是将开方后的结果包含在内。if n % i == 0:return Falsereturn Truefor i in range(5, num+1, 6):if f1(i) and f1(i+2) and (i+2)<=num:  # 最后的条件是限制素数对超过Ns += 1
#         print((i,i+2),s)
print(s)

最终用时为 85ms!!!,又少了一半多!!!

这个是从判断是否为孪生素数对的角度来寻找思路,对于是否为素数,我想也没必要赘述了。按照以上思路写就可以了。

其实从这个小练手让我学到了一件事,在做一些事情之前,不要一开始就闷着头干,先思考,分析,才能真正抓住事情的本质,得出更满意的结果。

python判断孪生质数对(素数对)并计算个数。相关推荐

  1. python判断是否质数_质数判断python

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! python3初学实践案例(11)判断质数以及计算一个数字的质因数昨天晚上看到群 ...

  2. python判断正负的函数_Python |在计算操作的函数内将负数转换为正数?

    我一直在寻找将负数转换为正数,我发现了一些东西,但没有成功.. 这是一个来自在线Python页面的练习,我正在学习Python. 我希望你明白这一点. 这是去洛杉矶旅行,我用功能计算钱,但现在有一个问 ...

  3. python 判断并记录1000以内素数的个数及具体数值

    一.素数的定义 素数:在正整数范围内,大于1并且只有1和自身两个约数的数. 二.python实现 1.代码 (示例:1000以内的素数判断) n = 1000 #判断的范围 L = [] #记录数值 ...

  4. python判断能否组成三角形_任意输入3个数,判断能否组成三角形(python)

    原博文 2018-08-10 17:11 − 任意输入3个数,判断能否组成三角形. 三角形:两边之和大于第三边 直角三角形:勾股定理 代码如下: # 输入合法性检查,必须输入正数,不支持科学计数法'' ...

  5. MATLAB判断是不是质数,matlab 如何表示一个数是不是质数,如题 。

    共回答了20个问题采纳率:85% %% 保存为 my_isprime.m function [pm,ct] = my_isprime(A) % 输入参数 A:单个自然数或自然数数组 % 输出参数 pm ...

  6. python判断质数合数奇数偶数_Python 判断合数质数

    Python 判断合数质数 首先明确合数和质数的概念 合数: 自然数中除了能被 1 和本身整除之外, 还能被其他的数整除的数(4,6,9,10...)defheshu(m): list_a=[] fo ...

  7. python质数判断if isprime_使用Python判断质数(素数)的简单

    这篇文章主要介绍了使用Python判断质数(素数)的简单方法讲解,经常被用来做科学计算的Python处理这种小问题当然手到擒来^_-需要的朋友可以参考下 质数又称素数.指在一个大于1的自然数中,除了1 ...

  8. python判断质数用for循环_Day3.Python判断与循环语句

    Python判断与循环语句!!! 例题引导: Q:输入3个整数,按从小到大依次输出,用"->"符号相连: 例如:输入4,2,6,输出2 -> 4 -> 6 A: ...

  9. 用python找孪生素数_python用递归筛选法求N以内的孪生质数(孪生素数)

    本人最近读完一本书<质数的孤独>,里面讲到孪生质数,就想查一下孪生质数的分布情况.其中主要用到了计算质数(素数)的方法,搜了一下,排名前几的都是用for循环来做的,感觉略微麻烦了一些,在比 ...

最新文章

  1. R语言ggplot2可视化:组合箱图(boxplot)和直方图(histogram)输出组合可视化结果
  2. 电单车拉力赛的调试情况汇集
  3. poj 1164 The Castle
  4. qt翻译---QTime
  5. Ubuntu 安装Jdk(apt-get)
  6. SAP S/4HANA Service Management和SAP FSM基于CPI的集成场景介绍
  7. Mac OSX中memcached安装测试
  8. 领域驱动设计在马蜂窝优惠中心重构中的实践
  9. spring配置文件注解方式引入的两种方式
  10. xhtmlrenderer + iText-HTML转PDF
  11. 雷军:小米12 Pro全球首发索尼IMX707
  12. Java习题集第三章Java程序设计基础
  13. python-opencv2利用 cv2.findContours()函数来查找检测物体的轮廓
  14. SQL语句(五) 索引建立
  15. Java 之未支付订单30分钟后自动取消
  16. 方法finalize()的应用
  17. MyBatis万能插入语句
  18. 第一次使用Arduino MKR WIFI 1010
  19. Broekett定理):
  20. python怎么计算_python怎么计算

热门文章

  1. android studio开发整合资源简单实现android扫一扫功能
  2. java jdbc 无效的列名_java.sql.SQLException列名无效
  3. 【Python】列表、元组、字典的使用详解(增删改查)
  4. 使用Wordpress搭建个人博客网站
  5. Lucene 7.5.0 索引文件之tvxtvd
  6. 爬虫第一课——教你学会使用requests库
  7. unable to write file .git/objects/8a/5a043a43c0dad68ceb65f5a7bd9f7e7a70078b: Permission denied
  8. vsco使用教程_摄影后期应用 VSCO Cam 基础教程:界面与基础功能简介
  9. 蘑菇丁工学云打卡教程
  10. postman中如何设置全局变量?