fork(1) download
  1. (import (normal extension)) ;;for random-integer
  2.  
  3. (define (prime? str)
  4. (rabin-miller? (string->number str)))
  5.  
  6. ;;ラビンミラーテスト
  7. ;;テスト対象のnを n^k * q に分解する。
  8. (define (rm1 n)
  9. (define (iter k q)
  10. (if (not (= (modulo q 2) 0))
  11. (list k q)
  12. (iter (+ k 1) (/ q 2))))
  13. (iter 0 (- n 1)))
  14.  
  15. ;;ラビンミラーテスト条件1
  16. ;;合成数なら#t 素数なら#f
  17. (define (rm2 a q n)
  18. (not (= (gaussmod a q n) 1)))
  19.  
  20. ;;ラビンミラーテスト条件2
  21. ;;合成数なら#t 素数なら#f
  22. (define (rm3 a k q n)
  23. (define (iter i)
  24. (cond ((>= i k) #t)
  25. ((= (gaussmod a (* (expt 2 i) q) n) -1) #f)
  26. (else (iter (+ i 1)))))
  27. (iter 0))
  28.  
  29.  
  30. ;;ラビンミラーテスト
  31. ;;nについて底aで条件1,2をテスト
  32. ;;合成数なら#t 素数なら#f
  33. (define (rm4 n a)
  34. (let* ((ls (rm1 n))
  35. (k (car ls))
  36. (q (cadr ls)))
  37. (and (rm2 a q n)
  38. (rm3 a k q n))))
  39.  
  40. ;;ラビンミラーテスト
  41. ;;関数本体
  42. ;;底を2~n-1まで乱数で発生させ10回試行する。
  43. ;;素数なら#t 合成数なら#f
  44. ;;擬素数である確率は 0.25^10 およそ0.000095%
  45. (define (rabin-miller? n)
  46. (define (iter t)
  47. (cond ((< t 1) #f)
  48. ((rm4 n (+ (random-integer (min (- n 2) 10000)) 1)) #t)
  49. (else (iter (- t 1)))))
  50. (if (= n 2)
  51. #t
  52. (not (iter 10))))
  53.  
  54. ;;繰り返し二乗法によるmod計算で結果を法mとした場合 -m/2~m/2 で表す。
  55. (define (gaussmod a k m)
  56. (let ((k1 (expmod a k m)))
  57. (cond ((and (> k1 0) (> k1 (/ m 2)) (< k1 m)) (- k1 m))
  58. ((and (< k1 0) (< k1 (- (/ m 2))) (> k1 (- m))) (+ k1 m))
  59. (else k1))))
  60.  
  61. (define (expmod a n m)
  62. (cond ((= 0 n) 1)
  63. ((even? n)
  64. (remainder (square (expmod a (/ n 2) m)) m))
  65. (else
  66. (remainder (* a (expmod a (- n 1) m)) m))))
  67.  
  68. norm> (prime? "123786712687686876213123127987987979879")
  69. #f
Compilation error #stdin compilation error #stdout 0s 0KB
stdin
Standard input is empty
compilation info
Main.java:1: error: class, interface, or enum expected
(import (normal extension)) ;;for random-integer
^
Main.java:1: error: <identifier> expected
(import (normal extension)) ;;for random-integer
       ^
Main.java:1: error: ';' expected
(import (normal extension)) ;;for random-integer
               ^
Main.java:1: error: class, interface, or enum expected
(import (normal extension)) ;;for random-integer
                              ^
Main.java:6: error: class, interface, or enum expected
;;?????????
  ^
Main.java:7: error: class, interface, or enum expected
;;???????? n^k * q ??????
  ^
Main.java:7: error: illegal character: '\u3002'
;;???????? n^k * q ??????
                        ^
Main.java:15: error: class, interface, or enum expected
;;????????????
  ^
Main.java:16: error: illegal character: '#'
;;?????#t ????#f
       ^
Main.java:16: error: illegal character: '#'
;;?????#t ????#f
              ^
Main.java:20: error: class, interface, or enum expected
;;????????????
  ^
Main.java:21: error: illegal character: '#'
;;?????#t ????#f
       ^
Main.java:21: error: illegal character: '#'
;;?????#t ????#f
              ^
Main.java:24: error: illegal character: '#'
    (cond ((>= i k) #t)
                    ^
Main.java:25: error: illegal character: '#'
          ((= (gaussmod a (* (expt 2 i) q) n) -1) #f)
                                                  ^
Main.java:30: error: class, interface, or enum expected
;;?????????
  ^
Main.java:31: error: illegal character: '\uff0c'
;;n?????a??????????
             ^
Main.java:31: error: illegal character: '\uff12'
;;n?????a??????????
              ^
Main.java:32: error: illegal character: '#'
;;?????#t ????#f
       ^
Main.java:32: error: illegal character: '#'
;;?????#t ????#f
              ^
Main.java:40: error: class, interface, or enum expected
;;?????????
  ^
Main.java:41: error: class, interface, or enum expected
;;????
  ^
Main.java:42: error: illegal character: '\uff5e'
;;??2?n-1?????????10??????
     ^
Main.java:42: error: illegal character: '\u3002'
;;??2?n-1?????????10??????
                         ^
Main.java:43: error: illegal character: '#'
;;????#t ?????#f
      ^
Main.java:43: error: illegal character: '#'
;;????#t ?????#f
              ^
Main.java:44: error: class, interface, or enum expected
;;????????? 0.25^10 ???0.000095% 
  ^
Main.java:47: error: illegal character: '#'
    (cond ((< t 1) #f)
                   ^
Main.java:48: error: illegal character: '#'
          ((rm4 n (+ (random-integer (min (- n 2) 10000)) 1)) #t)
                                                              ^
Main.java:51: error: illegal character: '#'
      #t
      ^
Main.java:54: error: class, interface, or enum expected
;;??????????mod????????????? -m/2?m/2 ????
  ^
Main.java:54: error: illegal character: '\uff5e'
;;??????????mod????????????? -m/2?m/2 ????
                                 ^
Main.java:54: error: illegal character: '\u3002'
;;??????????mod????????????? -m/2?m/2 ????
                                         ^
Main.java:69: error: illegal character: '#'
#f
^
34 errors
stdout
Standard output is empty