乘法后CLISP溢出

时间:2010-07-02 18:38:39

标签: lisp read-eval-print-loop clisp

我正在尝试通过键入

来使用CLISP实现获得第一个lisp程序
(print (mod (+ (* 28433 (expt 2 7830457) 1)) (expt 10 10))))
在REPL中

但它给了我*** - overflow during multiplication of large numbers。我认为lisp具有任意大小/精度。怎么会发生呢?

5 个答案:

答案 0 :(得分:3)

Lisp的bignums可能拥有非常大的数字,但它们也有其限制。

在您的情况下,您可以将取幂和模数组合到一个程序中,例如:如在http://en.wikipedia.org/wiki/Modular_exponentiation#Right-to-left_binary_method中那样。

答案 1 :(得分:2)

有可能有更好的方法来解决问题。我还没有在PE上做到那么远,但我知道到目前为止我所做的一些事情往往有“啊哈!”解决计算机程序范围内出现的问题。

特别是这个 - ^ ^ 7830457是一个巨大的号码 - 试试(format t "~r" (expt 2 160))。你可能会尝试以新的眼光看问题,看看有没有办法看到你没想过的。

答案 2 :(得分:2)

根据http://clisp.cons.org/impnotes/num-concepts.html,bignum的最大尺寸为(2 ^ 2097088 - 1),而你的2 ^ 7830457远大于此。

也许你可以看一下这个数字的分解 - 或许将一些较小的2 ^ X因子分开......

答案 3 :(得分:1)

Lisp是一系列具有数十种方言和数百种不同实现的语言。

计算机的内存有限。某些操作系统下的程序可能对内存大小有限制。不同的Common Lisp实现使用不同的数字库。

您可能需要查阅CLISP手册,了解其各种数据类型的限制。

答案 4 :(得分:0)

CLisp提供了“mod-expt”(或EXT:mod-expt)函数

[1]> (mod-expt 2 1000000 59)

53

非常快。为了您的目的,这是有效的。