在python中打印素数系列

时间:2012-07-23 20:22:35

标签: python primes series

我正在尝试学习Python编程,而且我对此很陌生。

我在打印一系列素数从一到百时遇到了问题。我无法弄清楚我的代码有什么问题。

这是我写的;它打印所有奇数而不是素数:

for num in range(1,101):
    for i in range(2,num):
        if (num%i==0):
            break
        else:
            print(num)
            break

34 个答案:

答案 0 :(得分:45)

你需要检查从2到n-1的所有数字(实际上是sqrt(n),但好吧,让它为n)。 如果n可被任何数字整除,则它不是素数。如果数字是素数,则打印它。

for num in range(2,101):
    prime = True
    for i in range(2,num):
        if (num%i==0):
            prime = False
    if prime:
       print num

你可以写更短更多的pythonic:

for num in range(2,101):
    if all(num%i!=0 for i in range(2,num)):
       print num

正如我已经说过的那样,检查除数不是从2到n-1,而是从2到sqrt(n):

import math
for num in range(2,101):
    if all(num%i!=0 for i in range(2,int(math.sqrt(num))+1)):
       print num

对于像101这样的小数字并不重要,但对于10 ** 8,差异将非常大。

您可以通过将检查范围增加2来进一步改善它,从而只检查奇数。像这样:

import math
print 2
for num in range(3,101,2):
    if all(num%i!=0 for i in range(2,int(math.sqrt(num))+1)):
       print num

编辑:

  

如在第一个循环中那样选择奇数,在第二个循环中没有   需要检查偶数,所以'我'的值可以从3开始   跳过2。

import math
print 2
for num in range(3,101,2):
    if all(num%i!=0 for i in range(3,int(math.sqrt(num))+1, 2)):
        print num

答案 1 :(得分:12)

break结束它当前所处的循环。所以,你只是检查它是否可被2整除,给你所有奇数。

for num in range(2,101):
    for i in range(2,num):
        if (num%i==0):
            break
    else:
        print(num)

话虽如此,有更好的方法在python中找到素数而不是这个。

for num in range(2,101):
    if is_prime(num):
        print(num)

def is_prime(n):
    for i in range(2, int(math.sqrt(n)) + 1):
        if n % i == 0:
            return False
    return True

答案 2 :(得分:11)

除了试验分裂之外,希腊数学家Eratosthenes在两千多年前发明的更好的方法是通过反复抛出多个素数来筛选。

首先列出从2到最大期望素数的所有数字。然后重复取最小的未交叉数,并将其全部交叉掉;保持未交叉的数字是素数。

例如,考虑小于30的数字。最初,2被识别为素数,然后4,6,8,10,12,14,16,18,20,22,24,26,28和30是划掉了。接下来3被识别为素数,然后划掉6,9,12,15,18,21,24,27和30。下一个素数是5,所以10,15,20,25和30被划掉。等等。剩下的数字是素数:2,3,5,7,11,13,17,19,23和29。

def primes(n):
  sieve = [True] * (n+1)
  for p in range(2, n+1):
    if (sieve[p]):
      print p
      for i in range(p, n+1, p):
        sieve[i] = False

筛网的优化版本分别处理2并仅筛选奇数。此外,由于所有小于当前素数的平方的复合物被较小的素数划掉,内环可以从p ^ 2而不是p开始,外环可以在n的平方根处停止。我将离开optimized version让你继续工作。

答案 3 :(得分:4)

我支持不采用最佳解决方案并对其进行测试。下面是我为@ igor-chubin和@ user448810创建简单类示例所做的一些修改。首先,请允许我说出所有重要信息,谢谢你们。但是我必须承认@ user448810他的聪明解决方案,这是迄今为止最快的(我测试的那些)。所以对你赞不绝口,先生!在所有示例中,我使用1百万(1,000,000)的值作为n。

请随意尝试使用该代码。

祝你好运!

Igor Chubin所描述的

方法1

def primes_method1(n):
    out = list()
    for num in range(1, n+1):
        prime = True
        for i in range(2, num):
            if (num % i == 0):
                prime = False
        if prime:
            out.append(num)
    return out

基准:超过272秒

Igor Chubin所描述的

方法2

def primes_method2(n):
    out = list()
    for num in range(1, n+1):
        if all(num % i != 0 for i in range(2, num)):
            out.append(num)
    return out

基准: 73.3420000076秒

Igor Chubin所描述的

方法3

def primes_method3(n):
    out = list()
    for num in range(1, n+1):
        if all(num % i != 0 for i in range(2, int(num**.5 ) + 1)):
            out.append(num)
    return out

