-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathex_1_25.clj
29 lines (23 loc) · 827 Bytes
/
ex_1_25.clj
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
(ns sicp.chapter-1.part-2.ex-1-25
(:require
[sicp.misc :as m]))
; Exercise 1.25
; Alyssa P. Hacker complains that we went to a lot of extra work in writing expmod
; After all, she says, since we already know how to compute exponentials, we could have simply written.
; (define (expmod base exp m)
; (remainder (fast-expt base exp) m))
; Is she correct? Would this procedure serve as well for our fast prime tester? Explain.
(defn fast-expt
[b n]
(cond (= n 0) 1
(even? n) (m/square (fast-expt b (/ n 2)))
:else (* b (fast-expt b (- n 1)))))
(defn expmod-alyssa
[base exp m]
(rem (fast-expt base exp) m))
(defn expmod
[base exp m]
(cond (= exp 0) 1
(even? exp)
(rem (m/square (expmod base (/ exp 2) m)) m)
:else (rem (* base (expmod base (- exp 1) m)) m)))