Поиск n-го числа для больших чисел n [duplicate]

@decorators были добавлены в python 2.4 Если вы используете python & lt; 2.4 вы можете использовать функцию classmethod () и staticmethod ().

Например, если вы хотите создать фабричный метод (функция, возвращающая экземпляр другой реализации класса в зависимости от того, какой аргумент он get) вы можете сделать что-то вроде:

class Cluster(object):

    def _is_cluster_for(cls, name):
        """
        see if this class is the cluster with this name
        this is a classmethod
        """ 
        return cls.__name__ == name
    _is_cluster_for = classmethod(_is_cluster_for)

    #static method
    def getCluster(name):
        """
        static factory method, should be in Cluster class
        returns a cluster object for the given name
        """
        for cls in Cluster.__subclasses__():
            if cls._is_cluster_for(name):
                return cls()
    getCluster = staticmethod(getCluster)

Также обратите внимание, что это хороший пример использования метода класса и статического метода. Статический метод явно принадлежит классу, поскольку он использует класс Cluster внутренне. Классному классу нужна только информация об этом классе, а не экземпляр объекта.

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

27
задан Ry- 8 March 2013 в 04:16
поделиться

23 ответа

Из многих тестов прочности, распространяющихся по Интернету, рассмотрим следующий простой тест:

def is_prime(n):
  if n == 2 or n == 3: return True
  if n < 2 or n%2 == 0: return False
  if n < 9: return True
  if n%3 == 0: return False
  r = int(n**0.5)
  f = 5
  while f <= r:
    print '\t',f
    if n%f == 0: return False
    if n%(f+2) == 0: return False
    f +=6
  return True    

Рассмотрим простое число 5003:

print is_prime(5003)

Распечатки:

 5
 11
 17
 23
 29
 35
 41
 47
 53
 59
 65
True

Линия r = int(n**0.5) оценивается до 70 (квадратный корень из 5003 равен 70.7318881411, а int() усекает это значение)

Из-за первых нескольких тестов и тестов в середине цикла, цикл должен быть оценен только каждый шестой номер.

Рассмотрим следующее нечетное число (так как все четные числа, отличные от 2, не простые) 5005, то же самое печатает:

 5
False

Предел - это квадратный корень, поскольку x*y == y*x Функция должна пройти только 1 цикл, чтобы найти, что 5005 делится на 5 и поэтому не является простым. Поскольку 5 X 1001 == 1001 X 5 (и оба они 5005), нам не нужно пройти весь путь до 1001 в цикле, чтобы узнать, что мы знаем в 5!


Теперь давайте посмотрим на алгоритм у вас есть:

def isPrime(n):
    for i in range(2,int(n**0.5)+1):
        if n%i==0:
            return False

    return True

Есть два вопроса:

  1. Он не проверяет, если n меньше 2, и нет простых чисел меньше 2;
  2. Проверяет каждое число между 2 и n ** 0,5, включая все четные и все нечетные числа. Поскольку каждое число, большее 2, которое делится на 2, не является простым, мы можем немного ускорить его, только проверяя нечетные числа больше 2.

Итак:

def isPrime2(n):
    if n==2 or n==3: return True
    if n%2==0 or n<2: return False
    for i in range(3,int(n**0.5)+1,2):   # only odd numbers
        if n%i==0:
            return False    

    return True

OK - это ускоряет его примерно на 30% (я сравнивал его ...)

Алгоритм, который я использовал is_prime, примерно в 2 раза быстрее, поскольку только каждое 6-е целое петля через петлю. (Еще раз, я проверил его.)


Боковое примечание: x ** 0.5 - это квадратный корень:

>>> import math
>>> math.sqrt(100)==100**0.5
True

Сторона примечания 2: - интересная проблема в информатике.

60
ответ дан dawg 1 September 2018 в 02:08
поделиться

Srsly guys ... Почему так много строк кода для простого метода вроде этого? Вот мое решение:

def isPrime(a):
    div = a - 1
    res = True
    while(div > 1):
        if a % div == 0:
            res = False
        div = div - 1
    return res
-4
ответ дан AGSoldier 1 September 2018 в 02:08
поделиться

