Ответ 1
Prelude> sigma2big 1000
401382971
(0.48 secs, 28491864 bytes)
Prelude> sigma2big 10^3
103161709
(0.02 secs, 1035252 bytes)
Prelude> (sigma2big 10)^3
103161709
приоритет функции (shh...)
Я работаю над проблемой 401 в эйлере проекта, я закодировал свое решение в python, но для запуска потребуется несколько дней, очевидно, мне нужно будет ускорить его или использовать другой подход. Я нашел решение в Haskell, которое выглядит почти идентично моему решению python, но завершается почти мгновенно.
Может кто-нибудь объяснить, как это так быстро? (Я НЕ ПРОСИМ ДЛЯ ПОМОЩИ ИЛИ РЕШЕНИЙ ДЛЯ ПРОБЛЕМЫ 401)
divisors n = filter (\x -> n `mod` x == 0) [1..(n`div`2)] ++ [n]
sigma2 n = sum $ map (\x -> x * x) (divisors n)
sigma2big n = sum $ map (sigma2)[1..n]
let s2b = sigma2big 10^15
putStrLn ("SIGMA2(10^15) mod 10^9 is " ++ (show (mod s2b 10^9)))
По моему мнению, это просто использование пробного деления для генерации списка делителей, возведение в квадрат и суммирование их, а затем суммирование результатов от 1 до n.
EDIT: забыл свой код на Python
from time import clock
def timer(function):
def wrapper(*args, **kwargs):
start = clock()
print(function(*args, **kwargs))
runtime = clock() - start
print("Runtime: %f seconds." % runtime)
return wrapper
@timer
def find_answer():
return big_sigma2(10**15) % 10**9
def get_divisors(n):
divs = set()
for i in range(1, int(sqrt(n)) + 1):
if n % i == 0:
divs.add(i)
divs.add(n // i)
return divs
def sigma2(n):
return sum(map(lambda x: x**2, get_divisors(n)))
def big_sigma2(n):
total = 0
for i in range(1, n + 1):
total += sigma2(i)
return total
if __name__ == "__main__":
find_answer()
Prelude> sigma2big 1000
401382971
(0.48 secs, 28491864 bytes)
Prelude> sigma2big 10^3
103161709
(0.02 secs, 1035252 bytes)
Prelude> (sigma2big 10)^3
103161709
приоритет функции (shh...)
Убедитесь, что вы используете Integer
для своих вычислений, а не Int
, так как 10^15
переполнит значение Int
.
Если вы измените:
let s2b = sigma2big 10^15
в
let s2b = sigma2big (10^15 :: Integer)
у кода Haskell заканчивается память в ghci
, и я не стал дожидаться его завершения при запуске скомпилированной версии.