我正在尝试通过键入
来使用CLISP实现获得第一个lisp程序(print (mod (+ (* 28433 (expt 2 7830457) 1)) (expt 10 10))))
在REPL中。
但它给了我*** - overflow during multiplication of large numbers
。我认为lisp具有任意大小/精度。怎么会发生呢?
答案 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
非常快。为了您的目的,这是有效的。