`

Python学习(一):求质数

阅读更多

    为了学习Python,最好还是直接从写代码入手,解决的问题如下:

    1、使用质数的定义求出所有小于等于1000000的质数

    2、使用筛法求出所有小于等于1000000的质数,并比较两种方法的耗时。数据说话

    3、从小到大,求出前m个素数。这里先使用素数定理x/lin(x)=m,预估出前m个素数分布的范围

         再使用筛选法求出

 

 

#coding=utf-8
'''
Created on 2015年8月14日

@author: zwustudy
1、输出所有小于等于max的质数,这里提供两种方法:
    producePrime1使用质数判断方法,一直遍历到某一个数的平方根值
    producePrime2使用筛法,筛选剔除小于等于max的所有非质数,剩下的就是质数了
2、从小到大,输出前m个质数。  筛法的速度远超普通方法,针对这个需求,普通方法很慢,筛法又不适用,因为不知道前m个质数对应的max是多少,
  这怎么办呢?质数越往后越稀疏,有个素数定理就是用来预估max以内有多少质数,最简洁的公式有x/ln(x),会有一定的误差,但是不超过百分之十五
 那么我们可以根据m反推出max的大小
'''
import math
import time


'''
   最朴素的判断质数的方法, 即根据质数的定义,一直从2到该数的平方根,判断是否能整除
'''    
def producePrime1(max):
    for i in range(2, max + 1):
        if __isPrime(i): print i

'''
筛选法找质数,即“埃拉托色尼筛法”,挖掉2的倍数、3的倍数、一直到max的平方根的倍数,剩下的都是质数了
'''          
def producePrime2(max):
    li = []
    for i in range(2, max + 1):
        if i > 2 and i % 2 == 0:
            li.append(0)
        else:
            li.append(i)
    
    for i in range(3, int(math.sqrt(max)) + 1, 2):
        if li[i - 2] != 0:
            for j in range(i + i, max + 1, i):
                li[j - 2] = 0
    
    for i in li:
        if i != 0:
            print i  

'''
从小到大,输出前count(count > 10)个质数
这里先使用素数定理求出count个素数分布的范围,再使用筛选法筛除所有素数,最后输出前count个素数
'''
def producePrePrime(count):
    max = int(__findMax(count) * 1.15)
    li = []
    for i in range(2, max + 1):
        if i > 2 and i % 2 == 0:
            li.append(0)
        else:
            li.append(i)
    
    for i in range(3, int(math.sqrt(max)) + 1, 2):
        if li[i - 2] != 0:
            for j in range(i + i, max + 1, i):
                li[j - 2] = 0
    
    j = 0
    for i in li:
        if i != 0:
            print i
            j += 1
            if j >= count:
                break  
    
        

'''
    判断number是否是质数
'''
def __isPrime(number):
    if number <= 1 : return False
    for i in range(2, int(math.sqrt(number)) + 1):
        if number % i == 0 :
            return False
    return True 

'''
根据素数定理,x/ln(x) >= m 找到最小的一个整数x解,m > 10
'''
def __findMax(m):
    if m <= 10:
        raise NameError('input illeagal m <= 10!')
    
    start = m
    end = m * 2
    while True:
        if end / math.log(end,math.e) >= m:
            break;
        start = end
        end = end * 2
    index = int((start + end) / 2)
    while True:
        m1 = index / math.log(index, math.e)
        m2 = (index - 1) / math.log(index - 1, math.e)
        if m1 >= m and m2 < m:
            break;
        if m1 >= m:
            end = index
        else:
            start = index
        index = int((start + end) / 2)
        
    return index

max = 1000000
        
start = long(time.time() * 1000)    
producePrime1(max)
end1 = long(time.time() * 1000)
producePrime2(max)
end2 = long(time.time() * 1000)

producePrePrime(10000)

print("使用质数定义法找出所有小于等于" + str(max) + "质数并输出,总共耗时" + str(end1 - start) + "毫秒")   
print("使用筛选法找出所有小于等于" + str(max) + "质数并输出,总共耗时" + str(end2 - end1) + "毫秒")

 

运行结果如下图:



 

 代码我也放到GitHub上面了

 

  • 大小: 6.4 KB
1
1
分享到:
评论

相关推荐

    python求素数因子-Python入门教程:素数判断与素因子分解.pdf

    总之,这份Python入门教程详细介绍了素数判断和素因子分解的实现,提供了一个实用的起点,帮助学习者掌握这些基本的数学计算方法。通过对代码的理解和优化,可以进一步提升算法效率,处理更大的数值挑战。

    python实现反向数,回文数,回文素数,反素数,梅森素数,双素数。

    同样,我们也可以找出指定范围内所有的双素数: ```python for i in range(1, 1001): if are_consecutive_primes(i, i+1): print(f"双素数对: {i}, {i+1}") ``` 在学习和实践这些算法时,不仅可以提升我们的编程...

    Python:爬虫质数查询程序

    总的来说,这个"Python:爬虫质数查询程序"是一个很好的学习项目,它涵盖了Python的基础语法、算法设计、文件操作等多个方面,对初学者来说是一个全面了解Python编程的好起点。同时,它也可以作为一个有趣的挑战,...

    Python源码:算素数.zip

    每个案例都如同精心雕琢的模板,旨在帮助学习者快速上手,深入理解Python的强大功能与应用场景。 无论你是初学者,希望通过具体项目巩固知识;还是资深开发者,寻求灵感与优化方案,这份源码库都能为你提供丰富的...

    python实战:算素数.zip

    踏入Python编程的实战殿堂,这份资源为您精心准备了丰富的实战案例源码及其详尽说明。不同于理论堆砌,这里注重的是将Python的强大功能与前端HTML技术完美融合,展现网页开发的全新视角。 每个案例均聚焦于解决实际...

    Python语言基础:while循环嵌套.pptx

    在Python编程语言中,`while`循环是一种控制流语句,用于重复执行一段代码块,直到指定的条件不再满足。而`while`循环的嵌套则意味着在一个`while`循环内部,还有一个或多个`while`循环,或者可能是`for`循环。这样...

    python基础教程:三元表达式 if for 构建List 进阶用法.pdf

    Python是一种高级编程语言,以其简洁明了的语法和强大的功能深受程序员喜爱。在这个基础教程中,我们将探讨Python中三元表达式、for循环以及构建List的进阶用法。 1. 三元表达式 虽然在提供的内容中没有直接提到...

    python 写 一个 回文素数

    回文素数 python 写 一个 回文素数

    python考试题目及答案-python期末考试试题汇总.pdf

    "Python考试题目及答案-python期末考试试题汇总" 本资源摘要信息涵盖了Python编程语言的多个方面,包括基本...这些知识点涵盖了Python编程语言的基础知识和进阶知识,为编程学习者和开发者提供了有价值的参考资源。

    Python求区间正整数内所有素数之和的方法实例

    Python的学习记录与分享——PTA程序设计类教学平台。如果你也正在学习关于此类的题目可以仔细阅读这篇文章,了解一下循环结构、素数的基本语法知识。 题目: 7-5就区间正整数内所有素数之和 (20分) 【描述】求m-n...

    Complete Guide For Python Programming 2015年1月

    22. Python程序示例:提供了多种Python程序示例,如矩阵加法、计算两个数的和、判断一个数是否是质数等,每个示例都展示了特定知识点的使用。 23. 判断三角形面积的程序:通过具体的程序代码,展示了如何计算三角形...

    1.5 编程基础之循环控制 python版.rar

    7. **第n小的质数**(1.5编程基础之循环控制 44 第n小的质数.py):找出第n个质数通常需要循环遍历整数并进行素数测试,例如使用Sieve of Eratosthenes算法。 8. **求特殊自然数**(1.5编程基础之循环控制 25 求...

    python求1000以内的素数-03-学员管理系统框架搭建.ev4.rar

    虽然提供的文件列表中只有"python求1000以内的素数-03-学员管理系统框架搭建.ev4.mp4",但我们可以推测这可能是一个视频教程,其中详细讲解了如何使用Python编程实现上述功能,包括素数计算和学员管理系统框架的搭建...

    Python 2种方法求某个范围内的所有素数(质数)

    素数,也称为质数,是指大于1的自然数,除了1和它自身外,不能被其他自然数整除。它是数学和计算机科学中的基本概念,对密码学、编码等领域有重要应用。本文将介绍两种在Python中求解指定范围内所有素数的方法。 ##...

    python如何求100以内的素数

    在Python编程语言中,求解100以内的素数是一项基本任务,它涉及到数论和算法的基础知识。素数是大于1且只有1和其本身两个正因数的自然数。以下是两种不同的方法来实现这个功能: **方法一:使用for循环** 这种方法...

    Python源码:100到200的素数.zip

    每个案例都如同精心雕琢的模板,旨在帮助学习者快速上手,深入理解Python的强大功能与应用场景。 无论你是初学者,希望通过具体项目巩固知识;还是资深开发者,寻求灵感与优化方案,这份源码库都能为你提供丰富的...

    python_素数.rar

    在"Python学习,代码文档_素数判定"这个主题中,我们主要会探讨如何用Python编写程序来检测一个数是否为素数。素数判定是初学者经常遇到的练习,有助于理解和掌握条件判断、循环等基本编程概念。 首先,我们需要了解...

    python :头歌答案内置函数

    在`is_prime`函数内部,有一系列的逻辑判断来检测输入的数字`num`是否为素数: ```python if num &lt; 2: return False ``` 这里判断如果`num`小于2,函数会立即返回`False`。因为在数学上,最小的素数是2,所以任何...

    试卷python软件编程等级考试(三级)编程实操题02练习.docx

    【知识点详解】 1. Python 语言特性:Python 是一种高级编程语言,以其简洁明了的语法和丰富的库而著名,适合用于开发各种应用,包括人工智能...这些知识点构成了学习 Python 的基础,并在实际编程中具有广泛的应用。

Global site tag (gtag.js) - Google Analytics