Я сейчас пытаюсь сделать простой тест на простоту, используя 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 при обработке большого числа