【数学·数论】勾股数组

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\) 相交,直线的方程和圆的方程联立求解。

posted @ 2025-06-23 19:11  Brilliance_Z  阅读(129)  评论(0)    收藏  举报