Clojure值长期超出范围

Clojure值长期超出范围,clojure,long-integer,integer-overflow,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

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

(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个五分之一的bigint乘法!即使我们非常仁慈地假设,每秒可以执行十亿次这样的运算,也需要900年才能完成这个计算

但假设你愿意等那么久。您还必须在计算机上执行一些内存升级:由此产生的数字将占用(非常粗略地)相当于整个互联网存储容量的计算机空间(无论如何,截至2016年:当您最终完成乘法运算后,在2900年,他们可能会有这样大小的拇指驱动器)

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

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

你到底想完成什么?你想做模幂运算吗?