關於費馬素數與正N邊形
Update:整理後的正文可以直接搜尋#乾淨的總結#,但如果直接看總結部分,可能會丟掉許許多多理解(也可能不會……畢竟我語文沒那麼好)
看了一篇文章,說的是正十七邊形的尺規作圖
嗯,那篇文章,讓我回憶起了一個故事,在本文開始之前,我希望先講講故事——畢竟,如果一個人連自己“為什麼好奇”而疑惑的時候,是不可能真正滿足自己的好奇心的。
問題很簡單,也很不簡單:比較兩個數的大小。
說它簡單是因為,是個人都知道,3比2大,2019比1994大
然而,事情並沒有那麼簡單,比如我們知道“天”跟“地”在計算機裡,都是由某種編碼儲存的——那麼,在utf-8編碼下,天大還是地大??
事實上,我們小時候學的,比較大小的方法,真的是不得了的演算法
——有一個問題叫做離散對數問題(discrete logarithm problem,DLP),這個問題有許多很漂亮但是耗時很長的演算法,歸根結底只是,我們不能透過我們定義的規則比較大小的緣故
……扯遠了,返回“比較大小”吧。
小學一年級的比較大小,是這樣寫的:
對兩個自然數,比較大小的時候先比較它們的位數,位數相等則從最高位開始依次比較,若某一位不相等,這一位較大的數字更大,否則兩數相等
原話忘掉了,但大概是這樣的一個東西。
我背這個,背到了小學三年級,而後遇到了一道題
比較
與無限迴圈小數
我按照那個演算法來了
首先對齊小數點,然後從最高位開始比較,1比0大,演算法結束——
。
當時我氣得不行,差點直接翻出小學一年級的數學書跟老師理論。幸運的是老師很快說服了意志不堅定的我,否則說不得數學考出過69+20(滿分100+20,+20是附加題,只是好看,並不計入排名)的我就要棄理從文了。
誰錯了?
1顯然是等於
的,而小學一年級的數學書也註明了,“對兩個自然數”——顯然
在大多數人眼中不是自然數(然而……這個數等於1,1是自然數,所以
是自然數……這是我剛剛想到的……簡直有毒)
——能記住的,只有那時候老師用的9x=9那種證法,我忘記了有沒有用過
這個證法——但我個人更傾向這種證法,哪怕對文科生,只要你讓ta指出
的小數表示形式,ta基本就明白這兩個數字相等了——而對文科生,(10-1)x=9。000000。。。這種證法很可能超出了50%文科生的數學理解能力。
有時候我真的很不信任大學以下的教科書(大學教科書只有印刷錯誤,但大學之下的教科書並不是這樣。)原因很簡單,我們費盡千辛萬苦學到的,很可能是錯的——而正因為它們處在更靠前更容易理解的位置,我們反而容易因此,在理解了書作者想要我們理解的一切的同時,收穫許多本不應該收穫的誤解。
——那又有什麼關係呢?你的小學很好,於是你上了一個好初中,於是你上了一個好高中,結果,高考失利——哪怕你知道,高考失利是小學初中老師的沉痾弊疾積重難返——那又如何?難道你還能去小學老師那裡,理直氣壯地說,“都是你沒教好我”嗎?
有一種錯覺叫做“我會”——因為很多人把“我會”等同於“我明白”,就比如,每個人都會玩dota之類的遊戲——哪怕你沒接觸過,你也會操控英雄,衝出兵線,跑到對方防禦塔下,然後被對方英雄擊殺——然而,這樣的“會”,又怎麼能真正的,等同於“明白”呢?
這一次,我想寫的,則是,明明白白的Fermat素數與正N邊形的關係。
說實在的,理解這一堆東西,並不容易,如果你只是想,像“學會如何比較大小”一樣,“學會如何做正十七邊形”,你們可能還需要自己補充“如何用尺規開根號,做乘除法”這件事。如果你已經學會了正十七邊形的做法,而想知道更靠後的,比如正二百五十七邊形的做法,讀這篇文章,正當時。
當然,如果你其實感興趣的是正65537邊形……你可以直接讀論文了,這篇文章對你而言,或許,太過淺顯了一些。
Gauss的工作,其實是相當漂亮的
然而,在理解這種漂亮之前,我們必須先認識幾個漂亮的事物,比如同餘,比如原根。
為什麼會出現這兩個東西呢?因為,三角函式,本來就是自帶一個“求餘數”功能的,兩個除以
“餘數”相同的數字,它們的三角函式值也是相同的——這便是“同餘”的意義,歸根結底只是簡化計算而已。
至於為什麼我說“求餘數”,大約是,我們在算比如
的時候,我們可以看作是在計算
,所有除以
的“餘數”是
的數字,它們的餘弦值都會等於
,由於大家都是除以
難以分辨,我們不妨寫成把這類數字率先除以
——然後我們就看到了這類數字的真面目:除以
之後得到的結果是,【除以7餘1】
為了不羅索,接下來的討論將不涉及
這個煩人的東西。
原根,在說這個概念之前,我們需要複習另一個概念,既約剩餘系,或者,簡化剩餘系。
這些,對初學者來說過於複雜,如果有興趣可以看一看“費馬小定理”嗯,就是“費馬大定理”的那個費馬,這是他提出的小定理——看完這個小定理,就可以學原根的相關知識了。
原根,是一種,對每一個素數都存在的神奇數字,比如3就是17(以及所有費馬素數)的原根
我們會發現,3的1到16次方除以17的餘數互不相同,而且3^16除以17餘數恰好是1
20:07:45> a=Vec(0,16);for(i=1,16,a[i]=3^i%17);a
%1 = [3, 9, 10, 13, 5, 15, 11, 16, 14, 8, 7, 4, 12, 2, 6, 1]
有定理證明原根對所有素數都存在(不一定好找,卻很好構造)
對費馬素數,有人證明了3一定是費馬素數的原根(可能不好證,我不知道證明,但這是細節問題,下文的3可以換成任何一個原根)
Gauss做正17邊形的做法很簡單——只要尺規做出長度為
的線段,一切問題迎刃而解,而事實上這個數值等於
的確是一個根式——emmm,這就是最流氓的證明方法。
而解釋這個根式是怎麼來的,以及其他的素數為什麼得不出類似公式,便是這篇文章的內容。
首先,Gauss注意到了,對
這個式子的和等於-1,這個可以用
這個方程,以及韋達定理,以及尤拉公式,以及上面那一坨其實就是
+
+。。。一直加到
,推出這一坨的和等於-1真的是相當容易的,甚至對於那些不是費馬素數的數字,我們已然可以推出一個類似的等式。
這時候,天才的Gauss想到,我們能否把這組數字分成a與b,然後把a跟b分別求出來呢?
——事實上,如果知道兩數和,知道兩數積,求出這兩個數字是相當容易的事情,在這裡,困難的只是,
推出它們的乘積
。
事實上,“乘積”才是“費馬素數”這個條件的關鍵——不理解“乘積”,便不能理解“費馬素數”。
而乘積,處理方法只是,和差化積
其實有時候,問題比你想象得簡單很多
只要肯算,就能算出來
然而不算,或者看到“肯算就有答案”所以“勞資不算了”
——後面這個,才是數學認知的最大障礙。
還記得題目一開始的那個問題嗎?
有些時候,有些東西,只有親手算一遍——或者至少看人家算一遍,才能理解。
慢慢算,不急,能看到這一行的,大多時間比知識更寬裕些。
我們要用的,只有這一個公式:
cos(m+n)+cos(m-n)=2cos(m)cos(n)
不知道,有沒有人原意,把這個式子裡面的m跟n乘以9
cos(9(m+n))+cos(9(m-n))=2cos(9m)cos(9n)
看上去變了
看上去沒變
變的是數字,不變的是形式。
不變的,是對稱。
——又有沒有人,把那一坨和為-1的數值,乘個9呢?
3變成了10,10變成了5,5變成了11,11變成了14,14變成了7,7變成了12,12變成了6,6變成了3,3——我們轉了一圈,哦,不對,是轉了半圈,便轉了回來。
如果我們把3,10,5,11,14,7,12,6這8個數字拎出來,剩下八個數字放一組,又會得到什麼呢?
remark:你們看到的8,4,2,1(如果你們看到了)可能並不是巧合,而很可能是“3是原根”的某個證據。
這一坨東西的和仍然是-1,而它們的乘積呢?
這坨東西,cos裡面乘9相當於不乘——於是它們和差化積的結果,也應該是“乘9等於不乘”的那種
說明了什麼?——很顯然,這說明了,和差化積之後得到的cos(m*2pi/17),與cos(9m*2pi/17)的係數是相同的。
係數相同,這是很重要的一點。
還記得剛剛轉的那個“半圈”嗎?只要我們算出“半圈”裡面的一個數字的係數,我們就算出了這“半圈”裡面全部數字的係數。
和差化積,免不了
然而,我們完全可以把這件事做得更簡單一些——或者更簡單一些,我們乘3
乘3會改變這兩部分的值——或者說,不算改變,因為乘3只是做了交換。
兩部分交換了,乘積卻沒有變,也就是,兩個“半圈”的係數應該是相等的
——也就是說,你和差化積之後生成的那些項,
至少在這一步
,是相等的
Remark2:之後就未必相等了
和差化積之後,我們算出,這兩部分的乘積,於是可以算出這兩部分的值
不知道你們有沒有注意到,這兩個“半圈”,會出現在下一步和差化積之中,而下一步的“交換”,可以保證下一步中的“半圈”係數都相等,也就是,在做和差化積之後,你不會尷尬地發現,化出來的結果你不知道等於多少。
Gauss就這樣一步步把結果化出來了
至於為啥Gauss沒在論文裡給出一個正十七邊形……難道你還想讓Gauss順手畫一個正65537邊形嗎?
最後,為了防止大家覺得我是在瞎寫,給幾個係數好了
正257邊形
l31 l35 - (2*l21 + 5*l22 + 4*l23 + 5*l20) // N
1。42109*10^-14
在正257邊形化簡的第三步,出現了若干個1/4圈,這4個圈的係數分別是2,5,4,5
——四個1/4圈的係數並不相等,但在圈的內部,所有項都是一樣的
所以,我們可以計算出名叫l31跟l35這兩個1/8圈的乘積為(2*l21 + 5*l22 + 4*l23 + 5*l20)
和差化積時候手賤乘3乘9,只是為了防止圈內的係數不相等的。
否則,如果你算出來一個類似l31跟l35這兩個1/8圈的乘積為(2*l21 + 5*l22 + 4*l23 + 5*l20)+Cos[6pi/257]-Cos[11pi/257]之類的結果……就算Gauss在世人家也救不了你的。
Gauss所做的一切只是,找到了一個迭代的二分演算法,不斷地將cos(i pi/k)分成兩組並藉助方程分別求出每一組的值:
說具體一點,對Fermat素數p,如果記
,那麼
且
為集合
中元素的有理係數的線性組合。
證明
相當容易,我們只需要對比一下兩邊係數是否一致。
計算
,需要注意到這樣一個事實:
如果記
那麼
,
從而
注意到
(*)
如果記積化和差之後的結果
那麼
(這是將(*)作用在上一式的結果)
由於c是積化和差的結果是整數,由此比較係數可知,
,將全部相等的ci拿出來,可以看出,組成的係數恰好是
的各項,從而可以設
這裡Cm的演算法,仍然還需要求助手動積化和差,但……算到這裡之後,剩下的部分都是已知的與體力活,是可以手算出結果的——到這裡,我們就完成了理論部分的推導。
事實上,如果不要求尺規作圖,或者允許三等分角,那麼只要是
素數,我們應該可以畫出正
邊形,思路還是一樣,藉助Vieta定理湊三數和,三數積與兩兩積的和,之後用一個類似(*)的公式(那裡面的3需要換成另一個有意義的原根)保證湊出來的結果都是已知結果的線性組合,就可以計算了
——至於這個的證明,就留作習題吧……