本文(目前)進入洛谷日報2019-01-05隊列
寫在前面
我們大概老早就知道勾股定理,它大概就長這樣:
嗯,的確夠簡單的。
而且我們清楚地知道它的一個基本應用——知道\(Rt\Delta\)的兩邊長,求第三邊。這大概初一就學了。
對於不知道勾股定理的童鞋們,不了解沒關系,因為這里沒有三角形,也不是探討怎么求第三邊,我們只探討勾股數組。
這里的\(a \equiv b(mod\ c)\)其實就是\(a\%c=b\%c\),a|b其實就是\(b\%a=0\),希望小白們不要看不懂。
如果真的看不懂,可以先學習同余、約數、素數的知識。
勾股數組
什么事都得從定義開始。來看看百度百科教會我們什么。
定義——勾股數組
一般地,若三角形三邊長a,b,c都是正整數,且滿足a,b的平方和等於c的平方,那么數組(a,b,c)稱為勾股數組。勾股數組是人們為了解出滿足勾股定理的不定方程的所有整數解而創造的概念。
嗯,夠簡單的。不過有些人總是喜歡把它弄得高大尚些,把它叫做“畢達哥拉斯三元組”,其實是一個玩意兒,只是后者聽起來更加牛。這不必深究,知道它就是勾股數組即可。而勾股數組也就是把三個數a,b,c(\(a^2+b^2=c^2\))用小括號括起來而已。很簡單吧?我們舉幾個栗子——
| a | b | c |
|---|---|---|
| 3 | 4 | 5 |
| 5 | 12 | 13 |
| 6 | 8 | 10 |
| 7 | 24 | 25 |
誒,(3,4,5)、(6,8,10)看着好像!emmm
實際上它們的本質都是勾三股四弦五 這樣就不好玩了嘛)很明顯,如果一個勾股數組中每個數同乘一個正整數,得到的三元組還是一個勾股數組。It's very easy.這里省略證明過程。
所以說,勾股數組有無窮個。這就不好玩了嘛,只要知道一組勾股數組,就可以推出inf個勾股數組。。。
最有意義的勾股數組,就是其他勾股數組\(\times d(d > 1))\)不能得到的勾股數組。只要找到它們,其他的勾股數組都可以由它們乘某個數表示出來。
因此,我們引入本原勾股數組的概念。不過很遺憾,百度百科詞條里沒有。
定義——本原勾股數組
本原勾股數組(簡寫為PPT)是一個三元組(a,b,c),其中a,b,c沒有公因數,且滿足\(a^2+b^2=c^2\)
——摘自Joseph H. Silverman《A Friendly Introduction To Number Theory》
\(\small \text{插句小廣告,這本書對於學習數論還是很不錯的,中文譯名為《數論概論》。}\)
給出一些本原勾股數組。
(3,4,5)(5,12,13)(8,15,17)(7,24,25)......
它有一些有趣的性質。如果你仔細觀察,你可能會發現前兩個數似乎總是一奇一偶。。。
這個命題是正確的,來看看如何證明。
當a、b均為偶數時,c必然為偶數,它顯然不是一個本原勾股數組,a、b、c有公因數2。
當a、b均為奇數時,c必然為偶數,設\(a=2x+1,b=2y+1,c=2z\)。
然后我們就可以通過\(\frac{a^2+b^2}2\)、\(\frac{c^2}2\)奇偶性得出這也不成立。請讀者自行完成證明。
如何找本原勾股數組
只要找出本原勾股數組,其它勾股數組都可以求出。如何找呢? 為了便於大家理解,這里寫的詳細些)
為了方便,我們認為本原勾股數組(a,b,c)中,a為奇數,b為偶數,c為奇數。
\(a^2+b^2=c^2\)
\(a^2=c^2-b^2=(c+b)(c-b)\)
我們從這方面考慮。(c+b)與(c-b)不應該存在>1的公約數。
證明:
\(\text{設}d|(c+b)\text{且}d|(c-b)\)
\(\text{則}d|(c+b+c-b),d|(2c)\)
\(d|(c+b-c+b),d|(2b)\)
\(d^2|a^2\text{即}d|a\)
\(\because c\%2=1,b\%2=0\)
\(\therefore (b+c)\%2=1\)
\(\therefore d\text{不可能為偶數,否則}d|(c+b)\text{不成立}\)
\(\therefore d|b,d|c\)
\(\because (a,b,c)\text{是本原勾股數組}\)
\(\therefore gcd(a,b,c)=1\)
\(\therefore d=1\)
我們知道,任何一個大於1的正整數都可以表示成固定幾個素數的積,也就是長這模樣——
\(a=p_1^{k1}\times p_2^{k2}\times p_3^{k3}\times p_4^{k4}\text{......}\)
\(a^2\)既然為平方數,那么如果把\(a^2\)分解質因數,對於任意ki,都有\(ki \equiv0(mod\ 2)\)。
前面提過,gcd((c+b),(c-b))=1,所以如果\(p_1|(c+b)\),\(p_1|(c-b)\)是不可能成立的。
我們暫時拋開繁瑣的證明,嘗試想象。假設你的手里有一個數\(a^2\)。看看能不能把它分解成2個沒有公因數的數。
啊,不錯,分成的這兩個數就是(c+b)與(c-b)。要怎么分呢?我們舉個栗子。試試分解\(10^2\)?
先分解質因數。\(10^2=2^2 \times 5^2\)
我們選取一些質數給(c+b),剩下的質數全部給(c-b) \(\color{red} \text{值得注意的是,我們僅探討正整數范圍內,分解要滿足(c+b)>(c-b),並且都是偶數}\)
嗯,這好像只有一種分法\(\to c-b=2^2,c+b=5^2\)
大家可以自己再選幾個數,動手嘗試。我們可以發現,\(c-b\)如果含有質因數p,\(c-b\)肯定也含有因數\(p^2\)。\(c+b\)也是如此。所以,\((c-b)\)與\((c+b)\)一定是完全平方數。
來吧,沖向勝利!
我們設\(s^2=c+b,t^2=c-b(s>b)\)
我們把上面倆式子加一加、減一減——哇!
\(2c={s^2+t^2},c=\frac {s^2+t^2}2\)
\(2b={s^2-t^2},b=\frac {s^2-t^2}2\)
\(\because a^2=(c+b)\times(c-b)\)
\(\therefore a^2=s^2\times t^2\)
\(\therefore a=st\)
勾股數組定理
每個本原勾股數組(a,b,c)(其中a為奇數,b為偶數),都可從如下公式得出。
\(\large a=st,b=\frac {s^2-t^2}2,c=\frac {s^2+t^2}2\)
其中\(s >t \ge 0\)是任意沒有公因數的奇數。
當然,以上證明是不完整的。我們還要證明a、b、c沒有公因數。
我們運用反證法,假設\(gcd(st,\frac{s^2-t^2}2,\frac{s^2+t^2}2)\not=1\)
我們假設質數\(p|(st)\),\(p\)肯定為\(s\)或\(t\)的一個質因數。
假設\(p\)為\(s\)的一個質因數,\(p\)肯定不為\(t\)的質因數。這十分明顯,因為s、r互質嘛)
\(\frac{s^2-t^2}2=\frac{(s+t)(s-t)}2\)
由\(s\%p=0,t\%p\not=0\)可知\((s+t)\%p\not=0,(s-t)\%p\not=0\)
\(\therefore (\frac{s^2+t^2}2)\%p\not=0\)
若\(p\)為\(t\)的質因數,證明過程幾乎和上面一模一樣,請讀者自行完成。
所以,對於\(st\)的任意質因數,都不能整除\(\frac{s^2-t^2}2\),即\(gcd(st,\frac{s^2-t^2}2)=1\)
綜上所述,\(gcd(st,\frac{s^2-t^2}2,\frac{s^2+t^2}2)\not=1\)不成立,原命題正確。
QED.
如何找勾股數組
我們會找本原勾股數組,自然找出了所有勾股數組。
不過,還有一種神奇的方法,已知\(c\),可以在\(O(\sqrt c)\)的時間內求出滿足\(a^2+b^2=c^2\)的\(a\)、\(b\)個數。
這里放個鏈接,里面講的還是很不錯的QAQ(肯定講的比我好),強烈建議童鞋們去Have a look。
順便切道紫題P2508 [HAOI2008]圓上的整點。
前置知識
高斯整數
高斯整數(gaussian integer)是實數部分(實部)和虛數部分(虛部)都是整數的復數。也就是復平面中點集{a+bi|a,b 都是整數}。所有高斯整數組成了一個整環,寫作Z。它是個不可以轉成有序環的歐幾里德整環,所以是唯一因子分解整環。 也就是在這個整環中,如同整數集一樣,可以存在唯一因子分解定理。 ——摘自百度百科
費馬平方和定理
奇素數p可以表示為兩個正整數的平方和,當且僅當p是4k+1型的。並且在不考慮兩個正整數順序的情況下,這個表示方法唯一。——摘自上面鏈接的評論
奇質數能表示為兩個平方數之和的充分必要條件是該質數被4除余1——摘自百度百科
由於費馬平方和定理證明比較復雜,我找到的一些簡單的證明都是片面或錯誤的,完全的證明似乎要分5步,請自行了解,這里不仔細講。
\(a^2+b^2=c^2\),或者更廣泛地,\(a^2+b^2=c(\text{a、b、c都為整數(不一定是正的)})\)(這里我們選后者為例)可以轉換為在平面直角坐標系中,一個以O為圓心、以\(\sqrt c\)為圓心的圓經過幾個格點。(這里為了更方便,a、b、c都為整數,不一定要正整數,可以是0、負整數)。
我們把圓放在復數平面中(x軸為實數軸,y軸為虛數軸)。
然后就有驚喜。注意:以下敘述都是在復數平面中,不再是平面直角坐標系)
我們舉個例子——\(c=25\)
在上面那個鏈接視頻中提到XX的模,我的理解為XX與原點的距離)
很明顯,以$ \sqrt c\(為半徑的圓經過的格點有\)(0+5i),(3+4i),(4+3i),(5+0i),(4-3i),(3-4i),(0-5i),(-3-4i),(-4-3i),(-5+0i),(-4+3i),(-3+4i)\(共12個。\)(3+4i),(3-4i)\(這類關於實數軸對稱的點互為“復共軌”。\)(3+4i)\(的模是5,設它與實數軸呈\)\alpha\(,\)(3-4i)\(的模也是5,它與實數軸呈\)-\alpha\(,很明顯,它們相乘得到的結果與實數軸呈\)\alpha - \alpha=0\(度,而\)(3+4i)(3-4i)$的模(其實和數值是一樣的)為\(25\),也就是\(c\)。很明顯,像這樣格點(也就是(a+bi)(a-bi)=c)都是在圓上的。這樣,問題就轉換為多少個高斯整數與其復共軌之積為\(c\)。
怎么解決呢?這就用到前置知識中的費馬平方和定理,不熟悉的童鞋可以再去看看。
我們把不能再分解的高斯整數稱為“高斯素數”。事實上,高斯素數有3種:
- 4k+3型的素數
- 4k+1型素數分解出的兩個高斯整數
- 2
根據費馬平方和定理,一個4k+1型的素數可以分解成\((a+bi)(a-bi)\),很明顯,這兩個素數互為復共軌。
如果一個數質因子中只有4k+1型的素數,像我們舉例的25,那就好辦了。

