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