为什么while循环停止而不会引发错误?

时间:2019-05-16 19:31:31

标签: python primes

试图找到输出匹配条件。遍历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 个答案:

答案 0 :(得分:1)

在不停止的同时,对其进行处理。在处理过程中会消耗大量时间。

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(check(239)),然后将打印放入第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)

答案 1 :(得分:0)

问题似乎是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的偶数没有意义。

人们可能会建议使用Eratosthenes筛子作为更好的初筛-保持警惕。由于内存分配问题,任何依赖于数组结构的 simple 筛子实现都会在创建11 ** 11 + 2左右的Python列表时遇到问题。我不知道只能表示奇数的位向量能走多大。