Простой простой генератор в Python - PullRequest
31 голосов
/ 20 февраля 2009

Может кто-нибудь сказать мне, что я делаю не так с этим кодом? В любом случае, это просто печать 'count'. Я просто хочу очень простой простой генератор (ничего особенного).

import math

def main():
    count = 3
    one = 1
    while one == 1:
        for x in range(2, int(math.sqrt(count) + 1)):
            if count % x == 0: 
                continue
            if count % x != 0:
                print count

        count += 1

Ответы [ 22 ]

1 голос
/ 12 февраля 2012

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

def oprime(n):
counter = 0
b = 1
if n == 1:
    print 2
while counter < n-1:
    b = b + 2
    for a in range(2,b):
        if b % a == 0:
            break
    else:
        counter = counter + 1
        if counter == n-1:
            print b
0 голосов
/ 20 февраля 2009
  • Оператор continue выглядит неправильно.

  • Вы хотите начать с 2, потому что 2 - это первое простое число.

  • Вы можете написать «while True:», чтобы получить бесконечный цикл.

0 голосов
/ 12 марта 2018

Если вы хотите найти все простые числа в диапазоне, вы можете сделать это:

def is_prime(num):
"""Returns True if the number is prime
else False."""
if num == 0 or num == 1:
    return False
for x in range(2, num):
    if num % x == 0:
        return False
else:
    return True
num = 0
itr = 0
tot = ''
while itr <= 100:
    itr = itr + 1
    num = num + 1
    if is_prime(num) == True:
        print(num)
        tot = tot + ' ' + str(num)
print(tot)

Просто добавьте while its <= и ваш номер для диапазона.
ВЫВОД:
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 101

0 голосов
/ 24 февраля 2017

SymPy - это библиотека Python для символической математики. Он предоставляет несколько функций для генерации простых чисел.

isprime(n)              # Test if n is a prime number (True) or not (False).

primerange(a, b)        # Generate a list of all prime numbers in the range [a, b).
randprime(a, b)         # Return a random prime number in the range [a, b).
primepi(n)              # Return the number of prime numbers less than or equal to n.

prime(nth)              # Return the nth prime, with the primes indexed as prime(1) = 2. The nth prime is approximately n*log(n) and can never be larger than 2**n.
prevprime(n, ith=1)     # Return the largest prime smaller than n
nextprime(n)            # Return the ith prime greater than n

sieve.primerange(a, b)  # Generate all prime numbers in the range [a, b), implemented as a dynamically growing sieve of Eratosthenes. 

Вот несколько примеров.

>>> import sympy
>>> 
>>> sympy.isprime(5)
True
>>> list(sympy.primerange(0, 100))
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
>>> sympy.randprime(0, 100)
83
>>> sympy.randprime(0, 100)
41
>>> sympy.prime(3)
5
>>> sympy.prevprime(50)
47
>>> sympy.nextprime(50)
53
>>> list(sympy.sieve.primerange(0, 100))
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
0 голосов
/ 15 февраля 2017

Для меня приведенное ниже решение выглядит простым и легким для подражания.

import math

def is_prime(num):

    if num < 2:
        return False

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

return True
0 голосов
/ 20 февраля 2009

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

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

0 голосов
/ 23 октября 2014
import time

maxnum=input("You want the prime number of 1 through....")

n=2
prime=[]
start=time.time()

while n<=maxnum:

    d=2.0
    pr=True
    cntr=0

    while d<n**.5:

        if n%d==0:
            pr=False
        else:
            break
        d=d+1

    if cntr==0:

        prime.append(n)
        #print n

    n=n+1

print "Total time:",time.time()-start
0 голосов
/ 18 марта 2009

Вот что у меня есть:

def is_prime(num):
    if num < 2:         return False
    elif num < 4:       return True
    elif not num % 2:   return False
    elif num < 9:       return True
    elif not num % 3:   return False
    else:
        for n in range(5, int(math.sqrt(num) + 1), 6):
            if not num % n:
                return False
            elif not num % (n + 2):
                return False

    return True

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

Теперь, если вы хотите сгенерировать список простых чисел, вы можете сделать:

# primes up to 'max'
def primes_max(max):
    yield 2
    for n in range(3, max, 2):
        if is_prime(n):
            yield n

# the first 'count' primes
def primes_count(count):
    counter = 0
    num = 3

    yield 2

    while counter < count:
        if is_prime(num):
            yield num
            counter += 1
        num += 2

использование генераторов здесь может быть желательно для эффективности.

И просто для справки, вместо того, чтобы сказать:

one = 1
while one == 1:
    # do stuff

Вы можете просто сказать:

while 1:
    #do stuff
0 голосов
/ 23 марта 2013
def genPrimes():
    primes = []   # primes generated so far
    last = 1      # last number tried
    while True:
        last += 1
        for p in primes:
            if last % p == 0:
                break
        else:
            primes.append(last)
            yield last
0 голосов
/ 03 августа 2012

Аналогично user107745, но с использованием «all» вместо двойного отрицания (немного более читабельно, но я думаю, что производительность та же):

import math
[x for x in xrange(2,10000) if all(x%t for t in xrange(2,int(math.sqrt(x))+1))]

В основном он перебирает x в диапазоне (2, 100) и выбирает только те из них, которые не имеют mod == 0 для всех t в диапазоне (2, x)

Другой способ, вероятно, состоит в простом заполнении простых чисел по ходу дела:

primes = set()
def isPrime(x):
  if x in primes:
    return x
  for i in primes:
    if not x % i:
      return None
  else:
    primes.add(x)
    return x

filter(isPrime, range(2,10000))
...