Число 1 - частный случай, который не считается ни простым, ни композиционным. Для получения дополнительной информации посетите: http://mathworld.wolfram.com/PrimeNumber.html

И, (n ** 0.5) -> Это даст нам квадрат root "из 'n'. Поскольку «n поднято до степени 0,5 или 1/2»

И ПОЧЕМУ мы это делаем, возьмем, например, число 400: мы можем представить его в виде a * b

1*400 = 400
2*200 = 400
4*100 = 400
5*80 = 400
8*50 = 400
10*40 = 400
16*25 = 400
20*20 = 400
25*16 = 400
40*10 = 400
50*8 = 400
80*5 = 400
100*4 = 400
200*2 = 400
400*1 = 400

Квадратный корень из 400 равен 20: и мы можем видеть, что нам нужно всего лишь проверить делимость до 20, потому что, поскольку «a» достигает 20, b начинает уменьшаться ... Итак, в конечном счете мы проверяем делимость с числами меньше квадратного корня.

-1
ответ дан AkshayJain 1 September 2018 в 02:08
поделиться

int(n**0.5) - это значение пола sqrt (n), которое вы путаете с мощностью 2 из n (n**2). Если n является не простым, то должно быть два числа 1 < i <= j < n такие, что: i * j = n.

Теперь, поскольку sqrt(n) * sqrt(n) = n, предполагая, что один из i,j больше (или равен) sqrt(n) - это означает, что другой должен быть меньше (или равен) sqrt(n) .

Так как это так, достаточно для повторения целых чисел в диапазоне [2, sqrt(n)]. И это именно тот код, который был опубликован.

Если вы хотите выйти в качестве реального смартфона, используйте следующую однострочную функцию:

import re
def is_prime(n):    
    return not re.match(r'^1?$|^(11+?)\1+$',n*'1')

Объяснение для «магического регулярного выражения» можно найти здесь

0
ответ дан alfasin 1 September 2018 в 02:08
поделиться
def is_prime(n):
    n=abs(n)
    if n<2:    #Numbers less than 2 are not prime numbers
        return "False"
    elif n==2: #2 is a prime number
        return "True"
    else:
        for i in range(2,n): # Highlights range numbers that can't be  a factor of prime number n. 
            if n%i==0:
                return "False" #if any of these numbers are factors of n, n is not a prime number
    return "True" # This is to affirm that n is indeed a prime number after passing all three tests
0
ответ дан Ayo 1 September 2018 в 02:08
поделиться
def fun(N):#prime test
if N>1 :
    for _ in xrange(5):
        Num=randint(1,N-1)
        if pow(Num,N-1,N)!=1:
            return False
    return True
return False

Истинно, если число является простым, иначе false

0
ответ дан chinmay rakshit 1 September 2018 в 02:08
поделиться

Этот метод будет медленнее, чем здесь рекурсивный и перечисляющий методы, но использует теорему Уилсона и является лишь одной строкой:

from math import factorial

def is_prime(x):
    return factorial(x - 1)  % x == x - 1
2
ответ дан clouduan 1 September 2018 в 02:08
поделиться

Вопрос был задан несколько назад, но у меня есть более короткое решение для вас

isPrime(Number):
    return 2 in [Number,2**Number%Number]

. Математическая операция всегда возвращает 2, если число является простым, а не 2. Но если 2 это число, оно добавляется к списку, в котором мы смотрим.

2^5=32    32%5=2
2^7=128   128%7=2
2^11=2048 2048%11=2

и т. д. ...

isPrime () возвращает True, если Number Prime, и False, если нет.

10
ответ дан Daniel 1 September 2018 в 02:08
поделиться

Поиск квадратного корня из числа для эффективности. например. если я пытаюсь найти коэффициенты 36, то наибольшее число, которое может быть умножено на себя на форму 36, равно 6. 7 * 7 = 49.

, поэтому каждый коэффициент 36 приходится умножать на 6 или меньшее число.

4
ответ дан dibble 1 September 2018 в 02:08
поделиться

Это мой метод:

import math

