(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)))))