浏览 2151 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-06-01
最后修改:2009-06-06
在C# 4.0的基础类库中,终于有了大数BigInteger,这个大数与其他.net的数值类型不同,它没有最大值和最小值的限制,理论上它可以存无限大的数(取决于你的程序的寻址空间),它与我以前使用的F#的Microsoft.FSharp.Math.BigInt的方法基本一致,但更方便,它可以自动从小数造型成大数,而不需要一再呼叫FromInt32...等等系列方法。BigInteger还提供了很好的构造器,除了接受小数的参数外,还可以接受Byte[]阵列作为参数(在没有大数之前,很多程序就利用byte[]来保存大数),并依照下标顺序构造出一个大数。如 Byte array (lowest index first) 00 10 A5 D4 E8 00 将构造出 Hexadecimal string E8D4A51000 其他运算方法与别的数值类型类似,请看代码 using System; using System.Numerics; using System.Threading; namespace LucasLehmer { class Program { static void Main(string[] args) { int range = 1000; System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch(); sw.Start(); Parallel.For(2, range, delegate(int i) { if (LucasLehmerTest(i)) { System.Console.WriteLine("M({0})={1}", i, Mersenne(i)); } }); sw.Stop(); System.Console.WriteLine("It take {0} seconds to caculate Mersenne in {1}", sw.ElapsedMilliseconds/1000, range); } public static BigInteger tcs(BigInteger n, BigInteger m, BigInteger result) { if(n.IsZero){ return result; } return tcs((n - BigInteger.One), m, ((BigInteger.Pow(result, 2) - 2 ) % m)); } public static BigInteger seq(BigInteger n, BigInteger m) { return tcs(n, m, 4 % m); } public static BigInteger LucasLehmerSequence(BigInteger n, BigInteger m) { if (n==BigInteger.Zero) return 4% m; return (BigInteger.Pow(LucasLehmerSequence(n - BigInteger.One, m), 2) - 2) % m; } public static BigInteger Mersenne(int n) { return BigInteger.Pow(2,n)-BigInteger.One; } public static bool LucasLehmerTest(int n){ BigInteger m = Mersenne(n); return (seq(n - 2, m).IsZero); //return (LucasLehmerSequence(BigInt.FromInt32(n - 2), m) == BigInt.Zero); } } } 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-06-06
貌似早该有了。
|
|
返回顶楼 | |