def isPrime(n):
    'Returns True if n is prime, False if n is not prime. Will not work if n is 0 or 1'

    # Make sure n is a positive integer
    n = abs(int(n))

    # Case 1: the number is 2 (prime)
    if n == 2: return True

    # Case 2: the number is even (not prime)
    if n % 2 == 0: return False

    # Case 3: the number is odd (could be prime or not)

    # Check odd numbers less than the square root for possible factors 
    r = math.sqrt(n)
    x = 3 
    while x <= r:
        if n % x == 0: return False  # A factor was found, so number is not prime
        x += 2 # Increment to the next odd number

    # No factors found, so number is prime  
    return True 

Чтобы ответить на исходный вопрос, n ** 0.5 совпадает с квадратом корня из n . Вы можете остановить проверку факторов после этого числа, потому что композитный номер будет всегда иметь коэффициент меньше или равен его квадратному корню. Это быстрее, чем просто проверка всех факторов между 2 и n для каждого n, поскольку мы проверяем меньшее количество чисел, что экономит больше времени с ростом n.

1
ответ дан Emmett Greenberg 1 September 2018 в 02:08
поделиться

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

. Это основано на идее, что: N / D = R для любого произвольного числа N, наименее возможного число для деления N (если не простое) равно D = 2, а соответствующий результат R равен (N / 2) (самый высокий).

По мере того, как D больше, результат R становится меньше ex: деление на D = 3 результата R = (N / 3), поэтому, когда мы проверяем, является ли N делимым на D, мы также проверяем, делится ли он на R

, так как D больше, а R меньше, чем (D == R == square root (N))

, тогда нам нужно только проверить числа от 2 до sqrt (N) еще один совет, чтобы сэкономить время, нам нужно только проверить нечетные числа, так как он делится любым четным числом он также будет делиться на 2.

, поэтому последовательность будет 3,5,7,9, ......, sqrt (N).

import math
def IsPrime (n): 
    if (n <= 1 or n % 2 == 0):return False
    if n == 2:return True
    for i in range(3,int(math.sqrt(n))+1,2):
        if (n % i) == 0:
            return False
    return True
-1
ответ дан eslam samy 1 September 2018 в 02:08
поделиться
def is_prime(x):  
    if x<2:  
        return False  
    elif x == 2:  
        return True  
    else:  
        for n in range(2, x):  
            if x%n==0:  
                return False  
        return True
-3
ответ дан Ethan 1 September 2018 в 02:08
поделиться

Вот мой

import math

def is_prime(num):

    if num % 2 == 0 and num > 2: 
       return False
    for i in range(3, int(math.sqrt(num)) + 1, 2):
        if num % i == 0:
            return False
    return True
-2
ответ дан ilkerv 1 September 2018 в 02:08
поделиться

