本文系转载:http://blog.sina.com.cn/s/blog_a661ecd50101cv41.html

  我们先研究这个问题的一部分:哪些素数是两平方数之和?为什么我们先研究素数,有个很重要的原因是:若两个正整数都是两平方数之和,那么它们的乘积也是两平方数之和。道理很简单,设两个正整数分别为 a^2+b^2 和 c^2+d^2 ,那么有

当然我们暂时不用管这么多,我们专心研究素数。在尝试了一些较小的素数后(这里不再像《数论概论》一样把表打出来了...),我们发现,除了偶素数 2 (它是两平方数 1,1 之和)之外,一个素数是两平方数之和当且仅当这个素数除以 4 的余数为 1 (也可以叫做 4k+1 型素数)。

也就是说,我们有如下两个猜想:

1. 4k+1 型素数一定是两平方数之和。

2. 4k+3 型素数一定不是两平方数之和。

我们先挑一个简单的。第一个猜想要证明存在性,一般要构造,但是似乎不容易构造出来。我们再看第二个猜想,这个...好像也太简单了吧...注意到平方数模 4 余数一定是 0 或 1 ,两个平方数加起来怎么也凑不出余数 3 。第二个猜想就这么证出来了。

回头再看第一个猜想,好像还是很难的样子...事实上,这个猜想是成立的。不过,证明方法并没有一下子构造出两个平方数,而是先把这个素数的某个倍数表示为两平方数之和,再逐步缩小这个倍数。这种方法被称为费马降阶法

设这个素数为 p ,我们先随便找一个正整数 k 使得 kp 可写为两平方数之和:

这是很容易办到的,例如取 b=1 ,由于 p 是 4k+1 型素数,所以 -1 必然是 p 的二次剩余,因此可以找到一个在 1,2,3,...,p-1 范围内的 a 使得 a^2+1 是 p 的倍数。顺便我们可以得到 k 小于 p 。

若 k=1 ,则我们已经把 p 写成两平方数之和,因此我们假设 k>1 。

接下来我们想办法找到另一组 a,b 使得 k 变得更小(也就是降阶操作)。为此我们先找一个尽量小的正整数 t 使得 kt 可写为两平方数之和:

这也很容易做,只需把 a,b 都模 k ,得到的两个余数分别作 u,v 即可。为了尽量缩小 t ,我们不管 u,v 是正的还是负的,这样的好处是 u,v 的绝对值都可以取到不超过 k/2 。后面可以看到,只有这样才能保证达到降阶的目的。

然后把两式相乘,利用上面的恒等式:

在使用恒等式时,左边的加减号稍微变了一下,这样能保证左边的两个平方数都是 k^2 的倍数(别忘了 a,u 和 b,v 都是模 k 同余的)。然后两边同时除以 k^2 ,在最后一行里,用 a,b 替换两个小括号,用 k 换掉右边的 t ,我们就找到了一组新的 a,b,k 使得 a^2+b^2=kp 。

当然,我们需要验证我们得到的 t 确实小于 k 。在式子 u^2+v^2=kt 中进行估计,左边不会超过 k^2/2 (因为 u,v 的绝对值都不超过 k/2 ),这样 t 一定不会超过 k/2 ,当然有 t 一定比 k 小。

最后还要排除 t=0 的情况。如果 t=0 ,那么 u^2+v^2=0 ,这样必有 u=v=0 ,也就是 a,b 一定是 k 的倍数。这样 a^2+b^2 一定是 k^2 的倍数,则 kp 也是 k^2 的倍数, p 就是 k 的倍数。而 k 是小于 p 的,所以 k 一定为 1 ,与我们假设 k>1 矛盾。

这样,只要 k>1 ,我们就可以重复进行降阶操作直到 k=1 ,此时我们就把 p 表示成了两平方数之和。

至此,我们证明了 4k+1 型素数一定是两平方数之和。

结论:素数 p 是两平方之和当且仅当 p=2 或 p 为 4k+1 型素数。

素数的情况就研究完了,其实本来希望是所有素数都可以的...这样的话每个合数都可以表示为若干个素数的乘积,就直接得出所有正整数都是两平方数之和了。

对任意正整数的情况,受上面的启发,我们知道 4k+3 型正整数肯定不是两平方数之和(仍然是模 4 分析余数)。 4k+1 型正整数是否一定是两平方数之和?试验发现有反例(例如 21 )。分解素因数发现, 21=3*7 ,两个素因数都是 4k+3 型的。我们需要研究含有 4k+3 型素因数的正整数的性质。

我们要证明这样一个性质:若 p 是 4k+3 型素数,则有

