Clojure 值长时间超出范围

Clojure Value out of range for long

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

(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)

有什么办法可以解决这个问题吗?

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

但假设您愿意等那么久。您还必须在您的计算机上执行一些内存升级:由此产生的数字将(非常粗略地)占用您计算机上的 space 与互联网的整个存储容量(无论如何截至 2016 年:当你终于乘完了,在2900年,他们可能会有这种大小的U盘。

如果这对您来说也没有问题,那么您只需编写 repeat 的一个版本,它使用 bigints 来计算重复次数,而不是 long:

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