我剛試圖在JavaScript中實現費馬的小定理。我試了兩種方法,a(p-1)mod p = 1和a p p mod p = a mod p。費馬在JS中的小定理
function fermat(a, p) {
return (((a^(p - 1)) % p) === 1);
}
和
function fermat(a, p) {
return ((a^p) % p) === (a % p);
}
它不工作兩種方式,有沒有辦法解決呢?
我剛試圖在JavaScript中實現費馬的小定理。我試了兩種方法,a(p-1)mod p = 1和a p p mod p = a mod p。費馬在JS中的小定理
function fermat(a, p) {
return (((a^(p - 1)) % p) === 1);
}
和
function fermat(a, p) {
return ((a^p) % p) === (a % p);
}
它不工作兩種方式,有沒有辦法解決呢?
在Javascript中^
意味着XOR。對於exponentiation您需要Math.pow(x, y)
。
function fermat(a, p) {
return Math.pow(a, p - 1) % p === 1;
}
而不是^,你需要使用Math.pow
在JavaScript中,克拉(^)是XOR運算符。你想要使用的是Math.pow(x,y)函數,它相當於x^y。
除了^與Math.pow()問題其他人指出,您可能會遇到的下一個障礙 是JavaScript內置數字 類型的有限精度。一旦指數開始變大,您將很快超過可準確表示的Javascript 數字的範圍,因爲如果您希望 使用這樣的例程作爲素數測試,它們將會很快超出範圍。您可能需要查看 支持取冪 的Javascript bignum庫(例如this one)以及任意大整數的模數。
是的,我知道。我已經在Java中實現了Fermat的小定理並得到了非常快速的響應,但是當我試圖讓所有素數達到10k時,我跑出了極限。但是,這只是對jsperf(http://jsperf.com/prime-numbers/4)的測試,它的執行速度幾乎與使用緩存的一些解決方案(50萬個操作循環)一樣快。我很好,結果... – fb55 2010-08-03 20:58:02