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))
例如,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次方整数的模时才应该使用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