Clojure值超出范围

Yar*_*Yar 0 clojure integer-overflow long-integer

我有一个简单的电源功能,我想用两个大数字做这样的事情:

(def y 19859145917581983573N)
(def p 27829350753993985481N)
(defn power
  [x n]
  (reduce *' (repeat n x))
  )
(power y p)
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

IllegalArgumentException Value out of range for long: 27829350753993985481  clojure.lang.RT.longCast (RT.java:1210)
Run Code Online (Sandbox Code Playgroud)

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

ama*_*loy 8

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

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

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

(defn repeat' [n x]
  (lazy-seq 
    (when (> n 0N)
      (cons x (repeat' (dec' n) x)))))
Run Code Online (Sandbox Code Playgroud)