summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--coding-exercises/1/21.rkt20
-rw-r--r--coding-exercises/1/22.rkt48
-rw-r--r--coding-exercises/1/23.rkt52
-rw-r--r--coding-exercises/1/24.rkt70
-rw-r--r--coding-exercises/1/27.rkt24
-rw-r--r--coding-exercises/1/28.rkt33
-rw-r--r--coding-exercises/1/29.rkt34
-rw-r--r--coding-exercises/1/30.rkt4
-rw-r--r--coding-exercises/1/chapter115.rkt (renamed from chapter115.rkt)0
-rw-r--r--coding-exercises/1/chapter116.rkt (renamed from chapter116.rkt)0
-rw-r--r--coding-exercises/1/chapter117.rkt (renamed from chapter117.rkt)1
-rw-r--r--lecture1-mit.rkt19
-rw-r--r--lecture1b.rkt37
-rw-r--r--test.rkt7
-rw-r--r--tree-recursion.rkt19
15 files changed, 285 insertions, 83 deletions
diff --git a/coding-exercises/1/21.rkt b/coding-exercises/1/21.rkt
new file mode 100644
index 0000000..7cda52f
--- /dev/null
+++ b/coding-exercises/1/21.rkt
@@ -0,0 +1,20 @@
+#lang racket
+(require racket/pretty)
+(require sicp)
+
+(define (smallest-divisor n)
+ (find-divisor n 2))
+
+(define (find-divisor n test-divisor)
+ (cond ((> (square test-divisor) n) n)
+ ((divides? test-divisor n) test-divisor)
+ (else (find-divisor n (+ test-divisor 1)))))
+
+(define (square x) (* x x))
+
+(define (divides? a b)
+ (= (remainder b a) 0))
+
+;; (pretty-print (smallest-divisor 199))
+;; (pretty-print (smallest-divisor 1999))
+;; (pretty-print (smallest-divisor 19999))
diff --git a/coding-exercises/1/22.rkt b/coding-exercises/1/22.rkt
new file mode 100644
index 0000000..feec18b
--- /dev/null
+++ b/coding-exercises/1/22.rkt
@@ -0,0 +1,48 @@
+#lang racket
+(require racket/pretty)
+(require sicp)
+
+(define (smallest-divisor n)
+ (find-divisor n 2))
+
+(define (find-divisor n test-divisor)
+ (cond ((> (square test-divisor) n) n)
+ ((divides? test-divisor n) test-divisor)
+ (else (find-divisor n (+ test-divisor 1)))))
+
+(define (square x) (* x x))
+
+(define (divides? a b)
+ (= (remainder b a) 0))
+
+(define (prime? n)
+ (= n (smallest-divisor n)))
+
+(define (report-prime n t duration)
+ (print n)
+ (println " *** prime")
+ (println duration)
+ t)
+
+(define (start-prime-test n start-time)
+ (if (prime? n)
+ (report-prime n true (- (current-inexact-milliseconds) start-time))
+ false))
+
+(define (time-prime-test n)
+ (start-prime-test n (current-inexact-milliseconds)))
+
+(define (search-for-primes found n)
+ (cond
+ ((> found 2) "found three primes")
+ ((time-prime-test n) (search-for-primes (+ found 1) (+ n 2)))
+ (else (search-for-primes found (+ n 2)))))
+
+(println " *** search for primes")
+(search-for-primes 0 1001)
+(println " *** search for primes")
+(search-for-primes 0 10001)
+(println " *** search for primes")
+(search-for-primes 0 100001)
+(println " *** search for primes")
+(search-for-primes 0 1000001)
diff --git a/coding-exercises/1/23.rkt b/coding-exercises/1/23.rkt
new file mode 100644
index 0000000..f44c87c
--- /dev/null
+++ b/coding-exercises/1/23.rkt
@@ -0,0 +1,52 @@
+#lang racket
+(require racket/pretty)
+(require sicp)
+
+(define (next n)
+ (if (= n 2) 3 (+ n 2)))
+
+(define (find-divisor n test-divisor)
+ (cond ((> (square test-divisor) n) n)
+ ((divides? test-divisor n) test-divisor)
+ (else (find-divisor n (next test-divisor)))))
+
+
+(define (smallest-divisor n)
+ (find-divisor n 2))
+
+(define (square x) (* x x))
+
+(define (divides? a b)
+ (= (remainder b a) 0))
+
+(define (prime? n)
+ (= n (smallest-divisor n)))
+
+(define (report-prime n t duration)
+ (print n)
+ (println " *** prime")
+ (println duration)
+ t)
+
+(define (start-prime-test n start-time)
+ (if (prime? n)
+ (report-prime n true (- (current-inexact-milliseconds) start-time))
+ false))
+
+(define (time-prime-test n)
+ (start-prime-test n (current-inexact-milliseconds)))
+
+(define (search-for-primes found n)
+ (cond
+ ((> found 2) "found three primes")
+ ((time-prime-test n) (search-for-primes (+ found 1) (+ n 2)))
+ (else (search-for-primes found (+ n 2)))))
+
+(println " *** search for primes")
+(search-for-primes 0 1001)
+(println " *** search for primes")
+(search-for-primes 0 10001)
+(println " *** search for primes")
+(search-for-primes 0 100001)
+(println " *** search for primes")
+(search-for-primes 0 1000001)
diff --git a/coding-exercises/1/24.rkt b/coding-exercises/1/24.rkt
new file mode 100644
index 0000000..9dae66c
--- /dev/null
+++ b/coding-exercises/1/24.rkt
@@ -0,0 +1,70 @@
+#lang racket
+(require racket/pretty)
+(require sicp)
+
+(define (next n)
+ (if (= n 2) 3 (+ n 2)))
+
+(define (square x) (* x x))
+
+(define (divides? a b)
+ (= (remainder b a) 0))
+
+(define (find-divisor n test-divisor)
+ (cond ((> (square test-divisor) n) n)
+ ((divides? test-divisor n) test-divisor)
+ (else (find-divisor n (next test-divisor)))))
+
+(define (smallest-divisor n)
+ (find-divisor n 2))
+
+(define (prime? n)
+ (= n (smallest-divisor n)))
+
+(define (expmod base e m)
+ (cond
+ ((= e 0) 1)
+ ((even? e)
+ (remainder (square (expmod base (/ e 2) m)) m))
+ (else
+ (remainder (* base (expmod base (- e 1) m)) m))))
+
+(define (fermat-test n)
+ (define (try-it a)
+ (= (expmod a n n) a))
+ (try-it (+ 1 (random (- n 1)))))
+
+(define (fast-prime? n times)
+ (cond
+ ((= times 0) true)
+ ((fermat-test n) (fast-prime? n (- times 1)))
+ (else false)))
+
+(define (report-prime n t duration)
+ (print n)
+ (println " *** prime")
+ (println duration)
+ t)
+
+(define (start-prime-test n start-time)
+ (if (fast-prime? n 3)
+ (report-prime n true (- (current-inexact-milliseconds) start-time))
+ false))
+
+(define (time-prime-test n)
+ (start-prime-test n (current-inexact-milliseconds)))
+
+(define (search-for-primes found n)
+ (cond
+ ((> found 2) "found three primes")
+ ((time-prime-test n) (search-for-primes (+ found 1) (+ n 2)))
+ (else (search-for-primes found (+ n 2)))))
+
+(println " *** search for primes")
+(search-for-primes 0 1001)
+(println " *** search for primes")
+(search-for-primes 0 10001)
+(println " *** search for primes")
+(search-for-primes 0 100001)
+(println " *** search for primes")
+(search-for-primes 0 1000001)
diff --git a/coding-exercises/1/27.rkt b/coding-exercises/1/27.rkt
new file mode 100644
index 0000000..8762d6c
--- /dev/null
+++ b/coding-exercises/1/27.rkt
@@ -0,0 +1,24 @@
+#lang racket
+(require sicp)
+
+(define (square x)
+ (* x x))
+
+(define (expmod base e m)
+ (cond
+ ((= e 0) 1)
+ ((even? e)
+ (remainder (square (expmod base (/ e 2) m)) m))
+ (else
+ (remainder (* base (expmod base (- e 1) m)) m))))
+
+(define (fermat? a n)
+ (= (expmod a n n) a))
+
+(define (all-fermat n)
+ (define (f a n)
+ (cond
+ ((= a 0) true)
+ ((fermat? (- a 1) n) (f (- a 1) n))
+ (else false)))
+ (f n n))
diff --git a/coding-exercises/1/28.rkt b/coding-exercises/1/28.rkt
new file mode 100644
index 0000000..39a10d9
--- /dev/null
+++ b/coding-exercises/1/28.rkt
@@ -0,0 +1,33 @@
+#lang racket
+(require sicp)
+
+(define (square x)
+ (* x x))
+
+(define (signal b e m x)
+ (cond
+ ((= e (- m 1)) x) ;; end result
+ ((= b (- m 1)) x) ;; base squared wil result in trivial root
+ ((= x 1) 0) ;; non-trivial root
+ (else x))) ;; no root found
+
+(define (expmod base e m)
+ (cond
+ ((= e 0) 1)
+ ((even? e)
+ (signal base e m (remainder (square (expmod base (/ e 2) m)) m)))
+ (else
+ (remainder (* base (expmod base (- e 1) m)) m))))
+
+(define (mr a n)
+ (= (expmod a (- n 1) n) 1))
+
+(define (all-mr n)
+ (define (f a n)
+ (cond
+ ((<= a 2) true)
+ ((mr (- a 1) n) (f (- a 1) n))
+ (else false)))
+ (f n n))
+
+(all-mr 1)
diff --git a/coding-exercises/1/29.rkt b/coding-exercises/1/29.rkt
new file mode 100644
index 0000000..b0d3ab8
--- /dev/null
+++ b/coding-exercises/1/29.rkt
@@ -0,0 +1,34 @@
+#lang racket
+(require sicp)
+
+(define (id x) x)
+
+(define (sum term a next b)
+ (if (> a b)
+ 0
+ (+ (term a)
+ (sum term (next a) next b))))
+
+(define (simpson f lower upper n)
+ (define (h)
+ (/ (- upper lower) n))
+ (define (term a)
+ (cond
+ ((= a 0) (f a))
+ ((= a upper) (f a))
+ ((even? a) (* 2 (f a)))
+ (else (* 4 (f a)))))
+
+ (* (/ (h) 3.0)
+ (sum term lower inc upper)))
+
+(define (cube x) (* x x x))
+(define (integral f a b dx)
+ (define (add-dx x) (+ x dx))
+ (* (sum f (+ a (/ dx 2.0)) add-dx b) dx))
+
+(integral cube 0 1 100)
+(println "")
+(simpson cube 0 1 100)
+(println "")
+(simpson cube 0 1 1000)
diff --git a/coding-exercises/1/30.rkt b/coding-exercises/1/30.rkt
new file mode 100644
index 0000000..c9bf57d
--- /dev/null
+++ b/coding-exercises/1/30.rkt
@@ -0,0 +1,4 @@
+#lang racket
+(require sicp)
+
+
diff --git a/chapter115.rkt b/coding-exercises/1/chapter115.rkt
index 0a026c6..0a026c6 100644
--- a/chapter115.rkt
+++ b/coding-exercises/1/chapter115.rkt
diff --git a/chapter116.rkt b/coding-exercises/1/chapter116.rkt
index e4f1e7d..e4f1e7d 100644
--- a/chapter116.rkt
+++ b/coding-exercises/1/chapter116.rkt
diff --git a/chapter117.rkt b/coding-exercises/1/chapter117.rkt
index b4a8e27..4a78d54 100644
--- a/chapter117.rkt
+++ b/coding-exercises/1/chapter117.rkt
@@ -5,7 +5,6 @@
(cond ((= b 0) s)
((even? b) (miter s (double a) (halve b)))
(else (miter (+ s a) (double a) (halve (- b 1))))))
-
(define (m a b)
(miter 0 a b))
diff --git a/lecture1-mit.rkt b/lecture1-mit.rkt
deleted file mode 100644
index 2b95306..0000000
--- a/lecture1-mit.rkt
+++ /dev/null
@@ -1,19 +0,0 @@
-#lang sicp
-(inc 487)
-nil
-
-the-empty-stream
-
-(runtime)
-(+ 3 (* 5 6) 8 2)
-
-(define A (* 5 5))
-
-(* A A)
-
-(define B (+ A (* 5 A)))
-B
-
-;; is basically the same
-(define (square x) (* x x))
-(define square (lambda (x) (* x x)))
diff --git a/lecture1b.rkt b/lecture1b.rkt
deleted file mode 100644
index b6769b0..0000000
--- a/lecture1b.rkt
+++ /dev/null
@@ -1,37 +0,0 @@
-#lang sicp
-(define (p)
- (p))
-(define (test x y)
- (if (= 0 x) 0 y))
-;; (test 0 (p))
-
-(define (sqrt-iter guess prev x)
- (if (good-enough? guess prev)
- guess
- (sqrt-iter (improve guess x) guess x)))
-
-(define (abs x)
- (if (> x 0) x (- x)))
-
-(define (good-enough? guess prev)
- (and
- (> prev 0)
- (< (abs (- 1 (/ guess prev))) 0.001)))
-
-(define (improve guess x)
- (/ (+ (/ x guess) guess) 2))
-
-(sqrt-iter 1 0 9.0)
-
-(define (cube-improve guess x)
- (/
- (+ (/ x (* guess guess)) (* 2 guess))
- 3))
-
-
-(define (cuberoot-iter guess prev x)
- (if (good-enough? guess prev)
- guess
- (cuberoot-iter (cube-improve guess x) guess x)))
-
-(cuberoot-iter 1 0 8.0)
diff --git a/test.rkt b/test.rkt
deleted file mode 100644
index 207ae6a..0000000
--- a/test.rkt
+++ /dev/null
@@ -1,7 +0,0 @@
-#lang sicp
-(inc 487)
-nil
-
-the-empty-stream
-
-(runtime)
diff --git a/tree-recursion.rkt b/tree-recursion.rkt
deleted file mode 100644
index 031d40f..0000000
--- a/tree-recursion.rkt
+++ /dev/null
@@ -1,19 +0,0 @@
-#lang sicp
-(define (myfun n)
- (cond ((< n 3) n)
- (else (+ (myfun (- n 1))
- (* 2 (myfun (- n 2)))
- (* 3 (myfun (- n 3)))))))
-(myfun 11)
-
-(define (myfun2 n)
- (define (mf i a b c)
- (cond ((< n 3) n)
- ((> i n) a)
- (else (mf (+ i 1)
- (+ a (* 2 b) (* 3 c))
- a
- b))))
- (mf 3 2 1 0))
-
-(myfun 11)