2012-05-19 3 views
3

Я попробовал несколько различных методов, чтобы получить общее число 10001.Список простых номеров Python неправильный?

def isPrime(value): 
    if ((2**value)-2)%value==0: 
    return True 

def nthPrime(n): 
    count = 0 
    value = 1 
    while count < n: 
    value += 1 
    if isPrime(value): 
     count += 1 
    return value 

Когда 10001 аргумент это возвращает 103903. Когда я ожидал 104743.

Я пробовал:

primes = [] 
for i in range(2,105000): 
    if ((2**i) - 2) % i == 0: 
    primes.append(i) 

print primes[10001] ---> 103903 
+1

Что делает ваш 'isPrime' функция ответа для чисел: 1105, 1729, 2465? Вы точно знаете, что 1105 и 2465 являются * не * премьер ... (Подсказка: http://en.wikipedia.org/wiki/Carmichael_number) – Pablo

+0

Псевдо-простые числа eh, я смутно помню, как это произошло раньше но это дало ему некоторый контекст. Хороший материал, спасибо! – tijko

ответ

2

Я считаю, что ваш премьер решето неправильно. Попробуйте использовать функцию isPrime, которая принимает числовое число каждого меньшего числа. Если любое из них равно 0, то число является составным (не простым). Насколько мне известно, нет единственного сравнения, которое скажет вам, является ли число простым, как предполагает функция isPrime.

+0

http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes – TEOUltimus

2

Это для Project Euler? Мне это кажется знакомым.

Ваша функция isPrime не так, как сказал TEOUltimus, нет ни одного способа узнать, является ли число простым.

Simple Prime Generator in Python

Это в значительной степени отвечает на ваш вопрос я думаю.

2

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

Вот моя функция, чтобы сделать так:

def PrimesSieve(limit): 
    np=set() 
    p=[2] 
    for i in xrange(1,limit+1,2): 
      if i == 1: continue 
      if {i} & np: continue 
      beg=2 if i % 2 == 0 else 0 
      for j in xrange(beg,int(limit)+1,i): 
        np.add(j) 
      p.append(i) 
    return p 
+0

Я никогда не использовал метод сита. Увидев вашу реализацию, она стала намного яснее. Вы заполняете массив факторов, перейдя через диапазон, увеличивающий на целое число, если целое число находится в массиве факторов, а не простое, если оно не является. – tijko

+0

Кроме того, я пошел и написал сито, используя описание, которое я дал выше, после того, как получил сущность. Только, я запустил внешний цикл в 2 и у меня начался внутренний цикл 0. У меня есть правильные результаты, я думаю, что это небольшое улучшение производительности? – tijko

+0

Небольшая оптимизация для вашего кода. Вы можете использовать логические операторы в 'sets()'. 'if i in np: continue' может быть изменен на' if {i} & np: continue' – tijko

Смежные вопросы