2016-03-06 90 views
0

我有一個簡單的冪函數,我想要做這樣的事情用兩個大數:Clojure的值超出範圍長期

(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十進制bigint乘法運算!即使我們相當慈善地假設您可以每秒執行10億次這樣的操作,但要花900年才能完成這一計算。

但是讓我們假設你願意等那麼久。您也必須在計算機上執行一些內存升級:由此產生的數量會佔用(非常粗略)您機器的整個存儲容量(至2016年爲止:當您最終完成乘數時,在2900年,他們可能會有這種尺寸的拇指驅動器)。

如果,要麼是你沒有問題,那麼你只需要編寫一個版本的repeat使用bigints計數,而不是長期的重複:

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