[ create a new paste ] login | about

Project: programmingpraxis
Link: http://programmingpraxis.codepad.org/qZrg7y54    [ raw code | output | fork ]

programmingpraxis - Scheme, pasted on Jul 7:
; 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)


Output:
1
2
3
#t
#t
#f


Create a new paste based on this one


Comments: