Итак, я занимаюсь Project Euler, потому что, дорогие боги, мне нужно попрактиковаться в написании кода, а также мои математические навыки ржавые, как что-то очень ржавое. Thusly; Проект Эйлера. Я уверен, что большинство здесь уже видели или слышали о проблеме, но я поставлю ее здесь только для полноты:
Основными факторами 13195 являются 5, 7, 13 и 29.
Что является самым большим основным фактором числа 600851475143?
Для этого я написал две функции:
from math import sqrt
def isprime(n):
if n == 1:
return False
elif n == 2:
return True
elif n % 2 == 0:
return False
for x in range(3, round(sqrt(n))+1, 2):
if n % x == 0:
return False
else:
return True
Это просто проверяет любой номер подачи на простоту. Он работает как задумано (насколько я знаю), но теперь, когда я сказал, что я расту неуверенно. В любом случае, он сначала проверяет особые случаи: 1 (не простое), 2 (простое) или делится на 2 (не простое). Если ни один из особых случаев не происходит, выполняется общий тест на простоту.
Это мой код факторизации:
def factorization(n):
factor = 2
x = 3
while True:
if n % x == 0:
if isprime(x):
factor = x
n = n // x
if n == 1:
return factor
else:
return factor
x += 2
И это определенно не работает, как задумано. К сожалению, он работает на конкретное значение проблемы Project Euler, но не работает, скажем, на 100. Я не уверен, что мне нужно сделать, чтобы это исправить: что происходит, если это число типа 100, он правильно найдет первые 5 (2 * 2 * 5), но после этого будет зацикливаться и устанавливать x = 7, что сделает весь цикл бесконечным, потому что ответ 2 * 2 * 5 * 5. Поможет ли здесь рекурсия? Я попробовал это, но это не получилось более симпатичным (это все еще пошло бы в бесконечный цикл для некоторых чисел). Я не уверен, как решить это сейчас.