Random-Number-Generator

你能向我解釋一下置換同餘生成器 XSL-RR-RR 是如何工作的嗎?

  • June 5, 2021

我在維基百科上找到了關於 XSL-RR-RR 的註釋:

https://en.wikipedia.org/wiki/Permuted_congruential_generator

但我不明白這是什麼意思:

  1. 計數 = (int)(x >> 122)
  2. low64 = rotr64((uint64_t)(x ^ (x >> 64)), 計數)
  3. high64 = rotr((uint64_t)(x >> 64), low64 & 63)
  4. 返回 (uint128_t)high64 << 64 | 低64

rotr 和 rotr64 有什麼區別?什麼是“int”?rotr64((uint64_t)(x ^ (x >> 64)), count) 是按計數步驟執行 rotr64 嗎(我理解正確嗎)?什麼是“|”?什麼是“uint64_t”?至少我理解“^”、“&”和“>>”。

XSL-RR-RR 是否消除了典型 LCG 中已知的低位週期?據我了解,這就是它被發明的原因。

我已經閱讀了一些關於 C 語法的內容,並且我似乎理解了這個生成器的作用。

  1. 計數 = (int)(x >> 122)

&gt;&gt;是右位移運算符,將所有位向右移動指定的數字。所以初始數字 $ x $ 被轉移 $ 122 $ 位。這意味著計數是由第一個組成的數字 $ 6 $ 最重要的位 $ x $ . 此數據的類型是int,因為它可能是每個 $ 0 $ -少量, $ 1 $ -少量, $ 2 $ -少量, $ 4 $ -少量, $ 5 $ -少量, $ 6 $ -位號。

  1. low64 = rotr64((uint64_t)(x ^ (x >> 64)), 計數)

^只是異或運算。在 xoring 之後,我們可以得到每個 $ 128 $ -bit number,這就是引入 type 的原因uint64_t。這意味著我們必須將我們的結果削減到第一個 $ 64 $ 最低有效位。Rotr64旋轉位 $ x $ 向右 $ n $ 周圍的地方 $ 64 $ -位邊界,這意味著我們將 (uint64_t)(x ^ (x >> 64) 旋轉計數位置。

  1. high64 = rotr64((uint64_t)(x >> 64), low64 & 63)

這裡我們有與上面相同的操作,除了&邏輯與運算符。

  1. 返回 (uint128_t)high64 << 64 | 低64

最後我們得到 $ 128 $ -位數(uint128_t)。high64 位在最重要的位位置上進行移位,並且|是邏輯 OR 運算符。全部 $ 64 $ << 64 之後的最低有效位將等於 $ 0 $ . 所以 OR 運算符只是複制所有 $ 1 $ 和 $ 0 $ 低64到 $ 64 $ 我們決賽中最不重要的位 $ 128 $ -位號。

和 $ x $ 只是取自典型的線性同餘生成器模數 $ 2^{n} $ . 作者在文件中指定了兩個乘數和增量,我們可以使用:

$ m=2549297995355413924 $ , $ i=4865540595714422341 $

$ m=6364136223846793005 $ , $ i=1442695040888963407 $

引用自:https://crypto.stackexchange.com/questions/87284