Advertisement
Guest User

PrimeETs.ss

a guest
May 25th, 2019
132
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scheme 4.73 KB | None | 0 0
  1. ;; LIBRARY
  2.  
  3. ;; base-x log of a number n
  4. (define logx (lambda (x n) (/ (log n) (log x))))
  5.  
  6. (define log2 (lambda (n) (logx 2 n)))
  7.  
  8. ;; lists integers from i to j, inclusive
  9. (define range
  10.   (lambda (i j)
  11.     (if (> i j)
  12.       '()
  13.       (cons i (range (+ i 1) j)))))
  14.  
  15. ;; lists odd or even natural numbers <= n, matching the parity of n
  16. (define odd-ls
  17.   (lambda (n)
  18.     (if (< n 1)
  19.       (list)
  20.       (cons n (odd-ls (- n 2))))))
  21.  
  22. (define mean
  23.   (lambda (ls)
  24.     (if (null? ls)
  25.       0
  26.       (/ (apply + ls) (length ls)))))
  27.  
  28. (define prime?
  29.   (lambda (n)
  30.     (letrec ((loop
  31.                (lambda (n test max)
  32.                  (cond
  33.                    [(> test max) #t]
  34.                    [(= (modulo n test) 0) #f]
  35.                    [else (loop n (+ test 2) max)]))))
  36.       (cond
  37.         [(= n 2) #t]
  38.         [(or (< n 2) (= (modulo n 2) 0)) #f]
  39.         [else (loop n 3 (floor (sqrt n)))]))))
  40.  
  41. ;; inverse of a prime counting function by Minac (Ribenboim 1995, p. 181)
  42. ;; returns the nth prime
  43. (define pi-inv
  44.   (lambda (n)
  45.     (letrec ((loop
  46.                (lambda (j acc n)
  47.                (if (zero? n)
  48.                  (- j 1)
  49.                  (loop
  50.                    (+ j 1)
  51.                    (* j acc)
  52.                    (- n (floor (- (/ (+ acc 1) j)
  53.                                   (floor (/ acc j))))))))))
  54.       (loop 2 1 n))))
  55.  
  56. (define remove-multiples
  57.   (lambda (x ls)
  58.     (cond
  59.       [(null? ls) '()]
  60.       [(= (modulo (car ls) x) 0) (remove-multiples x (cdr ls))]
  61.       [else (cons (car ls) (remove-multiples x (cdr ls)))])))
  62.  
  63. (define n-primes
  64.   (lambda (n)
  65.     (letrec ((loop
  66.                (lambda (ls)
  67.                  (if (null? ls)
  68.                    '()
  69.                    (cons (car ls)
  70.                      (loop (remove-multiples (car ls) (cdr ls))))))))
  71.       (cond
  72.         [(= n 0) '()]
  73.         [(= n 1) '(2)]
  74.         [(cons 2 (loop (cdr (reverse (odd-ls (pi-inv n))))))]))))
  75.  
  76. (define n-composites
  77.   (lambda (n)
  78.     (letrec ((inner
  79.                (lambda (n int comps)
  80.                  (cond
  81.                    [(= n 0) (cddr (reverse comps))]
  82.                    [(prime? int) (inner n (+ int 1) comps)]
  83.                    [else (inner (- n 1) (+ int 1) (cons int comps))]))))
  84.       (inner (+ n 2) 0 '()))))
  85.  
  86. ;; MAIN FUNCTIONS
  87.  
  88. (define patent-val-div
  89.   (lambda (et basis)
  90.     (map (lambda (x)
  91.            (inexact->exact (round (* et (logx (apply min basis) x)))))
  92.       basis)))
  93.  
  94. (define remove-torsion
  95.   (lambda (ls)
  96.     (cond
  97.       [(null? ls) '()]
  98.       [(> (apply gcd (car ls)) 1) (remove-torsion (cdr ls))]
  99.       [else (cons (car ls) (remove-torsion (cdr ls)))])))
  100.  
  101. ;; TOP tuning of basis given val
  102. (define top-val
  103.   (lambda (val basis)
  104.     (let* ((log2-primes (map log2 basis))
  105.            (exact-val (map / val log2-primes))
  106.            (big (apply max exact-val))
  107.            (small (apply min exact-val))
  108.            (mid (/ (+ big small) 2))
  109.            (tuned-val (map (lambda (x) (/ x mid)) val)))
  110.       (map (lambda (x) (* x 1200))
  111.         tuned-val))))
  112.  
  113. (define top-damage
  114.   (lambda (val basis)
  115.     (let*
  116.       ((weights (map log2 basis))
  117.        (ji (map (lambda (x) (* x 1200)) weights))
  118.        (errors (map abs (map - ji (top-val val basis)))))
  119.        (apply max (map / errors weights)))))
  120.  
  121. (define best-val-err
  122.   (lambda (et chord errorfunction)
  123.     (apply min
  124.       (map (lambda (val)
  125.              (errorfunction val chord))
  126.         (remove-torsion
  127.           (map (lambda (exact-et)
  128.                  (patent-val-div exact-et chord))
  129.             (map (lambda (x) (+ et x))
  130.               '(-0.4 -0.3 -0.2 -0.1 0 0.1 0.2 0.3 0.4))))))))
  131.  
  132. (define range-prime-comp
  133.   (lambda (min max)
  134.     (letrec ((inner
  135.                (lambda (min primes comps)
  136.                  (cond
  137.                    [(> min max) (list (reverse primes) (reverse comps))]
  138.                    [(prime? min) (inner (+ min 1) (cons min primes) comps)]
  139.                    [else (inner (+ min 1) primes (cons min comps))]))))
  140.       (inner min '() '()))))
  141.  
  142. (define avg-rel-err
  143.   (lambda (basis divs)
  144.     (letrec ((step-size (lambda (div)
  145.                           (/ (* (log2 (car basis)) 1200) div))))
  146.       (mean (map / (map (lambda (x)
  147.                           (best-val-err x basis top-damage))
  148.                      divs)
  149.                    (map (lambda (x)
  150.                           (step-size x))
  151.                      divs))))))
  152.  
  153. ;; EXAMPLES
  154.  
  155. ;; (avg-rel-err '(2 3 5 7) (cddr (n-primes 1002)))
  156. ;; 0.11286850458406111
  157.  
  158. ;; (avg-rel-err '(2 3 5 7) (n-composites 1000))
  159. ;; 0.11777593026693876
  160.  
  161. ;; (avg-rel-err '(2 3 5 7) (car (range-prime-comp 5 100))) ;; primes
  162. ;; 0.11412166292698245
  163.  
  164. ;; (avg-rel-err '(2 3 5 7) (cadr (range-prime-comp 5 100))) ;; comps
  165. ;; 0.11763126363512029
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement