a-conjecture-of-mine

An exercise on polyglossy: the same problem solved on multiple languages

script.rkt (1142B)

      1 #lang racket
      2 
      3 ; This script is a simple test for the following conjecture:
      4 
      5 ; Let S: N -> N be the sum of the digits of a positive integer.
      6 ; For all A and B in N, S(A + B) = S(A) + S(B) - 9k, where k is an interger.
      7 
      8 (provide counterexempl?)
      9 
     10 ;; Returns `#t` if a counterexemple was found between `0` and `m`.
     11 ;; Otherwise returns `#f`.
     12 (define (counterexempl? m)
     13     (define (test a b sums-cache)
     14         (let ([sum (lambda (n) (vector-ref sums-cache n))])
     15              (zero? (remainder (- (sum (+ a b)) (sum a) (sum b)) 9))))
     16     (define (iter a sums-cache)
     17         (stream-fold (lambda (acc b) (and acc (test a b sums-cache))) 
     18                      #t 
     19                      (in-range a)))
     20     (let ([sums-cache (get-sums m)])
     21          (not (stream-fold (lambda (acc a) (and acc (iter a sums-cache)))
     22                            #t
     23                            (in-range m)))))
     24 
     25 (define (sum-digits n) 
     26     (define (sum-digits-tail n acc)
     27         (if (zero? n)
     28             acc
     29             (sum-digits-tail (quotient n 10) (+ acc (remainder n 10)))))
     30     (sum-digits-tail n 0))
     31 
     32 (define (get-sums m) (build-vector (+ (* 2 m) 1) sum-digits))
     33