基准: 11.3580000401秒

Igor Chubin所描述的

方法4

def primes_method4(n):
    out = list()
    out.append(2)
    for num in range(3, n+1, 2):
        if all(num % i != 0 for i in range(2, int(num**.5 ) + 1)):
            out.append(num)
    return out

基准: 8.7009999752秒

用户448810(我认为非常聪明)所描述的

方法5

def primes_method5(n):
    out = list()
    sieve = [True] * (n+1)
    for p in range(2, n+1):
        if (sieve[p]):
            out.append(p)
            for i in range(p, n+1, p):
                sieve[i] = False
    return out

基准: 1.12000012398秒

注意事项:上面列出的解决方案5(由用户448810提议)证明是最快,最诚实的创意和聪明。我喜欢它。谢谢你们!

编辑:哦,顺便说一下,我觉得没有必要为数值的平方根导入数学库,因为等价物只是(n * * .5)。否则我没有编辑其他的东西然后使值存储在和输出数组中由类返回。此外,将结果存储到文件可能比使用详细信息更有效,并且如果一次只有一个,则可以节省大量内存但由于磁盘写入会花费更多时间。我认为总有改进的余地。所以希望这些代码很有意义。

答案 4 :(得分:2)

解决上述问题的最佳方法是使用“Miller Rabin Primality Test”算法。它使用概率方法来查找数字是否为素数。它是迄今为止我遇到的最有效的算法。

下面演示了python的实现:

def miller_rabin(n, k):

    # Implementation uses the Miller-Rabin Primality Test
    # The optimal number of rounds for this test is 40
    # See http://stackoverflow.com/questions/6325576/how-many-iterations-of-rabin-miller-should-i-use-for-cryptographic-safe-primes
    # for justification

    # If number is even, it's a composite number

    if n == 2:
        return True

    if n % 2 == 0:
        return False

    r, s = 0, n - 1
    while s % 2 == 0:
        r += 1
        s //= 2
    for _ in xrange(k):
        a = random.randrange(2, n - 1)
        x = pow(a, s, n)
        if x == 1 or x == n - 1:
            continue
        for _ in xrange(r - 1):
            x = pow(x, 2, n)
            if x == n - 1:
                break
        else:
            return False
    return True

答案 5 :(得分:2)

一个Python程序功能模块,它返回1' st N素数:

def get_primes(count):
    """
        Return the 1st count prime integers.
    """
    result = []
    x=2
    while len(result) in range(count):
        i=2
        flag=0
        for i in range(2,x):
            if x%i == 0:
                flag+=1
                break
            i=i+1
        if flag == 0:
            result.append(x)
        x+=1
    pass
    return result

答案 6 :(得分:1)

n = int(input())
is_prime = lambda n: all( n%i != 0 for i in range(2, int(n**.5)+1) )
def Prime_series(n):
    for i in range(2,n):
        if is_prime(i) == True:
            print(i,end = " ")
        else:
            pass
Prime_series(n)

这是使用lambda函数的简化答案。

答案 7 :(得分:1)

我将素数列入条目数而没有太多麻烦的方法是使用属性,您可以获得任何不是素数的素数的数字。

因此,如果你将条目号除以它下面的所有素数,并且它们不能被它们中任何一个整除,你知道你有一个素数。

当然还有更快的方法来获得素数,但是这个方法已经表现得相当不错,特别是因为你没有将条目号除以任何数字,而是只有素数一直到这个数字。

使用此代码,我在计算机上管理,在不到4秒的时间内列出所有素数高达100 000。

import time as t

start = t.clock()

primes = [2,3,5,7]

for num in xrange(3,100000,2):
    if all(num%x != 0 for x in primes):
        primes.append(num)

print primes
print t.clock() - start
print sum(primes)

答案 8 :(得分:0)

最快的&省略素数的最佳实现:

def PrimeRanges2(a, b):
    arr = range(a, b+1)
    up = int(math.sqrt(b)) + 1
    for d in range(2, up):
        arr = omit_multi(arr, d)

答案 9 :(得分:0)

for i in range(1, 100):
  for j in range(2, i):
    if i % j == 0:
      break 
  else:
    print(i)

答案 10 :(得分:0)

这是一种不同的方法,用于交换空间以加快搜索时间。这可能是最快的。

import math

