一组勾股三角形(a,b,c)当$gcd(a,b,c) = 1$的情况下,被定义为原始/原生的。因为任意勾股三角形有$gcd(a,b) = gcd(b,c) = gcd(c,a)$的性质,而当且仅当$gcd(a,b) = 1$,这样的一个三角形才是原始/原始的。正如古希腊人所知道的,所有原始/原生的勾股三角形可以被表示为 $$ \begin{align} (9.1) \\ a &= m^2 - n^2 \\ b &= 2 \times m \times n \\ c &= m^2 + n^2 \\ \end{align} $$ 此时$0 < n < m$,也许要交换$a$和$b$使得$a < b$。这些方程总是可以构造出一个勾股三角形,但是当且仅当有确切的一组$m,n$为偶数且$gcd(m,n) = 1$,才会被视作原始/原生的。 从任意一个勾股三角形你可以取得一个原始/原生的三角形,然后除去一个最大公因数,所以每一个勾股三角形有一个独一无二的表示: $$ \begin{align} (9.2) \\ a &= (m^2 - n^2) \times d \\ b &= 2 \times m \times n \times d \\ c &= (m^2 + n^2) \times d \\ \end{align} $$ 此时$0 < n < m$,且$gcd(m,n) = 1$,并且有确切的一组$m,n$为偶数,$d$代表$a,b,c$的最大公因数。
将其参数化后,我们可以得到 $$ (9.3) \\ a + b + c = 2 \times m \times (m + n) \times d $$ 所以为了找一个勾股三角形(a,b,c) 且 $a + b + c = s$,我们需要找到一个$\frac{s}{2}$的因子$m (> 1)$ 和一个$\frac{s}{2m}$奇数因子$k (=m+n)$,同时满足$m < k < 2m$和$gcd(m,k) = 1$,然后设$n = k - m$,$d = \frac{s}{2mk}$,联立(9.2),可得出答案。
intgcd(int a, int b) { return (b != 0) ? gcd(b,a%b) : a; } intmain(void) { int s2 = 1000 / 2; int mlimit = static_cast<int>( ceil(sqrt(s2)) ) - 1; for(int m = 2; m <= mlimit; ++m) if(s2 % m == 0) { int sm = s2 / m; while(sm % 2 == 0) sm = sm / 2; int k; if(m % 2 == 1) k = m + 2; else k = m + 1; while( k < 2 * m && k <= sm ) { if(sm % k == 0 && gcd(k, m) == 1) { int d = s2 / (k*m); int n = k - m; int a = d * (m * m - n * n); int b = 2 * d * m * n; int c = d * (m * m + n * n); printf("%d %d %d %d",a,b,c,a*b*c); return0; } k += 2; } } return0; }