largest remainder


Create a function that accepts a positive integer and an upper bound and returns the largest remainder resulting from dividing the given integer by a positive integer that's less than the given bound.

 $ cat lrd.rkt 
 #lang racket 
 (require rackunit srfi/1) 
  
 (define (lrd n d-max) 
   (let loop ((d (- d-max 1)) (r-max 0)) 
     (if (<= d r-max) 
       r-max 
       (loop (- d 1) (max (remainder n d) r-max))))) 
  
 (define (lrd2 n d-max) 
   (fold max 0 
     (map (lambda (d) (remainder n (+ d 1))) 
       (iota (- d-max 1))))) 
  
  
 (do ((n 1 (+ n 1))) ((> n 101)) 
   (do ((d 1 (+ d 1))) ((= d n)) 
     (check-eq? (lrd n d) (lrd2 n d)))) 
  
 (define (time-it f N) 
   (let-values 
     (((a b c d) 
         (time-apply 
           (lambda () 
             (do ((n 1 (+ n 1))) ((> n N)) 
               (do ((d 1 (+ d 1))) ((= d N)) 
                 (f n d)))) '()))) 
     b)) 
  
 (define N 400) 
 (printf "lrd msec: ~a\n" (time-it lrd N)) 
 (printf "lrd2 msec: ~a\n" (time-it lrd2 N)) 
  
 $ mzscheme lrd.rkt 
 lrd msec: 180 
 lrd2 msec: 4784 
  
 $