Lisp SBCL中的bignum乘法

Lisp SBCL中的bignum乘法,lisp,common-lisp,sbcl,Lisp,Common Lisp,Sbcl,昨天我试图计算出新的梅森素数()的大小 在我的SBCL机箱上(版本1.3.2(x64)、Windows 10、Dell Core i5 8GB RAM) 差不多一个小时后,我放弃了,中断了计算。 在生成的屏幕下方: This is SBCL 1.3.2, an implementation of ANSI Common Lisp. More information about SBCL is available at <http://www.sbcl.org/>. SBCL is

昨天我试图计算出新的梅森素数()的大小 在我的SBCL机箱上(版本1.3.2(x64)、Windows 10、Dell Core i5 8GB RAM) 差不多一个小时后,我放弃了,中断了计算。 在生成的屏幕下方:

This is SBCL 1.3.2, an implementation of ANSI Common Lisp.
More information about SBCL is available at <http://www.sbcl.org/>.

SBCL is free software, provided as is, with absolutely no warranty.
It is mostly in the public domain; some portions are provided under
BSD-style licenses.  See the CREDITS and COPYING files in the
distribution for more information.

WARNING: the Windows port is fragile, particularly for multithreaded
code.  Unfortunately, the development team currently lacks the time
and resources this platform demands.
* (- (expt 2 74207281) 1)


debugger invoked on a SB-SYS:INTERACTIVE-INTERRUPT in thread
 '#<THREAD "main thread" RUNNING {1002A9BD03}>:'
  Interactive interrupt at #x100008BD9E.

Type HELP for debugger help, or (SB-EXT:EXIT) to exit from SBCL.

restarts (invokable by number or by possibly-abbreviated name):

  0: [CONTINUE] Return from SB-WIN32::SIGINT.

  1: [ABORT   ] Exit debugger, returning to top level.
1

(SB-BIGNUM:MULTIPLY-BIGNUMS #<unavailable argument> #<unavailable argument>)
0] 1
只花了8秒就开始了数字展览

尽管这可能是一个bug,但有人知道SBCL是如何实现bignum乘法的吗?它这样做的方式是否会成为拖延的可能原因

提前谢谢

*编辑


在西尔维斯特的评论之后,也许正确的问题是:是什么阻止了这个大数字的出现?是的,它确实很大(Racket和Haskell版本将其写入了21MB的文本文件),但似乎有超出其大小的东西阻止了任务的完成。

在我的机器上,实际计算速度相当快,实际上不到一秒钟

(defun make prime()
(声明(优化(安全0)(调试0)(速度3)))
(时间(-(实验2 74207281)1)))
(def参数*prime*(make prime))
;评价采取了:
;  0.000秒的实时性
;  总运行时间为0.000017秒(0.000015用户,0.000002系统)
;  100.00%CPU
;  1292处理器周期
;  消耗0字节
; ==> *主要的*

然而,打印数字完全是另一回事。

我已经尝试了你的代码,几乎花了同样的时间,但当我执行(使素数)时,打印又挂断了。我被迫认为问题在于bignum乘法(SB-bignum:MULTIPLY-BIGNUMS),我将重新表述我的问题。西尔维斯特的答案是正确的:bignum乘法很快,但打印速度很慢。在许多系统中,打印非常大的数字一直是一个性能问题(主要是Lisps,但不仅如此):我怀疑这种明显的方法有一些可怕的性能特征,但正如Racket&c所见证的,显然有更好的方法。一个问题是对整个过程进行计时(到一个文件,而不是终端!):可能是更好的系统开始发送数字的时间更快,但生成整个输出所需的时间类似,甚至更长。
74207281*log10(2)=22338617.47766583040356636
=>22338618百万位,其中很少一位是30037641。。。(
10**0.47766583040356636=3.003764155059042
)@tfb:你有什么办法吗?标准的方法(开-写-行-关)也会导致同样的结果。@Will Ness:是的,你是对的:我用Racket得到的大文件是从30037641开始的…@rand:如果是这样的话,那么我想SBCL的bignum打印真的很慢,答案是看看它做了什么使它如此慢。当然,这不是一个真正有用的答案。关闭一些打印精美选项可能会有所帮助。
GHCi, version 7.10.3: http://www.haskell.org/ghc/  :? for help

Prelude> 2^74207281 - 1