簡體   English   中英

Java 中的模冪運算

[英]Modular Exponentiation in Java

我需要一種方法來計算:

(g^u * y^v) mod p

在 Java。

我發現了這個用於計算 (g^u) mod p 的算法:

int modulo(int a,int b,int c) {
    long x=1
    long y=a;
    while(b > 0){
        if(b%2 == 1){
            x=(x*y)%c;
        }
        y = (y*y)%c; // squaring the base
        b /= 2;
    }
    return (int) x%c;
}

它工作得很好,但我似乎無法找到一種方法來做到這一點

(g^u * y^v) mod p

因為我的數學技能乏善可陳。

把它放在上下文中,它是用於“簡化”DSA 的 java 實現 - 驗證部分需要解決這個問題。

假設這兩個因素不會溢出,我相信你可以用這種方式簡化表達式:

(x * y) mod p = ( (x mod p)*(y mod p) ) mod p 我相信你可以從那里弄明白。

該代碼片段實現了眾所周知的“快速取冪”算法,也稱為平方

它還使用(a * b)mod p =((a mod p)*(b mod p))mod p的事實。 (加法和乘法都是采用素數模的保留結構 - 它是同態)。 這種方式在算法的每個點上都減少到小於p的數字。

雖然您可以嘗試在循環中以交錯方式計算這些,但這樣做並沒有什么好處。 只需單獨計算它們,將它們相乘,最后一次取mod。

請注意,如果p ^ 2大於最大可表示的int,您將會溢出,這將導致您得到錯誤的答案。 對於Java,切換到大整數可能是謹慎的,或者至少對p的大小進行運行時檢查並拋出異常。

最后,如果這是出於加密目的,您可能應該使用庫來執行此操作,而不是自己實現它。 做一些看起來有效的錯誤很容易,但提供的安全性很小甚至沒有。

嘗試

(Math.pow(q,u)* Math.pow(y,v))%p

下面是一些示例代碼,它在原始問題中輸入變量,並遵循 Christian Mann 的回答。 BigInteger 解決了溢出問題。 返回語句是一個 BigInteger。

    public static BigInteger ModularExponent(BigInteger G, BigInteger U, BigInteger Y, BigInteger V, BigInteger P) {
      
      return ((G.modPow(U,P)).multiply(Y.modPow(V,P))).mod(P);
    }

暫無
暫無

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

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