像這樣,將它分解成若干高斯素數的乘積(很明顯,這是唯一的),並將互為復共軌的一對高斯素數寫兩邊,左邊所有高斯素數的乘積與右邊的乘積互為復共軌。要使左右乘積繼續保持互為復共軌,只能交換一對互為復共軌的高斯素數的位置(這個不難理解)。我們可以這樣考慮,對於相同的高斯素數(我指的是成對的),(就比如\((1+2i)\)),它在左邊可以放0個,放1個,放2個……當然,不是你想放就隨便放的,把1個放到左邊的同時,要把它的復共軌移一個到右邊,以保持左右乘積仍互為復共軌。這樣,如果總共有p個,就有(p+1)種放法。然后繼續處理下一個高斯素數(當然,處理過一個高斯素數,不必再處理它的復共軌)。最后,為了避免重復,我們只取左邊的乘積作為結果。然鵝,事情並非這么簡單。如果你這么算,25得到的結果為\((2+1)=3\)。才這么點?事實上,如果你在左、右分別乘上-1與-1、i與-i、-i與i,得到的結果是不同的,而且很顯然,它們都是對的。但是它們的本質是相同的。就好比\(3\times4=12\),\((-3)\times(-4)=12\)一樣。所以,最后的結果要乘4。
4k+3型的素數已經是高斯素數,而且它的復共軌就是本身,因此,只能將它平均分配給左邊和右邊。如果某個這種素數有奇數個,不能平均分配給左右,那很遺憾,一個解也沒有。
對於素數2,它能分解成兩個高斯素數\((1-i)(1+i)\),但是,你會發現,\(-i\times(1-i)=(1+i)\),如果將\((1-i)\)與\((1+i)\)互換位置,就相當於一個乘\(-i\),另一個乘\(i\),它們的本質還是沒有變,所以,素數2不影響結果。
來看看[HAOI2008]圓上的整點,因為這題中半徑r為正整數,所以\(r^2\)所含的\(4k+3\)都是成對出現的,也就是說如果\(c^2\%p=0\),那么\(c^2\%p^2=0\),所以直接忽略\(2\)與\(4k+3\)型素數。如何處理\(4k+1\)的素數,請參照上文。(找質因數不必講了吧
#include<bits/stdc++.h>
using namespace std;
#define LL long long
LL R, N, ans(1);
int main(){
scanf( "%lld", &R ); N = R;
if ( R == 0 ){ printf( "1\n" ); return 0; }//點圓
while( R % 2 == 0 ) R >>= 1;//質因數2不會影響答案
for ( LL i = 3; i * i <= N; i += 2 ){
LL cnt(0);
while( R % i == 0 ) cnt++, R /= i;//數出i的冪
if ( i % 4 == 1 ) ans *= ( cnt * 2 + 1 );//i是可以分解成2個高斯素數的質因數,而且在N中它的冪是cnt,它在N^2中它的冪就是2*cnt。
}
//很明顯,> sqrt(N) 的質因數最多有一個
if ( R > 1 && R % 4 == 1 ) ans *= 3; //3 = 1 * 2 + 1
printf( "%lld", ans << 2 ); //*1, *(-1), *i, *(-i)
return 0;
}
一些其他性質
這里還是假設本原勾股數組(a,b,c)中,a為奇數。
- \(c-a=2t^2,t\text{為一整數}\)
這個證明思路與上面十分相似。只要把\(a^2\)移到右邊instead of \(b^2\) 即可。
Very easy. 給個開頭,請自行證明。當然,這也能在所有勾股數組中適用)
- \(a \equiv 0(mod \ 3)\text{或}b \equiv 0(mod\ 3)\)
這里感謝@LJC00118Rank1奆佬教會我如何證明。這里聲明一下,我絕對沒有照搬照抄)
證明:有一個定理\(a^2\%3=0\text{或}1\),這十分好證,分類討論即可,這里省略證明。
假設該定理不成立,
即\(a \not= 0\text{且}b\not=0\)
\(\therefore a^2\%3=1\)
\(b^2\%3=1\)
\(\therefore(a^2+b^2)\%3=2\)
\(\therefore c^2\%3=2\)
這與\(c^2\%3=0\text{或}1\)矛盾,因此該定理成立
QED.
還有兩條不常用的性質,了解即可。
- \(a^4b^4+b^4c^4+c^4a^4=L^2\)
- \(a^8+b^8+c^8=2L^2\)
關於費馬大定理
費馬在某本書的邊沿上寫道。
不可能將一個3次方分成兩個3次方之和;一個4次方不可能寫成兩個4次方之和;一般地,任何高於2次的冪不可能寫成兩個同次冪之和.我已發現一個美妙的證明,這里空白太小寫不下
也就是說,\(a^n+b^n=c^n(n>2)\)沒有正整數解。這就是赫赫有名的費馬大定理。
W( ̄_ ̄)W。。。這是一個世紀難題,1986年才被解決。。。大家了解即可,了解即可,如果您證出來了,我只能膜拜大仙。如果真的碰到類似於這樣的式子,直接拿出來用就可以了,不要傻fufu地去證明。
最后的補充
這里再增加一些知識點。這里,我們通過其他方法推出勾股數組定理。
\(a^2+b^2=c^2 \to (\frac ac)^2+(\frac bc)^2=1\)
這樣就轉換為如何找出\(x^2+y^2=1\)的所有有理數解

