84 lines
1.7 KiB
Plaintext
84 lines
1.7 KiB
Plaintext
|
|
(defn expt [b n]
|
|
(if (= n 0)
|
|
1
|
|
(* b (expt b (- n 1)))))
|
|
|
|
(defn expt2 [b n]
|
|
(defn expt-iter [b n s]
|
|
(if (= n 0)
|
|
s
|
|
(expt-iter b (- n 1) (* s b))))
|
|
(expt-iter b n 1))
|
|
|
|
(defn fast-expt [b n]
|
|
(defn even? [n]
|
|
(= (mod n 2) 0))
|
|
(defn square [n]
|
|
(* n n))
|
|
(defn expt-iter [b n s]
|
|
(cond
|
|
(= n 0) s
|
|
(even? n) (square (expt-iter b (/ n 2) s))
|
|
(* b (expt-iter b (- n 1) s))))
|
|
(expt-iter b n 1))
|
|
|
|
(defn fast-expt2 [b n]
|
|
(defn even? [n]
|
|
(= (mod n 2) 0))
|
|
(defn square [n]
|
|
(* n n))
|
|
(defn expt-iter [b n s]
|
|
(cond
|
|
(= n 0) s
|
|
(even? n) (expt-iter (square b) (/ n 2) s)
|
|
(expt-iter b (- n 1) (* b s))))
|
|
(expt-iter b n 1))
|
|
|
|
(defn count-fast-expt2 [b n]
|
|
(var counter 0)
|
|
(defn even? [n]
|
|
(= (mod n 2) 0))
|
|
(defn square [n]
|
|
(* n n))
|
|
(defn expt-iter [b n s]
|
|
(set counter (+ counter 1))
|
|
(cond
|
|
(= n 0) s
|
|
(even? n) (expt-iter (square b) (/ n 2) s)
|
|
(expt-iter b (- n 1) (* b s))))
|
|
(expt-iter b n 1)
|
|
counter)
|
|
|
|
# case 1 (n mod 2 = 0):
|
|
# f(b,n) = f(b,n/2)^2
|
|
# case 2 (n mod 2 = 1):
|
|
# f(b,n) = f(b,n-1)*b
|
|
# iterative approach:
|
|
# case 1 (n mod 2 = 0):
|
|
# f(b,n) = f(b^2, n/2)
|
|
# case 2 (n mod 2 = 1):
|
|
# f(b,n) = f(b, n-1)*b
|
|
|
|
# examples:
|
|
# n = 1
|
|
# f(b,1) = f(b,0)*b = 1 * b = b
|
|
# n = 2
|
|
# f(b,2) = f(b^2,1) = 1 * b^2 = b^2
|
|
# n = 3
|
|
# f(b,3) = f(b,2)*b = f(b^2, 1) * b = b * b^2 = b^3
|
|
# n = 4
|
|
# f(b,4) = f(b^2,2) = f(b^4, 1) = 1 * b^4 = b^4
|
|
# n = 5
|
|
# f(b,5) = f(b,4)*b = f(b^4, 1) = b * b^5 = b^5
|
|
|
|
(def k 100000)
|
|
(defn lo [n]
|
|
(cond
|
|
(= n k) (printf "%d,%d" n (count-fast-expt2 0.99 n))
|
|
(do
|
|
(printf "%d,%d" n (count-fast-expt2 0.99 n))
|
|
(lo (+ n 1)))))
|
|
|
|
(lo 0)
|