我想在Java中實現Schnorr簽名算法。我面臨用大指數(例如MD5哈希數)計算功率的問題。BigInteger到BigInteger的功能(Schnorr簽名)
有什麼辦法讓BigInteger獲得BigInteger的權力嗎?
我需要計算(a^x * b^y)%z其中y是非常大的數字。有沒有計算這種表達式的方法?
由於
我想在Java中實現Schnorr簽名算法。我面臨用大指數(例如MD5哈希數)計算功率的問題。BigInteger到BigInteger的功能(Schnorr簽名)
有什麼辦法讓BigInteger獲得BigInteger的權力嗎?
我需要計算(a^x * b^y)%z其中y是非常大的數字。有沒有計算這種表達式的方法?
由於
我終於找到了解決方案。
(a * b) % p = ((a % p) * (b % p)) % p
所以我的例子是這樣的:我可以非常快使用這種技術計算我的表達
(a^x * b^y) % z = (((a^x) % z) * ((b^y) % z)) % z;
,或者使用的BigInteger在Java中:
BigInteger result = a.modPow(x, z).multiply(b.modPow(y, z)).mod(z);
+1用於解決您自己的問題並描述解決方案。老實說,我從來不會意識到這個問題是如此基礎 - 從我第一次學習模塊算術開始,這已經太長了。 –
號的最大值的BigInteger支持是2 Integer.MAX_VALUE的 -1。這個澄清的句子已被添加到Java 8中的BigInteger javadoc,但實施過程在相當長一段時間內一直存在。
的BigInteger必須支持範圍爲-2 Integer.MAX_VALUE的(不包括)值以2 Integer.MAX_VALUE的(不包括),並且可以支持該範圍以外的值。
正如其他人指出的,您可能需要使用modPow
而不是計算中間值。
作爲對比,宇宙中估計有1080(或2 )個原子。
我需要計算(a^x * b^y)%z,其中y是非常大的數字。有沒有計算這種表達式的方法? –
對於Schnorr簽名算法,您實際上需要組合的功率和模數運算。由於涉及的數字潛在巨大,因此僅僅進行權力運作是沒有意義的。
您需要使用BigInteger
class的modPow
方法。
相關:HTTP: //math.stackexchange.com/q/176252 –
有一個明顯的原因是您在這裏遇到問題。如果你將它提升到(2^127)的能力,即使是一個小到42的數字也會比這個星球上存在的內存佔用更多的內存。 – cHao
@cHao因爲$ z $比較小,所以只需要幾百個字節。 – CodesInChaos