Что делает этот код таким медленным?(для проекта Euler Q45) - PullRequest
0 голосов
/ 14 мая 2018

Я только что решил и нашел ответ на задачу 45 в проекте euler, однако решение заняло двадцать минут.Другие аналогичные решения занимают менее секунды, чтобы найти решение.

Проблема

Мой код:

import time

def is_triangular(n):

    triangle_index = (((8 * n + 1) ** 0.5) + 1) / 2
    if triangle_index % 1 == 0:
        return True
    return False

def is_pentagonal(n):

    pentagonal_index = (((24 * n  + 1) ** 0.5) + 1) / 6
    if pentagonal_index % 1 == 0:
        return True
    return False

def is_hexagonal(n):
    hexagonal_index = (((8 * n + 1) ** 0.5) + 1) / 4
    if hexagonal_index % 1 == 0:
        return True
   return False


number = 40756
while True:
    if is_triangular(number) and is_pentagonal(number) and is_hexagonal(number):
        print(number)
        break

    number += 1

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

Поскольку вы просматриваете каждое натуральное число после 40755. Ограничьте регистр подмножеством действительных чисел: если вы уже знаете, что число не является шестигранным, вы можете, например, его отбросить.

Так какшестиугольники находятся в менее плотном подмножестве, начните с просмотра чисел в этом наборе.Затем проверьте, являются ли они пятиугольниками, и, в конце концов, проверьте, являются ли они и треугольными.

пример основной функции:

hex = 144
while True:
    number = hex*(2*hex-1)
    if is_hexagonal(number):
        if is_pentagonal(number):
            if is_triangular(number):
                print("Found: {}".format(number))
                break
    hex += 1

Существуют другие модификации, которые можно сделать в коде Python,но я сосредоточился только на алгоритме.

0 голосов
/ 14 мая 2018

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

Вы можете генерировать гексагональные числа, используя формулу для гексагональных чисел и увеличивая n на 1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...