/primality.rkt
Racket | 66 lines | 63 code | 3 blank | 0 comment | 10 complexity | 347d2a41812dd386853649e3c6cfdfc0 MD5 | raw file
- (require racket/include)
- (include "small-primes.rkt")
- (define (pow x y) (cond
- ((= y 0) 1)
- ((= y 1) x)
- (else (* x (pow x (- y 1))))))
- (define (member? x l)
- (cond
- ((null? l) #f)
- ((equal? (car l) x) #t)
- (else (member? x (cdr l)))
- ))
- (define (l-product a)
- (list-product-helper a 0))
- (define (list-product-helper a r)
- (cond
- ((null? a) r)
- (else (list-product-helper (cdr a) (* (car a) r)))
- ))
- (define (prime? n k)
- (cond
- ((< n 5) (member? n '(2 3)))
- ((= (remainder n 2) 0) #f)
- (else
- (let ((ch (call-helper n)))
- (prime-tester k (+ (random (- n 4)) 2) n (cadr (call-helper n)) (car (call-helper n)))))
- ))
- (define (call-helper n)
- (prime-helper 0 (- n 1)))
-
- (define (prime-helper s d)
- (cond
- ((= (remainder d 2) 0) (prime-helper (+ s 1) (/ d 2)))
- (else (list s d))
- ))
- (define (not-witness a d n s)
- (cond
- ((= (remainder (pow a d) n) 1) #t)
- (else (not-witness-helper s (remainder (pow a d) n) n))
- ))
- (define (not-witness-helper r x n)
- (cond
- ((= r 0) #f)
- ((= x (- n 1)) #t)
- (else (not-witness-helper (- r 1) (remainder (pow x 2) n) n))
- ))
- (define (prime-tester k a n d s)
- (cond
- ((> (gcd (+ 2 (random (- n 4))) n) 1) #f)
- ((not (not-witness a d n s)) #f)
- ((= k 0) #t)
- (else (prime-tester (- k 1) a n d s))
- ))
- (define (gen-prime-helper p)
- (let ((k (random (/(- p 1) 2))))
- (cond
- ((prime? (+ (* 2 k p) 1) 50) (+ (* 2 k p) 1))
- (else (gen-prime-helper p))
- )))
- (define (gen-prime p n)
- (cond
- ((= n 0) p)
- (else (gen-prime (gen-prime-helper p) (- n 1)))
- ))