Guest User

Untitled

a guest
Jun 24th, 2018
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.58 KB | None | 0 0
  1. ; Example
  2. ; $ ./groups
  3. ; enter the group order: 8
  4. ; Z_{8}
  5. ; Z_{4} Z_{2}
  6. ; Z_{2} Z_{2} Z_{2}
  7.  
  8. (use srfi-1)
  9. (use extras)
  10.  
  11. ; Sieve of Eratosthenes
  12. ; I profiled it and it was much faster than
  13. ; the simpler implementation, howerver the
  14. ; the rest of the code is pretty ineffecient
  15. (define (prime-sieve count)
  16. (let ((marked (make-vector count #f)))
  17. (define (build-list index)
  18. (if (>= index count)
  19. '()
  20. (if (vector-ref marked index)
  21. (build-list (+ index 1))
  22. (cons (+ index 1) (build-list (+ index 1))))))
  23. (define (next-prime index)
  24. (if (>= index count)
  25. marked
  26. (begin
  27. (if (vector-ref marked index)
  28. 'done
  29. (mark (+ index 1) (+ index index 1)))
  30. (next-prime (+ index 1)))))
  31. (define (mark stride index)
  32. (if (>= index count)
  33. 'ok
  34. (begin
  35. (vector-set! marked index #t)
  36. (mark stride (+ index stride)))))
  37. (begin (next-prime 1) (build-list 1))))
  38.  
  39. (define (divide-prime n p)
  40. (define (iter m k)
  41. (if (= (modulo m p) 0)
  42. (iter (/ m p) (+ k 1))
  43. (cons m k)))
  44. (iter n 0))
  45.  
  46. (define (factor n prime-list)
  47. (if (null? prime-list)
  48. '()
  49. (let ((div-pair (divide-prime n (car prime-list))))
  50. (if (> (cdr div-pair) 0)
  51. (cons
  52. (cons (car prime-list) (cdr div-pair))
  53. (factor (car div-pair) (cdr prime-list)))
  54. (factor (car div-pair) (cdr prime-list))))))
  55.  
  56. (define (partition-n n)
  57. ; partition(n)
  58. ; (n) + part(0)
  59. ; (n - 1) + part(1)
  60. ; (n - 2) + part(2)
  61. ; ...
  62. ; (1) + part(n - 1)
  63. (define (iter k)
  64. (if (= k n)
  65. '()
  66. (append
  67. (map
  68. (lambda (tail) (cons (- n k) tail))
  69. (filter (lambda (tail)
  70. (or (null? tail)
  71. (<= (car tail) (- n k))))
  72. (partition-n k)))
  73. (iter (+ k 1)))))
  74. ; partition(0) = (null)
  75. (if (= n 0)
  76. (list '())
  77. (iter 0)))
  78.  
  79. (define (cartesian-product list-a list-b)
  80. (append-map
  81. (lambda (a) (map (lambda (b) (append a b)) list-b)) list-a))
  82.  
  83. (define (combine-partitions factors)
  84. ; the way the combing works we need the elements in their own lists
  85. (define (wrap-list ls)
  86. (map (lambda (tail) (list tail)) ls))
  87. (if (null? (cdr factors))
  88. (wrap-list (partition-n (cdr (car factors))))
  89. (cartesian-product (wrap-list (partition-n (cdr (car factors))))
  90. (combine-partitions (cdr factors)))))
  91.  
  92. (define (apply-powers prime-factor power-list)
  93. (if (null? power-list)
  94. '()
  95. (cons (expt prime-factor (car power-list))
  96. (apply-powers prime-factor (cdr power-list)))))
  97.  
  98. (define (build-groups n)
  99. ; example combos ((1 1 1 1) (4))
  100. ; example factors ((3 . n) (2 . m))
  101. (define (iter-combos power-lists factors)
  102. (if (null? power-lists)
  103. '()
  104. (append (apply-powers (car (car factors)) (car power-lists))
  105. (iter-combos (cdr power-lists) (cdr factors)))))
  106.  
  107. (define (iter-solutions solutions factors)
  108. (if (null? solutions)
  109. '()
  110. (cons (iter-combos (car solutions) factors)
  111. (iter-solutions (cdr solutions) factors))))
  112.  
  113. (let* ((factors (factor n (prime-sieve n)))
  114. (solutions (combine-partitions factors)))
  115. (iter-solutions solutions factors)))
  116.  
  117. (define (input-loop)
  118. (define (display-group group)
  119. (map
  120. (lambda (order)
  121. (display "Z_{") (display order) (display "} "))
  122. group))
  123.  
  124. (begin
  125. (display "enter the group order: ")
  126. (map
  127. (lambda (group) (display-group group) (newline))
  128. (build-groups (string->number (read-line))))
  129. (newline)
  130. (input-loop)))
  131.  
  132. (input-loop)
Add Comment
Please, Sign In to add comment