簡體   English   中英

在Python(Hill Cipher)中將float轉換為int

[英]Conversion of float to int in Python (Hill Cipher)

Hill密碼中 ,將float轉換為int時,我得到了不同的結果(在解密過程中)。

代碼https : //github.com/krshrimali/Hill-Cipher/blob/master/hill_cipher.py

問題https : //github.com/krshrimali/Hill-Cipher/issues/1

代碼

# create empty plain text string
plain_text = ""
# result is a matrix [[260. 574. 439.]]
# addition of 65 because inputs are uppercase letters
for i in range(dimensions):
    plain_text += chr(int(result[0][i]) % 26 + 65)

輸出 :ABS

(密文-加密的文本-是POH)

結果矩陣 :(將逆與密碼密鑰矩陣相乘后)

[[ 260. 574. 539.]]

轉換為int后:

[260, 573, 538]

誰能解釋為什么會這樣,並對此進行修復? 謝謝。

問題是您使用的是int ,它會截斷為零。

具有float值的數學運算本質上是不精確的。 如果您不明白為什么,經典的解釋是《每個計算機科學家應該知道的浮點數》 但是簡短的版本是每次轉換和每個中間計算都將四舍五入到與實際數字最接近的52位小數。 這可能意味着,如果使用實數執行計算,則精確地產生574,而使用float s進行計算,實際上產生的數字比574略多或略少。 如果最后得到的數字比574小一點,並用int將其截斷為零,則得到573

在這種情況下,您要使用的取round是四舍五入到最接近的整數。 只要您可以確定累積的誤差永遠不會大於0.5,就可以做到您想要的。 而且,只要您沒有選擇可笑的巨大鍵值(這將是毫無意義的,因為這樣一來您就無法獲得更多的安全性),您就可以確定。

但是,這里有兩件事值得考慮。

摘自Wikipedia上Hill密碼文章的簡短掃描:它旨在通過快速的鉛筆和紙操作來執行。 首先,您不需要逆矩陣,只需一個逆模數為26的矩陣,該矩陣就更容易計算,並且意味着您所用的數字較小,因此不太可能出現此問題。 這意味着您可以用整數進行所有數學運算,因此首先不會出現問題:使用dtype=int將您的矩陣創建為數組,並且不會出現舍入問題。 而且,作為獎勵,如果你挑可笑的巨大的鍵值,你會得到不正確的結果的錯誤信息。 (如果要允許這樣的值,則希望將Python大小不受限制的int值存儲在dtype=object數組中。但是,如果不需要它,只會使事情變得更慢,更復雜。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM