; approximate squaring

(define (asq x)
  (define (sq x) (* x (ceiling x)))
  (let loop ((x (sq x)) (xs (list x)))
    (if (integer? x)
        (reverse (cons x xs))
        (loop (sq x) (cons x xs)))))

(display (asq 8/7)) (newline)
(display (asq 10/6)) (newline)

(define (asq-table d)
  (do ((n (+ d 1) (+ n 1))) ((= n (+ d d)))
    (let ((xs (asq (/ n d))))
      (display n) (display " ")
      (display (- (length xs) 1)) (display " ")
      (display (car (reverse xs))) (newline))))

(asq-table 6)
(asq-table 8)