【定义】
满足 的 三元组称为毕达哥拉斯三元组,当 时,称其为本原的。
毕达哥拉斯三元组,也称为勾股数。
【性质】
由 x、y、z 构成的三元组 (x,y,z) ,其中 y 为偶数,那么由他们构成的本原的毕达哥拉斯三元组
等价于:
存在互素的一奇一偶的正整数 m、n,且 m>n,有:,并且可以看出,本原的毕达哥拉斯三元组中,最大的数一定是奇数。
特别地,由 构成毕达哥拉斯三元组,将 即得
【实现】
求解 n 以内本原的毕达哥拉斯三元组个数
根据 ,只要枚举一下 m、n(m,n<=sqrt(n)),然后将三元组乘以 i (保证 i*z 在范围内),即可求出所有的毕达哥拉斯三元组。
int x[N],y[N],z[N];
int pythagoras(int n){
int num=0;//数组游标
int res=0;//本原三元组的个数
int m=sqrt(n*1.0);
for(int i=1;i<=m;i+=2){//从1开始,每次+2,保证为奇数
for(int j=2;j<=m;j+=2){//从2开始,每次+2,保证为偶数
a=max(i,j);//大的为m
b=min(i,j);//小的为n
if(gcd(i,j)!=1)//要求m、n互质
continue;
x[num]=a*a-b*b;
y[num]=2*a*b;
z[num]=a*a+b*b;
num++;
if( (a*a+b*b)<=n )//保证在范围内
res++;
}
}
return res;
}
【例题】
- Fermat vs. Pythagoras(POJ-1305)(毕达哥拉斯三元组):点击这里