I changed "integer-length" to use numberOfLeadingZeros or bitLength methods.
It reduces execution time a bit. So that of "exact-integer-sqrt" too.

;; test with name integer-length-new

(defmulti ;; #^{:private true}
  integer-length-new class)
(defmethod integer-length-new java.lang.Integer [n]
  (- 32 (Integer/numberOfLeadingZeros n)))
(defmethod integer-length-new java.lang.Long [n]
  (- 64 (Long/numberOfLeadingZeros n)))
(defmethod integer-length-new java.math.BigInteger [n]
  (.bitLength n))

(defn time-f [f start length]
  (time (dorun (map f (range start (+ start length))))))

;; Integer case
(time-f integer-length (expt 2 10) (expt 10 6))
"Elapsed time: 435.079883 msecs"

(time-f integer-length-new (expt 2 10) (expt 10 6))
"Elapsed time: 415.858854 msecs"

;; Long case
(time-f integer-length (expt 2 40) (expt 10 6))
"Elapsed time: 746.825107 msecs"

(time-f integer-length-new (expt 2 40) (expt 10 6))
"Elapsed time: 612.915711 msecs"

;; BigInteger case
(time-f integer-length (expt 2 70) (expt 10 5))
"Elapsed time: 1263.520978 msecs"

(time-f integer-length-new (expt 2 70) (expt 10 5))
"Elapsed time: 1006.090455 msecs"

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To post to this group, send email to clojure@googlegroups.com
To unsubscribe from this group, send email to 
clojure+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/clojure?hl=en
-~----------~----~----~----~------~----~------~--~---

--- math.clj.~master~	2009-03-30 10:37:00.000000000 +0900
+++ math.clj	2009-03-30 11:04:02.000000000 +0900
@@ -134,11 +134,11 @@
 ; Length of integer in binary, used as helper function for sqrt.
 (defmulti #^{:private true} integer-length class)
 (defmethod integer-length java.lang.Integer [n]
-  (count (Integer/toBinaryString n)))
+  (- 32 (Integer/numberOfLeadingZeros n)))
 (defmethod integer-length java.lang.Long [n]
-  (count (Long/toBinaryString n)))
+  (- 64 (Long/numberOfLeadingZeros n)))
 (defmethod integer-length java.math.BigInteger [n]
-  (count (. n toString 2)))
+  (.bitLength n))
 
 ;; Produces the largest integer less than or equal to the square root of n
 ;; Input n must be a non-negative integer

Reply via email to