Оптимизация алгоритма. Задача Эйлера № 62
Можно найти перестановки куба 41063625 (345^3), чтобы получить еще два куба: 56623104 (384^3) и 66430125 (405^3).
К слову, 41063625 является наименьшим кубом, для которого ровно три перестановки также являются кубами.
Найдите наименьший куб, для которого ровно пять перестановок также являются кубами.
Мое решение.
def is_cubik(n):
n = int(n) # Функция для проверки, является ли число кубом
return int(n ** (1/3)) + 1 - n ** (1/3) < 10 ** (-12)
def degree_of_three(n):
x = n ** (1/3) # - Такая же функция, что и первая. Какая из них лучше - не знаю
x = int(round(x))
if x * x * x == n:
return True
return False
def glitch():
from itertools import permutations
for i in range(345, 10 ** 5 + 1):
perm = set(permutations(str(i ** 3))) # Генерируем уже готовые кубы
# set нужен, так число, например, 1000 имеет 3 одинаковые перестановки
# условие, что первый элемент != 0, так как это некорректное число
x = len(list(j for j in perm if j [0] != '0' and degree_of_three(int(''.join(map(str, j)))) ))
print(x, i)
if x == 5:
print(i ** 3)
break
У меня на числе 2326 виснет компьютер и дальше работать не хочет, приходится перезагружать.
Есть ли более простое решение, а не перебор всех permutations? Или может можно сделать этот перебор более оптимизированным?
Заранее спасибо.