定理:在奇数数列 1+3+5+...+2n-1 中,若φm是一个平方数且φm可以分解成连续φ个奇数之和,
则存在唯一个数x^2,使得 φm + x^2 = (x + φ)^2 , 既一组勾股数。
例如:取φ = 1,m = 3^2, 5^2, 7^2,....
则 φm = 9, 25, 49,....
[9] +[1+3+5+7] = [1+3+5+7+9] → 3^2 + 4^2 = 5^2
[25]+[1+3+...+23] = [1+3+...+25] → 5^2 + 12^2 = 13^2
[49]+[1+3+...+47] = [1+3+...+49] → 7^2 + 24^2 = 25^2
....
又如:取φ = 2,m = 18, φm = [17+19], √(φm) = 6
[17+19] + [1+3+...+15] = [1+3+...+19] → 6^2 + 8^2 = 10^2
取φ = 3,m = 27, φm = [25+27+29], √(φm) = 9
[25+27+29] + [1+3+...+23] = [1+3+...29] → 9^2 + 12^2 = 15^2
证明:左边 = (1+3+5+...+2x-1) + [(2x+1)+(2x+3)+...+(2x + 2φ-1)]
= ∑[i=1..x](2i-1) + ∑[i=1..φ](2i-1) + 2x*φ
= x^2 + 2φx + φ^2
= (x+φ)^2
= 右边
证完。
【code】
编了个小程序检测 φ=3时的勾股数,φm < 1000000
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i, f = 3, fm, n;
for (i = 9,fm = 81; fm < 1000000; i+=2,fm=i*i )
{
if (!(fm % f))
{
n = (fm / f - f / 2) / 2;
printf(" %d^2 + %d^2 = %d^2/n",i,n-1,n+f-1);
}
}
system("pause");
return 0;
}