右边推左边是显然的。如果已知左边推右边,先用反证法,假设右边不成立,则 a,b 有一个不是 p 的倍数,容易得到另一个也不是 p 的倍数。然后就可以用费马小定理了。

到这里显然矛盾了。注意第 4 行用到了 p 为 4k+3 型素数的条件(否则右边没有负号)。我们立即推出,p^2 也是 a^2+b^2 的约数,而且 (a^2+b^2)/p^2=(a/p)^2+(b/p)^2 也是两平方数之和。

接下来我们讨论两平方数之和的问题,若某个正整数含某个 4k+3 型素因子 p ,并且 p^2 不整除该正整数,则该正整数不是两平方数之和;否则若 p^2 整除该正整数,则该正整数是两平方数之和,等价于该正整数除以 p^2 后仍然是两平方数之和。

结论:某个正整数是两平方数之和,当且仅当该正整数的所有 4k+3 型素因子的幂次均为偶数。

考虑一个加强版的问题:哪些正整数可以表示成两个互素的平方数之和?容易想到的是,这类正整数决不能含有 4k+3 型素因子(否则的话,这两个平方数也必须是该素因子的倍数,它们不可能互素)。不过,不含 4k+3 型素因子的正整数也并不是都可以(例如 4,8 )。事实上,所有 4 的倍数都不行,否则的话模 4 分析可得两个平方数均为 4 的倍数,它们不可能互素。

现在我们只剩下两类数要考虑:

1.只含 4k+1 型素因子的奇数。

2.只含 4k+1 型素因子的奇数的二倍。

下面证明第一类数都是两互素平方数之和。为此,先用归纳法证明 4k+1 型素数的正整数次幂是两互素平方数之和。设 p 为 4k+1 型素数,我们已经证出来 p 是两平方数之和,容易证明这两个平方数是互素的。

假设 p^k 被表示成了两互素平方数之和:

则我们可以将 p^(k+1) 表示为:

假如该表示不符合两平方数互素的要求,设 au+bv,av-bu 的最大公约数为 d(d>1) ,则有 d|p^(k+1) ,容易得到 d 是 p 的倍数,也就是说 au+bv,av-bu 都是 p 的倍数。反过来,如果 au+bv,av-bu 不是 p 的倍数,那么该表示必然符合要求。

同时我们也可以看到,由归纳假设, p^k 和 p 的平方和表示都是合格的,也就是说 a,b,u,v 均不是 p 的倍数。

事实上,如果 au+bv,av-bu 确实是 p 的倍数,那么我们把这两个数换成 au-bv,av+bu ,这两个数都不是 p 的倍数(否则的话,它们都是 p 的倍数,那么 2bv=(au+bv)-(au-bv) 也是 p 的倍数,这与 b,v 均不是 p 的倍数矛盾)。所以我们总是可以找到两个互素的平方数。

接下来证明所有只含 4k+1 型素因子的奇数都是两互素平方数之和。为此我们先把它分解为若干个单素数幂,它们两两互素,由刚才的结论,可以把它们分别表示为两个互素平方数之和。然后再把它们乘起来。

我们证明这个结论:若 n=a^2+b^2,m=c^2+d^2 ,且 (n,m)=(a,b)=(c,d)=1 ,则

证明比较简单,设待证的最大公约数为 g ,则

所以说,只要互素的数 n,m 都是两互素平方数之和,则 nm 也是两互素平方数之和。这样我们就证完了。

对于第二类数(只含 4k+1 型素因子的奇数的二倍),设其中一个数为 2n ,则 n 是只含 4k+1 型素因数的奇数,于是存在 n=a^2+b^2 ,其中 a,b 互素。显然 a,b 一奇一偶。把 2n 写成 (a+b)^2+(a-b)^2 ,则有

于是这种表示是满足要求的。

结论:某个正整数是两互素平方数之和,当且仅当该正整数不含 4k+3 型素因子且不被 4 整除。

