勾股数的归纳与整理

· · 算法·理论

我们称正整数三元组 (a,b,c) 为一组勾股数当且仅当 a^2+b^2=c^2。求所有勾股数最显然的做法就是 O(n^3) 枚举,那我们有没有更快的做法呢?
我们可以进行如下推导:

b^2 = c^2-a^2 = (c+a)(c-a),

x = c+a,y = c-a 得到:

a= \frac{x-y}{2},b=\sqrt{xy},c= \frac{x+y}{2},

再令 m= \sqrt{\frac{x}{2}},n=\sqrt{\frac{y}{2}} 得到:

a=m^2-n^2,b=2mn,c=m^2+n^2. - 若 $a$ 奇 $b$ 偶,则 $m,n$ 必为整数 证明: $$\begin{aligned} & \because a\text{ 为整数}\\ & \therefore x,y\text{ 奇偶性相同}\\ & 又\because b\text{ 为偶数}\\ & \therefore x,y\text{ 均为偶数}\\ & \because a,c\text{ 互质}\\ &\begin{equation} \therefore \frac{x-y}{2}\text{ 与 }\frac{x+y}{2}\text{ 互质} \end{equation}\\ & \text{设 }\frac{x}{2}\text{ 与 }\frac{y}{2}\text{ 存在公因数 }d\\ & \therefore \frac{x}{2} = k_1d,\frac{y}{2}=k_2d (k_1,k_2\in\mathbb{Z})\\ & \therefore \frac{x-y}{2}=(k1-k2)d,\frac{x+y}{2}=(k1+k2)d\text{ 存在公因数 }d\text{ 与(1)矛盾}\\ & \therefore \frac{x}{2},\frac{y}{2}\text{ 互质}\\ & 又\because b\text{ 为整数}\\ & \therefore xy\text{ 为完全平方数}\\ & \therefore \frac{x}{2}\text{ 与 }\frac{y}{2}\text{ 为完全平方数}\\ & \therefore m,n\text{ 为整数} \end{aligned}$$ - 若 $a$ 偶 $b$ 奇,则 $m,n$ 显然不均为整数 所以枚举合法的 $m,n$ 能使所有本原勾股数恰好出现一次,以所有本原勾股数构造 $(ka,kb,kc)$ 得到所有勾股数。枚举本原勾股数是 $O(\sqrt{n}\cdot\sqrt{n})$,加上枚举 $k$ 调和级数总复杂度 $O(n\log n)$。 ```cpp for(int i=0;i*i<n;i++) for(int j=i+1;j*j-i*i+2*i*j<n;j++) if(__gcd(j*j-i*i,2*i*j)==1) for(int k=1;k*(j*j-i*i+2*i*j)<n;k++) x=k*2*i*j,y=k*(j*j-i*i),z=k*(j*j+i*i); ```