2011-02-13 94 views
0

我正在爲我的任務寫一個小程序來查找素數的原始根。到目前爲止,該程序適用於13個較小的素數,並提供正確的根數。但對於更高的素數,它只顯示較少的原始根。而現在我陷入素數41,顯示沒有原始根源。我使用DOUBLE數據類型進行計算,並再次嘗試使用數據類型DECIMAL,但沒有運氣。有誰知道這種問題?謝謝。最高值的數據類型可以存儲在c#

+4

您應該使用int或long,素數始終是整數(按定義)。我懷疑邏輯中有一個錯誤,因爲數字41的失敗絕對不是由於數據類型的大小造成的 – Rob 2011-02-13 23:24:29

+0

您是否可以介紹Post以及示例代碼? – Crimsonland 2011-02-13 23:29:11

回答

4

如果您正在嘗試查找大整數,您是否嘗試過使用.NET 4中的BigInteger

請注意,在double中存儲整數是一個壞主意 - 因爲它的範圍內的每個雙精度都不能精確存儲。 IIRC,decimal可以總是準確地存儲整數,但只能得到28或29位數......並且它仍然是一個壞主意,因爲您試圖表示整數

另一方面,「固定素數爲41」的含義並不十分清楚。你真的確定它是一個大整數數據類型嗎?

0

這比數據大小問題更可能是算法問題。你的算法不需要做比將你想要獲得根的頭兩個值更多的值。而不是直接將候選人提高到小於p的每個功率,然後取結果mod p,從1開始,然後反覆乘以您正在測試的值,並在每個步驟後得到結果mod p 這意味着你將永遠不需要使用大於p * candidate的數字,並且能夠使用int或long來處理相當大的數字。

0

素數總是整數,所以不需要使用double。如果您的計算失敗爲41,則問題與您所使用的數據類型的大小無關。您需要發佈您使用的代碼。

0

WAY回來的時候,我用C++寫了自己的素數。在足夠大的時候,沒有可用的數據類型 - 您可能需要刪除自己的數據類型。如果你用bit,nybbles,bytes和words長大,這很容易(嘿,作爲一個旁人,我是唯一一個記得字節是整數的寬度而不是8位的人)?但是,如果你沒有很好地掌握記憶和使用方法,自己就不會那麼容易。

Waffling post我知道,但你會學到很多關於計算機如何工作,如果你創建自己的數據類型。還有很多關於C#與你重寫所有的操作符等!

相關問題