Почему python пропускает мое время l oop в моем тесте на простоту, когда я ввожу огромное число? - PullRequest
0 голосов
/ 20 марта 2020

Я сейчас пытаюсь сделать простой тест на простоту, используя python для проверки простого числа.

Вот код, который я сделал для теста:

def is_prime(n):      
    if np.mod(n, 2) == 0:          
        return False

    f = 3

    while np.square(f) <= n:       
        if np.mod(n, f) == 0:
            return False
        f += 2

    return True             

Я запускаю код, и он отлично работает для небольших чисел. Затем я ввожу огромное число (для удобства я выбрал 2^128), оно возвращает True. Но когда я ввожу 2^129, 2^130, 2^131, 2^132 (и т. Д.), всегда возвращает True . Я считаю, что мой l oop был пропущен. Чтобы убедиться в этом, я изменил код, как показано ниже:

while np.square(f) <= n:       
    if np.mod(n, f) == 0:
        print(f)    #Added line
        return False
    f += 2

print(f)     #Added line

Я проверил это снова для некоторых небольших чисел, и он выведет правильное значение f. Но для произвольно больших чисел (возможно, больше, чем «2 ^ 50») будет напечатано только 3 (начальное значение f). Так что я уверен, что это пока l oop было пропущено.

Есть ли способ исправить это?

P / S:

  • Я также сделал другой тест на простоту. Но я хочу использовать этот тест для проверки результатов этих тестов (хотя это займет больше времени)

  • Я также использую Numba для ускорения кода (@jit(nopython=True)) , Вот почему я использую много функций NP, как Numba эффективность работы с NumPy

Edit 1:

  • I пришлось повторно протестировать код без, и он прекрасно работает (даже с большими числами), но это намного медленнее. Поэтому я думаю, что есть проблема с Numba при обработке большого числа
...