我目前正在研究Project Euler,並認爲如果不勉強強迫所有問題,它可能會更有趣(以及更好的學習體驗)。在問題3中,它要求一個數字的主要因素,我的解決方案是將數字分解(使用另一個分解算法),然後測試素數因子。我想出了一個Miller-Rabin Primality測試的代碼(在徹底研究素性測試之後),它對於我輸入的所有複合奇數都是正確的。任何人都可以幫我弄清楚爲什麼?我以爲我已經正確編碼了算法。Java中的Miller-Rabin原始性測試
public static boolean isPrime(long num)
{
if(num % 2 == 0)
return false;
else
{
double d;
int r=0;
while((num-1) % Math.pow(2,r+1) == 0)
r++;
d = (num-1) % Math.pow(2,r);
int[] a = {2,3,5,7,11,13,17,23,31,62,73,1662803};
boolean primality = true;
for(int k = 0; k < a.length; k++)
{
if((Math.pow(a[k],d)-1) % num != 0)
{
for(int s = 0; s < r-1; s++)
{
if((Math.pow(a[k],Math.pow(2,s)*d)+1) % num != 0)
primality = false;
}
}
}
return primality;
}
你試過跟蹤代碼嗎? –
這與你的代碼沒有關係,我也沒有多少專業知識,但「考慮數字(使用另一個代理算法)」是一個難以確定素數的問題。您可以通過獲取素數列表來避免蠻力強制分解。獲得素數列表的最簡單方法就是使用篩子。 – maybeWeCouldStealAVan
'Math.pow(a [k],d)-1)%num' - 我會說你的雙打超出了他們可以表示範圍內的每個整數的範圍。 –