Вот некоторый чистый Python-код, который делает то, что вы хотите довольно быстро.Это набирает скорость множественными способами.Во-первых, он использует математический способ для вычисления суммы делителей числа, используя только простое разложение (произведение степеней различных простых чисел) числа.Во-вторых, он использует предварительно вычисленный список простых чисел для ускорения простого разложения.Таким образом, этот код имеет более длинный код и использует больше памяти, но работает быстрее.В-третьих, я использовал встроенную в Python функцию is_integer
, чтобы ускорить обнаружение идеальных квадратов.Наконец, я удалил проверку ошибок из своего кода, чтобы ускорить его.Этот код работает до простого числа, большего, чем квадрат последнего числа в простом списке.Вы сказали в комментарии, что вам нужно число до тысячи.Я увеличил это до одного миллиона, чтобы быть уверенным, и это занимает 168
простых чисел.(Если вы уверены, что вам никогда не понадобится превышать 1000, вы можете использовать первые 11
простые числа, вплоть до 31
.)
Я только что набрал %timeit
в своем коде, и этотребуется 3.26
миллисекунд для вычисления и печати результирующего списка до 1000
.Это займет 9.05
секунд, чтобы сделать это за миллион.Вам нужно что-нибудь быстрее?
import math
primelist = [
2, 3, 5, 7, 11, 13, 17, 19, 23, 29,
31, 37, 41, 43, 47, 53, 59, 61, 67, 71,
73, 79, 83, 89, 97, 101, 103, 107, 109, 113,
127, 131, 137, 139, 149, 151, 157, 163, 167, 173,
179, 181, 191, 193, 197, 199, 211, 223, 227, 229,
233, 239, 241, 251, 257, 263, 269, 271, 277, 281,
283, 293, 307, 311, 313, 317, 331, 337, 347, 349,
353, 359, 367, 373, 379, 383, 389, 397, 401, 409,
419, 421, 431, 433, 439, 443, 449, 457, 461, 463,
467, 479, 487, 491, 499, 503, 509, 521, 523, 541,
547, 557, 563, 569, 571, 577, 587, 593, 599, 601,
607, 613, 617, 619, 631, 641, 643, 647, 653, 659,
661, 673, 677, 683, 691, 701, 709, 719, 727, 733,
739, 743, 751, 757, 761, 769, 773, 787, 797, 809,
811, 821, 823, 827, 829, 839, 853, 857, 859, 863,
877, 881, 883, 887, 907, 911, 919, 929, 937, 941,
947, 953, 967, 971, 977, 983, 991, 997]
def sumdivisors(n):
"""Return the sum of the positive divisors of n. This is guaranteed
to work if 0 < n < 1000000 and will work for many larger numbers.
"""
sqrtn = int(math.sqrt(n))
result = 1
for p in primelist:
if p > sqrtn:
break
exponentofp = 0
while n % p == 0:
n //= p
exponentofp += 1
if exponentofp:
sqrtn = int(math.sqrt(n))
result *= (p**(exponentofp + 1) - 1) // (p - 1)
if n > 1:
result *= n + 1
return result
num = int(input("Enter the beginning: "))
end = int(input("Enter the end: "))
ans = [n for n in range(num, end+1) if math.sqrt(sumdivisors(n)).is_integer()]
print(ans)