TEL AVIV UNIVERSITY
Department of computer science
0368.1105 – Extended Introduction To computer Science
Spring semester, 2000-2001
Homework 3
This homework is due by 2.4.2001, 18:00, in the hand-in boxes near room 005 in Schreiber building. Write your name, ID number and group number clearly, and keep a copy of the assignment. Remember to include a meaningful sample execution of your code for each question that requires coding (a printout).
1 a. Write a program that checks whether a given input n is a Carmichael number.
b. Write a program that finds all Carmichael numbers up to a given input m.
c. Analyze the running time of the algorithms you gave in a and b.
d. Check the running time on a sample of 10 numbers chosen at random between
1 and 1000000. (Use the primitive procedure (runtime)). Does it match your
prediction?
2. Solve the following recursive equations:
a. T(n)=T(n/2)+O(1), T(1)=O(1).
b. T(n)=2T(n/2)+O(1), T(1)=O(1).
c. T(n)=2T(n/2)+O(n), T(1)=O(1).
d. T(n)=4T(n/2)+O(n), T(1)=O(1).
3. a. In class we saw a recursive solution to factorial. Write an iterative solution to
factorial, call it fact.
Now suppose
(define (fact-mod n b)
(remainder (fact n) b)))
Also write a procedure fact-mod-2 that pushes the mod operation into the
procedure fact.
b. Compare the running time of fact-mod and fact-mod-2 on large n and b.
c. Compute (fact-mod (- n 1) n) on a large random sample of numbers. Can you
guess what is this value?
4. The procedure sum defined here, generates a recursive process.
(define (sum term a next b)
(if (> a b)
0
(+ (term a)
(sum term (next a) next b))))
- Define a new version of sum that generates an iterative process.
- Define a procedure product, analogous to sum, which computes the product of a given function at points over a given range.
5.
Part I
Define a procedure applyto5 that takes a procedure of one argument and applies it to 5. For example,
==> (applyto5 square)
25
Use substitution to evaluate the following expressions:
- (apply-to-5 1+)
value: - (apply-to-5 (lambda(x) (+ 5 x))
value: - (apply-to-5 apply-to-5)
value:
part II
Write a procedure applyto that, given a number n, returns the procedure analogous to applyto5
(for n = 5). That is, you should be able to write
(define applyto5 (applyto 5))
Given the following definitions:
(define applyto5 (applyto 5))
(define (3* x) (* 3 x))
Use substitution to evaluate the following expression:
(apply-to-5 3*)
value:
6. Write a procedure shift which, given a function F and a value a produces the function G such that G(x) = F (x – a). That is, you should have
((shift square 3) 8) ==> 25
7. The square procedure computes the square of a number, and the sqrt procedure computes the square root of a number. Mathematically, these are inverse functions; that is, x = sqrt (square (x)) = square (sqrt (x)) for all nonnegative x. But on the computer, which cannot represent numbers with infinite precision, square and sqrt will not be perfect inverses. In this exercise, we will write procedures to help investigate the behavior of inverse procedures.
- Write a procedure test-sqrt-of-square that takes a number as argument and tests whether the square root of the square of the number is equal to the original number (this procedure should return true or false). Try it on a few numbers.
- Write a procedure test-square-of-sqrt that takes a number as argument and tests whether the square of the square root of the number is equal to the original number. Try it on a few numbers.
- We might want to test other pairs of inverse procedures, not just sqrt and square. Abstract the idea of testing a pair of inverse procedures by writing a procedure make-inverse-tester that takes two procedures as arguments and returns an inverse-testing procedure. For example, we can define test-sqrt-of-square and test-square-of-sqrt as follows:
(define test-square-of-sqrt
(make-inverse-test square sqrt))
(define test-sqrt-of-square
(make-inverse-test sqrt square))
8 a. Write a procedure compose such that (compose F G) evaluated at x returns F
applied to (G x). For example:
((compose square 1+) 7) ==> 64
((compose 1+ square) 7) ==> 50
b. Use compose to define repeated-application, where (repeated-application fn n) is
a procedure that applies fn to its argument n times:
(define 5+ (repeated-application 1+ 5))
(5+ 100) ==> 105
c. Define repeatedapplication without using compose.
9. For each of the cases bellow, give an expression involving foo, whoses evaluation will return the value 2.
a. (define foo
(lambda (x) (* 2 x)))
b. (define foo
(lambda (x) (x 3)))
c. (define foo
(lambda (y) (lambda ( x) (- y x))))
d. (define (foo x)
( x (lambda (x) (* 2 x))))
10. Suppose mad is defined as follows:
(define (mad fn)
(lambda (x) (fn (fn (fn x)))))
What are?
- ((mad 1+) 0)
- ((mad (mad 1+)) 0)
- (((mad mad) 1+) 0)