-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathex1.2-1.rkt
121 lines (92 loc) · 2.85 KB
/
ex1.2-1.rkt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#lang racket
(define (prime? n)
(= (smallest-divisor n) n))
(define (smallest-divisor n)
(define (divides? a b)
(= (remainder a b) 0))
(define (square x)
(* x x))
;; + 1
(define (find-divisor value test-div)
(cond ((divides? value test-div) test-div)
((> (square test-div) value) value)
(else (find-divisor value (+ test-div 1)))))
;; next
(define (next n)
(if (= n 2) 3 (+ n 2)))
(define (find-divisor-2 value test-div)
(cond ((divides? value test-div) test-div)
((> (square test-div) value) value)
(else (find-divisor-2 value (next test-div)))))
;; (find-divisor n 2)
(find-divisor-2 n 2)
)
(define (square x)
(* x x))
(define (prime?-2 n times)
(cond ((= times 0) #t) ;; fermat 테스트를 times 횟수 반복했는데 모두 #t 인 경우
((fermat-test n) (prime?-2 n (- times 1))) ;; fermat 테스트를 통과한 경우
(else #f))) ;; fermat 테스트를 통과하지 못한 경우
(define (expmod base exp m)
(cond ((= exp 0) 1)
((even? exp)
(remainder (square (expmod base (/ exp 2) m)) m))
(else
(remainder (* base (expmod base (- exp 1) m)) m))))
(define (fermat-test n)
(define (try-it a)
(= (expmod a n n) a))
(try-it (+ (random (- n 1)) 1)))
;; 1.22
(define (timed-prime-test n)
; (display n)
; (newline)
(start-prime-test n (current-inexact-milliseconds)))
(define (start-prime-test n start-time)
(if (prime? n) ; 100)
(report-prime n (- (current-inexact-milliseconds) start-time))
#f))
(define (report-prime n elapsed-time)
(display " *** ")
(display elapsed-time))
(define (search-for-prime n c)
(if (= c 0)
(newline)
(search-for-prime
(+ n 1)
(if (timed-prime-test n)
(- c 1)
c))))
;(search-for-prime 1000 3)
;(search-for-prime 10000 3)
;(search-for-prime 100000 3)
;(search-for-prime 1000000 3)
;(search-for-prime 10000000 3)
;(search-for-prime 100000000 3)
;(search-for-prime 1000000000 3)
;(search-for-prime 10000000000 3)
;(search-for-prime 100000000000 3)
;(search-for-prime 1000000000000 3)
;(search-for-prime 10000000000000 3)
(define (prime-by-fermat-all-number? n)
(define (iter a)
(if (< a 2) #t
(if (= (expmod a n n) a) (iter (- a 1)) #f)))
(iter (- n 1)))
(define (camichael-number? n)
(and (not (prime? n)) (prime-by-fermat-all-number? n)))
(define (prime-by-miller-test? n times)
(cond ((= times 0) #t)
((miller-test n) (prime-by-miller-test? n (- times 1)))
(else #f)))
;; ???
(define (expmod base exp m)
(cond ((= exp 0) 1)
((even? exp)
(remainder (square (expmod base (/ exp 2) m)) m))
(else
(remainder (* base (expmod base (- exp 1) m)) m))))
(define (miller-test n)
(define (try-it a)
(= (expmod a (- n 1) n) 1))
(try-it (+ (random (- n 1)) 1)))