勾股数组(核心笔记)
Brilliance_Z · · 算法·理论
勾股数组
定义:满足
性质:a,b中必有一个3的倍数;a,b中必有一个4的倍数;a,b,c中必有一个5的倍数;ab是12的倍数;abc是60的倍数。
本原勾股数组
定义:满足gcd(a,b,c)==1的勾股数组。
结构:必为
本原勾股数组定理:令本原勾股数组(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)一一对应本原勾股数组(a/d,b/d,c/d)乘d,进而一一对应s,t和d,一一对应m,n和d。
勾股数组分解
给定正整数c,求所有满足
注:本原勾股数组分解不唯一。(e.g.
- 求一个数c的本原勾股数组分解:根据勾股数组定理,枚举s,求出t。
O(\sqrt C\log C) 。 -
求1~c的本原勾股数组分解:根据勾股数组定理,枚举s,t,求出a,b,c。
O(C\times\log C) 。推论:值域为c内的本原勾股数组的个数为
O(C) 。 - 求一个数c的勾股数组分解:枚举c的约数,对每个约数求其本原勾股数组分解,转移到c。
- 求n个数c的勾股数组分解:先求1\~c的本原勾股数组分解,再对每个数c借助“求一个数的约数”转移。
O(C\log C+N\times\max(\sqrt C,勾股数组的个数)) 。 - 求1\~c的勾股数组分解:先求1\~c的本原勾股数组分解,再借助“求1\~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,求所有满足
下记p为满足p%4==1的质数,q为满足q%4==3的质数(即高斯质数)。
引理:给定一个正整数x,记质因数分解
-
-
定义积性函数
\chi(x)=\begin{cases}1&x\equiv1\pmod 4\\-1&x\equiv3\pmod 4\\0&x\equiv0\pmod 2\end{cases} 。
记质因数分解
应用:平面上的圆的整点问题
注:在勾股数组的基础上,还需补充
-
求一个中心为原点半径为正整数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相交,直线的方程和圆的方程联立求解。
-