【问题标题】:How do I optimize an algorithm to decompose a number as the sum of two squares?如何优化算法以将数字分解为两个平方和?
【发布时间】:2016-01-28 21:59:42
【问题描述】:

我有一个简单的数学算法。它所做的只是接受一个输入并找到 i,j 使得 i^2 + j^2 = input 具有 j >= i 的限制(这样它就不会打印它的对应物,例如 2^2 + 3^ 2 == 3^2 + 2^2 但我只需要后者作为 j >= i)

对于我的代码,我执行了以下操作:我有 2 个 for 循环,第一个循环用于 i,第二个循环用于 j。同时获取 i 和 j 值并测试 i^2 + j^2 == 输入以及 j >= i。如果是,请打印并更新计数。

问题是,对于大量的值,它需要很长时间,因为它从 1 到 2000 循环两次,然后又从 1 到 2000 循环。

def some_mathfn(n):
    count = 0
    for i in range(1,n+1):
        for j in range(1,n+1):
            if(i**2 + j**2 == n and j >= i):
                g = print(i, '^2 + ', j,'^2')
                count += 1
    return count

some_mathfn(2001)

【问题讨论】:

  • Stack Overflow 不是集思广益算法的好平台。至少,为你的问题想一个更好的标题。
  • for j in range(i+1, n+1) 会剪掉合理比例的循环,并删除 if 语句的第二部分,因为它现在是多余的。
  • @MartijnPieters 你知道哪些网站更适合这样的问题吗?
  • 尝试 CodeReview.StackExchange.com 或 Math.StackExchange.com。另请查看 Fermat's theoremPell's equation 了解有关该主题的一般工作。
  • 我个人认为这里没问题。这是一个足够具体的问题,基本上是关于寻找更快的算法...How to Ask 页面确实明确表示“询问... [...] 软件算法。”有很多优化问题非常模糊等 - 但这似乎没问题。

标签: python python-3.x math optimization


【解决方案1】:

你有一个 O(n2) 算法没有明显的原因。很容易做到这个 O(n1/2)...

  • 从 1 循环到 n/2 的平方根(对于变量 i) - 因为当 i 大于 sqrt(n/2) 时,i*i + j*j 将大于 n 对于任何大于 ji
    • (只求n的平方根,因为
  • 减去i的平方
  • 取结果的平方根,并找到最接近的整数 - 称之为j
  • 检查您感兴趣的条件是否成立

最后两个步骤实际上只是检查n - i*i 的平方根实际上是一个整数,但在某些情况下(对于非常大的 n 值)找到最接近的整数然后检查条件可能更可靠方法,为了避免浮点限制导致问题,其中最接近理论结果的可表示双精度可能是整数,尽管实际结果不是整数。这只会发生在 n 值非常大的情况下,但是...

【讨论】:

  • @JonSkeet 问题是 range() 不会浮动!!
  • @misheekoh:所以向下舍入到最接近的整数。毕竟你只关心整数值......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-27
  • 1970-01-01
  • 2016-02-01
  • 2011-06-07
  • 1970-01-01
相关资源
最近更新 更多