I'm generating numbers using a Java program (BigIntegers) and I want to know if there's a binary readily available that I could use to run primality tests on the numbers generated.... suppose I feed them through a pipe from my java program into the binary. Is it out there? I'm trying to find packages for aks on apt but I see nothing "straightforward", only libs that I could use to program stuff (like, based on GMP).
2 Answers
openssl
The program openssl does primality tests:
$ a=31
$ openssl prime 31
1F (31) is prime
$ openssl prime 18446744073709551557
FFFFFFFFFFFFFFC5 (18446744073709551557) is prime
The command is listed with help (openssl help):
$ openssl help 2>&1 | grep prime
pkeyparam pkeyutl prime rand
And the details of the actual command are given by (-help or --help):
$ openssl prime -help
Usage: prime [options] [number...]
number Number to check for primality
-help Display this summary
-hex Hex output
-generate Generate a prime
-bits +int Size of number in bits
-safe When used with -generate, generate a safe prime
-checks +int Number of checks
Very long numbers are also possible (2^521)-1 (Mersenne number with 157 decimal digits):
$ time openssl prime $(BC_LINE_LENGTH=0 bc <<<'2^521-1')
1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
(6864797660130609714981900799081393217269435300143305409394463459185543183397656052122559640661454554977296311391480858037121987999716643812574028291115057151)
is prime
real 0m0.042s
Two other utilities not connected to openssl but related to primes are:
Primes and factor:
primes - generate primes in a range factor - factor numbers
$ echo $(primes 10 50)
11 13 17 19 23 29 31 37 41 43 47
$ openssl prime 11 13 17 19 23 29 31 37 41 43 47
B (11) is prime
D (13) is prime
11 (17) is prime
13 (19) is prime
17 (23) is prime
1D (29) is prime
1F (31) is prime
25 (37) is prime
29 (41) is prime
2B (43) is prime
2F (47) is prime
$ factor 11 13 17 19 23 29 31 37 41 43 47
11: 11
13: 13
17: 17
19: 19
23: 23
29: 29
31: 31
37: 37
41: 41
43: 43
47: 47
$ factor 18446744073709551557
18446744073709551557: 18446744073709551557
$ factor 18446744073709551559
18446744073709551559: 41 163 269 8807 1165112831
Quite close to the max (signed) 64 bit integer number:
$ printf '%X\n' 18446744073709551559 $(( (2<<63) - 1 ))
FFFFFFFFFFFFFFC7
FFFFFFFFFFFFFFFF
-
1Note that GNU coreutils (like some other Unices such as Solaris) has
factorbut notprimes(even though both were introduced in Unix v7 in the late 70s). FreeBSDfactorseems to support larger numbers than GNU factor. ITYMprimes 10 50 | xargs -n1 openssl primeinstead ofopenssl prime primes 11 13 17 19 23 29 31 37 41 43 47Stéphane Chazelas– Stéphane Chazelas2017-08-05 13:55:33 +00:00Commented Aug 5, 2017 at 13:55 -
1Good find about
openssl primeBTW. It doesn't seem to be documented. Even the help message with the version on my system doesn't mention the-generate/-bitsoption. To find out about the-checksoption (20 by default as seen in the code), you need to look at theBN_is_prime_ex(3)man page that says it performs a Miller-Rabin probabilistic primality test with nchecks iterations.Stéphane Chazelas– Stéphane Chazelas2017-08-05 14:16:09 +00:00Commented Aug 5, 2017 at 14:16 -
The primes I have reports BSD Games Manual, so yes it should be from BSD (one of them). But it fails above 32 bits, it lists as primes numbers like 65539 square (4295360521). The number of incorrect primes grows as closer it gets to 64 bits. So, the (February 3, 2008) BSD primes has at least this (important) bug. @StéphaneChazelasuser232326– user2323262017-08-07 01:21:14 +00:00Commented Aug 7, 2017 at 1:21
-
GNU factor support quite large numbers, from the manual: factoring the eighth Fermat number 2^{256}+1 takes about 20 seconds on the same machine. Assuming the large number option was compiled in (read info factor).user232326– user2323262017-08-07 01:22:54 +00:00Commented Aug 7, 2017 at 1:22
-
1Really @StéphaneChazelas ? Open ssl 1.1.0 was released on (25 Aug 2016), close to a year ago. Openssl must be updated as soon as possible, there are many vulns to correct, it is presently at 1.1.0f, the fifth release of that version. Please update as soon as possible. And it is
openssl prime, without thes.user232326– user2323262017-08-07 17:05:11 +00:00Commented Aug 7, 2017 at 17:05
There is a primesieve-bin package:
$ sudo apt install primesieve-bin
$ primesieve 20 -p
2
3
5
7
11
13
17
19
to check that a number is prime, you could do:
$ test $(primesieve 11 -p | tail -1) -eq 11
$ echo $?
0
$ test $(primesieve 12 -p | tail -1) -eq 12
$ echo $?
1
EDIT: Not recommended since openssl primes is much faster for that task (as pointed out in the comments).
-
The OP wants to test a number (e.g., 43) to see whether it is prime. How can they do that with this tool? … … … … … … … … … … … Please do not respond in comments; edit your answer to make it clearer and more complete.G-Man Says 'Reinstate Monica'– G-Man Says 'Reinstate Monica'2024-08-03 11:51:47 +00:00Commented Aug 3, 2024 at 11:51
-
This seems to be a terrible option for testing if something is a prime.
openssl prime 18446744073709551557returned pretty much immediately on a Raspberry Pi 4B, butprinesieve --dist 1 18446744073709551557has been running for over an hour on the same system (64 minutes now and counting).muru– muru2024-08-03 13:08:52 +00:00Commented Aug 3, 2024 at 13:08 -
That is true @muru . I think the reason is that openssl uses a specialized algorithm for that task called Miller–Rabin primality testIsidro Arias– Isidro Arias2024-08-03 18:36:15 +00:00Commented Aug 3, 2024 at 18:36
-
Yes, I know. I'm just saying that this tool is impractical for any numbers of real interest. The invocation I mentioned earlier is still running, 27 hours later. Testing the primarily of, say, p from an 4096-bit RSA key would probably require creating a new universe.muru– muru2024-08-04 15:57:56 +00:00Commented Aug 4, 2024 at 15:57