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