2.6 素數表達式
著名的哥德巴赫猜想的1+1,實際上就是把偶數寫成兩個素數之和,無疑是素數表達式的簡單形式。本節將編程在指定區間驗證這一著名猜想。
同時,在素數世家中,有關產生素數的歐拉表達式與勒讓德表達式曾在歐洲引起轟動。本節通過編程驗證這兩個著名素數表達式,并探索新的素數表達式。
2.6.1 哥德巴赫猜想
1. 背景簡介
德國數學家哥德巴赫(Goldbach)在寫給歐拉的信中提出了以下猜想:任何大于2的偶數都是兩個素數之和。
兩個多世紀過去了,這一猜想既無法證明,也沒有被推翻。
如果把命題“任一充分大的偶數都可以表示為一個素因子不超過a個的數與另一個素因子不超過b個的數之和”記作a+b,則哥德巴赫猜想即為1+1。
摘錄證明哥德巴赫猜想a+b的簡要進程如下所示。
1920年,挪威數學家布朗證明了9+9,離目標1+1相距甚遠。
1956年,中國數學家王元證明了3+4至2+3,離目標1+1近了些許。
1962年,中國數學家潘承洞證明了1+5,王元證明了1+4,首次出現了1,離目標1+1進一步拉近了。
1966年,中國數學家陳景潤證明了1+2,即“任一充分大的偶數都可以表示為一個素數與另一個素因子不超過2個的數之和”,已經很接近目標1+1了。
由以上進程可見,中國的數學家在哥德巴赫猜想的證明中做出了巨大的努力并取得了一系列舉世矚目的成果。
陳景潤先生的1+2結論發表已經過去50多年,至今還沒有出現更進一步的結果。也就是說,此進程還停留在1+2,哥德巴赫猜想至今還是一個猜想。
試設計程序驗證指定區間[c,d]上哥德巴赫猜想是否成立:
如果區間上的偶數能分解為兩個素數之和,則輸出該分解和式;
如果區間上某一偶數不能分解為兩個素數之和,則輸出該反例,推翻哥德巴赫猜想。
2. 驗證設計要點
為了擴大驗證哥德巴赫猜想的區間范圍,把變量設置為雙精度實型。
對于[c,d]上的所有偶數i,分解為奇數j與k=i-j(j=3,5,…,i/2)之和。用試商判別法分別對奇數j,k是否為素數進行檢驗判別:
若j或k不是素數(標記t=1),則j增2,用一組新的奇數j,k再試;
若j與k都是素數(保持標記t=0),則偶數i找到分解式i=j+k。
若某一偶數i枚舉的所有奇數分解情形都不是兩個素數,即已找到推翻了哥德巴赫猜想的反例,打印反例信息(作為完整的驗證程序設計,這一步驟不能省,盡管其出現的可能性微乎其微)。
3. 驗證哥德巴赫猜想程序設計

4. 程序運行示例與說明

