newOctaveScheme
;; Collatz sequence generator (tail recursive)
(define (generate-collatz-sequence n)
(let loop ((current n) (acc '()))
(if (= current 1)
(reverse (cons 1 acc))
(loop (if (even? current)
(/ current 2)
(+ (* 3 current) 1))
(cons current acc)))))
;; Reduce to single digit using modulo 9 (octave reduction)
(define (reduce-to-single-digit value)
(+ (modulo (- value 1) 9) 1))
;; Map reduced values to octave coordinates
(define (map-to-octave value layer)
(let* ((angle (* (/ value 9.0) (* 2 pi)))
(x (* (cos angle) (+ layer 1)))
(y (* (sin angle) (+ layer 1))))
(list x y)))
;; Generate Collatz data for numbers 1..max-n
(define (generate-collatz-data max-n)
(let loop ((n 1) (result '()))
(if (> n max-n)
(reverse result)
(loop (+ n 1)
(cons (cons n (generate-collatz-sequence n)) result)))))
;; Map sequences to octave positions
(define (map-sequences-to-octave collatz-data stack-spacing)
(map (lambda (entry)
(let ((number (car entry))
(sequence (cdr entry)))
(cons number
(let loop ((layer 0) (seq sequence) (acc '()))
(if (null? seq)
(reverse acc)
(let* ((value (car seq))
(reduced (reduce-to-single-digit value))
(coords (map-to-octave reduced layer))
(x (car coords))
(y (cadr coords))
(z (* layer stack-spacing)))
(loop (+ layer 1)
(cdr seq)
(cons (list x y z) acc))))))))
collatz-data))
;; Example usage
(define collatz-data (generate-collatz-data 20))
(define octave-positions (map-sequences-to-octave collatz-data 1.0))
;; Print results
(for-each
(lambda (entry)
(display "Number: ") (display (car entry)) (newline)
(for-each (lambda (pos)
(display pos) (newline))
(cdr entry)))
octave-positions)