Печать серии простых чисел в 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