From 5e5f7eb2304b9f9f2a54c163cdd79720ea8e0892 Mon Sep 17 00:00:00 2001 From: bd Date: Mon, 5 Aug 2024 14:06:25 -0600 Subject: Circular primes implementation and tests --- circular-primes/cp.scm | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 circular-primes/cp.scm (limited to 'circular-primes/cp.scm') diff --git a/circular-primes/cp.scm b/circular-primes/cp.scm new file mode 100644 index 0000000..1f4105c --- /dev/null +++ b/circular-primes/cp.scm @@ -0,0 +1,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))))) -- cgit v1.2.3