我试图寻找方程的整数解:

y^2 + x^2 = 2n^2

如果我在wolfram alpha中搜索这个,它们几乎都会立即被找到,即使是非常大的n。当我实现一个蛮力方法时,速度非常慢:
def psearch(n, count):
    for x in range(0, n):
        for y in range(0, n):
            if x*x + y*y == 2*n**2:
                print(x,y)
                count += 1
    return count

所以我假设有一个更快的方法得到上面方程的所有整数解。我如何在python中做到这一点,以便它有更低的运行时?
注:我已经看到this question但是它是关于在一个圆内找到晶格点,而不是圆方程的整数解。另外,我感兴趣的是找到具体的解决方案,而不仅仅是解决方案的数量。
编辑:我仍然在寻找一个数量级更快的东西。下面是一个例子:n=5应该有12个整数解,以找到应该在Wolfram alpha上搜索这个方程的解。
编辑2:@维克多·岑对这个问题给出了惊人的答案。有谁能想出进一步优化解决方案的方法吗?

最佳答案

在你的算法中,你在搜索所有可能的y值。这是不必要的。这里的诀窍是要意识到

y^2 + x^2 = 2n^2

直接意味着
y^2 = 2n^2-x^2

这意味着你只需要检查2n^2-x^2是一个完美的正方形。你可以通过
y2 = 2*n*n - x*x
#check for perfect square
y = math.sqrt(y2)
if int(y + 0.5) ** 2 == y2:
    #We have a perfect square.

另外,在你的算法中,你只检查x值到n。这是不正确的。由于y^2始终为正或零,我们可以通过将y^2设置为其最低值(即0)来确定需要检查的最高x值。因此,我们需要检查所有满足
x^2 <= 2n^2

减少到
abs(x) <= sqrt(2)*n.

将此与只检查顶部象限的优化结合起来,您将得到一个优化的psearch
def psearch(n):
    count = 0
    top = math.ceil(math.sqrt(2*n*n))
    for x in range(1, top):
        y2 = 2*n*n - x*x
        #check for perfect square
        y = math.sqrt(y2)
        if int(y + 0.5) ** 2 == y2:
            count+=4
    return count

09-25 18:24