Miller–Rabin primality test: Difference between revisions
Content added Content deleted
(Added Java implementation) |
(→{{header|Bc}}: Allow rng to generate large numbers. While here, clean the code by removing extra semicolons.) |
||
Line 210: | Line 210: | ||
}</lang> |
}</lang> |
||
=={{header| |
=={{header|bc}}== |
||
Requires a <tt>bc</tt> with long names. |
|||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
# random generator (according to POSIX...); since |
|||
(A previous version worked with [[GNU bc]].) |
|||
# this gives number between 0 and 32767, we can |
|||
⚫ | |||
# test only numbers in this range. |
|||
⚫ | |||
⚫ | |||
{ |
|||
/* Random number from 0 to 32767. */ |
|||
⚫ | |||
⚫ | |||
⚫ | |||
/* Cheap formula (from POSIX) for random numbers of low quality. */ |
|||
⚫ | |||
⚫ | |||
} |
} |
||
/* Random number in range [from, to]. */ |
|||
define rangerand(from, to) { |
|||
{ |
|||
⚫ | |||
⚫ | |||
m = to - from + 1 |
|||
h = length(m) / 2 + 1 /* want h iterations of rand() % 100 */ |
|||
b = 100 ^ h % m /* want n >= b */ |
|||
while (1) { |
|||
n = 0 /* pick n in range [b, 100 ^ h) */ |
|||
⚫ | |||
r = rand() |
|||
while (r < 68) { r = rand(); } /* loop if the modulo bias */ |
|||
n = (n * 100) + (r % 100) /* append 2 digits to n */ |
|||
⚫ | |||
if (n >= b) { break; } /* break unless the modulo bias */ |
|||
} |
|||
⚫ | |||
} |
} |
||
⚫ | |||
{ |
|||
⚫ | |||
/* n is probably prime? */ |
|||
⚫ | |||
⚫ | |||
⚫ | |||
auto d, r, a, x, s |
|||
if (n <= 3) { return (1); } |
|||
⚫ | |||
⚫ | |||
s = 0; |
|||
/* find s and d so that d * 2^s = n - 1 */ |
|||
d = n - 1 |
|||
s = 0 |
|||
⚫ | |||
⚫ | |||
⚫ | |||
} |
} |
||
while(k-- > 0) { |
while (k-- > 0) { |
||
a = rangerand(2, n-2) |
a = rangerand(2, n - 2) |
||
x = (a^d) % n |
x = (a ^ d) % n |
||
if ( |
if (x != 1) { |
||
for(r=0; r < s; r++) { |
for (r = 0; r < s; r++) { |
||
if (x == (n - 1)) { break; } |
|||
x = (x * x) % n |
|||
} |
} |
||
if ( |
if (x != (n - 1)) { |
||
return (0) |
|||
} |
} |
||
} |
} |
||
} |
} |
||
return (1) |
return (1) |
||
} |
} |
||
for (i = 1; i < 1000; i++) { |
|||
⚫ | |||
⚫ | |||
i |
|||
⚫ | |||
⚫ | |||
} |
} |
||
} |
} |
||
quit |
quit</lang> |
||
=={{header|C}}== |
=={{header|C}}== |