summaryrefslogtreecommitdiff
path: root/circular-primes/cp.scm
blob: 1f4105cbf4a87529aee8815461ef6ab2f93011e6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
(define-module (cp)
  #:use-module (soe)
  #:use-module  (srfi srfi-1)
  #:export (generate-circular-primes-to
            number->circular-list
            list-rotate))


(define (generate-circular-primes-to n)
  "Returns the 'circular primes' under N."
  (let loop ((primes (generate-primes-to n))
             (circular-primes '()))
    (if (null? primes)
        (sort circular-primes <)
        (let* ((circle (number->circular-list (car primes)))
               (prev-num-primes (length primes))
               (primes (lset-difference eqv? primes circle)))
          (loop primes
                ;; primes contains no duplicates, so:
                (if (eq? (length primes) (- prev-num-primes (length circle)))
                    (append circle circular-primes)
                    circular-primes))))))

(define (number->circular-list n)
  "Given number N, returns a list of all rotated
numbers of N, i.e.:

123 -> '(312 231 123)"
  (let ((lst (string->list (number->string n))))
    (let loop ((accum (list lst))
               (next (list-rotate lst)))
      (if (equal? next lst)
          (map (lambda (x) (string->number (list->string x)))
               accum)
          (loop (cons next accum)
                (list-rotate next))))))

(define (list-rotate lst)
  (if (null? lst)
      '()
      (append (cdr lst) (list (car lst)))))