BigInteger.ModPow(a,1,b)中的BigInteger.Remainder(a,b)与C#语言的区别是什么?

时间:2015-12-11 07:38:26

标签: c# .net

C#语言与OnClientItemChecked的{​​{1}}有何不同?

如果我们使用相反的数字,例如每个数字之间是否存在差异,例如

BigInteger.Remainder(a, b)

BigInteger.ModPow(a, 1, b)

2 个答案:

答案 0 :(得分:3)

例如,差异与int a = 5;int a = Math.Pow(5, 1);之间的差异相同。

根据文件,

  

BigInteger.ModPow 对提升到另一个数字幂的数字执行模数除法。

     

BigInteger.Remainder (a,b) 对两个BigInteger值执行整数除法并返回余数。

换句话说,ModPow (a ^ b) % c ^ 是pow )和Remainder a % c

如果b等于1,则它们将产生相同的值。但是,使用ModPow需要什么?在进行一些额外的计算时,降低性能(参见“性能比较”)和可读性是没有意义的。在这种情况下使用Remainder

如果您需要BigInteger功率的模数,请使用ModPow

性能比较

使用以下代码对这些操作进行基准测试:

List<BigInteger> results = new List<BigInteger>();

Stopwatch sw = new Stopwatch();

sw.Start();

for (int i = 0; i < 1000000; i++)
{
    results.Add(BigInteger.ModPow(new BigInteger(21), 1, new BigInteger(-5)));
}

sw.Stop();

Console.WriteLine($"ModPow took {sw.ElapsedMilliseconds} ms");

sw.Restart();

for (int i = 0; i < 1000000; i++)
{
    results.Add(BigInteger.Remainder(new BigInteger(21), new BigInteger(-5)));
}

sw.Stop();

Console.WriteLine($"Modulus took {sw.ElapsedMilliseconds} ms");

输出如下:

ModPow took 277 ms
Modulus took 91 ms

表明只有在实际需要N次方整数模数时才应使用ModPow

答案 1 :(得分:1)

除了ModPow浪费更多的电力之外,理论上不存在,也几乎没有。

https://dotnetfiddle.net/cZ2LZh

using System;

using System.Numerics;


public class Program
{
    public static void Main()
    {
        var a = System.Numerics.BigInteger.ModPow (new System.Numerics.BigInteger(21) ,1,new System.Numerics.BigInteger(-5) ) ;

        var b = BigInteger.Remainder(new BigInteger(21),new BigInteger(-5));

        Console.WriteLine(a);
        Console.WriteLine(b);
        Console.WriteLine("Hello World");

    }
}

==&GT;

  

1
1
你好世界