Sean's Blog

Hyper-Primes

A hyper-prime is a prime number p where all prime factors and all exponents in the prime factorization of p-1 are themselves hyper-primes.

Definition

For a prime number p, compute N = p - 1 and find its prime factorization: N = q₁^e₁ × q₂^e₂ × ... × qₖ^eₖ The prime p is hyper-prime if and only if:

  • Each prime factor qᵢ is hyper-prime
  • Each exponent eᵢ is hyper-prime

By definition, 0 and 1 are hyper-primes.

Table

PrimeFactors of p-1ExponentsHyperPrime
0True
1True
211^0True
322^1True
52 × 22^2True
72 × 32^1, 3^1True
112 × 52^1, 5^1True
132 × 2 × 32^2, 3^1True
172 × 2 × 2 × 22^4False
192 × 3 × 32^1, 3^2True
232 × 112^1, 11^1True
292 × 2 × 72^2, 7^1True
312 × 3 × 52^1, 3^1, 5^1True
372 × 2 × 3 × 32^2, 3^2True
412 × 2 × 2 × 52^3, 5^1True
432 × 3 × 72^1, 3^1, 7^1True
472 × 232^1, 23^1True
532 × 2 × 132^2, 13^1True
592 × 292^1, 29^1True
612 × 2 × 3 × 52^2, 3^1, 5^1True
672 × 3 × 112^1, 3^1, 11^1True
712 × 5 × 72^1, 5^1, 7^1True
732 × 2 × 2 × 3 × 32^3, 3^2True
792 × 3 × 132^1, 3^1, 13^1True
832 × 412^1, 41^1True
892 × 2 × 2 × 112^3, 11^1True
972 × 2 × 2 × 2 × 2 × 32^5, 3^1True
1012 × 2 × 5 × 52^2, 5^2True
1032 × 3 × 172^1, 3^1, 17^1False
1072 × 532^1, 53^1True
1092 × 2 × 3 × 3 × 32^2, 3^3True
1132 × 2 × 2 × 2 × 72^4, 7^1False
1272 × 3 × 3 × 72^1, 3^2, 7^1True
1312 × 5 × 132^1, 5^1, 13^1True
1372 × 2 × 2 × 172^3, 17^1False
1392 × 3 × 232^1, 3^1, 23^1True
1492 × 2 × 372^2, 37^1True
1512 × 3 × 5 × 52^1, 3^1, 5^2True
1572 × 2 × 3 × 132^2, 3^1, 13^1True
1632 × 3 × 3 × 3 × 32^1, 3^4False
1672 × 832^1, 83^1True
1732 × 2 × 432^2, 43^1True
1792 × 892^1, 89^1True
1812 × 2 × 3 × 3 × 52^2, 3^2, 5^1True
1912 × 5 × 192^1, 5^1, 19^1True
1932 × 2 × 2 × 2 × 2 × 2 × 32^6, 3^1False
1972 × 2 × 7 × 72^2, 7^2True
1992 × 3 × 3 × 112^1, 3^2, 11^1True
2112 × 3 × 5 × 72^1, 3^1, 5^1, 7^1True
2232 × 3 × 372^1, 3^1, 37^1True
2272 × 1132^1, 113^1False
2292 × 2 × 3 × 192^2, 3^1, 19^1True
2332 × 2 × 2 × 292^3, 29^1True
2392 × 7 × 172^1, 7^1, 17^1False
2412 × 2 × 2 × 2 × 3 × 52^4, 3^1, 5^1False
2512 × 5 × 5 × 52^1, 5^3True
2572 × 2 × 2 × 2 × 2 × 2 × 2 × 22^8False
2632 × 1312^1, 131^1True
2692 × 2 × 672^2, 67^1True
2712 × 3 × 3 × 3 × 52^1, 3^3, 5^1True
2772 × 2 × 3 × 232^2, 3^1, 23^1True
2812 × 2 × 2 × 5 × 72^3, 5^1, 7^1True
2832 × 3 × 472^1, 3^1, 47^1True
2932 × 2 × 732^2, 73^1True
3072 × 3 × 3 × 172^1, 3^2, 17^1False
3112 × 5 × 312^1, 5^1, 31^1True
3132 × 2 × 2 × 3 × 132^3, 3^1, 13^1True
3172 × 2 × 792^2, 79^1True
3312 × 3 × 5 × 112^1, 3^1, 5^1, 11^1True
3372 × 2 × 2 × 2 × 3 × 72^4, 3^1, 7^1False
3472 × 1732^1, 173^1True
3492 × 2 × 3 × 292^2, 3^1, 29^1True
3532 × 2 × 2 × 2 × 2 × 112^5, 11^1True
3592 × 1792^1, 179^1True
3672 × 3 × 612^1, 3^1, 61^1True
3732 × 2 × 3 × 312^2, 3^1, 31^1True
3792 × 3 × 3 × 3 × 72^1, 3^3, 7^1True
3832 × 1912^1, 191^1True
3892 × 2 × 972^2, 97^1True
3972 × 2 × 3 × 3 × 112^2, 3^2, 11^1True
4012 × 2 × 2 × 2 × 5 × 52^4, 5^2False
4092 × 2 × 2 × 3 × 172^3, 3^1, 17^1False
4192 × 11 × 192^1, 11^1, 19^1True
import math
from collections import Counter

