生成具有一个固定值的毕达哥拉斯四元组?

时间:2011-10-12 22:11:46

标签: geometry computer-science complexity-theory computational-geometry time-complexity

如果我想生成唯一的(忽略底片)毕达哥拉斯四重(形式为^ 2 + b ^ 2 + c ^ 2 = d ^ 2)具有固定的d(在这种情况下为2 ^ 15-1),这样做有比O(n ^ 3)更好的方法吗?

现在我非常粗暴地强迫它:

int r = (1 << 15) - 1;

for(int i = 0; i < r; i++)
 for(int j = i; j < r; j++)
  for(int k = j; k < r; k++)
   if( i * i + j * j + k * k == r * r )
    //add to list

哪个是O(n ^ 3),有更快的方法吗?我发现了一些可以产生四倍的snippits,但他们都说他们可能会错过一些。我看到了它们的方程式,我认为可能存在一些线性方程组方式?

3 个答案:

答案 0 :(得分:1)

它仍然是O(n ^ 3),但你可以通过不搜索太大的数字来加快它的速度:

...
for(int i = 0; i < r; i++)
  for(int j = i; j < sqrt(r^2 - i^2); j++)
     for(int k = j; k < sqrt(r^2 - i^2 - j^2); k++)
...

答案 1 :(得分:1)

previously-mentioned Wikipedia page的第二个参数化说

  

所有毕达哥拉斯四重奏......都可以从两个正整数a,odd和b生成,甚至......   令p为a ^ 2 + b ^ 2的任何因子,使得p ^ 2

这似乎是一种简单的O(n ^ 2)方法来生成所有毕达哥拉斯四边形,但没有明显的方法来利用d被修复。

这是另一种O(n ^ 2)方法,它不需要数学洞察力,只需要一些基本的数据结构能力:

   for(k=0; k<r; ++k)
     insert r^2 - k^2 into BST [*]

   for(i=0; i<r; ++i)
     for(j=i; j<r; ++j)
       if i^2 + j^2 is in BST report i,j,k [**]

[*]可以使用任何高速字典数据结构;二叉搜索树不是强制性的。但是,AA trees速度快且易于编码。

[**]从k ^ 2 = r ^ 2 - i ^ 2 - j ^ 2计算k

答案 2 :(得分:0)

尝试参数化,Wikipedia page提到其中2个。