Learning/SICP/exercise_1_16.janet
2025-05-29 22:00:25 +02:00

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)