def prime_factors(n):
    factors = []
    while n % 2 == 0:
        factors.append(2)
        n //= 2
    f = 3
    while f * f <= n:
        while n % f == 0:
            factors.append(f)
            n //= f
        f += 2
    if n > 1:
        factors.append(n)
    return factors

def is_prime(num):
    if num < 2:
        return False
    if num in (2, 3):
        return True
    if num % 2 == 0:
        return False
    root = int(math.sqrt(num))
    for i in range(3, root + 1, 2):
        if num % i == 0:
            return False
    return True

def is_hyper_prime(n, memo={}):
    if n in memo:
        return memo[n]
    
    # Bootstrap base cases: 0, 1, 2 are hyper-primes by definition
    if n in (0, 1, 2):
        memo[n] = True
        return True
    
    # Must be prime to be hyper-prime
    if not is_prime(n):
        memo[n] = False
        return False
    
    # Factor n-1
    factors = prime_factors(n - 1)
    factor_counts = Counter(factors)
    
    # Check all prime factors are hyper-primes
    for factor in factor_counts.keys():
        if not is_hyper_prime(factor, memo):
            memo[n] = False
            return False
    
    # Check all exponents are hyper-primes
    for exponent in factor_counts.values():
        if not is_hyper_prime(exponent, memo):
            memo[n] = False
            return False
    
    memo[n] = True
    return True

def generate_primes(limit):
    primes = []
    for p in range(2, limit + 1):
        if is_prime(p):
            primes.append(p)
    return primes

def generate_hyper_primes(limit):
    hyperprimes = []
    memo = {}
    for p in range(2, limit + 1):
        if is_hyper_prime(p, memo):
            hyperprimes.append(p)
    return hyperprimes

def generate_hyper_primes_debug(limit):
    print(f"| {'Prime':>6} | {'Factors of p-1':>25} | {'Exponents':>15} | {'HyperPrime':>10} |")
    print(f"|{'-'*8}|{'-'*27}|{'-'*17}|{'-'*12}|")
    memo = {}
    for p in range(2, limit + 1):
        if not is_prime(p):
            continue
        factors = prime_factors(p - 1)
        counts = Counter(factors)
        exps_str = ', '.join(f"{prime}^{exp}" for prime, exp in counts.items())
        hyper = is_hyper_prime(p, memo)
        factors_str = ' × '.join(map(str, factors)) if factors else '1'
        print(f"| {p:6} | {factors_str:25} | {exps_str:15} | {str(hyper):>10} |")

# Example test up to 420
generate_hyper_primes_debug(420)

References

#math