def primes(n):
    if n < 2:
        return []
    numbers = [0]*(n+1)
    primes = [2]
    # Mark all odd numbers as maybe prime, leave evens marked composite.
    for i in xrange(3, n+1, 2):
        numbers[i] = 1

    sqn = int(math.sqrt(n))
    # Starting with 3, look at each odd number.
    for i in xrange(3, len(numbers), 2):
        # Skip if composite.
        if numbers[i] == 0:
            continue
        # Number is prime.  Would have been marked as composite if there were
        # any smaller prime factors already examined.
        primes.append(i)
        if i > sqn:
            # All remaining odd numbers not marked composite must be prime.
            primes.extend([i for i in xrange(i+2, len(numbers), 2)
                           if numbers[i]])
            break
        # Mark all multiples of the prime as composite.  Check odd multiples.
        for r in xrange(i*i, len(numbers), i*2):
            numbers[r] = 0

    return primes

n = 1000000
p = primes(n)
print "Found", len(p), "primes <=", n

答案 11 :(得分:0)

我受到了Igor的启发,并创建了一个创建列表的代码块:

def prime_number():

for num in range(2, 101):
    prime = True
    for i in range(2, num):
        if (num % i == 0):
            prime = False
    if prime and num not in num_list:
        num_list.append(num)
    else:
        pass
return num_list


num_list = []
prime_number()
print(num_list)

答案 12 :(得分:0)

添加到已接受的答案中,可以通过使用列表存储素数并在生成后打印它们来实现进一步的优化。

import math
Primes_Upto = 101
Primes = [2]
for num in range(3,Primes_Upto,2):
    if all(num%i!=0 for i in Primes):
       Primes.append(num)
for i in Primes:
    print i

答案 13 :(得分:0)

这是初学者获得素数的最简单逻辑:

p=[]
for n in range(2,50):
    for k in range(2,50):
        if n%k ==0 and n !=k:
            break
        else:
            for t in p:
                if  n%t ==0:
                    break
            else:
                p.append(n)

print p

答案 14 :(得分:0)

a=int(input('enter the lower no.'))
b=int(input('enter the higher no.'))
print("Prime numbers between",a,"and",b,"are:")
for num in range(a,b):

    if num>1:
        for i in range(2,num):
            if (num%i)==0:
                break
        else:
            print(num)

答案 15 :(得分:0)

首先我们找到那个数字的因数

def fac(n):
  res = []
  for i in range(1,n+1):
    if n%i == 0:
res.append(i)

检查是否输入素的脚本

def prime(n):
return(fac(n) == [1,n])

将所有素数打印到n的脚本

def prime_list(n):
  pri_list = []
  for i in range(1,n+1):
    if prime(i)
      pri_list.append(i)
return(pri_list)

答案 16 :(得分:0)

一种更简单,更有效的解决方法是存储先前找到的所有素数,并检查下一个数是否是任何较小素数的倍数。

n = 1000
primes = [2]

for i in range(3, n, 2):
    if not any(i % prime == 0 for prime in primes):
        primes.append(i)

print(primes)

请注意,any是一种短路功能,换句话说,一旦找到真实值,它将中断循环。

答案 17 :(得分:0)

我们可以使用sympy库制作素数列表

@model CampBookingSys.Models.School

@{
ViewBag.Title = "School Booking Form";
}

<h2>School Booking Form</h2>


<form asp-controller="School" asp-action="BookingForm" method="post">
<p>@Model.ValidationMsg</p>

<br />

<p>Please complete the following information</p>

<div>
    <label for="RollNumber">School Roll Number:</label>
    <br />
    <input asp-for="Booking.Rollnumber" id="txtRoll" name="RollNumber" 
value="@Model.RollNumber" />
</div>
<br />
<div>
    <label for="Date">Choose Camp Date:</label>
    <br />
    <input asp-for="Booking.Date" id="txtDate" name="Date" 
value="@Model.Date.Value.ToShortDateString()" />
</div>
<br />
<div>
    <label for="OfficialSchoolName">School Name:</label>
    <br />
    <input asp-for="Booking.OfficialSchoolName" id="txtOfficialSchoolName" 
name="OfficialSchoolName" value="@Model.OfficialSchoolName" />
</div>
<br />
<div>
    <label for="TeacherName">Teacher Name:</label>
    <br />
    <input asp-for="Booking.TeacherName" id="txtTeacherName" 
name="TeacherName" />
</div>
<br />
<div>
    <label for="Email">Teacher Email:</label>
    <br />
    <input asp-for="Booking.Email" id="txtEmail" name="Email" />
</div>
<br />
<div>
    <label for="PhoneNumber">Teacher Contact Number:</label>
    <br />
    <input asp-for="Booking.PhoneNumber" id="txtPhoneNumber" 
