我有一个简单的幂函数,我想用两个大数字来做这样的事情:
(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)
有没有办法解决这个问题?
答案 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)))))