---------------------------------------
Tutorial notes #5 for 3/12 or 3/13/2007
TA: Stephen McCamant
Email: smcc@mit.edu
Location: 36-113A or 36-115
http://people.csail.mit.edu/smcc/6.001-sp07/
----------------------------------------
Quiz 1 hand-back
Median for my students: 92/100
Go over tricky problems?
----------------------------------------
Project 1 work time statistics
Mean: 9.5 hrs
Quartiles: 5, 7, 12 hrs
Standard deviation: 6.35 hrs
How to make future projects go faster?
- You get less efficient if try to work
for too long at once: start early, but
do a bit every day.
- Talk through project with others (but
list them as collaborators)
- Ask for help when you need it, not at
the last minute
----------------------------------------
Project 1 hand-back
Comments in red are things I took off
points for.
Comments in green are things I didn't, but
they're still important.
----------------------------------------
Project 1 common mistakes
- Easiest way to lose lots of points:
start late, turn in late, and skip the
last couple of problems
- You need to write your own test cases
(took off one point per problem, up to
5, for this)
- Be sure to answer all the parts of all
the questions.
- Problems in key generation:
- Need to check that p*q is big enough
- When retrying, need to pick new p,q
- random-prime can fail in many ways
(you needed to give at least two)
- Procedures not running fast enough
- "louis-mult" problem
- Don't delay moding in exptmod
- We wanted you to do RSA on single,
large numbers representing strings
not sequences of small ones. (RSA on
small numbers isn't secure.)
- I tested your code by actually running it
- So make sure to use the right
procedure names
- And argument lists
- And comment out all your test cases
- Make sure your test cases match your
code
- Rerun tests when you change the code,
even if "this can't break anything"
- The only legitimate way to get test
results is by running the code you've
written. Anything else is cheating.
- Be sure to list your collaborators
- Collaboration is good, we encourage it
- But, you *must* acknowledge your
collaborators
- And, you must write up your work
yourself.
- Having submissions online makes it
easy for us to catch cheating, and
we have.
----------------------------------------
Office-hours style open questions
----------------------------------------
All you need is HOPs
In my continuing quest to prove that
pairs don't need to be a primitive data
type, I started to write an
implementation of booleans using
higher-order procedures:
(define (my-if cond then else)
(cond then else))
What definitions of my-true and my-false
go with this?
(define (my-true then else) then)
(define (my-false then else) else)
Also, I want to get rid of pairs.
(define (my-car p) (p my-true))
(define (my-cdr p) (p my-false))
How should I write my-cons?
(define (my-cons a b)
(lambda (selector)
(if selector a b)))
While I'm at it, it would be nice to
replace numbers too. One idea is to
represent "n" by a higher-order function
that repeats its argument n times.
("Church numerals")
Write zero, one, zero?
(define (zero f) identity)
(define (one f) (lambda (x) (f x)))
(define one identity) ; equivalently
(define (zero? n)
((n (lambda (x) my-false)) my-true))
Write plus-one
(define (plus-one n)
(lambda (f)
(lambda (x)
(f ((n f) x)))))
Write plus
(define (plus m n)
(lambda (f)
(lambda (x)
((m f) ((n f) x)))))
Write times
(define (times m n)
(compose m n))
Write to-the
(define (to-the m n)
(n m))
Write minus-one
;; Solution apparently due to Norman Ramsey
; (lag (cons m n)) -> (n+1 . n)
(define (lag p)
(my-cons (plus-one (my-car p)) (my-car p)))
(define (minus-one n)
(my-cdr ((n lag) (my-cons zero zero))))
Without a special form for if, it's hard to
write recursive procedures. But we can use
numerals to implement loops.
Are there any loops you can't do with
numbers?
You can't do a loop where you don't know at the beginning how long it
will run for, including things like interactive programs, as well as
evaluators for other programming languages. Also, there are some
functions that get so big, you won't be able to compute how many
iterations they'll take to compute.