name="PhoneNumber" value="@Model.PhoneNumber" />
</div>
<br />
<div>
    <label for="Surveys">Would you like to take part in research surveys? 
</label>
    <br />
    <input asp-for="Booking.Surveys" id="Surveys" name="Surveys" 
type="checkbox" onclick="$(this).val(this.checked ? true : false)" />
</div>
<br />
<input type="submit" value="Submit" class="submit" />
</form>

答案 18 :(得分:0)

text

答案 19 :(得分:0)

f=0
sum=0
for i in range(1,101):
    for j in range(1,i+1):
        if(i%j==0):
            f=f+1
    if(f==2):
        sum=sum+i
        print i        
    f=0
print sum

答案 20 :(得分:0)

这个怎么样?阅读我用过的所有建议:

prime=[2]+[num for num in xrange(3,m+1,2) if all(num%i!=0 for i in range(2,int(math.sqrt(num))+1))]

素数高达1000000

root@nfs:/pywork# time python prime.py
  

78498

     

真实的0m6.600s

     

用户0m6.532s

     

sys 0m0.036s

答案 21 :(得分:0)

使用过滤功能。

l=range(1,101)
for i in range(2,10): # for i in range(x,y), here y should be around or <= sqrt(101)
    l = filter(lambda x: x==i or x%i, l)

print l

答案 22 :(得分:0)

n = int(raw_input('Enter the integer range to find prime no :'))
p = 2
while p<n:
  i = p
  cnt = 0
  while i>1:
    if p%i == 0:
        cnt+=1
    i-=1
  if cnt == 1:
     print "%s is Prime Number"%p
  else:
     print "%s is Not Prime Number"%p
  p+=1

答案 23 :(得分:0)

这是我编写的示例程序,用于检查数字是否为素数。

def is_prime(x):
    y=0
    if x<=1:
        return False
    elif x == 2:
        return True
    elif x%2==0:
        return False
    else:
        root = int(x**.5)+2
        for i in xrange (2,root):
            if x%i==0:
                return False
                y=1
        if y==0:
            return True

答案 24 :(得分:0)

您过早地终止了循环。在测试了for循环体中的所有可能性而不是破坏之后,这个数字是素数。因为一个人不是素数,你必须从2开始:

def primes(limit):
    if limit > 1:
        primes_found = [(2, 4)]
        yield 2
        for n in xrange(3, limit + 1, 2):
            for p, ps in primes_found:
                if ps > n:
                    primes_found.append((n, n * n))
                    yield n
                    break
                else:
                    if not n % p:
                        break

for i in primes(101):
    print i

在更快的解决方案中,您只尝试除以小于或等于您正在测试的数字的根的素数。这可以通过记住您已找到的所有素数来实现。此外,您只需测试奇数(2除外)。您可以将生成的算法放入生成器中,以便将其用于在容器中存储素数或将其打印出来:

<?xml version="1.0" encoding="IBM437"?>
<header1>
<header2>
  <fracc>6004</fracc>
  <txncode>HTH</txncode>
  <reason>testing</reason>
  <timeout>20</timeout>
  <rdate>2/3/2015 12:00:00 AM</rdate>
  <rtime>6/18/2015 1:20:00 PM</rtime>
  <seqno>5</seqno>
  <prefix>8</prefix>
  <msgtype>trr</msgtype>
  <sendto>trr</sendto>
  <replyto>trr</replyto>
</header2>
</header1>

正如您所看到的,无需计算平方根,存储每个素数的平方更快,并将每个除数与此数字进行比较。

答案 25 :(得分:0)

min=int(input("min:"))
max=int(input("max:"))
for num in range(min,max):
    for x in range(2,num):
        if(num%x==0 and num!=1):
            break
        else:
            print(num,"is prime")
            break

答案 26 :(得分:0)

# computes first n prime numbers
def primes(n=1):
    from math import sqrt
    count = 1
    plist = [2]
    c = 3
    if n <= 0 :
        return "Error : integer n not >= 0"
    while (count <= n - 1):    # n - 1 since 2 is already in plist
        pivot = int(sqrt(c))
        for i in plist:
            if i > pivot :    # check for primae factors 'till sqrt c
                count+= 1
                plist.append(c)
                break
            elif c % i == 0 :
                break    # not prime, no need to iterate anymore
            else :
                continue 
        c += 2    # skipping even numbers              
    return plist

答案 27 :(得分:0)

def prime_number(a):
    yes=[]
    for i in range (2,100):
        if (i==2 or i==3 or i==5 or i==7) or (i%2!=0 and i%3!=0 and i%5!=0 and i%7!=0 and i%(i**(float(0.5)))!=0):
            yes=yes+[i]
    print (yes)

