C#,模运算给出与计算器不同的结果

标签 c# math mod

所以我想写这个方法:142^23 (mod 187),使用任何计算器我得到结果 65,但使用这段代码: 双数 = Math.Pow(142, 23) % 187 我得到 53 的结果。这是为什么,我在这里做错了什么?

最佳答案

Math.Pow(142, 23) 太大而无法用 double 表示。所以你的模数是在有损计算上完成的。

这将给出正确答案:

BigInteger.ModPow(142, 23, 187);

BigInteger 可以在 System.Numerics 命名空间和程序集中找到。

如果你想像你在问题中使用的整数那样,你也可以自己有效地实现它。

private static int ModPow(int basenum, int exponent, int modulus)
{
    if (modulus == 1)
    {
        return 0;
    }
    int result = 1;
    for (var i = 0; i < exponent; i++)
    {
        result = (result * basenum) % modulus;
    }
    return result;
}

BigInteger 在二进制求幂方面做了一些更聪明的事情,这将更好地处理真正巨大的数字。

关于C#,模运算给出与计算器不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49456119/

相关文章:

c++ - 斐波那契模数 C++

java - 在Java中计算模数

math - 如何在二进制级别检测到溢出?

javascript - 防止圆圈重叠

c# - 从 exe 中检索 COM ProgID 而无需注册

c# - 在 Ninject 2 依赖关系图中进行特定于上下文和参数的注入(inject)

python - 查找(或暴力破解)值列表和数学运算的数学表达式

forms - 以 angular2 模型驱动形式重用组件

c# - Azure 上的 Hadoop 示例生成空白文件

c# - 这个 C# "using"指令是什么?