处理Haskell中的大数字

时间:2012-03-25 21:00:18

标签: haskell biginteger

我正在尝试在Haskell中实现米勒测试(不是Miller-Rabin。)我正在处理大数字,特别是我需要对大数进行取幂并将大数模数转换为另一个大数

这样做有什么标准功能吗?正常的expt函数^告诉我在计算结果之前我的内存耗尽。例如,我想这样做:

(mod(8888 ^ 38071670985)9746347772161)

我可以实现自己的算法,但如果这些算法已经存在,那就太好了。

2 个答案:

答案 0 :(得分:6)

arithmoi包中有模幂运算(以及更多)。

自从我写这篇文章以来,我很想知道你是否觉得它有用,哪些可以改进。

如果您尝试计算

(mod (8888^38071670985) 9746347772161)

目前,中间结果8888^38071670985将占据大约5 * 10 11 位,大约60GB。即使你有这么多的RAM,也接近(可能略高于)GMP的限制(GMP整数中的大小字段是4个字节)。

因此,您还必须在计算过程中减少中间结果。这不仅可以使计算在没有问题的情况下适应内存,而且由于涉及的数字仍然很小,因此它也更快。

答案 1 :(得分:1)

在使用模数之前,您的数字是近似值

  10^log(8888^38071670985)
= 10^(38071670985 * log(8888))
= 10^(1.5 * 10^11)

换句话说,它有大约1.5 * 10 ^ 11位数。它需要围绕

1.5 * 10^11 / log(2) / 8 / (2^30) = 58GB
记忆只是代表。

所以从这开始可能不是最好的主意。库是否支持使用这么大的数字进行计算?