; We can write lob-mult using the standard shift-and-add ; multiplication technique taught in grade school, but it's probably easier ; to just use the equations: ;
; (0) * (0) = 0 ; (0) * (2a + b) = 0 ; (2a + b) * (0) = 0 ; (2x + 0) * (2y + 0) = 4xy ; (2x + 1) * (2y + 0) = 4xy+2y ; (2x + 0) * (2y + 1) = 4xy+2x ; (2x + 1) * (2y + 1) = 4xy+2(x+y)+1 ;
; (define lob-mult (lambda (l1 l2) (cond [(and (null? l1) (null? l2)) null] [(and (null? l1) (cons? l2)) null] [(and (cons? l1) (null? l2)) null] [(and (cons? l1) (cons? l2)) (cond [(and (zero? (car l1)) (zero? (car l2))) (lob-mult2 (lob-mult2 (lob-mult (cdr l1) (cdr l2))))] [(and (zero? (car l1)) (one? (car l2))) (lob-add l1 (lob-mult2 (lob-mult2 (lob-mult (cdr l1) (cdr l2)))))] [(and (one? (car l1)) (zero? (car l2))) (lob-add l2 (lob-mult2 (lob-mult2 (lob-mult (cdr l1) (cdr l2)))))] [(and (one? (car l1)) (one? (car l2))) (lob-add1 (lob-add (lob-mult2 (lob-add (cdr l1) (cdr l2))) (lob-mult2 (lob-mult2 (lob-mult (cdr l1) (cdr l2))))))] [else (error "missed a case in lob-mult/case1,1: " l1 l2)])] [else (error "missed a case in lob-mult: " l1 l2)]))) ;(lob-mult null null) ;(lob-mult null (list 0 1)) ;(lob-mult (list 0 1) null) ;(lob-mult (list 1 0 1 1) (list 1)) ;(lob-mult (list 1 1) (list 0 0 1)) ;(lob-mult (list 0 1) (list 0 1)) ;'------ ;(lob-mult (list 0 1) (list 1 1)) ;(lob-mult (list 1 1) (list 0 1)) ;(lob-mult (list 1 0 1) (list 1 1)) ;(lob-mult (list 1 0 1 1) (list 0 1))