count = 0
i = 11

while count <= 1000 and i <= 10000:
    if i%2 != 0:
       if (i%3 == 0 or i%4 == 0 or i%5 == 0 or i%6 == 0 or i%7 == 0 or i%9 == 0):
           continue
       else:
           print i,'is prime.'
           count += 1
    i+=1

我试图通过使用循环来生成第1000个素数.我正确地生成素数,但是我得到的最后一个素数不是第1000个素数.我如何修改我的代码呢?提前感谢帮忙.

编辑:我明白如何做这个问题.但有人可以解释为什么以下代码不起作用?这是我之前写的第二个代码.

count = 1
i = 3
while count != 1000:
    if i%2 != 0:
       for k in range(2,i):
          if i%k == 0:
            print(i)
            count += 1
            break
     i += 1

解决方法

让我们来看看.
count = 1
i = 3
while count != 1000:
    if i%2 != 0:
       for k in range(2,i):
          if i%k == 0:        # 'i' is _not_ a prime!
            print(i)       # ??
            count += 1     # ??
            break
     i += 1          # should be one space to the left,# for proper indentation

如果i%k == 0,那么我不是素数.如果我们发现它不是素数,我们应该(a)不打印出来,(b)不增加发现的素数的计数器,(c)我们确实应该从for循环中脱离出来 – 不需要再测试任何数字.

此外,我们可以从3开始增加2,而不是测试i%2,它们都将是奇怪的,然后通过构造.

所以,我们现在有了

count = 1
i = 3
while count != 1000:
    for k in range(2,i):
        if i%k == 0:       
            break
    else:
        print(i)
        count += 1
    i += 2

如果for循环没有被过早地破坏,那么之后的执行将被执行.

它有效,但它的工作太难了,所以要慢得多.它会根据下面的所有数字来测试一个数字,但只要测试它的平方根即可.为什么?因为如果一个数字n == p * q,其中p和q在1和n之间,则p或q中的至少一个将不大于n的平方根:如果它们都较大,则它们的乘积将更大比n

所以the improved code is:

from math import sqrt

count = 1
i = 1
while count < 1000:
    i += 2
    for k in range(2,1+int(sqrt(i+1))):
        if i%k == 0:       
            break
    else:
        # print(i),count += 1
        # if count%20==0: print ""
print i

只需尝试使用range(2,i)(如上一个代码)运行它,并看看它有多慢. 1000素素需要1.16秒,2000 – 4.89秒(3000 – 12.15秒).但是,sqrt只需要0.21秒的时间才能产生3000个素数,对于10,000和0.44秒,对于20,000(orders of growth〜n2.1 … 2.2 vs.〜n1.5),需要0.84秒.

上面使用的算法被称为trial division.还有一个进一步的改进需要使其成为最佳的试验划分,即仅通过素数测试.一个例子can be seen here,其中runs about 3x faster,更好的经验复杂性〜n1.3.

那么the sieve of Eratosthenes是is quite faster(对于20,000个素数,比上面的“改进代码”要快12倍,之后还要快得多:它的经验增长顺序为〜n1.1,用于生成n个素数,最多为n = 1,000,000个素数):

from math import log

count = 1 ; i = 1 ; D = {}
n = 100000                        # 20k:0.20s 
m = int(n*(log(n)+log(log(n))))   # 100k:1.15s 200k:2.36s-7.8M 
while count < n:                  #            400k:5.26s-8.7M 
        i += 2                    #            800k:11.21-7.8M 
        if i not in D:            #            1mln:13.20-7.8M (n^1.1)
            count += 1
            k = i*i
            if k > m:  break      # break,when all is already marked
            while k <= m:
                D[k] = 0 
                k += 2*i
while count < n:
        i += 2
        if i not in D: count += 1
if i >= m: print "invalid: top value estimate too small",i,m ; error
print i,m

真正无限的incremental,“sliding” sieve of Eratosthenes速度还快了1.5倍,在这个测试范围内.