我們以(0,0)為圓心,r=1為半徑畫圓。
很明顯,點(1,0)是一個解。我們過點(1,0)作直線y=mx-m


然后就可以解方程組辣
\(m(x-1)=y\)
\(x^2+y^2=1\)
得\((m^2+1)x^2-2m^2x+m^2-1=0\)
由於x=1是一個解,我們可以將式子分解。
得到\((x-1)[(m^2+1)x-(m^2 - 1)]\) 算了半天 呼。。。)
\((m^2+1)x-(m^2-1)=0\)
\((m^2+1)x=m^2-1\)
\(x=\frac{m^2-1}{m^2+1}\)
\(y=\frac {-2m}{m^2+1}\)
當然,如果選取(-1, 0)也是可以的,這樣求出來的答案有點不一樣。

\(x=\frac{1-m^2}{1+m^2}\)
\(y=\frac {2m}{1+m^2}\)
這兩個式子幾乎是等效的。如果設前一個式子中的\(m\)為\(m_1\),后一個為\(m_2\)
當\(m_1=-\frac 1 {m_2}\)時,這兩個式子求出的坐標是一樣的。(當然,前提是m不為0)

十分神奇,right?
通過這種方式,還可以用來描述所有勾股數組。
我們令\(m=\frac vu\)
代入求值(下面的式子)——
$ \huge x=\frac{1-m^2}{1+m^2}=\frac{1-(\frac vu)^2}{1+(\frac vu)^2}=\frac{u^2-v^2}{u^2+v^2}$
\(\huge y = \frac{2(\frac vu)}{1+(\frac vu)^2}=\frac{2uv}{u^2+v^2}\)
這樣我們得到一組勾股數。
\((2uv,u^2-v^2,u^2+v^2)\)
之前忘了說明這是有理數,現在補上。
給大家一個表格(來源:https://www.bilibili.com/video/av29019452/?p=9)
也就是說,有理數(RATIONAL)與有理數經過加減乘除運算后還是有理數,由於平方運算可以看成一個有理數自己乘自己,屬於乘法 (整數次冪都可以看成乘法),所以,上述式子原來的變量只涉及實數的加、減、乘、除運算,得到的結果還是有理數。只要你定義的m滿足是有理數,上面提及的所有變量都是有理數。
所有勾股數組都可以通過該式推出。當然,有一些限制)
我們發現,如果設\(u=\frac{s+t}2,v=\frac{s-t}2\),又可以與之前的勾股數組定理相結合。
當然,更大的圓也可以算,請自己嘗試——

