《数论概论》读书笔记(第二章)勾股数组

本章主要讨论的是本原勾股数组,也就是关于满足 a2+b2=c2 的三元组 (a,b,c) ,且 (a,b,c) 互质的问题。
这章中提到一个概念:本原勾股数组(PPT)是一个三元组 (a,b,c) ,其中 a,b,c 没有公因子,且满足 a2+b2=c2 ,就是 gcd(a,b,c)=1
对于本原勾股数组,显然 a b 奇偶性不同只需要将 a=2x+1,b=2y+1,c=2z ,代入 a2+b2=c2 ,即可推出有公约数2。由于 a b奇偶性不同,即 a b是偶数那么显然 c 为奇数。(书中有证明的)。

那么我们最关心的是如何求出所有的本原勾股数组。

如果将公式转化一下,得到a2=c2b2=(c+b)(cb),那么显然有, c+b cb 没有公因子。

(反证法)证明:
如果 d|(c+b)d|(cb) ,那么显然有 d|((c+b)+(cb)) d|((c+b)(cb)) d|2bd|2c ,因为在定义本原勾股数组的时候已经有了 b c的最大公约数是1的约定(虽然定义是 abc 最大公约数是1,但是如果 gcd(b,c)=d>1 显然有 d|c 不满足定义)。所以 d 要么为1,要么为2。但是如果d=2时,那么显然 abc 均为偶数,不满足定义,那么 d 只能为1,证明了c+b cb 都没有公因子。(书中都有)。
因此,如果将 a2 进行质因数分解,那么会有 a=pa11pa22pa33...pann ,其中指数 a1,a2,a3...an 为偶数(因为这样才能保证 a2 开根号后为整数),又因为 c+b cb 没有公因数, c+b cb 各用 a 分解后的必然是pakk这些东西,因此, c+b cb 均为平方数。那么假设 c+b=s2,cb=t2 ,则有 c=(s2+t2)2,b=(s2t2)2a=st 因此形如 (st,(s2t2)2(s2+t2)2) 的三元组为本原勾股数组。(其中 s t都是奇数,因为如果 s t中有且只有一个为奇数,那么显然 (s2+t2)2 不会是整数,而如果两个数都是偶数,那么显然该三元组有公因子 2 ,与本原勾股数组定义矛盾。)

本原勾股数公式:a=m²n²b=2mnc=m²+n²

一些构造题和数论题会涉及:本原勾股数组。
例题:
http://codeforces.com/contest/707/problem/C
http://acm.hdu.edu.cn/showproblem.php?pid=3422
http://poj.org/problem?id=1305

习题解析:
  1. (a) 反证法。假设 a b都不是3的倍数,那么由于 a b的奇偶性不同,因此我想的方法是分成4种情况讨论:
    由于a和b具有互换性,因此假定 a 为奇数,b为偶数。

    • amod3=1,bmod3=1
      那么 a=6x+1,b=6y+4, 那么根据勾股定理,可以得到 c=6z+5 的形式,再代入 a2+b2=c2 后可得:
      36x2+12x+1+36y2+48y+16=36z2+60z+25
      整理后可得 3(12x2+4x+12y2+16y12z220z)=8
      3 不是8的因子,所以显然不存在整数 xy 使得该式成立。
    • amod3=1,bmod3=2
      那么有 a=6x+1,b=6y+2, 那么可以得到 c=6y+5 的形式,代入 a2+b2=c2 后可得
      36x2+12x+1+26y2+24y+4=26y2+60z+25
      整理后常数项 20 也不是 3 的因子,所以不存在整数xy
    • 同理,可证明当 amod3=2,bmod3=1 amod3=2,bmod3=2 中同样找不到 xy 成立,因此假设不成立,所以证明了 a 或者b必定是 3 的倍数。
      (b)根据上面的反证法也可以证明a b c 5 的倍数。
  2. 证明:如果d|m d|n ,则 d|(mn)d|(m+n) 的证明。
    很显然有 m=ad,n=bd mn=d(ab)m+n=d(a+b) 显然能够被 d 整除。

  3. 证明略。奇数和4的倍数可以出现在本原勾股数组中,而形如4n+2的偶数不可能出现在本原勾股数组中。
    定理:如果x y 没有公约数,那么x2+y2任何奇素因子 都必定形如 4n+1 .

  4. 显然是存在相同 c 值的2个本原勾股数组的。自己打个表就知道了。也可以找到相同 c 值的4个本原勾股数组。但找不到 3 (10,000,000内),可以找到 4 个的,找不到5个的,也找不到 6 个的。。。
    测试代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n;
ll vis[10000000+7];
ll gcd(ll a,ll b){
    return b==0?a:gcd(b,a%b);
}
ll cot[100000000+7];
int main()
{
    while(~scanf("%lld",&n))// <= 1,000,0000
    {
        memset(vis,0,sizeof(vis));
        int m=sqrt((double)n);

        ll ans=0; 
        ll x,y,z;
        ll a,b,d;
        for(ll i=1;i<=m;i+=2)
        {
            for(ll j=2;j<=m;j+=2)
            {

                a=max(i,j);
                b=min(i,j);
                d=gcd(a,b);

                if(d==1)
                {
                    x=a*a-b*b;
                    y=2*a*b;
                    z=a*a+b*b;
                    cot[z]++;
                    for(int k=1;k*z<=n;k++)
                    {
                        vis[x*k]=1;
                        vis[y*k]=1;
                        vis[z*k]=1;
                    }
                    if(z<=n)
                        ans++;  
                }
            }
        }
        printf("有%lld个本原勾股数组\n",ans);
        ans = 0;
        for(int i=1;i<=n;i++){
             ans=max(ans,cot[i]);
             if(ans==2)cout<<"存在2个."<<endl;
            // if(ans==4)cout<<"存在4个"<<endl;
            // if(ans==5)cout<<"存在5个"<<endl;
             //if(ans==6)cout<<"存在6个"<<endl;
        }
        cout<<"(最大值)相同的有"<<ans<<"个."<<endl;
    }
    return 0;
}

(5)
对于问题 a :
首先,
b=4T1:(3,4,5)
b=4T2:(5,12,13)
b=4T3:(7,24,25)
b=4T4:(9,40,41)
观察可以找到规律:一个数是奇数,第二个数是 Tn ,第三个数是 (Tn)+1 。即: a=2k+1,b=2k(k+1),c=2k(k+1)+1 ,即 a=2k+1b=2k2+2kc=2k2+2k+1 .

对于问题 b ,由 a 可以得到, b 显然是是三角数的4倍。所以,每个三角数 Tn 都存在 b=Tn 的本原勾股数组 abc

(6) 对于 abc ,由上面的题目我们可以得到: a=4kb=4k21,c=4k2+1 ,即: c=a+2 。那么: a=4kb=4k21,c=4k2+1 就是通用公式。

(7) 你打个表或者套上面的公式,可以发现,打表发现 2c2a 为完全平方数。特殊形式: 2c2a=2((s2+t2)2st)=(st)2

(8) 自行阅读与了解。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值