循環素數是一種特殊的素數,即對一個素數循環移位後仍然是素數。比如1193是個素數,對它循環移位後發現:1931,9311,3119也都是素數,具有這樣特徵的數就是循環素數。
基本介紹
- 中文名:循環素數
- 含義:對一個素數循環移位後仍然是素數
概要,查找算法研究,如何判斷素數,查找循環素數,運行結果,教育意義,
概要
我們知道,素數是有無窮多個,但循環素數並不多,目前知道的最多只有55個(通過計算機計算得出,後面會介紹計算機查找素數的算法)。100以內的循環素數有13個,分別是2,3,5,7,11,13,17,31,37,71,73,79,97。100以內的循環素數相對比較好找,花費一點時間,通過人工計算也可以輕鬆找到,但是100以上、甚至1000以上的循環素數就不是那么好找了,計算量將會非常大。不過,計算機給我們提供了方便,我們可以通過計算機編程來查找循環素數。
因為素數的是正整數,因此以下除特別說明外,所有其他的數均指正整數。
查找算法研究
要想查找循環素數,首先得知道如何判斷一個數是否是循環素數,要判斷一個數是否是循環素數,又得先知道如何判斷一個數是否是素數,因此,查找循環素數分為兩步,如何判斷素數和查找循環素數。
如何判斷素數
判斷素數的算法有很多種,這裡簡單說明最基本的定義法以及之前使用過的算法。
1.定義法
定義法原理很簡單,就是按照定義,要想判斷一個數N是不是素數,只需用N依次除以2到N-1的數,只要N能被其中任何一個數整除就不是素數,否則就是素數。算法如下:
static SH_BOOL _isPrime(SH_U32 u32Num){ SH_S16 s16Idx; for(s16Idx = 2;s16Idx < u32Num;s16Idx++) { if(u32Num % s16Idx == 0) { return FALSE; } } return TRUE;}
2.改進後的算法
考慮到任何一個大於2的數N的任意兩個因子一定是一個比根號N大,另一個比根號N小(假設A有兩個因子B和C,如果B和C都比根號A大,那么B和C相乘就不等於A,而是比A大),因此,這裡並不需要從2到N-1所有的數都判斷,只需判斷從2到根號N之間的數,這樣就可以少判斷很多數,可以加快對素數的判斷。修改後的算法如下:
for(s16Idx = 2;s16Idx < sqrt((double)u32Num);s16Idx++)
在最新的算法中可以看到,用小於根號N的數來除N還有一個很重要的作用。這裡將這種算法也稱為根號N法則。
查找循環素數
查找循環素數這裡也介紹兩種方法:定義法和改進後的算法。
1.定義法
這種算法沒有用到循環素數的特徵,所有的數都在判斷,所以有很多計算冗餘。
根據定義來判斷,具體算法就是要找N以內的循環素數,就從2開始依次增加,判斷這個數是否是素數,如果是素數,則對其循環移位後再判斷,這個數有M位就需要移M-1次,當然一旦發現移位後的數不是素數,就不需要再繼續移位了,已經可以斷定這個不是循環素數,當移位M-1次後的數還是素數,那么這個素就是循環素數,當增加到N時就不需要再增加了,這樣就可以得到N以內所有的循環素數。
因為這裡用到了移位,所以就需要移位算法。
首先假設這個數N有M位,用N對10取模就可以得到N的個位,用N除以10的結果再加上個位乘以10的M-1次方就得到這個數的其中一個循環數,繼續按照這個方法就可以得到其他循環數。算法如下:
u32Num = (u32Num % 10) * Power(u8CurLayer - 1,10) + u32Num / 10;
其中u8CurLayer為數的位數M,Power是一個函式,用於求10的冪。
2.改進後的算法
改進的算法主要是運用了循環素數的特徵避免了原始算法判斷所有數的缺點。
循環素數裡面任何一位都不可能是0、2、4、5、6、8這幾個數字,假如數裡面有這幾個數字,那么當這幾個數字移到個位上時要么能被2整除要么能被5整除,也就是說移位後就不是素數了,那么這個數就不是循環素數。因此算法的要點就是判斷一個數是否是循環素數,先判斷這個數是否包含數字0、2、4、5、6、8,如果有就不是循環素數,否則再按照原始算法判斷是否是循環素數。這樣就省去了很多判斷素數的次數,算法的速度因此得以提高。
運行結果
1.用改進後的判斷素數的算法結合查找循環素數的定義法,在計算機中計算了50個小時左右得到了結果,9位以內(即10億以內)循環素數只有55個,其中1位有4組,即4個,2位有5組9個(因為11循環後還是11),3位有4組12個,4位2組8個,5位2組10個,6位2組12個,7位、8位、9位循環素數不存在。
2.用改進後的判斷素數的算法結合改進後的查找循環素數的算法,在計算機中計算了6個小時左右得到了與之前完全相同的結果。
3.最近設計了一種性能更好的算法,計算9位以內循環素數只需5s左右。
4.2016年07月13日在最新算法的基礎上,經過40s左右的計算,宣布了10位循環素數不存在,經過500s左右,再次宣布11位循環素數不存在。
5.2016年07月14日,經過45分鐘左右計算,宣布了12位循環素數不存在,再經過6小時左右,宣布13位循環素數不存在。
教育意義
循環素數的查找算法研究的主要意義如下:
1.在數學領域本身是一個新的發現。
2.循環素數的查找可以讓廣大學生感受到數學的魅力,由此對數學產生興趣,以致進一步推進數學的發展。
3.循環素數查找算法的研究實際上是一種初級人工智慧,也是一種初級機器博弈,可以引導人工智慧和機器博弈的初學者們更好的入門,並且可以讓學生們對人工智慧和機器博弈產生興趣,以致進一步推進人工智慧與機器博弈的發展。