數論 - UVA 10006 - Carmichael Number

UVa 10006 Carmichael Number


問題

密碼學(cryptography)是電腦科學中一個重要的領域,密碼學的演算法常會用到大的質數。然而,要檢查一個大數是否是質數並不是那麼容易。一個窮舉的方法就是檢查所有小於等於其根號的數是否可以被整除。但是這方法所花費的時間及空間還是相當多。然而有一些機率的測試可以低花費得到高可信度。費馬測試(Fermat test)就是其中之一。

令 a 是一個介於 2 到 n-1 的數(在這裡 n 是我們要檢查是否為質數的數),那麼n可能是一個質數,如果以下的式子成立的話:



an mod n = a

如果一個數通過費馬測試許多次,那麼他是質數的機率就很高。不幸的是,有些數不是質數但仍然能通過所有的費馬測試。我們稱這些數為Carmichael numbers。

你的任務就是寫一個程式來檢驗一個數是否是Carmichael number。


* 中文翻譯:Lucky 貓



Input

每組測試資料一列,含有一個整數 n(2 < n < 65000)。n=0代表輸入結束。

Output

對每一組測試資料,輸出其是否為Carmichael number。


Sample Input

1729
17
561
1109
431
0

Sample Output

The number 1729 is a Carmichael number.
17 is normal.
The number 561 is a Carmichael number.
1109 is normal.
431 is normal.

解法


github


先判斷是否是質數, 再利用 UVa 374 Big mod 的技巧, 來加速計算 a ^ n mod n 


a^2 mod m = a * a mod m = ((a mod m) * (a mod m) ) mod m











留言

熱門文章