我正在尝试在Haskell中实现米勒测试(不是Miller-Rabin。)我正在处理大数字,特别是我需要对大数进行取幂并将大数模数转换为另一个大数
这样做有什么标准功能吗?正常的expt函数^告诉我在计算结果之前我的内存耗尽。例如,我想这样做:
(mod(8888 ^ 38071670985)9746347772161)
我可以实现自己的算法,但如果这些算法已经存在,那就太好了。
答案 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
记忆只是代表。
所以从这开始可能不是最好的主意。库是否支持使用这么大的数字进行计算?