如何在python中生成第1000个素数?的更多相关文章

  1. macos – 如何使用针对Swift结构的Cocoa绑定

    我正在学习斯威夫特.这些天我主要在iOS工作,但我目前正在为OSX开发一个小项目.在OSX上,我喜欢使用Cocoa绑定将我的模型中的值链接到UI元素.它节省了大量的胶水代码.我正在编写一个程序,将Swift的性能与C/Objective-C的性能进行比较.我正在使用素数生成器作为测试项目.我创建了一个SwiftStructComputeSettings,它封装了在Swift和Objective-C

  2. php – 从整数生成伪随机6字符串

    我现在花了整整2天的时间,没有将700,000,000个代码转储到数据库中并随机检索它们我完全没有想法.斯蒂芬如果你采用输入序列1,3…

  3. java – 找到质数比这更简单的方法吗?

    有没有比这更有效,更清洁/更优雅的寻找素数的方法?效率现在问题的另一面是确定指定范围内的素数的有效方法.虽然快速的互联网搜索应该产生许多不同的“快速”算法,用于确定一组比蛮力方式更紧固的素数.其中一种方法是阿特金筛选:方便的是,我们现在只需更改前一个主程序中的一行即可使用此素数生成器!

  4. java – 为什么Netbeans以它的方式生成hashCode()?

    特别是由于thisansweronthelinkedSOquestion,我了解了现在更全面地设计一个hashCode方法中使用素数的逻辑.然而,目前为止,没有人真正解决的问题的另一方面是Netbeans如何选择它为生成的方法所做的素数.哈希字段和其他乘数似乎根据类的各种因素而不同.例如,如果我添加第二个String到该类,则hashCode()变为那么,为什么Netbeans选择这些特定的素数,而不是其他的?

  5. 什么是在java中查找下一个最大素数的内置函数?

    JavaAPI是否提供了一个在给定输入x的情况下计算下一个最大素数的函数?解决方法这将是一个非常深奥的方法,并不是一个很好的候选人包含在一般类库中.您需要使用test或sieve自己编写.

  6. 任何人都可以解释一下java设计HashMap的hash()函数吗?

    为什么这个方法可以抵御糟糕的hashCode函数?对于获得(桶/槽)索引的大小执行的模数简单地通过以下方式计算:hash&(这正是HashMap中用来获取索引的内容!

  7. c – 确定性地检查大数是素数还是复数?

    我正在寻找一种算法来进行素数测试数字.有没有好的算法?

  8. c – 素数算法

    我需要生成素数但我的算法很慢.我的代码:t是测试用例的数量m,n是要打印质数的范围.解决方法您需要创建一个与您要查找的最大素数一样大的布尔数组.在开始时它完全初始化为true.如果i是素数,则此类数组的第i个单元格将为true,否则为false.从i=2开始迭代:它是素数,然后将索引倍数为2的任何单元格设置为false.转到下一个素数(i=3)并执行相同操作.转到下一个素数并且一次又一次地执行相同操作.

  9. 在C中工作后如何用Python思考?

    我是Python的新手,并试图通过将以下C函数复制到python中来学习它在我的python代码中(下面),而不是第二个向量,我有一个字符串列表的列表,前一个字符串中的字符的排序列表,以及一个bool.但是,我无法弄清楚如何在遍历列表时更改值.任何有关这样做或更多思考“pythony”的帮助表示赞赏.解决方法保持简单,这是O的复杂性,如果你没有GB的数据,那就足够了.请注意,set()和dict()基本上是一个散列索引(free和builtin!

  10. c – 哈希表实现

    我刚刚买了一本书“C接口和实现”.在第一章中,它实现了一个“Atom”结构,示例代码如下:在本章末尾,在练习3.1中,该书的作者说“大多数文本都建议使用素数作为桶.使用素数和良好的散列函数通常会给出一个更好地分配挂在水桶上的列表的长度.Atom使用2的幂,有时明确引用作为一个糟糕的选择.编写一个程序来生成或读取10,000个典型的字符串和度量Atom_new的速度和分布列表的长度.然后更换桶以使其

随机推荐

  1. 10 个Python中Pip的使用技巧分享

    众所周知,pip 可以安装、更新、卸载 Python 的第三方库,非常方便。本文小编为大家总结了Python中Pip的使用技巧,需要的可以参考一下

  2. python数学建模之三大模型与十大常用算法详情

    这篇文章主要介绍了python数学建模之三大模型与十大常用算法详情,文章围绕主题展开详细的内容介绍,具有一定的参考价值,感想取得小伙伴可以参考一下

  3. Python爬取奶茶店数据分析哪家最好喝以及性价比

    这篇文章主要介绍了用Python告诉你奶茶哪家最好喝性价比最高,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧

  4. 使用pyinstaller打包.exe文件的详细教程

    PyInstaller是一个跨平台的Python应用打包工具,能够把 Python 脚本及其所在的 Python 解释器打包成可执行文件,下面这篇文章主要给大家介绍了关于使用pyinstaller打包.exe文件的相关资料,需要的朋友可以参考下

  5. 基于Python实现射击小游戏的制作

    这篇文章主要介绍了如何利用Python制作一个自己专属的第一人称射击小游戏,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起动手试一试

  6. Python list append方法之给列表追加元素

    这篇文章主要介绍了Python list append方法如何给列表追加元素,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  7. Pytest+Request+Allure+Jenkins实现接口自动化

    这篇文章介绍了Pytest+Request+Allure+Jenkins实现接口自动化的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  8. 利用python实现简单的情感分析实例教程

    商品评论挖掘、电影推荐、股市预测……情感分析大有用武之地,下面这篇文章主要给大家介绍了关于利用python实现简单的情感分析的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下

  9. 利用Python上传日志并监控告警的方法详解

    这篇文章将详细为大家介绍如何通过阿里云日志服务搭建一套通过Python上传日志、配置日志告警的监控服务,感兴趣的小伙伴可以了解一下

  10. Pycharm中运行程序在Python console中执行,不是直接Run问题

    这篇文章主要介绍了Pycharm中运行程序在Python console中执行,不是直接Run问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

返回
顶部