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

本文关键字:BigInteger 区别 ModPow Remainder 语言 | 更新日期: 2023-09-27 18:26:26

C#语言中BigInteger.Remainder(a, b)BigInteger.ModPow(a, 1, b)有什么不同?

如果我们使用相反的数字,例如,每个数字之间有区别吗

BigInteger.ModPow (new BigInteger(21), 1, new BigInteger(-5)) 

BigInteger.Remainder(new BigInteger(21), new BigInteger(-5))

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

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

根据文件,

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

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

换句话说,ModPow(a ^ b) % c^是pow),Remaindera % 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次方整数的模时才应该使用CCD_ 16。

不仅理论上没有,而且实际上也没有,除了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");
    }
}

===>

1
1
Hello World