我发现在C#中,BigInteger.ModPow
函数和Java中的BigInteger.modPow
函数相比非常慢。这使得我不愿意使用C#来实现执行模幂运算的函数。
我编写了一个测试程序来证明这一点。
C#
static void Main(string[] args)
{
BigInteger num = BigInteger.Parse("444266014606582911577255360081280172978907874637194279031281180366057");
BigInteger m = 2;
Console.WriteLine("Start multiply.");
Stopwatch stopwatch = Stopwatch.StartNew();
for (int i = 3; i <= 200000; i++)
m *= i;
stopwatch.Stop();
Console.WriteLine(stopwatch.ElapsedMilliseconds);
stopwatch.Reset();
Console.WriteLine("Start mod pow.");
stopwatch.Start();
for (int i = 0; i < 10; i++)
BigInteger.ModPow(3, m, num);
stopwatch.Stop();
Console.WriteLine(stopwatch.ElapsedMilliseconds);
}
Java语言中的等效程序
public static void main(String[] args) {
BigInteger num = new BigInteger("444266014606582911577255360081280172978907874637194279031281180366057");
BigInteger m = BigInteger.TWO;
System.out.println("Start multiply.");
long startTime = System.currentTimeMillis();
for (int i = 3; i <= 200000; i++)
m = m.multiply(BigInteger.valueOf(i));
System.out.println(System.currentTimeMillis() - startTime);
System.out.println("Start mod pow.");
startTime = System.currentTimeMillis();
for (int i = 0; i < 10; i++)
BigInteger.valueOf(3).modPow(m, num);
System.out.println(System.currentTimeMillis() - startTime);
}
程序分为两部分:
- 计算200000!以生成一个非常大的数字
m
。 - 计算3 ^
m
modnum
10次。
这是我的电脑上的执行结果。
规格
- CPU:Intel(R) Core(TM) i3-8100 CPU @ 3.60GHz
- .Net版本:.NET 6.0.102
- Java版本:17.0.1
C#
开始乘法。 19443 开始取模幂。 35292
Java
开始乘法。 14668 开始取模幂。 3462它显示C#中的
BigInteger.ModPow
函数比Java中的慢约10倍。有人知道原因吗?这是一个bug吗?