Оптимизация алгоритма. Задача Эйлера № 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? Или может можно сделать этот перебор более оптимизированным? Заранее спасибо.


Ответы (0 шт):