在Haskell中处理大数字

在Haskell中处理大数字,haskell,biginteger,Haskell,Biginteger,我试图在Haskell(不是Miller-Rabin)中实现Miller测试。我处理的是大数,特别是我需要对大数进行幂运算,并将大数的模改为另一个大数 是否有任何标准的功能来执行此操作?normal expt函数()在计算结果之前告诉我内存不足。例如,我想做: (国防部(8888^38071670985)9746347772161) 我可以实现我自己的算法,但如果这些算法已经存在,那就太好了。包中有模幂运算(还有更多) 既然是我写的,我很想听听你是否觉得它有用,还有哪些地方可以改进 如果你试图计

我试图在Haskell(不是Miller-Rabin)中实现Miller测试。我处理的是大数,特别是我需要对大数进行幂运算,并将大数的模改为另一个大数

是否有任何标准的功能来执行此操作?normal expt函数()在计算结果之前告诉我内存不足。例如,我想做:

(国防部(8888^38071670985)9746347772161)


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

包中有模幂运算(还有更多)

既然是我写的,我很想听听你是否觉得它有用,还有哪些地方可以改进

如果你试图计算

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


因此,您还必须在计算过程中减少中间结果。这不仅可以让计算毫无问题地放入内存,而且速度更快,因为所涉及的数字仍然相当小。

在取模之前,近似您的数字是

  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
只是为了表现的记忆


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

…您的指数非常大。。。但是…NVM需要实现我自己的。我研究了这些算法的Haskell实现。它们正是我应该如何实现它们的。正如我所说。。。你的指数是…,非常大…也许试着估计一下你需要多少内存来存储你的指数。这是一个巨大的数字,你想储存。这是辉煌的工作。我从一开始就应该这么做。我不知道为什么我没有。无论如何,我已经盯着算法看了一段时间了。不管出于什么原因,我一直试图分别进行expt和mod运算,并没有将它们放在一起使用同余的属性来减少问题。模幂运算不需要保留“取模前的数”