timothy235 icon

sicp-1-3-1-procedures-as-arguments

timothy235 | PRO | 12/19/24 01:21:45 AM UTC (Edited) | 0 ⭐ | 370 👁️ | Never ⏰ | []
Racket |

4.91 KB

|

None

|

0 👍

/

0 👎

#lang racket
 
;;;;;;;;;;
;; 1.29 ;;
;;;;;;;;;;
 
(define (sum term a next b)
  (if (> a b)
    0
    (+ (term a)
       (sum term (next a) next b))))
 
(define (integral f a b dx)
  (define (add-dx x) (+ x dx))
  (* (sum f (+ a (/ dx 2.0)) add-dx b)
     dx))
 
(define (cube x) (* x x x))
 
(integral cube 0 1 0.01)
;; 0.24998750000000042
(integral cube 0 1 0.001)
;; 0.249999875000001
 
;; Simpson's Rule:  Estimate the definite integral of f(x) from x = a to x = b as
;; [(b - a) / (* 3 n)] times
;; [(sum all terms) + (sum all inner terms) + 2 * (sum all odd inner terms)]
;; where n is an even number
 
(define (simpson-integral f a b even-n)
  (define h (/ (- b a) even-n))
  (define (add-dx x) (+ x h))
  (define (add-two-dx x) (+ x h h))
  (* (/ h 3.0)
     (+ (sum f a add-dx b)
        (sum f (+ a h) add-dx (- b h))
        (* 2 (sum f (+ a h) add-two-dx (- b h))))))
 
(simpson-integral cube 0 1 100)
;; 0.25
(simpson-integral cube 0 1 1000)
;; 0.25
 
;;;;;;;;;;
;; 1.30 ;;
;;;;;;;;;;
 
;; iterative-sum is tail-recursive hence iterative
 
(define (iterative-sum term a next b)
  (define (iter a result)
    (if (> a b)
      result
      (iter (next a) (+ result (term a)))))
  (iter a 0))
 
(define (identity x) x)
 
(iterative-sum identity 1 add1 100) ; sum numbers from 1 to 100
;; 5050
 
;;;;;;;;;;
;; 1.31 ;;
;;;;;;;;;;
 
(define (product term a next b)
  (if (> a b)
    1
    (* (term a) (product term (next a) next b))))
 
(define (factorial n)
  (product identity 1 add1 n))
 
(factorial 3)
;; 6
(factorial 4)
;; 24
(factorial 5)
;; 120
 
(define (iterative-product term a next b)
  (define (iter a result)
    (if (> a b)
      result
      (iter (next a) (* result (term a)))))
  (iter a 1))
 
(iterative-product identity 1 add1 5) ; should be factorial(5)
;; 120
 
;; Wallis' formula:
;; pi / 4 = (2 / 3) * (4 / 3) * (4 / 5) * (6 / 5) * (6 / 7) * (8 / 7) ...
 
(define (wallis-term i)
  (define j (* 2 (add1 (quotient i 2))))
  (if (odd? i)
    (/ j (add1 j))
    (/ j (sub1 j))))
 
 
(for ([i (in-range 1 7)]) (displayln (wallis-term i)))
;; 2/3
;; 4/3
;; 4/5
;; 6/5
;; 6/7
;; 8/7
 
(* 4 (product wallis-term 1.0 add1 10))
;; 3.275101041334807
(* 4 (product wallis-term 1.0 add1 100))
;; 3.1570301764551645
(* 4 (product wallis-term 1.0 add1 1000))
;; 3.143160705532257
(* 4 (product wallis-term 1.0 add1 10000))
;; 3.1417497057379635
(* 4 (product wallis-term 1.0 add1 100000))
;; 3.1416083612780903
 
;;;;;;;;;;
;; 1.32 ;;
;;;;;;;;;;
 
(define (accumulate combiner null-value term a next b)
  (if (> a b)
    null-value
    (combiner (term a)
              (accumulate combiner null-value term (next a) next b))))
 
(define (new-sum term a next b)
  (accumulate + 0 term a next b))
 
(new-sum identity 1 add1 100) ; add numbers from 1 to 100
;; 5050
 
(define (new-product term a next b)
  (accumulate * 1 term a next b))
 
(new-product identity 1 add1 5) ; should be factorial(5)
;; 120
 
(define (iterative-accumulate combiner null-value term a next b)
  (define (iter a result)
    (if (> a b)
      result
      (iter (next a) (combiner result (term a)))))
  (iter a null-value))
 
(iterative-accumulate + 0 identity 0 add1 100) ; add numbers from 1 to 100
;; 5050
 
(iterative-accumulate * 1 identity 1 add1 5) ; should be factorial(5)
;; 120
 
;;;;;;;;;;
;; 1.33 ;;
;;;;;;;;;;
 
(define (filtered-accumulate filter? combiner null-value term a next b)
  (define (iter a result)
    (cond [(> a b) result]
          [(filter? a)
           (iter (next a) (combiner result (term a)))]
          [else (iter (next a) result)]))
  (iter a null-value))
 
(define (prime? n [times 10]) ; miller-rabin test from 1.26
  (define (expmod base expo m)
    (cond [(zero? expo) 1]
          [(even? expo)
           (define u (expmod base (/ expo 2) m))
           (define u-squared (remainder (sqr u) m))
           (if (and (= u-squared 1)
                    (> u 1)
                    (< u (sub1 m)))
             0
             u-squared)]
          [else (remainder (* base (expmod base (sub1 expo) m)) m)]))
  (define (try-it a)
    (= (expmod a (sub1 n) n) 1))
  (if (< n 10)
    (member n '(2 3 5 7))
    (for/and ([i (in-range times)])
             ; do not test 0, 1, or n - 1
             (try-it (+ 2 (random (min 4294967087 (- n 3))))))))
 
(define (sum-of-squares-of-primes a b)
  (filtered-accumulate prime? + 0 sqr a add1 b))
 
(sum-of-squares-of-primes 1 4) ; 2 ^ 2 + 3 ^ 2 = 13
;; 13
(sum-of-squares-of-primes 1 10) ; 4 + 9 + 25 + 49 = 87
;; 87
 
(define (product-of-relative-primes n)
  (define (relatively-prime? i)
    (= (gcd i n) 1))
  (filtered-accumulate relatively-prime? * 1 identity 1 add1 n))
 
(product-of-relative-primes 6) ; 1 * 5 = 5
;; 5
(product-of-relative-primes 7) ; 1 * 2 * 3 * 4 * 5 * 6 = 720 
;; 720
(product-of-relative-primes 8) ; 1 * 3 * 5 * 7 = 105
;; 105
(product-of-relative-primes 20)
;; 8729721

Comments