2016-01-19 2 views
0

Я пытаюсь получить функцию, чтобы определить, является ли N простым числом. Я новичок в Python, и я знаю, что это не может быть наиболее эффективным способом решить эту проблему, но это моя попыткаisPrime function (list +% operator)

def is_prime(N): 
    k = []          #Creates a new list k 
    for i in range(2,N):      #For each i from 2 -> N 
     r = N%i        # r is the remainder of N % i 
     k.append(r)       # appends each remainder r to list k 

     if (i == N-1):       #Once index equals N-1, print list k 
      print(k)   

     #For each element j in list k, check if each element in list k is 0 
      for j in range (len(k)):   
       if k[j] != 0:    <---PROBLEM 
        return True 
       else: 
        return False 
print(is_prime(15)) 

Логика, у меня есть, что, когда число делится на 1 и само по себе, а не делится на любые другие числа от 2 до N-1, тогда это простое число. В приведенном выше коде у меня есть проблема, сравнивающая значения каждого элемента в списке k. Я хочу определить, является ли значение каждого элемента k [j] == 0. Если каждый элемент k [j]! = 0 и N% 1 == 0 и N% N == 0, то это простое число!

Любые идеи, как я могу решить эту проблему? Пожалуйста, обратитесь к приведенной ниже ссылке, чтобы получить визуализацию моего кода! http://goo.gl/IVIRz7

+0

Если вы добавите число, делящееся в список, почему вы не пытаетесь выполнить условие в списке 'len', почему вы его проверяете? – Arman

+0

@Arman Я не совсем понимаю, что вы имеете в виду. Я проверяю внутри списка, потому что хочу знать, является ли значение каждого элемента внутри него 0 или нет. – misheekoh

+0

Посмотрите на мой ответ, вы должны только проверить длину списка – Arman

ответ

2

Я хотел бы предложить, чтобы решить следующим образом:

def is_prime(n): 
    i = 2 
    while (i * i <= n): 
     if (n % i == 0): 
      return False 
     i += 1 
    return True 

Этот код будет работать на n >= 2.

+1

Вы можете сделать еще лучше, не проверяя никаких четных значений 'i'> 2. –

+0

Не могли бы вы объяснить логику использования i * i. Кажется, я знаю, почему ты это делаешь, а просто хочешь услышать свое мнение. Благодаря! – misheekoh

+0

@misheekoh: Если * ab * == N, то по крайней мере один из * a * & * b * должен быть <= sqrt (N); если * a * <= sqrt (N), то a \ * a <= N. –

0

ответ Армана правильно, но быть более вещий:

def is_prime(n): 
    return all(n % i for i in range(2, n)) 
+2

Итак, теперь 'pythonic' означает« сильно неэффективный »? –

+0

Действительно? Вы помните, что «все» оцениваются лениво, и если первый элемент False, другие не будут вычислены? –

+1

@EugenePrimako И для простых чисел у вас есть O (N) алгоритм вместо O (sqrt (N)). – SashaMN

0

Приведенные выше ответы будут работать, но я думал, что объяснить вашу логическую ошибку. Ваши рассуждения на английском языке звучат так: если любые числа между [2, N-1] делят N равномерно, то вы нашли нечетное число.

for j in range (len(k)):   
     if k[j] != 0:    
      return True 
     else: 
      return False 

Что это цикл проверка на самом деле, если первого число в к является 0 или нет. Если оно отличное от нуля, число не равномерно разделяет N (обратите внимание, это не означает, что другие числа делят n равномерно), поэтому число может оставаться возможно простым, но только если остаток отличен от нуля для оставшегося потенциала делители. Другими словами, вы можете быстро вернуть Falseas, когда увидите остаток от 0, но вы можете вернуть True только в том случае, если все делители имеют ненулевые остатки.

Исправлено:

 for j in range (len(k)):   
      if k[j] == 0: 
       return False 
      return True 

Возвращение Истинное утверждение выполняется только если нам удастся сделать это весь путь через петлю без возврата false.

2
import math 

def is_prime(n): 
    i = 3 
    while (i <= math.sqrt(n)): 
     if (n % i == 0): 
      return False 
     i += 2 
    return True 

Это лучше. Все выше упомянутые варианты.