Почему выполнение моего простого кода занимает так много времени, когда я предоставляю в качестве входных данных большие числа?

#python-3.x #time-complexity

#python-3.x #временная сложность

Вопрос:

Я написал простой код для вывода наибольшего простого множителя заданного числа из Project Euler. Это отлично работает для чисел, таких как 24, но для больших чисел нет ответа от оболочки python!

 a=600851475143
b=[]
for i in range(2,600851475143):
    if a%i==0:
         if i==2:
            b.append(i)
            continue
         for j in range(2,i 1):
             if j==i:
                b.append(i)
             if i%j==0:
                break
 print(max(b))
 print(b)
  

Комментарии:

1. Эта программа выполняет порядка 10 ^ 20 операций. Средний компьютер может выполнять около 10 ^ 8 операций в секунду (обычно ближе к 10 ^ 7 в python, поскольку python — очень медленный язык). Следовательно, выполнение этой программы заняло бы 10 ^ 13 секунд, что является большим временем

2. Чтобы закончить этот ход мыслей, 10 ^ 13 секунд — это примерно 316 887 лет.

Ответ №1:

Вы можете использовать подобный алгоритм для получения больших множителей простых чисел:

 import math

def LLL(N):
   p = 1<<N.bit_length()-1
   if N == 2:
     return 2
   if N == 3:
     return 3
   s = 4
   M = pow(p, 2) - 1
   for x in range (1, 100000):
     s = (((s * N ) - 2 )) % M
     xx = [math.gcd(s, N)]   [math.gcd(s*p x,N) for x in range(7)]   [math.gcd(s*p-x,N) for x in range(1,7)]
     try:
        prime = min(list(filter(lambda x: x not in set([1]),xx)))
     except:
        prime = 1
     if prime == 1:
        continue
     else:
        break
   return N/prime

  

Комментарии:

1. Это не то, о чем на самом деле спрашивал OP. Кроме того, OP пытается решить проблему в Project Euler. Если это сработает, это огромный спойлер.