如何正确使用PowMod?

时间:2017-03-16 10:45:05

标签: math

如果必须实施以下计算:

enter image description here

实施它的正确方法是什么?

b^-c * powmod(g,s_3, p)

(b^-c * powmod(g,s_3, p)) % p

powmod(b,-c,p) * powmod(g,s_3, p)

(powmod(b,-c,p) * powmod(g,s_3, p)) % p

3 个答案:

答案 0 :(得分:3)

当然需要% p,否则你可能会得到比p大得多的结果。

b^-c在这种情况下是非常不正确的,因为它无法知道它是模幂运算,而不像正指数不仅仅是性能问题,而是正确性问题:正常的负指数给出一个小数结果,这在这里毫无意义。

通过消除只留下你的最后一个建议:

(powmod(b,-c,p) * powmod(g,s_3, p)) % p

答案 1 :(得分:1)

( a * b ) % c = (( a % c )*( b % c )) % c

所以,

(b^-c * g^s_3)) % p = ((b^-c % p)*(g^s_3 % p)) % p

g^s_3 % pb^-c % p应使用powmod解决。 powmod的正确实现取决于您。

How to deal with negative exponents in modular arithmetic?可能会对您有所帮助。

答案 2 :(得分:1)

取决于powmod是否可以处理负指数,最后一个是正确的。前两个具有不可解释的b^-c(或者它被解释为对比特序列的XOR操作),第三个可能具有大于p的结果作为两个余数的乘积mod p可以与(p-1)^2一样大。

为了使负指数正确,使用费马的小定理:

  

对于任何素数pa%p!=0,其中a^(p-1)%p==1

以便完整的计算

(powmod(b, p-1-(c%(p-1)),p) * powmod(g,s_3,p) ) % p