编译运行一个高精度大整数库Skyiv.Numeric的BigInteger - l1t1/note GitHub Wiki

最近研究大整数运算,在博客园看到如下文章浅谈 BigInteger, 作者说它只有区区 335 行,该有的功能基本上都有了。实现了基本的算术运算和逻辑运算,还实现了 Pow 和 Sqrt 方法。 这个程序是用c#编写的,将其内容复制粘贴到一个BigInteger.cs文件, 行号用UltraEdit的列操作处理掉。另几个测试函数也依原样复制到相应文件, 都以Test开头。 因为我们只测试Skyiv.Numeric的BigInteger,所以TestMain.cs改为如下内容

using System;

 namespace Skyiv
 {
   class TestMain
   {
     static void Main()
     {
       string s2 = new TestSkyivBigInteger().Run(20);

       Console.WriteLine(s2);
     }
   }
 }

然后编辑一个批处理文件setpath.bat, 内容:

set path=%path%;C:\Windows\Microsoft.NET\Framework\v4.0.30319

然后在cmd窗口输入setpath, 就可以在任何目录下用csc命令编译cs文件了。 编译命令行为

csc -define:DEBUG -optimize -out:File2.exe BigInteger.cs Test*.cs

编译完成后,执行File2,输出

Skyiv.TestSkyivBigInteger?  3.8971220?256,142
1593226182121832392496925637014..

用时约4秒比作者当年的记录34.2497761 秒快7倍。

作者后来又在3篇文章中做了优化

BigArithmetic - 提供任意精度的算术运算的静态类

再谈 BigInteger - 使用快速傅里叶变换

再谈 BigInteger - 优化

把相关文件复制粘贴好后用如下命令行编译

csc -define:DEBUG -optimize -out:File3.exe BigInteger.cs BigArithmetic.cs Utility.cs Test*.cs

解决了一些编译错误,主要是改变底层存储结构,从List改成byte[]引起的,把Count改成Length,再加两个强制类型转换就编译通过。

运行结果是

Skyiv.TestSkyivBigInteger?  0.0412528?256,142  //第一步FFT优化
Skyiv.TestSkyivBigInteger?  0.0318193?256,142  //第二步Parse 和ToString优化

其余输出与第一版完全一致,用时比作者文章给出的0.1749114秒,也快了5倍。

⚠️ **GitHub.com Fallback** ⚠️