; vedic divisibility
(define (digits n . args)
(let ((b (if (null? args) 10 (car args))))
(let loop ((n n) (d '()))
(if (zero? n) d
(loop (quotient n b)
(cons (modulo n b) d))))))
(define (undigits ds . args)
(let ((b (if (null? args) 10 (car args))))
(let loop ((ds ds) (n 0))
(if (null? ds) n
(loop (cdr ds) (+ (* n b) (car ds)))))))
(define (but-last x)
(undigits (reverse (cdr (reverse (digits x))))))
(define (last x) (car (reverse (digits x))))
(define (osculator n)
(define (f x) (+ (but-last (* n x)) 1))
(let ((ds (digits n)))
(case (car (reverse ds))
((1) (f 9))
((3) (f 3))
((7) (f 7))
((9) (f 1))
(else (error 'osculator "unsupported")))))
(define (divisible? n d)
(let ((osc (osculator d)))
(let loop ((n n))
(let ((next (+ (but-last n) (* (last n) osc))))
(if (< next n) (loop next) (zero? (modulo n d)))))))
(display (divisible? 13174584 23)) (newline)
(display (divisible? 175121 37)) (newline)
(display (divisible? 134567 29)) (newline)