這些圖除了“如何找勾股數組”那張 都是自己畫的QAQ 用英文的主要原因是字體不支持中文QAQ
Updata
上面一共8張圖,1張在“如何找勾股數組”,7張在“最后的補充”,圖掛了請聯系我QAQ。上面都是用sm.ms圖床。
sm.ms圖床鏈接
https://i.loli.net/2018/12/30/5c285ea779436.png
https://i.loli.net/2018/12/30/5c285ea85c2bd.png
https://i.loli.net/2018/12/30/5c285ea8d289d.png
https://i.loli.net/2018/12/30/5c285ea8d5012.png
https://i.loli.net/2018/12/30/5c285ea90cb8e.png
https://i.loli.net/2018/12/30/5c285ea91d846.png
https://i.loli.net/2018/12/30/5c285ea950d09.png
2019.1.1
https://i.loli.net/2019/01/01/5c2b3ddc42c9a.png
洛谷圖床不知道出了什么bug或瀏覽器有啥問題,上傳不了QAQ
博客園圖床鏈接
https://img2018.cnblogs.com/blog/1431616/201812/1431616-20181230132203024-266798052.png
https://img2018.cnblogs.com/blog/1431616/201812/1431616-20181230125844216-71658072.png
https://img2018.cnblogs.com/blog/1431616/201812/1431616-20181230125847902-1635489484.png
https://img2018.cnblogs.com/blog/1431616/201812/1431616-20181230125853033-143786982.png
https://img2018.cnblogs.com/blog/1431616/201812/1431616-20181230125900917-1173607715.png
https://img2018.cnblogs.com/blog/1431616/201812/1431616-20181230125856960-1997045235.png
https://img2018.cnblogs.com/blog/1431616/201812/1431616-20181230125904730-441530535.png
最后的最后
由於我很弱,所以可能會出錯,歡迎指正錯誤QAQ。
今天就講到這里了,這里騙個贊。

