2 回答

TA貢獻1111條經驗 獲得超0個贊
AKS 素性測試的實現僅限于使用 32 位數據類型,它可以存儲最多2,147,483,647. 你的號碼比那個大很多,所以沒有正確閱讀。
聽起來很容易解決,我們應該能夠將所有出現的int,更改為,long因為long數據類型可以存儲非常大的數字。不幸的是,這行不通,因為我們仍然受到 Java 中 32 位數組的最大大小的限制。因此,不深入研究不安全的內存訪問是非常不切實際的。
如果要檢查大數字的素數,可以像這樣修改代碼:
替換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));
}
用這個替換nonAKSisPrime函數:
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;
}
并將這個新函數添加到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貢獻1775條經驗 獲得超11個贊
恐怕您的意思是 16字節整數,而不是bit。一個javaint
是4字節32位,一個long
8字節64位。
1425412525412545
可能適合 long,當然不是 int,也許您BigInteger
原則上應該使用來覆蓋完整的 16 個字節。
由于這不再是原始類型,因此需要更多的編寫。
添加回答
舉報