构建自己的整数类所需的知识?

时间:2009-08-13 13:18:00

标签: algorithm language-agnostic math data-structures

当.Net框架缺少BigInteger类(但尚未到达)的砖墙时,我已经决定开发自己的练习(我知道存在开源替代方案)。我需要通过哪些环节才能开发出来?是否有任何我可能不会拥有的特殊知识?

编辑方面问题。您将使用哪种数据类型来表示新的大整数类中的数字?

7 个答案:

答案 0 :(得分:8)

Arbitrary precision arithmetic

编辑:要表示您的数字,您可能需要一个可调整大小的整数数组。

答案 1 :(得分:6)

我会提高你的基本数学技能。当我写一篇Big Int课程时,我必须记住如何像小学一样手动添加,乘法和除法。

接下来,如果您要创建一个新类,我将尝试遵循为框架设置的standards。所以它看起来像任何其他.Net类。

我会关注TDD,因此您知道您的班级按其设计方式运作。

答案 2 :(得分:3)

您需要非常了解数字系统。您可以选择在基础10 基础2 或任何基础x 中表示bignum。这种选择会对你的课堂表现产生很大影响。您还必须选择要实施的算法。通常,像GMP这样的大型库,根据操作数的大小选择算法。你必须要注意很多话题,但最后你应该确信你不能产生一些非常有趣的东西。作为一个学习主题,它是非常有价值的,但是为了产生有用的东西,请考虑不要重新发明轮子!

答案 3 :(得分:3)

如果你想深入了解它的数学,你需要阅读Donald Knuth

答案 4 :(得分:2)

.Net 3.5有一个BigInteger类,但它的内部属于CLR。您可以使用Reflector查看代码。打开System.Core.dll并查看System.Numeric命名空间。 BigInteger是该命名空间中唯一的类。

如果要查看F#BigInteger类的代码,请查看[F#安装文件夹] \ source \ fsharp \ FSharp.Core \ math \ z.fs文件。

答案 5 :(得分:0)

也许学习一个已经实现的BigInteger课可能有帮助吗?

答案 6 :(得分:0)

如果使用基本算法,则BigInts将无法用于非常大的整数,例如Mersenne Primes。

如果您没问题,请使用简单的32位int作为基本数据类型。在这种情况下,您需要处理64个结果。如果您根本不关心速度,请使用一些基数为10的数字作为基数,比方说10000,这将非常容易实现。

这主要是因为天真实现中的乘法具有O(n ^ 2)运行时。基于傅里叶变换的高级算法具有O(n(log(n))运行时。 这需要一些数学技能和知识。