编译运行一个高精度大整数库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 - 提供任意精度的算术运算的静态类
把相关文件复制粘贴好后用如下命令行编译
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倍。