Miller–Rabin primality test: Difference between revisions

Content added Content deleted
(→‎{{header|Commodore BASIC}}: Turn "mod N" into a function; fix formatting; better example.)
Line 1,000: Line 1,000:


=={{header|Commodore BASIC}}==
=={{header|Commodore BASIC}}==
This displays a minimum probability of primality = 1-1/4<sup>k</sup>, as the fraction of "strong liars" approaches 1/4 in the limit.
<lang basic>100 PRINT CHR$(147)CHR$(18)"**** MILLER-RABIN PRIMALITY TEST ****": PRINT
<lang basic>100 PRINT CHR$(147); CHR$(18); "**** MILLER-RABIN PRIMALITY TEST ****": PRINT
110 OPEN 1, 0
110 INPUT "NUMBER TO TEST"; N$
120 PRINT "ENTER N:";: INPUT#1, N$: PRINT
130 N = VAL(N$): IF N<2 THEN 120
120 N = VAL(N$): IF N < 2 THEN 110
140 IF 0 = (N AND 1) THEN PRINT "(EVEN)": GOTO 400
130 IF 0 = (N AND 1) THEN PRINT "(EVEN)": GOTO 380
140 INPUT "ITERATIONS"; K$
150 PRINT "ENTER K:";: INPUT#1, K$: PRINT
160 K = VAL(K$): IF K < 1 THEN 150
150 K = VAL(K$): IF K < 1 THEN 140
160 PRINT
170 CLOSE 1
170 DEF FNMD(M) = M - N * INT(M / N)
180 D = N - 1
180 D = N - 1
190 S = 0
190 S = 0
Line 1,017: Line 1,018:
250 : X = 1
250 : X = 1
260 : FOR J = 1 TO D
260 : FOR J = 1 TO D
270 : X = X * A
270 : X = FNMD(X * A)
280 : X = X - N * INT(X / N)
280 : NEXT J
290 : IF (X = 1) OR (X = (N - 1)) THEN 360
290 : NEXT J
300 : IF (X = 1) OR (X = (N - 1)) THEN 380
300 : FOR J = 1 TO S - 1
310 : FOR J = 1 TO S - 1
310 : X = FNMD(X * X)
320 : X = X * X
320 : IF X = 1 THEN P = 0: GOTO 370
330 : X = X - N * INT(X / N)
330 : IF X = N - 1 THEN 360
340 : NEXT J
340 : IF X = 1 THEN P = 0: GOTO 390
350 : IF X = N - 1 THEN 380
350 : P = 0: GOTO 370
360 : NEXT J
360 NEXT I
370 : P = 0: GOTO 390
370 P = P * (1 - 1 / (4 * K))
380 IF P THEN PRINT "PROBABLY PRIME ( P >="; P; ")": END
380 NEXT I
390 PRINT "COMPOSITE."</lang>
390 P = P * (1 - 1 / (4 * K))
400 IF P THEN PRINT "PROBABLY PRIME (P >="P")": END
410 PRINT "COMPOSITE."</lang>
{{Out}}
{{Out}}
Sample runs.
Sample runs. Probability of primality is is computed as 1-1/4<sup>k</sup>, based on the fraction of "strong liars" which approaches 1/4 in the limit.
<pre>**** MILLER-RABIN PRIMALITY TEST ****
<pre>**** MILLER-RABIN PRIMALITY TEST ****



ENTER N:1747
NUMBER TO TEST? 1747
ENTER K:2
ITERATIONS? 2
PROBABLY PRIME (P >= .875 )

PROBABLY PRIME ( P >= .875 )


READY.</pre>
READY.</pre>
Line 1,044: Line 1,045:
<pre>**** MILLER-RABIN PRIMALITY TEST ****
<pre>**** MILLER-RABIN PRIMALITY TEST ****


ENTER N:4353
ENTER K:2
COMPOSITE.


NUMBER TO TEST? 32329
READY.</pre>
ITERATIONS? 2


COMPOSITE.</pre>
(Self-evident, since 4+3+5+3=15 is a multiple of 3.)


=={{header|Common Lisp}}==
=={{header|Common Lisp}}==