我试图寻找方程的整数解:
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上搜索这个方程的解。你知道吗
编辑二:@victor zen对这个问题给出了惊人的答案。有人能想出一种方法来进一步优化他的解决方案吗?你知道吗
在第一个八分体
y>0
,x<y
内搜索就足够了(四个解(±n, ±n)
很明显,通过对称,一个解(x, y)
产生8个拷贝(±x, ±y)
,(±y, ±x)
)。你知道吗根据单调性,对于一个给定的
y
,至多有一个x
。您可以通过循序渐进地跟随圆弧,减少y
,然后调整x
来找到它。如果您尽可能严格地维护条件x²+y²≤2n²
,那么下面的代码将被优化为只使用基本整数算术(为了效率,使用2x
而不是x
)。你知道吗以下是
1
和100
之间n
的所有解决方案:你可以通过只考虑一个象限和乘以4来优化这个算法。你知道吗
输出
在算法中,搜索所有可能的y值。这是不必要的。这里的诀窍是认识到
直接暗示
这意味着你只需要检查2n^2-x^2是一个完美的正方形。你可以通过
另外,在您的算法中,您只检查x值到n。这是不正确的。由于y^2始终为正或零,我们可以通过将y^2设置为其最低值(即0)来确定需要检查的最高x值。因此,我们需要检查所有满足
减少到
将此与只检查顶部象限的优化结合起来,您就有了一个优化的psearch
相关问题 更多 >
编程相关推荐