Печать серии простых чисел в python

Я пытаюсь изучить программирование на Python, и я довольно новичок в этом.

У меня были проблемы с печатью ряда простых чисел от одного до ста. Я не могу понять, что не так с моим кодом.

вот что я написал; он печатает все нечетные числа вместо простых чисел:

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

29 ответов


вам нужно проверить все числа от 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

редактировать:

как в первом цикле выбираются нечетные числа, во втором цикле нет нужно проверить с четными числами, поэтому значение " i " можно начать с 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

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 до максимально желаемого простого n. Затем снова и снова берите наименьшее непересекающееся число и вычеркивайте все его кратные; числа, которые остаются непересекающимися, являются простыми.

например, рассмотрим числа меньше 30. Изначально, 2 определяется как премьер, потом 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28 и 30 зачеркиваются. Далее 3 определяется как prime, затем 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. Я оставлю оптимизированная версия для вас, чтобы работать.


Я сторонник не предполагая лучшее решение и протестировать его. Ниже приведены некоторые модификации, которые я сделал для создания простых классов примеров как @igor-chubin, так и @user448810. Во-первых, позвольте мне сказать, что это отличная информация, спасибо, ребята. Но я должен признать @user448810 за его умное решение, которое оказывается самым быстрым (из тех, которые я тестировал). Это честь для вас, сэр! Во всех примерах я использую значения 1 миллион (1,000,000) как n.

пожалуйста, не стесняйтесь попробовать код.

удачи!

Способ 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

Benchmark: более 272 + секунд

Способ 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

Benchmark: 73.3420000076 секунд

Способ 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

Benchmark: 11.3580000401 секунды!--6-->

метод 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

Benchmark: 8.7009999752 секунд

Метод 5 как описано user448810 (который я думал, был довольно умным):

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

Benchmark: 1.12000012398 секунд

Примечания: решение 5, перечисленное выше (как предложено user448810), оказалось самым быстрым и честно тихим творческим и умный. Я люблю это. Спасибо, ребята!!

EDIT: О, и, кстати, я не чувствовал необходимости импортировать математическую библиотеку для квадратного корня значения, поскольку эквивалент просто (n**.5). В противном случае я не редактировал многое другое, а затем сохранял значения и выводил массив для возврата классом. Кроме того, было бы, вероятно, немного эффективнее хранить результаты в файле, чем многословно, и может сэкономить много памяти, если бы это было только по одному, но стоимость немного больше времени из-за записи на диск. Я думаю, что всегда есть место для улучшения. Так что, надеюсь, код имеет смысл, ребята.


лучший способ решить вышеуказанную проблему - использовать алгоритм "тест примитивности Миллера Рабина". Он использует вероятностный подход к определить, является ли число простым или нет. И это, безусловно, самый эффективный алгоритм, с которым я сталкивался для того же самого.

реализация 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

модуль функции программы 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

мой способ перечисления простых чисел на номер записи без особых хлопот-использовать свойство, которое вы можете получить любое число, которое не является простым с суммированием простых чисел.

поэтому, если вы делите номер записи со всеми простыми числами ниже него, и он не делится равномерно ни на одно из них, вы знаете, что у вас есть простое число.

конечно, есть еще более быстрые способы получения простых чисел, но этот уже работает довольно хорошо, особенно потому, что вы не деление номера записи на любое число, но только простые числа вплоть до этого числа.

С помощью этого кода мне удалось на моем компьютере перечислить все простые числа до 100 000 менее чем за 4 секунды.

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)

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)

печать N простых чисел с помощью python:

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,

Игорь Медрессе Чубинответ можно улучшить. При тестировании, если X является простым, алгоритм не должен проверять каждое число до квадратного корня X, ему нужно только проверить простые числа до sqrt(X). Таким образом, он может быть более эффективным, если он ссылается на список простых чисел по мере его создания. Функция ниже выводит список всех простых чисел под b, что удобно в качестве списка по нескольким причинам (например, когда вы хотите знать количество простых чисел

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

вот простая и интуитивно понятная версия проверки того, является ли она простой в рекурсивной функции! :) (Я сделал это как домашнее задание для класса 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 с интеграцией памяти:

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 секунд, чтобы вычислить его. :)


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)

# 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

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

вы заканчиваете цикл слишком рано. После того, как вы проверили все возможности в теле цикла for, а не ломать, то число простым. Поскольку один не является простым, вы должны начать с 2:

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

в более быстром решении вы пытаетесь разделить только простые числа, которые меньше или равны корню числа, которое вы тестируете. Это может быть достигнуто путем запоминания всех простых чисел вы уже нашли. Кроме того, вам нужно проверить только нечетные числа (кроме 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

Как вы можете видеть, нет необходимости вычислять квадратный корень, быстрее хранить квадрат для каждого простого числа и сравнивать каждый делитель с этим числом.


Это пример программы, которую я написал для проверки, является ли число простым или нет.

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

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

С помощью функции фильтра.

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

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

Как насчет этого? Читая все предложения, я использовал это:

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.600-х

пользователь 0m6.532s

sys 0m0.036s


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

самая быстрая и лучшая реализация пропуска простых чисел:

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)

вот другой подход, который торгует пространством для более быстрого времени поиска. Это может быть быстрее всего.

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

Я был вдохновлен Игорь и сделал блок кода, который создает список:

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)

добавление к принятому ответу, дальнейшая оптимизация может быть достигнута с помощью списка для хранения простых чисел и печати их после генерации.

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

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))

вот самая простая логика для начинающих, чтобы получить простые числа:

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

Сначала мы находим коэффициент этого числа

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

скрипт для проверки prime или нет

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)

добавление моей собственной версии, просто чтобы показать некоторые трюки 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