答案 28 :(得分:0)

这是一个简单直观的版本,检查它是否是RECURSIVE函数中的素数! :)(我把它作为MIT课程的家庭作业) 在python中它运行得非常快,直到1900年。如果你尝试超过1900,你会得到一个有趣的错误:)(你想检查你的计算机可以管理多少个数字?)

def is_prime(n, div=2):

    if div> n/2.0: return True

    if n% div == 0:
        return False
    else:
        div+=1
        return is_prime(n,div)

#The program:
until = 1000
for i in range(until):
    if is_prime(i):
        print i

当然......如果您喜欢递归函数,可以使用字典升级这个小代码以严重提高其性能,并避免这个有趣的错误。 这是一个简单的1级升级,带有MEMORY集成:

import datetime
def is_prime(n, div=2):
    global primelist
    if div> n/2.0: return True
    if div < primelist[0]:
        div = primelist[0]
        for x in primelist:
            if x ==0 or x==1: continue
            if n % x == 0:
                return False
    if n% div == 0:
        return False
    else:
        div+=1
        return is_prime(n,div)


now = datetime.datetime.now()
print 'time and date:',now
until = 100000
primelist=[]
for i in range(until):
    if is_prime(i):
        primelist.insert(0,i)
print "There are", len(primelist),"prime numbers, until", until
print primelist[0:100], "..."

finish = datetime.datetime.now()
print "It took your computer", finish - now , " to calculate it"

以下是结果,我打印了最后发现的100个素数。

  
    
      

时间和日期:2013-10-15 13:32:11.674448

    
  

有9594个素数,直到100000

[99991,99989,99971,99961,99929,99923,99907,99901,99881,99877,99871,99859,99839,99833,99829,99823,99817,99809,99793,99787,99767,99761,99733, 99721,99719,99713,99709,99707,99689,99679,99667,99661,99643,99623,99611,99607,99581,99577,99571,99563,99559,99551,99529,99527,99523,99497,99487,99469, 99439,99431,99409,99401,99397,99391,99377,99371,99367,99349,99347,99317,99289,99277,99259,99257,99251,99241,99233,99223,99191,99181,99173,99149,99139, 99137,99133,99131,99119,99109,99103,99089,99083,99079,99053,99041,99023,99017,99013,98999,98993,98981,98963,98953,98947,98939,98929,98927,98911,98909, 98899,98897] ......

您的计算机以0:00:40.871083计算了它

所以我的i7笔记本电脑需要40秒来计算它。 :)

答案 29 :(得分:0)

Igor Chubin 的答案可以得到改善。当测试X是否为素数时,算法不必检查每个数字直到X的平方根,它只需要检查素数直到sqrt(X)。因此,如果它在创建素数时引用素数列表,则效率会更高。下面的函数输出b下所有素数的列表,由于几个原因(例如,当你想知道素数的数量&lt; b时)这是一个方便的列表。通过仅检查质数,它可以节省更多数字的时间(比较大约10,000;差异是明显的)。

from math import sqrt
def lp(b)
    primes = [2]
    for c in range(3,b):
        e = round(sqrt(c)) + 1
        for d in primes:
            if d <= e and c%d == 0:
                break
        else:
            primes.extend([c])
    return primes

答案 30 :(得分:0)

使用python打印n素数:

num = input('get the value:')
for i in range(2,num+1):
    count = 0
    for j in range(2,i):
        if i%j != 0:
            count += 1
    if count == i-2:
        print i,

答案 31 :(得分:-1)

添加我自己的版本,只是为了展示一些itertools技巧v2.7:

import itertools

def Primes():
    primes = []
    a = 2
    while True:
        if all(itertools.imap(lambda p : a % p, primes)):
            yield a
            primes.append(a)
        a += 1

# Print the first 100 primes
for _, p in itertools.izip(xrange(100), Primes()):
    print p

答案 32 :(得分:-1)

num= int(input("Enter the numbner"))
isDivisible= False
int=2

while i<num:
    if num%i==0
    isDivisible True
    print("The number {} is divisible by {}.".format(num,i))
    i +=1

if isDivisible:
    print("The number {} is not prime.".format(num))
else:
    print("The number {} is a prime number.".format(num))

答案 33 :(得分:-1)

min = int(input(“输入下限范围:”)) max = int(input(“输入上限范围:”))

print(“ min,”和“,max,”之间的素数是:“

范围内的数字(最小,最大+ 1):   如果num> 1:     对于范围(2,num)中的i:        如果(num%i)== 0:            打破     其他:        打印(数字)