我要实现
BigInteger.ModPow(1/BigInteger, 2,5);
但是1/BigInteger
总是返回0
,这将导致,即结果为0
了。 我试图寻找一些BigDecimal
为C#类,但我没有发现任何。 有什么办法如何即便算上这一点,如果没有BigDecimal
?
我要实现
BigInteger.ModPow(1/BigInteger, 2,5);
但是1/BigInteger
总是返回0
,这将导致,即结果为0
了。 我试图寻找一些BigDecimal
为C#类,但我没有发现任何。 有什么办法如何即便算上这一点,如果没有BigDecimal
?
1/a
为0 | A |> 1,由于BigIntegers
使用整数除法,其中的分割的小数部分被忽略。 我不知道你期待什么导致此。
我假设你想模反元素的a
模m
,而不是一个小数。 此逆矩阵存在当且仅当a
和m
是互质数,即gcd(a, m) = 1
。
链接的维基百科页面列出了两种标准算法计算模反元素:
扩展欧几里德算法 ,这适用于任意模
它速度快,但依赖输入的运行时间。
我没有在手的C#代码,但是从维基百科移植的伪代码应该是直线前进。
使用欧拉定理:
这需要φ(M),即知识,你需要知道m的首要因素。 这是一个受欢迎的选择,当m
是一个素数,因而φ(M)= M-1时,它简单地变 。 如果您需要经常运行时,你知道φ(M),这是要走的路。
在C#这成为BigInteger.ModPow(a, phiOfM-1, m)
所述的过载/
选择操作,如下:
public static BigInteger operator /(
BigInteger dividend,
BigInteger divisor
)
见BigInteger.Division操作 。 如果结果之间的0
和1
(这是可能发生dividend
是1
在你的情况下),因为返回值是一个整数, 0
返回,如你所见。
什么是你想用做ModPow
方法? 你是否意识到2,5
两个参数,二,五,而不是“二点五”? 是您的意图“拿方形模5”?
如果你想浮点除法,你可以使用:
1.0 / (double)yourBigInt
注投给double
。 这可能会失去精度,甚至“溢”到零,如果yourBigInt
过于庞大。
例如,你需要得到d,在未来:
3 * d = 1(MOD 9167368)
这同样是:
3 * d = 1 + K * 9167368,其中k = 1,2,3,...
重写它:
d =(1 + K * 9167368)/ 3
你d必须具有最低 k处的整数。
让我们写公式:
d =(1 + K * FI)/ E
public static int MultiplicativeInverse(int e, int fi)
{
double result;
int k = 1;
while (true)
{
result = (1 + (k * fi)) / (double) e;
if ((Math.Round(result, 5) % 1) == 0) //integer
{
return (int)result;
}
else
{
k++;
}
}
}
让我们来测试该代码:
Assert.AreEqual(Helper.MultiplicativeInverse(3, 9167368), 6111579); // passed