2 回答

TA貢獻(xiàn)1111條經(jīng)驗(yàn) 獲得超0個(gè)贊
AKS 素性測試的實(shí)現(xiàn)僅限于使用 32 位數(shù)據(jù)類型,它可以存儲(chǔ)最多2,147,483,647. 你的號(hào)碼比那個(gè)大很多,所以沒有正確閱讀。
聽起來很容易解決,我們應(yīng)該能夠?qū)⑺谐霈F(xiàn)的int,更改為,long因?yàn)閘ong數(shù)據(jù)類型可以存儲(chǔ)非常大的數(shù)字。不幸的是,這行不通,因?yàn)槲覀內(nèi)匀皇艿?Java 中 32 位數(shù)組的最大大小的限制。因此,不深入研究不安全的內(nèi)存訪問是非常不切實(shí)際的。
如果要檢查大數(shù)字的素?cái)?shù),可以像這樣修改代碼:
替換main為:
public static void main(String[] args)
{
AKSPrime p = new AKSPrime();
TextReader k = new TextReader();
System.out.print("Input number for primality testing: ");
long i = k.readLong();
System.out.println("Is " + i + " prime? " + p.nonAKSisPrime(i));
}
用這個(gè)替換nonAKSisPrime函數(shù):
private boolean nonAKSisPrime(long x)
{
long f = 2;
boolean result = true;
long s = (long)Math.sqrt(x);
while(f <= s && result)
{
if(x % f == 0)
result = false;
f++;
}
return result;
}
并將這個(gè)新函數(shù)添加到TextReader,讀取long值:
public long readLong()
{
long result = 0;
do // keep on trying until a valid long is entered
{
try
{
result = Long.parseLong(readWord());
break; // result is good, jump out of loop down to return result;
}
catch (Exception e)
{
if(rePrompting)
System.out.println("Invalid long. Try again.");
else
{
error( "readLong" );
break;
}
}
} while( true );
return result;
}

TA貢獻(xiàn)1775條經(jīng)驗(yàn) 獲得超11個(gè)贊
恐怕您的意思是 16字節(jié)整數(shù),而不是bit。一個(gè)javaint
是4字節(jié)32位,一個(gè)long
8字節(jié)64位。
1425412525412545
可能適合 long,當(dāng)然不是 int,也許您BigInteger
原則上應(yīng)該使用來覆蓋完整的 16 個(gè)字節(jié)。
由于這不再是原始類型,因此需要更多的編寫。
添加回答
舉報(bào)