如何在LISP中乘以两个大整数

mea*_*gee -2 lisp common-lisp

给定n位整数和m位整数.如何使用列表,数组或任何其他特定于lisp的数据类型在LISP中将它们相乘?

例如;

一(1)(2)... A(N)

B(1)B(2)... B(M)

结果;

R(1)R(2)... R(M + N)

Bas*_*tch 6

Common Lisp本身已经是bignums.你为什么不用它们?

你基本上不必特别申报任何东西,他们"神奇地"发生:

 % sbcl
 This is SBCL 1.0.56.0.debian, an implementation of ANSI Common Lisp.

 * (defun fact (n) (if (< n 1) 1 (* n (fact (- n 1)))))
 FACT

 * (fact 50)
 30414093201713378043612608166064768844377641568960512000000000000
Run Code Online (Sandbox Code Playgroud)

所以使用Common Lisp,你基本上不必费心......

附加物

高效的bignum算法是一个非常困难的问题 ; 高效的算法比天真的算法具有更好的复杂性; 你可以找到解释它们的困难书籍(基础数学很难).另见这个答案.

如果你想要有竞争力的bignum实施,准备好工作几年,并使其成为博士论文.