( https://www.youtube.com/watch?v=Vxw1b8f_yts&t=3384s ) Avinash Jain

for i in range(2,5003):
    j = 2
    c = 0
    while j < i:
        if i % j == 0:
            c = 1
            j = j + 1
        else:
            j = j + 1
    if c == 0:
        print(str(i) + ' is a prime number')
    else:
        c = 0
-1
ответ дан Joshua 1 September 2018 в 02:08
поделиться

В python реализован псевдокод ( https://en.wikipedia.org/wiki/Primality_test ), надеюсь эта помощь.

# original pseudocode https://en.wikipedia.org/wiki/Primality_test
def isPrime(n):
    # Corner Cases
    if (n<= 1): return False
    elif (n<= 3): return True
    elif (n%2 == 0 or n%3 == 0): return False

    i = 5
    while i*i<=n:
        if (n%i==0 or n%(i+2)==0): return False
        i += 6

    return True;

%timeit isPrime(800)
0
ответ дан madeinQuant 1 September 2018 в 02:08
поделиться

Довольно просто!

def prime(x):
  if x == 1:
    return False
  else:
    for a in range(2,x):
      if x % a == 0:
        return False
  return True
-1
ответ дан Mouneer 1 September 2018 в 02:08
поделиться

С n**.5 вы не занимаете квадрат n, а принимаете квадратный корень.

Рассмотрим число 20; целые коэффициенты равны 1, 2, 4, 5, 10 и 20. Когда вы разделите 20 на 2 и получите 10, вы знаете, что он также делится на 10, без необходимости проверять. Когда вы разделите его на 4 и получите 5, вы знаете, что он делится на 4 и 5, без необходимости проверять 5.

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

Кроме того, причина 1 не является простым числом, так как prime числа определяются как имеющие 2 фактора, 1 и себя. то есть 2 1 * 2, 3 равно 1 * 3, 5 равно 1 * 5. Но 1 (1 * 1) имеет только один фактор. Поэтому оно не соответствует этому определению.

19
ответ дан mwfearnley 1 September 2018 в 02:08
поделиться
def isPrime(num,div=2):
    if(num==div):
        return True
    elif(num % div == 0):
        return False
    else:
        return isPrime(num,div+1)
0
ответ дан namco 1 September 2018 в 02:08
поделиться
def is_prime(x):  
    if x < 2:  
        return False  
    for n in range(2, (x) - 1):  
        if x % n == 0:  
            return False  
    return True
8
ответ дан nbro 1 September 2018 в 02:08
поделиться

Это мой способ np:

def is_prime(x):
    if x < 4:
        return True
    if all([(x > 2), (x % 2 == 0)]):
        return False
    else:
        return np.array([*map(lambda y: ((x % y) == 0).sum(), np.arange(1, x + 1))]).sum() == 2

Вот производительность:

%timeit is_prime(2)
%timeit is_prime(int(1e3))
%timeit is_prime(5003)

10000 loops, best of 3: 31.1 µs per loop
10000 loops, best of 3: 33 µs per loop
10 loops, best of 3: 74.2 ms per loop
0
ответ дан O.rka 1 September 2018 в 02:08
поделиться

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

Мы используем квадратный корень из (n), то есть int (n ** 0,5), чтобы уменьшить диапазон чисел, которые ваша программа будет вынуждена вычислять.

Например, мы можем выполнить пробное деление, чтобы проверить правильность 100. Давайте посмотрим на все делители 100:

2, 4, 5, 10, 20, 25, 50 Здесь мы видим, что наибольший коэффициент равен 100/2 = 50. Это верно для всех n: все делители меньше или равны n / 2. Если мы более подробно рассмотрим дивизоров, мы увидим, что некоторые из них являются избыточными. Если мы будем писать список по-разному:

100 = 2 × 50 = 4 × 25 = 5 × 20 = 10 × 10 = 20 × 5 = 25 × 4 = 50 × 2 избыточность становится очевидной. Как только мы достигнем 10, что составляет √100, делители просто поворачиваются и повторяются. Поэтому мы можем дополнительно исключить тестовые делители, превышающие √n.

Возьмем другое число, например 16.

Его делители равны 2,4,8

16 = 2 * 8, 4 * 4, 8 * 2.

Вы можете заметить, что после достижения 4, являющегося квадратным корнем из 16, мы повторили 8 * 2, которые мы уже сделали как 2 * 8 , Этот шаблон верен для всех чисел.

Чтобы избежать повторения, мы, таким образом, проверяем на соответствие с квадратным корнем числа n.

Итак, мы преобразуем квадратный корень в int потому что нам не нужен диапазон с плавающими числами.

Прочтите тест прочности на wikipedia для получения дополнительной информации.

1
ответ дан Stephen-Njoroge 1 September 2018 в 02:08
поделиться
isPrime=lambda x: all(x % i != 0 for i in range(int(x**0.5)+1)[2:])

и здесь говорится, как его использовать

isPrime(2) == False
isPrime(5) == True
isPrime(7) == True

Чтобы найти все простые числа, которые вы могли бы использовать:

filter(isPrime, range(4000)[2:])[:5]
=> [2, 3, 5, 7, 11]

Обратите внимание, что в этом случае 5 означает количество найденных простых чисел и максимальный диапазон 4000, где будут искать простые числа.

1
ответ дан test30 1 September 2018 в 02:08
поделиться

Каждый написанный вами код должен быть эффективным. Для начинающего, как и вы, самый простой способ - проверить делимость числа «n» от 2 до (n-1). Это занимает много времени, когда вы считаете очень большие цифры. Метод с квадратным корнем помогает быстрее сделать код за счет меньшего количества сравнений. Читайте о сложностях в разработке и анализе алгоритмов.

2
ответ дан Vipin Rai 1 September 2018 в 02:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: