Почему цикл while останавливается без выдачи ошибки? - PullRequest
0 голосов
/ 16 мая 2019

Попытка найти выходные условия соответствия. Итерация по циклу while, увеличение переменной, но программа, кажется, останавливается, когда num = 239 и не знает почему. Когда я пробую каждую функцию вручную, программа работает нормально.

def is_prime(num):
    if num > 1:
        for i in range(2,num):
            if (num % i) == 0:
                return(False)  
                break
        else:
            return(True)

def calc(num):
    x = (num ** num) + 2
    return(x)

def get_next_prime(num):
    num += 1
    while True:
        if is_prime(num):
            return(num)
            break
        else:
            num += 1

def check(num):
    while True:
        if is_prime(calc(num)) and is_prime(num):
            return(num)
            break
        else:
            num = get_next_prime(num)
            print(num)




print(check(4))

Ожидаемый результат - продолжение итеративного вывода в виде следующего простого числа после 239.

Ответы [ 2 ]

1 голос
/ 16 мая 2019

Пока не останавливается, его обработка. Потребляет огромное количество времени во время процесса.

def is_prime(num):
if num > 1:
    for i in range(2,num):
        if (num % i) == 0:
            return(False)  
            break
    else:
        return(True)

В результате вышеупомянутой функции 240^240 является чем-то, как показано ниже.

42200323427409150751742179532592018252808661114071266629718376939092568551075505740268077803623642715001998769421215763628719631633378375087756319383725641630331895773386010866243028159828607385899087848942302738709343403640250275314218243930567432731458807734886574283968918955323573297631562415292893276034393336066052132808455118105272470307339550216091253570417050545677371810192238471803263478546492058686483752405946094606978411379079233793804753705243644236607675749522119768311584522527886912942059070222789851175661909205254663263392466134105108288691503106

В вашем коде is_prime(calc(num)) проверяет каждое целое число, начиная с 2 и выше числа. Так что его трудоемкое время.

В качестве совета используйте vscode или другие средства отладки.

Если вы используете print для отладки, замените print(check(239)), затем поместите print в строку 4, чтобы увидеть результат отладки.

def is_prime(num):
if num > 1:
    for i in range(2,num):
        print(i)
        if (num % i) == 0:
            return(False)  
            break
    else:
        return(True)
0 голосов
/ 17 мая 2019

Кажется, проблема в том, что 239 - это первое простое число, где нетривиально определить, является ли 239 ** 239 + 2 простым.До этого вычисленные числа легко проходили простое тестирование (кратно 5 и т. Д.). Ниже приведен пример очистки вашего кода, чтобы прояснить (по крайней мере, мне), что происходит.Он включает некоторые оптимизации, предложенные в комментариях, но это мало что меняет.Он все еще спускается вниз в 239:

def is_prime(number):

    if number < 2:
        return False

    if number % 2 == 0:
        return number == 2

    i = 3

    while i * i <= number:
        if number % i == 0:
            return False

        i += 2

    return True

def calculate(odd_prime):
    return odd_prime ** odd_prime + 2

def get_next_odd_prime(odd_number):

    while True:
        odd_number += 2

        if is_prime(odd_number):
            return odd_number

def check(odd_prime):
    while True:
        if is_prime(calculate(odd_prime)):
            return odd_prime

        odd_prime = get_next_odd_prime(odd_prime)

        print(odd_prime)

print(check(5))

Так как 3 проходит этот тест (3 ** 3 + 2 == 29, который также является простым), мы начинаем со следующего более высокого нечетного простого числа, поскольку четные числа выше 2 не имеют смысла.

Люди могут предложить использовать сито Эратосфен в качестве лучшего основного теста - будьте осторожны.Любая простая ситовая реализация, которая опирается на структуру массива, столкнется с проблемами при создании списка Python всего за 11 ** 11 + 2 или около того из-за проблем с выделением памяти.Я не знаю, насколько больше может пойти битвектор, который, скажем, представляет только нечетные числа.

...