【问题标题】:What makes this code so slow? (for project Euler q45)是什么让这段代码这么慢? (对于项目欧拉 q45)
【发布时间】:2023-03-29 05:36:02
【问题描述】:

我刚刚在项目 euler 上解决并找到了问题 45 的答案,但是该解决方案需要 20 分钟来计算。其他类似的解决方案只需不到一秒钟的时间即可找到解决方案。

The problem

我的代码:

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

【问题讨论】:

  • 你为什么要做所有这些% 1 计算?
  • 如果你不使用,那么导入time 有什么用?除非这只是您的代码的一部分并且您在其他地方使用它?
  • % 1 不会像您认为的那样做。如果你想检查它是否可整除,那么你需要% 2 == 0 而不是/ 2% 6 == 0 而不是/ 6,等等。
  • 对于初学者,您只能计算一次(((8 * n + 1) ** 0.5) + 1)。但是知道项目欧拉问题,蛮力不是解决方案。你必须找到一些标准来避免计算所有的数字
  • 和项目欧拉一样,有一些分析解决方案:mathworld.wolfram.com/HexagonalPentagonalNumber.html

标签: python algorithm math


【解决方案1】:

而不是遍历每个数字并检查其是否为三角形、五边形和六边形。生成六边形数字并为每个六边形数字检查它是三角形还是五边形。

您可以使用六边形数的公式并将 n 增加 1 来生成六边形数。

【讨论】:

  • 是的,你是对的。使用生成器生成六边形数字,现在解决方案需要大约 20 毫秒才能找到。我真的应该停止依赖纯粹的计算能力。
  • 很高兴我能帮上忙 :)
【解决方案2】:

因为您要查找 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 代码中进行其他修改,但我只关注算法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-31
    • 2011-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多