Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #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
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement