Unix 查找给定范围内的勾股三元组数

Unix 查找给定范围内的勾股三元组数,unix,c++,c,Unix,C++,C,我正试图编写一个程序,打印给定范围N的毕达哥拉斯三元组(a^2+b^2=c^2),其中a首先,只要有新的c值可用,就可以计算c2: for (c = 0; c <=N; c++) { /* compute c2 here */ 对于(c=0;c您可以通过以下计算减少一个变量 a = m^2 - n^2, b = 2mn, c = m^2 + n^2 让我们检查它是否满足a^2+b^2=c^2: a^2+b^2 = (m^2 - n^2)^2 + (2mn)^2 = (m

我正试图编写一个程序,打印给定范围N的毕达哥拉斯三元组(a^2+b^2=c^2),其中a首先,只要有新的
c
值可用,就可以计算
c2

 for (c = 0; c <=N; c++)
  {
   /* compute c2 here */

对于(c=0;c您可以通过以下计算减少一个变量

a = m^2 - n^2,  b = 2mn,  c = m^2 + n^2
让我们检查它是否满足
a^2+b^2=c^2

a^2+b^2 = (m^2 - n^2)^2 + (2mn)^2 = (m^2 + n^2)^2 = c^2.
现在,我们可以迭代所有可能的
m
n
,并生成相应的
a
b
c


这是我用过的最快的方法。但是,我不知道是否存在任何
O(1)
O(log(n))
数学解。

根据数论,毕达哥拉斯三元组的参数是(2pq,p^2-q^2,p^2+q^2)。你可以枚举这些,只要c>N就中止。这当然是最优的,因为你做的计算和三元组一样多…

a)这是Stackoverflow的问题。b) 欧拉项目?…或者最好不要这样,因为它也可以在那里关闭。@deviantfan。。为什么它会在S/O关闭??只是好奇。。。这似乎是一个合法的编程问题,除非我真的很蠢并且遗漏了一些东西,因为:
a
b
c
中的一次2的可能重复是固定的,最后一次可以直接计算而不需要循环。(在你的例子中,
a*a=c*c-b*b
a^2+b^2 = (m^2 - n^2)^2 + (2mn)^2 = (m^2 + n^2)^2 = c^2.