Miller–Rabin primality test: Difference between revisions
Content added Content deleted
m (→{{header|Sidef}}: replaced integer division by 2 with right-shift of 1) |
(Added EchoLisp) |
||
Line 919: | Line 919: | ||
} |
} |
||
println()</lang> |
println()</lang> |
||
=={{header|EchoLisp}}== |
|||
EchoLisp natively implement the '''prime?''' function = Miller-Rabin tests for big integers. The definition is as follows : |
|||
<lang scheme> |
|||
(lib 'bigint) |
|||
;; output : #t if n probably prime |
|||
(define (miller-rabin n (k 7) (composite #f)(x)) |
|||
(define d (1- n)) |
|||
(define s 0) |
|||
(define a 0) |
|||
(while (even? d) |
|||
(set! s (1+ s)) |
|||
(set! d (quotient d 2))) |
|||
(for [(i k)] |
|||
(set! a (+ 2 (random (- n 3)))) |
|||
(set! x (powmod a d n)) |
|||
#:continue (or (= x 1) (= x (1- n))) |
|||
(set! composite |
|||
(for [(r (in-range 1 s))] |
|||
(set! x (powmod x 2 n)) |
|||
#:break (= x 1) => #t |
|||
#:break (= x (1- n)) => #f |
|||
#t |
|||
)) |
|||
#:break composite => #f ) |
|||
(not composite)) |
|||
;; output |
|||
(miller-rabin #101) |
|||
→ #t |
|||
(miller-rabin #111) |
|||
→ #f |
|||
(define big-prime (random-prime 1e+100)) |
|||
3461396142610375479080862553800503306376298093021233334170610435506057862777898396429 |
|||
6627816219192601527 |
|||
(miller-rabin big-prime) |
|||
→ #t |
|||
(miller-rabin (1+ (factorial 100))) |
|||
→ #f |
|||
(prime? (1+ (factorial 100))) ;; native |
|||
→ #f |
|||
</lang> |
|||
=={{header|Erlang}}== |
=={{header|Erlang}}== |