fork download
  1. ; gcd sum
  2.  
  3. (define (range . args)
  4. (case (length args)
  5. ((1) (range 0 (car args) (if (negative? (car args)) -1 1)))
  6. ((2) (range (car args) (cadr args) (if (< (car args) (cadr args)) 1 -1)))
  7. ((3) (let ((le? (if (negative? (caddr args)) >= <=)))
  8. (let loop ((x(car args)) (xs '()))
  9. (if (le? (cadr args) x)
  10. (reverse xs)
  11. (loop (+ x (caddr args)) (cons x xs))))))
  12. (else (error 'range "unrecognized arguments"))))
  13.  
  14. (define (fold-right op base xs)
  15. (if (null? xs)
  16. base
  17. (op (car xs) (fold-right op base (cdr xs)))))
  18.  
  19. (define (sum xs) (fold-right + 0 xs))
  20.  
  21. (define (factors n)
  22. (let loop ((n n) (f 2) (fs (list)))
  23. (cond ((< n (* f f))
  24. (reverse (cons n fs)))
  25. ((zero? (modulo n f))
  26. (loop (/ n f) f (cons f fs)))
  27. (else (loop n (+ f 1) fs)))))
  28.  
  29. (define (divisors n)
  30. (let ((divs (list 1)))
  31. (do ((fs (factors n) (cdr fs)))
  32. ((null? fs) (sort divs <))
  33. (let ((temp (list)))
  34. (do ((ds divs (cdr ds)))
  35. ((null? ds)
  36. (set! divs (append divs temp)))
  37. (let ((d (* (car fs) (car ds))))
  38. (when (not (member d divs))
  39. (set! temp (cons d temp)))))))))
  40.  
  41. (define (sigma x n . args) ; sum of x'th powers of divisors of n
  42. (define (add1 n) (+ n 1))
  43. (define (uniq-c eql? xs)
  44. (if (null? xs) xs
  45. (let loop ((xs (cdr xs)) (prev (car xs)) (k 1) (result '()))
  46. (cond ((null? xs) (reverse (cons (cons prev k) result)))
  47. ((eql? (car xs) prev) (loop (cdr xs) prev (+ k 1) result))
  48. (else (loop (cdr xs) (car xs) 1 (cons (cons prev k) result)))))))
  49. (define (prod xs) (apply * xs))
  50. (if (= n 1) 1
  51. (let ((fs (uniq-c = (if (pair? args) (car args) (factors n)))))
  52. (if (zero? x)
  53. (prod (map add1 (map cdr fs)))
  54. (prod (map (lambda (p a)
  55. (/ (- (expt p (* (+ a 1) x)) 1) (- (expt p x) 1)))
  56. (map car fs) (map cdr fs)))))))
  57.  
  58. (define (tau n) (sigma 0 n))
  59.  
  60. (define (totient n) ; count of positive integers less than n coprime to it
  61. (if (= n 1) 1
  62. (let loop ((t n) (p 0) (fs (factors n)))
  63. (if (null? fs) t
  64. (let ((f (car fs)))
  65. (loop (if (= f p) t (* t (/ (- f 1) f))) f (cdr fs)))))))
  66.  
  67. (define (moebius n) ; (-1)^k if n has k factors, or 0 if any factors duplicated
  68. (if (= n 1) 1
  69. (let loop ((m 1) (f 0) (fs (factors n)))
  70. (if (null? fs) m
  71. (if (= f (car fs)) 0
  72. (loop (- m) (car fs) (cdr fs)))))))
  73.  
  74. (define x (* 17 97))
  75.  
  76. (define (gcd x y)
  77. (if (zero? y) x
  78. (gcd y (modulo x y))))
  79.  
  80. (define (gcd-sum n)
  81. (let loop ((k 1) (s 0))
  82. (if (< n k) s
  83. (loop (+ k 1) (+ s (gcd k n))))))
  84.  
  85. (display (gcd-sum x)) (newline)
  86.  
  87. (define (gcd-sum n)
  88. (let ((sum 0))
  89. (do ((k 1 (+ k 1))) ((< n k) sum)
  90. (set! sum (+ sum (gcd k n))))))
  91.  
  92. (display (gcd-sum x)) (newline)
  93.  
  94. (define (gcd-sum n)
  95. (sum (map (lambda (k) (gcd k n)) (range 1 (+ n 1)))))
  96.  
  97. (display (gcd-sum x)) (newline)
  98.  
  99. (define (gcd-sum n)
  100. (fold-right (lambda (k s) (+ s (gcd k n))) 0 (range 1 (+ n 1))))
  101.  
  102. (display (gcd-sum x)) (newline)
  103.  
  104. (define (gcd-sum n)
  105. (fold-right
  106. (lambda (d s) (+ s (* d (totient (/ n d)))))
  107. 0
  108. (divisors n)))
  109.  
  110. (display (gcd-sum x)) (newline)
  111.  
  112. (define (gcd-sum n)
  113. (let ((ds (divisors n)))
  114. (fold-right
  115. (lambda (d s) (+ s (* d (tau d) (moebius (/ n d)))))
  116. 0
  117. ds)))
  118.  
  119. (display (gcd-sum x)) (newline)
Success #stdin #stdout 0.95s 9136KB
stdin
Standard input is empty
stdout
6369
6369
6369
6369
6369
6369