2015-05-04 25 views
0

如果我知道参数a,kp那么如何在C#中计算此值?如何在C#中执行模乘和幂运算?

s=a*k^-1 mod p 

它用于加密目的,我是新的。如果问题不恰当,请不要感到生气。

请注意,k^-1k (mod p)的模块化反转而非电源运营商。

+0

是** k^-1 **表示** k ** * mod p的模逆。 @ArtjomB。 – Leon

+0

'a','k'和'​​p'有多大?问题是int是否足够或者需要BigInteger。 –

+0

'a,k和p'会和'long'变量一样大。抱歉。 @ArtjomB。 – Leon

回答

2

由于问题是关于模块化逆转的问题,我认为这将有利于求职者看另一个SO question。答案

关键的是 -

网4.0+实现的BigInteger用特殊的模块化算术函数ModPow(产生“X动力y模Z”),你并不需要一个第三方库模仿ModInverse。如果m是一个素数,所有你需要做的是计算:

在C#中按MSDN documentation这被定义为

public static BigInteger ModPow(
    BigInteger value, 
    BigInteger exponent, 
    BigInteger modulus 
) 

利用这一点,我们可以做这样的事情来计算k的逆模p 像

BigInteger bi= ModPow(k, -1, p); 
int b= (int) bi; 
s= (a* bi)%p; 
+1

使用'ModPow(k,-1,p)'将导致'ArgumentOutOfRangeException'被抛出,表明'指数是负数'。 [BigInteger.ModPow方法例外](https://msdn.microsoft.com/en-us/library/system.numerics.biginteger.modpow(v = vs.110).aspx#Anchor_1) –

-3

公共静态双DoMath(双一,双K,双p)

{ 
     return (a * Math.Pow(k, -1)) % p; 
    } 
+0

'k^-1'是一个模数反转,它与'Math.Pow(k,-1)'不同。 –