2012-07-18 42 views
3

是否有任何好的可逆1-1函數將整數映射到另一個整數? 對於例如,給出的範圍0-5,我想找到一個映射:使用1-1函數從id生成代碼

0->3 
1->2 
2->4 
3->5 
4->1 
5->0 

此外,映射應該看起來是隨機的。

回答

4

您可以按升序填充數組並將其洗牌。如果不是最有效的記憶方式,這通常會表現得相當好。

您還可以依賴封閉的離散轉換,如乘法。如果你有2個數字,P和K,那麼(我認爲)只要P和K是互質的,P^n mod K將產生一個長度爲(K-1)的非重複的僞隨機序列值,範圍從1到K.離散數學的這種特殊表現是密碼學的前提之一。從序列向後指向被稱爲離散對數問題,這也是傳統RSA安全的原因。

你問了一個可逆算法。如果你跟蹤指數,你可以從P^n模K到P ^(n-1)mod K,沒有什麼困難。你可以採取一些快捷方式從權力向後退去,這在密碼學中不起作用,因爲算法的某些參數被故意丟棄以使其更難。這就是說,如果你在解決離散日誌問題時碰巧破壞RSA,那麼一定要讓我知道。

+1

如果'K'是素數,則只能通過'P^n'得到一個長度爲'K - 1'的序列。一般來說,極限是φ(K),並且當且僅當'P'是一個原始根模'K'(其中有'φ(K-1)')時,達到極限。 – 2012-07-18 04:49:13

+0

這個建議背後的數學相當神祕,我不會假裝完全理解它們。 – Wug 2012-07-18 04:59:48

+0

thanx,今晚讓我試試mod一個:) – boh 2012-07-18 05:43:22

0

置換多項式如何?請參閱本文中的第3部分:http://webstaff.itn.liu.se/~stegu/jgt2012/article.pdf它用於那裏的噪音,但它看起來完全像你想要的。

它建議構造形式(Ax^2 + Bx) mod M的函數。只有這些函數的一小部分是可逆的/產生排列的,但是如果它存在則不應該很難找到實際的反函數。

0

您可以使用分組密碼生成這樣的排列,而不必將整個內容保存在內存中(就像您要洗牌列表一樣)。我前一段時間寫了一篇關於它的博客文章,你可以找到here