【数学·数论】勾股数组
1.5.2. 勾股数组
定义:满足 \(a^2+b^2=c^2\) 的三元正整数组 \((a,b,c)\)。
性质:\(a,b\) 中必有一个 \(3\) 的倍数;\(a,b\) 中必有一个 \(4\) 的倍数;\(a,b,c\) 中必有一个 \(5\) 的倍数;\(ab\) 是 \(12\) 的倍数;\(abc\) 是 \(60\) 的倍数。
本原勾股数组
定义:满足 \(\gcd(a,b,c)=1\) 的勾股数组。
结构:必为\(奇数^2+偶数^2=奇数^2\)。
本原勾股数组定理:令本原勾股数组 \((a,b,c)\) 中 \(a\) 为奇数,\(b\) 为偶数。每个本原勾股数组 \((a,b,c)\) 一一对应:
- \(s,t\),满足 \(s>t\) 且 \(s,t\) 互质且 \(s,t\) 是奇数,使得 \(a=st,b=\frac{s^2-t^2}{2},c=\frac{s^2+t^2}{2}\)。
- \(m,n\),满足 \(m>n\) 且 \(m,n\) 互质且 \(m,n\) 奇偶性不同,使得 \(a=m^2-n^2,b=2mn,c=m^2+n^2\)。
记 \(d=\gcd(a,b,c)\),则每个勾股数组 \((a,b,c)\) 一一对应本原勾股数组 \((\frac{a}{d},\frac{b}{d},\frac{c}{d})\) 乘 \(d\),进而一一对应 \(s,t\) 和 \(d\),一一对应 \(m,n\) 和 \(d\)。
勾股数组分解
给定正整数 \(c\),求所有满足 \(c^2=a^2+b^2,a<b\) 的正整数组 \((a,b)\)。
注:本原勾股数组分解不唯一。(e.g.\(65^2=16^2+63^2=33^2+56^2\)。)自然地,勾股数组分解也不唯一。
-
求一个数 \(c\) 的本原勾股数组分解:根据勾股数组定理,枚举 \(s\),求出 \(t\)。\(O(\sqrt C\log C)\)。
-
求 \(1\sim c\) 的本原勾股数组分解:根据勾股数组定理,枚举 \(s,t\),求出 \(a,b,c\)。\(O(C\times\log C)\)。
推论:值域为 \(C\) 内的本原勾股数组的个数为 \(O(C)\)。
-
求一个数 \(c\) 的勾股数组分解:枚举 \(c\) 的约数,对每个约数求其本原勾股数组分解,转移到 \(c\)。
-
求 \(n\) 个数 \(c\) 的勾股数组分解:先求 \(1\sim c\) 的本原勾股数组分解,再对每个数 \(c\) 借助“求一个数的约数”转移。\(O(C\log C+N\times\max(\sqrt C,勾股数组的个数))\)。
-
求 \(1\sim c\) 的勾股数组分解:先求 \(1\sim c\) 的本原勾股数组分解,再借助“求 \(1\sim c\) 的约数”转移。\(O(C\log C+\max(C\ln C,勾股数组的个数))\)。
vector<pii> ppt[C];//ppt[c]:数值c的本原勾股数组分解{a,b}
vector<pii> pt[N];//pt[i]:第i个数c_i的勾股数组分解{a_i,b_i}
//求1~c的本原勾股数组分解
void get_ppt()
{
for(int s=1;(s*s+1*1)/2<C;s+=2)
for(int t=1;t<s && (s*s+t*t)/2<C;t+=2)
if(gcd(s,t)==1)
if(s*t<(s*s-t*t)/2) ppt[(s*s+t*t)/2].push_back({s*t,(s*s-t*t)/2});
else ppt[(s*s+t*t)/2].push_back({(s*s-t*t)/2,s*t});
return ;
}
get_ppt();
//求n个数c的勾股数组分解
for(int i=1;i<=n;i++)
{
int c=read();
for(int d=1;d*d<=c;d++)
if(c%d==0)
{
for(auto it : ppt[d]) pt[i].push_back({it.first*(c/d),it.second*(c/d)});
if(c/d!=d)
for(auto it : ppt[c/d])
pt[i].push_back({it.first*d,it.second*d});
}
}
勾股数组分解方案数
给定一个正整数 \(c\),求所有满足 \(c^2=a^2+b^2,a<b\) 的正整数组 \((a,b)\) 的个数 \(f_1(c)\)。
下记 \(p\) 为满足 \(p\bmod 4=1\) 的质数,\(q\) 为满足 \(q\bmod 4=3\) 的质数(即高斯质数)。
引理:给定一个正整数 \(x\),记质因数分解 \(x=2^{u}\prod p_i^{v_i}\prod q_j^{w_j}\),则所有满足 \(x=a^2+b^2,a>0,b\geqslant0\) 的整数组 \((a,b)\) 的个数 \(f_2(x)\):
-
\(f_2(x)=\prod(v_i+1)\prod[w_j\%2==0]\)。\(O(\sqrt X)\)。
-
定义积性函数 \(\chi(x)=\begin{cases}1&x\equiv1\pmod 4\\-1&x\equiv3\pmod 4\\0&x\equiv0\pmod 2\end{cases}\)。
\(f_2(x)=\sum\limits_{d|x}\chi(d)\)。
记质因数分解 \(c=2^{u}\prod p_i^{v_i}\prod q_j^{w_j}\),则 \(c^2=2^{2u}\prod p_i^{2v_i}\prod q_j^{2w_j}\),则 \(f_1(c)=\frac{f_2(c^2)-1}{2}=\frac{(\prod(2v_i+1))-1}{2}\)。\(O(\sqrt C)\)。
应用:平面上的圆的整点问题
注:在勾股数组的基础上,还需补充 \(c^2=0^2+c^2\)。
-
求一个中心为原点半径为正整数r的圆上的整点数:给定一个正整数 \(r\),求所有满足 \(r^2=a^2+b^2\) 的整数组 \((a,b)\) 的个数 \(f_3(r)\):
引理:给定一个正整数 \(x\),所有满足 \(x=a^2+b^2\) 的整数组 \((a,b)\) 的个数 \(f_4(x)=4f_2(x)\)。
记质因数分解 \(r=2^{u}\prod p_i^{v_i}\prod q_j^{w_j}\),则 \(r^2=2^{2u}\prod p_i^{2v_i}\prod q_j^{2w_j}\),则 \(f_3(r)=f_4(r^2)=4f_2(r^2)=4\prod(2v_i+1)\)。\(O(\sqrt R)\)。
-
一个中心为原点半径为正整数 \(r\) 的圆内(含圆上)的整点数 \(f_5(r)=\sum\limits_{c=1}^{r^2}f_3(\sqrt c)=\sum\limits_{c=1}^{r^2}f_4(c)=4\sum\limits_{c=1}^{r^2}f_2(c)=4\sum\limits_{c=1}^{r^2}\sum\limits_{d|c}\chi(d)\)。
-
求一个中心为原点半径为有理数 \(r\) 的圆上的有理点:给定一个有理数 \(r\),求 \(a^2+b^2=r^2\) 的有理解 \((a,b)\)\(\Rightarrow\) 令 \(x=a/r,y=b/r\),求\(x^2+y^2=1\)的有理解:\(x=\frac{m^2-1}{m^2+1},y=\frac{-2m}{m^2+1},m\in \mathbb{Q}\)。
-
证明
显然点 \((1,0)\) 是一个解,过点 \((1,0)\) 作直线 \(y=mx-m\),与圆 \(x^2+y^2=1\) 相交,直线的方程和圆的方程联立求解。
-

浙公网安备 33010602011771号