x^2+y^2=N的整数解?的更多相关文章

  1. x+y+z=n的正整数解

    题:x+y+z=n,其中(n>=3),求x,y,z的正整数解的个数根据图象法:x>=1,y>=1,x+y<=n-1

  2. MT【228】整数解的个数

    求方程$x+y+z=24$的整数解的个数,要求$1\le x\le 5,12\le y\le 18,-1\le z\le12$ 解:设$a_r$是方程$X+Y+Z=r$的满足上述要求的整数解的个数,那 ...

  3. POJ 1061青蛙的约会。求解(x+mT)%L=(y+nT)%L的最小步数T。

    因为是同余,所以就是(x+mT)%L-(y+nT)%L=0.可以写成(x-y+(m-n)T)%L=0.就是这个数是L的倍数啦.那么我可以这样x-y+(m-n)T + Ls = 0.就可以了,s可正可负 ...

  4. ex_gcd求不定方程的最小正整数解

    #include<bits/stdc++.h> using namespace std; int gcd(int a,int b) {return b?gcd(b,a%b):a;} int ...

  5. LeetCode1237找出给定方程的正整数解

    题目 给定方程f和值z,找出给定方程f(x,y)=z的正整数解x,y.f(x,y)关于x.y都是严格单调的. 题目保证 f(x, y) == z 的解处于 1 <= x, y <= 100 ...

  6. TopCoder SRM 639 Div.2 500 AliceGameEasy

    题意: 一个游戏有n轮,有A和B比赛,谁在第 i 轮得胜,就获得 i 分,给出x,y,问A得x分,B得y分有没有可能,如果有,输出A最少赢的盘数 解题思路: 首先判断n(n+1)/2 = (x+y)是 ...

  7. POJ 1061青蛙的约会(拓展欧几里德算法)

    题目链接: 传送门 青蛙的约会 Time Limit: 1000MS     Memory Limit: 65536K Description 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见 ...

  8. poj2115-C Looooops(扩展欧几里德算法)

    本题和poj1061青蛙问题同属一类,都运用到扩展欧几里德算法,可以参考poj1061,解题思路步骤基本都一样.一,题意: 对于for(i=A ; i!=B ;i+=C)循环语句,问在k位存储系统中循 ...

  9. poj1061-青蛙的约会(扩展欧几里德算法)

    一,题意: 两个青蛙在赤道上跳跃,走环路.起始位置分别为x,y. 每次跳跃距离分别为m,n.赤道长度为L.两青蛙跳跃方向与次数相同的情况下, 问两青蛙是否有方法跳跃到同一点.输出最少跳跃次数.二,思路 ...

随机推荐

  1. 《转载》深入理解 cocos2d-x 坐标系

    原文地址:http://www.cnblogs.com/lyout/p/3292702.html. 首先我们添加两个测试精灵(宽:27,高:40)到场景里面: CCSprite *sprite1 = ...

  2. 改变HTML中超链接的显示样式

    更详细的内容请参考:http://www.w3school.com.cn/tags/tag_a.asp HTML中的代码如下: <a class="news_title" t ...

  3. python学习第二天 --变量及其字符串

    python变量: 在计算机程序中,变量不仅可以是数字,还可以是任意数据类型. 在Python程序中,变量是用一个变量名表示,变量名必须是大小写英文.数字和下划线(_)的组合,且不能用数字开头. 在P ...

  4. HBase架构深度解析

    原文出处: DLevin(@雪地脚印_) 前记 公司内部使用的是MapR版本的Hadoop生态系统,因而从MapR的官网看到了这篇文文章:An In-Depth Look at the HBase A ...

  5. C语言读写伯克利DB 4

    因为缓存数据的buffer总是不够大(会引起段错误)索性从堆上拿了两块大内存 /* 功能说明:逐日存储来访用户(使用伯克利DB) 根据存储的用户信息确定某用户是否是首次来访用户(未被存储的伯克利DB) ...

  6. sgu Kalevich Strikes Back

    这道题就是求一个大矩形被n个矩形划分成n+1个部分的面积,这些矩形之间不会相交,可能包含.. #include <cstdio> #include <cstring> #inc ...

  7. Keil 中关于C语言编译生成汇编代码函数名规则

    在keil 中 C语言的函数有带参数和不带参数之分. 一般的资料里说fun(void)类型的函数不带参数,所以,keil编译器生成的汇编的调用地址(函数名) 为fun.这没有错.事实上,不管C语言的函 ...

  8. shell下有操作json对象的库

    http://kernelpanic.im/blog/2012/03/08/shell-manipulate-json/ Json.org推荐了两个:Jshon和JSON.sh 其中JSON.sh是完 ...

  9. MCM1988 问题B_lingo_装货问题

    两辆平板车的装货问题有七种规格的包装箱要装到两辆铁路平板车上去包装箱的宽和高是一样的但厚度(t,以厘米计)及重量(,以公斤计)是不同的.下表给出了每种包装箱的厚度重量以及数量每辆平板车有10.2 米长 ...

  10. 【CF 549G Happy Line】排序

    题目链接:http://codeforces.com/problemset/problem/549/G 题意:给定一个n个元素的整数序列a[], 任意时刻对于任一对相邻元素a[i-1]. a[i],若 ...