如果必须实施以下计算:
实施它的正确方法是什么?
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
答案 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 % p
和b^-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
一样大。
为了使负指数正确,使用费马的小定理:
对于任何素数
p
和a%p!=0
,其中a^(p-1)%p==1
。
以便完整的计算
(powmod(b, p-1-(c%(p-1)),p) * powmod(g,s_3,p) ) % p