一.素勾股数的定义及性质
有三个数a,b,c,三者互质(最大公因数为1)满足a^2 + b^2 = c^2,称a,b,c为一组素勾股数。
性质一:素勾股数他们的整数倍也是勾股数,即(na,nb,nc)也是勾股数。
性质二:a,b必为一奇一偶。
性质三:任何素勾股数可表示为如下形式:,其中n<m,gcd(n,m)=1。
a = 2 * m * n;
b = m^2 - n^2;
c = m^2 + n^2;
二.素勾股数的应用
在了解了素勾股数的性质之后,我们不难发现,任一勾股数都可以用素勾股数表示,所以其最大的应用就是在我们处理有关勾股数问题且数据量较大时,可以通过枚举素勾股数来处理。
例如,欧拉计划的第九题:特殊毕达哥拉斯三元组
暴力枚举实现的代码如下:
#include <stdio.h>
int main() {
int n;
for(int a = 2; a < 333; a++){
for(int b = a + 1; b < (1000 - a) / 2; b++){
int c = 1000 - b - a;
if(a * a + b * b == c * c) n = a * b * c;
}
}
printf("%d\n", n);
return 0;
}
而通过素勾股数实现的代码如下:
#include <stdio.h>
#include <math.h>
int gcd(int a, int b){
if(a % b == 0) return b;
return (b, a % b);
}
int main() {
int x = 0;
for(int n = 1; n < 33; n++){
for(int m = n + 1; m < 33; m++){
if(gcd(n, m) != 1) continue;
int a = 2 * m * n;
int b = m * m - n * n;
int c = m * m + n * n;
if(1000 % (a + b + c) == 0){
int k = 1000 / (a + b + c);
x = a * b * c * (int)pow(k, 3);
}
if(x) break;
}
if(x) break;
}
printf("%d", x);
return 0;
}
相较而言第二种方法两层循环的次数更少,当题目所给的范围更大时,素勾股数的方法就更具优势。