1 / BigInteger的在c#(1/BigInteger in c#)

2019-08-05 18:07发布

我要实现

BigInteger.ModPow(1/BigInteger, 2,5);

但是1/BigInteger总是返回0 ,这将导致,即结果为0了。 我试图寻找一些BigDecimal为C#类,但我没有发现任何。 有什么办法如何即便算上这一点,如果没有BigDecimal

Answer 1:

1/a为0 | A |> 1,由于BigIntegers使用整数除法,其中的分割的小数部分被忽略。 我不知道你期待什么导致此。

我假设你想模反元素的am ,而不是一个小数。 此逆矩阵存在当且仅当am是互质数,即gcd(a, m) = 1

链接的维基百科页面列出了两种标准算法计算模反元素:

  • 扩展欧几里德算法 ,这适用于任意模
    它速度快,但依赖输入的运行时间。

    我没有在手的C#代码,但是从维基百科移植的伪代码应该是直线前进。

  • 使用欧拉定理:

    这需要φ(M),即知识,你需要知道m的首要因素。 这是一个受欢迎的选择,当m是一个素数,因而φ(M)= M-1时,它简单地变 。 如果您需要经常运行时,你知道φ(M),这是要走的路。

    在C#这成为BigInteger.ModPow(a, phiOfM-1, m)



Answer 2:

所述的过载/选择操作,如下:

public static BigInteger operator /(
        BigInteger dividend,
        BigInteger divisor
)

见BigInteger.Division操作 。 如果结果之间的01 (这是可能发生dividend1在你的情况下),因为返回值是一个整数, 0返回,如你所见。

什么是你想用做ModPow方法? 你是否意识到2,5 两个参数,二,五,而不是“二点五”? 是您的意图“拿方形模5”?

如果你想浮点除法,你可以使用:

1.0 / (double)yourBigInt

注投给double 。 这可能会失去精度,甚至“溢”到零,如果yourBigInt过于庞大。



Answer 3:

例如,你需要得到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


文章来源: 1/BigInteger in c#