[英]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.