簡體   English   中英

有限域算術實現中模運算的最佳頻率

[英]Optimal frequency of modulo operation in finite field arithmetic implementation

我正在嘗試實現有限域算術以在橢圓曲線計算中使用它。 由於曾經使用的只是與模運算符通勤的算術運算,因此我認為沒有理由不將該運算延遲到最后。 可能發生的一件事是所涉及的數字可能變得(方式)太大並且不切實際/效率低下,但我想知道是否有一種方法可以確定應該觸發計算中的模運算的最佳條件/頻率.

我在 C 中編碼。

避免橢圓曲線加密的復雜性(因為我不熟悉它的算法); 假設你正在做temp = (a * b) % M; result = (temp * c) % M temp = (a * b) % M; result = (temp * c) % M ,而您正在考慮只做result = (a * b * c) % M

我們還假設您使用相同的模數M做了很多事情; 所以您已經預先計算了“M 的倍數”查找表,以便您的模代碼可以使用該表找到不大於被除數的“M 左移 N”的最高倍數,然后從被除數中減去,然后重復隨着 N 值的減小,直到剩下商。

如果您的查找表有 256 個條目,則被除數為 4096 位,除數為 2048 位; 那么您將每次迭代將被除數的大小減少 8 位,因此在不超過 256 次“搜索和減法”操作之后,被除數將變得小於除數(並且您會找到商)。

用於乘法; 對於每對數字,它幾乎是純粹的“乘法和加法”。 例如,使用uint64_t作為數字,乘以 2048 位數字就是乘以 32 位數字,並且涉及32 * 32 = 1024的“乘加數字”操作。

現在我們可以進行比較了。 具體來說,假設abcM是 2048 位數字:

a) 原始temp = (a * b) % M; result = (temp * c) % M temp = (a * b) % M; result = (temp * c) % M將是 1024“乘加”,然后是 256“搜索和減法”,然后是 1024“乘法和加法”,然后是 256“搜索和減法”。 總數為 2048“乘加”和 512“搜索和減法”。

b) 建議的result = (a * b * c) % M將是 1024“乘加”,然后將是 2048“乘加”(因為a*b的結果將是“兩倍大”4096 -位數),然后是 512“搜索和減法”(因為a*b*c將是a*b兩倍)。 對於總數,它將是 3072“乘法和加法”和 512“搜索和減法”。

換句話說; (假設有很多假設)建議的result = (a * b * c) % M會更糟,“乘法和加法”增加 50%,“搜索和減法”完全相同。

當然,這些(橢圓曲線加密所需的操作、變量的大小等)都不能假設適用於您的具體情況。

我想知道是否有辦法確定應該在計算中觸發模運算的最佳條件/頻率。

是的; 確定最佳條件/頻率的方法類似於我上面所做的 - 確定真正的成本(就較低級別的操作而言,如我的“搜索和減法”和“乘法和加法”)並比較它們。

一般來說(不管模數是如何實現的,等等)我希望你會發現盡可能頻繁地進行模數是最快的選擇(因為它降低了乘法的成本,也降低了后期/最終模數的成本)對於所有情況都不涉及加法或減法,並且不適合簡單的整數。

如果M是常數,則取模的替代方法是乘以M的邏輯逆。 查看 Polk 關於 256 位是一種常見情況的評論,然后假設M是具有 1 位系數的 256 次多項式,然后將M的倒數定義為 x^512 / M,這導致 256 位“逆”。 將此逆命名為I 然后對於乘模M

C = A * B                            ; 512 bit product
Q = (upper 256 bits of C * I)>>256   ; Q = C / M = 256 bit quotient
P = M * Q                            ; 512 bit product
R = lower 256 bits of (C xor P)      ; (A * B)% M   

所以這需要 3 個擴展精度乘法和一個異或。

如果此代碼的處理器具有無進位乘法,例如 X86 PCLMULQDQ,它將兩個 64 位操作數相乘以產生 128 位結果,則可以將其用作擴展精度乘法的基礎。 256 位乘 256 位乘法的基本實現需要 16 次乘法以產生 512 位乘積。 這可以使用類似 Karatsuba 的東西來改進:

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

但是在當前的 X86 上,PCLMULQDQ 很快,需要 1 到 3 個周期,所以主要問題是將數據加載到 XMM 寄存器中,我不確定 Karatsuba 會節省多少時間。

應在計算中觸發模運算的最佳條件/頻率

標准做法是用其他東西替換所有實際的模運算。 所以頻率永遠不會。 有不同的方法可以做到這一點:

  • 選擇模數為梅森素數或偽梅森素數。 有大量的數學技巧可以有效地實現算術模(偽)梅森素數,而無需進行任何實際的模運算。 在橢圓曲線的上下文中,以這種方式選擇素數模數 NIST 曲線也是出於這個原因。
  • 使用巴雷特減少。 這與真正的模運算具有相同的效果,但依賴於一些預計算和輸入范圍的先決條件,以便能夠將類似模運算的成本降低到幾次乘法的成本(加上一些支持操作)。 也適用於多項式域。
  • 以蒙哥馬利形式進行算術運算。

此外,也許更符合您問題的精神,一種常見的技術是進行各種加法而不是每次都減少(加法不會顯着改變數字的大小)。 在你的整數需要一個額外的肢體之前需要做很多加法,所以在減少開始有意義之前可以完成很多。 對於乘法,除非它是一個小的常數,否則幾乎總是在之后立即減少以防止數字在物理上變得比它們需要的大得多(如果將結果輸入另一個乘法,這將特別糟糕)。

與 Barrett 縮減特別相關的另一種技術是在大多數情況下工作在比 [0.. N) 稍大的范圍內,例如 [0.. 2N)。 這使得能夠跳過 Barrett 歸約所需的條件減法,以便完全歸約到 [0.. N) 范圍,同時仍然使用最重要的部分,即從 [0.. N²) 范圍歸約到 [0. .2N)。

暫無
暫無

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

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