驗證僅僅只是驗證,并不能代替哥德巴赫猜想的證明。
某一區間的驗證只能說哥德巴赫猜想在該區間成立,不能據某一區間的驗證斷言哥德巴赫猜想成立。
但驗證程序若找出某一不能分解的反例,只要一個反例就足可以推翻這一猜想。
2.6.2 歐拉與勒讓德表達式
素數的個數是無窮的,是否存在一個表達式,能表達出所有素數?
這當然是不可能的。那么,退一步,能否找到一個表達式,能表達出部分素數?
于是,一場漫無邊際的尋找素數表達式的風潮盛行于整個歐洲數百年。
1. 素數表達式的背景
在尋找素數表達式的進程中,很多數學家積極參與其中,成果卓著,影響深遠。有成功的,也有失敗的。
(1)歐拉表達式。
早在1772年,數學家歐拉發現,當x=0,1,…,40時,表達式y=x2-x+41的值都是素數。
歐拉的這一表達式推出,引發了關于素數多項式的深入探求。
(2)勒讓德表達式。
在歐拉表達式面世的20多年后,數學家勒讓德于1798年發現,當x=0,1,…,28時,二次多項式y=2x2+29的值都是素數。
我們當然有理由質疑,這些表達式真有這么神奇嗎?
下面,我們設計一個簡單的程序,具體驗證這兩個素數表達式的結論。如果能找到一個反例推翻這些表達式,那也是大功一件。
2. 驗證歐拉表達式與勒讓德素數表達式設計要點
設2次3項式為ax2+bx+c,通過兩個多項式項目p的選擇,分別落實這兩個多項式的3個參數a,b,c值。
(1)歐拉表達式。
參數取a=1,b=-1,c=41。
為了驗證歐拉表達式y=x2-x+41,當x循環取值0~40時,計算y的值。為了通過試商判別法判別y是不是素數,設置k=2,3,…,的試商循環。
若y不能被k整除(保持t=0),則說明y是素數,并標注“素數”。
若循環x(0~40)中的所有y都為素數,則完成歐拉表達式驗證。
否則,如果存在某一y能被k整除(t=1),找到y為“非素”的反例,打印y的因數分解式y=k?(y/k)后退出,則說明歐拉表達式不成立。
(2)勒讓德表達式。
參數取a=2,b=0,c=29。
同樣,驗證勒讓德表達式y=2x2+29,當x取值為0~28時y的值是否都為素數。
如果循環x(0~28)中的所有y都為素數,完成勒讓德表達式驗證。
如果存在某一y不是素數,則輸出因數分解式,說明勒讓德表達式不成立。
3. 驗證素數多項式程序設計

4. 程序運行結果與說明

程序驗證了當x=0,1,…,40時,歐拉表達式y=x2-x+41的值均為素數。
也驗證了當x=0,1,…,28時,勒讓德表達式y=2x2+29的值也均為素數。
既然是驗證程序,那么其中輸出“反例”的語句不能省略。
歐拉表達式與勒讓德表達式的相繼問世,在世界各地引發了關于素數表達式的廣泛探求。
其中,有資料介紹:“畢格爾發現二次式x2-x+72491對于x=1,2,…,11000都產生素數,這個紀錄至今沒人打破。”
這一結論可簡單驗證為假。
例如,取x=1,二次式的值為72491=71×1021;
又如,取x=5,二次式的值為72511=59×1229。
在華羅庚教授的《數學歸納法》(見《華羅庚科普著作選集》,上海教育出版社,p110)上有“當n=1,2,…,11000時,式子n2+n+72491的值都是素數。”
這一結論也不成立,可能是筆誤造成的。
設f(n)=n2+n+72491,則在n≤10范圍內就有5個不是素數:
f(4)=72511=59×1229
f(5)=72521=47×1543
f(8)=72563=149×487
f(9)=72581=181×401
f(10)=72601=79×919
那么,是否還存在新的素數多項式?
2.6.3 創建素數表達式
1. 素數表達式定義與設計要點
定義2次3項式y=ax2+bx+c為素數表達式:當x=0,1,…,c-1時,函數y的值都是素數。
因此,如果2次3項式y=ax2+bx+c為素數表達式,則只有當c為素數,且x取值為[0,c-1]時,所對應的y值全為素數。
在編程時,用變量統計某一表達式生成的素數個數,只有當素數個數為c時,才符合素數表達式定義。
素數表達式的探求與系數a,b,c密切相關。對于同樣的參數a,b,常數項c越大,表達式表達素數的個數就越多。因此,參數c可約定為奇數從大到小枚舉,當找到并輸出一個素數表達式后即行退出c循環,避免探求較小c參數的表達式。
試在一定整數范圍內枚舉a,b,c的值(注意,系數b可為負整數,也可為0),應用試商判別法,探求2次3項式y=ax2+bx+c型的素數表達式。
2. 程序設計

3. 程序運行示例與說明

以上運行輸出中的第1個是歐拉表達式,第3個是勒讓德表達式,其他則是程序探索到的新的素數表達式。
遺憾的是,新的素數表達式所產生的素數個數并不比歐拉表達式或勒讓德表達式所產生的多。
如果修改程序中a,b,c的循環參數,例如,把表達式中一次項系數b修改為[-10,10],則生成的素數表達式會相應增多。