Factorial primes: Difference between revisions

Content added Content deleted
Line 728: Line 728:
{{libheader|gmpy2}}
{{libheader|gmpy2}}


Takes about 32 seconds to find the first 33 factorial primes on my machine (Ryzen 5 1500X).
This takes about 32 seconds to find the first 33 factorial primes on my machine (Ryzen 5 1500X).


<syntaxhighlight lang="python">
<syntaxhighlight lang="python">
from itertools import count
from itertools import islice
from itertools import islice
from typing import Iterable
from typing import Iterable
Line 739: Line 740:


def factorials() -> Iterable[int]:
def factorials() -> Iterable[int]:
i: int = 1
fact = 1
n: int = 1
for i in count(1):
while True:
yield fact
yield n
fact *= i
n *= i
i += 1




def factorial_primes() -> Iterable[Tuple[int, int, str]]:
def factorial_primes() -> Iterable[Tuple[int, int, str]]:
for i, n in enumerate(factorials()):
for n, fact in enumerate(factorials()):
if gmpy2.is_prime(n - 1):
if gmpy2.is_prime(fact - 1):
yield (i, n - 1, "-")
yield (n, fact - 1, "-")
if gmpy2.is_prime(n + 1):
if gmpy2.is_prime(fact + 1):
yield (i, n + 1, "+")
yield (n, fact + 1, "+")




def main(n=10) -> None:
def print_factorial_primes(limit=10) -> None:
print(f"First {n} factorial primes.")
print(f"First {limit} factorial primes.")
for i, factorial_prime, op in islice(factorial_primes(), 1, n + 1):
for n, fact_prime, op in islice(factorial_primes(), 1, limit + 1):
s = str(factorial_prime)
s = str(fact_prime)
if len(s) > 40:
if len(s) > 40:
s = f"{s[:20]}...{s[-20:]} ({len(s)} digits)"
s = f"{s[:20]}...{s[-20:]} ({len(s)} digits)"
print(f"{i}! {op} 1 = {s}")
print(f"{n}! {op} 1 = {s}")




if __name__ == "__main__":
if __name__ == "__main__":
import sys
import sys
main(int(sys.argv[1]) if len(sys.argv) > 1 else 10)
print_factorial_primes(int(sys.argv[1]) if len(sys.argv) > 1 else 10)
</syntaxhighlight>
</syntaxhighlight>