Clojure值超出范围

时间:2016-03-06 22:09:05

标签: clojure long-integer integer-overflow

我有一个简单的幂函数,我想用两个大数字来做这样的事情:

(def y 19859145917581983573N)
(def p 27829350753993985481N)
(defn power
  [x n]
  (reduce *' (repeat n x))
  )
(power y p)

我收到此错误:

IllegalArgumentException Value out of range for long: 27829350753993985481  clojure.lang.RT.longCast (RT.java:1210)

有没有办法解决这个问题?

1 个答案:

答案 0 :(得分:8)

您将不得不找到一种比简单重复乘法更有效的求幂方法。你要求你的计算机执行27次quintillion bigint乘法!即使我们非常慈悲地假设您每秒可以执行十亿次这样的操作,也需要900年才能完成此计算。

但是我们假设你愿意等那么久。您还必须在计算机上执行一些内存升级:由此产生的数字将占用(非常大)您计算机上的空间与互联网的整个存储容量(截至2016年:当您最终完成倍增时) ,在2900年,他们可能会有这种尺寸的拇指驱动器。)

如果你也没有问题,那么你只需编写repeat版本,使用bigint来计算重复次数而不是长篇:

(defn repeat' [n x]
  (lazy-seq 
    (when (> n 0N)
      (cons x (repeat' (dec' n) x)))))