Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 6, 2015 20:22:11

Art-master
От: Россия, Ростов-на-Дону
Зарегистрирован: 2013-06-08
Сообщения: 78
Репутация: +  1  -
Профиль   Отправить e-mail  

Совершенные числа

Появилась проблема. Необходимо вывести первые несколько совершенных чисел (число называется совершенным если оно равно сумме его делителей без самого числа). Если просто перебирать все натуральные числа один за другим, будет слишком медленно, даже получаса не хватит чтобы дойти до пятого числа. Поэтому было решено воспользоваться Началами Евклида (кто не знает). Получился следующий код:

def sdel(x): # сумма делителей числа x
	sum = 1
	for i in range(2, int(x**0.5)+1):
		if x % i == 0:
			sum += i
			if i != x / i:
				sum += x / i
	return sum
i = 2
while i < 10*40:
	if sdel(2**i-1) == 1: # если оно простое
		print (2**i-1) * (2**(i-1))
		f = open("perfects.log", "a") # мы еще и в файлик выводили
		f.write(str((2**i-1) * (2**(i-1))) + " ")
		f.close()
	i+=1

Получился такой вот вывод:
6 28 496 8128 33550336 8589869056 137438691328 2305843008139952128 

Объясните, почему алгоритм останавливается на 9-ом числе?

Офлайн

#2 Окт. 6, 2015 22:35:58

Master_Sergius
Зарегистрирован: 2013-09-12
Сообщения: 271
Репутация: +  7  -
Профиль   Отправить e-mail  

Совершенные числа

Ну, не совсем останавливается. Вы попробуйте выводить значение i в вашем цикле, да что-то увидите. Да и почему такое странное условие:

while i < 10*40
, почему не сразу 400?



———————————————————————————
Мой блог о семействе *nix: http://nixtravelling.blogspot.com/

Офлайн

#3 Окт. 6, 2015 23:14:15

Art-master
От: Россия, Ростов-на-Дону
Зарегистрирован: 2013-06-08
Сообщения: 78
Репутация: +  1  -
Профиль   Отправить e-mail  

Совершенные числа

Да решили число побольше поставить. Т.е. получается, что просто вычислительной способности компа не хватает? А есть какие-то способы еще оптимизировать алгоритм?

Офлайн

#4 Окт. 7, 2015 06:12:22

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Совершенные числа

Art-master
А есть какие-то способы еще оптимизировать алгоритм?
Если учесть, что к настоящему времени найдено 48 совершенных чисел, предлагаю вбить их в список в программе:)



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version