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

Prime Factors of p-1 Exponents HyperPrime
0 True
1 True
2 1 1^0 True
3 2 2^1 True
5 2 × 2 2^2 True
7 2 × 3 2^1, 3^1 True
11 2 × 5 2^1, 5^1 True
13 2 × 2 × 3 2^2, 3^1 True
17 2 × 2 × 2 × 2 2^4 False
19 2 × 3 × 3 2^1, 3^2 True
23 2 × 11 2^1, 11^1 True
29 2 × 2 × 7 2^2, 7^1 True
31 2 × 3 × 5 2^1, 3^1, 5^1 True
37 2 × 2 × 3 × 3 2^2, 3^2 True
41 2 × 2 × 2 × 5 2^3, 5^1 True
43 2 × 3 × 7 2^1, 3^1, 7^1 True
47 2 × 23 2^1, 23^1 True
53 2 × 2 × 13 2^2, 13^1 True
59 2 × 29 2^1, 29^1 True
61 2 × 2 × 3 × 5 2^2, 3^1, 5^1 True
67 2 × 3 × 11 2^1, 3^1, 11^1 True
71 2 × 5 × 7 2^1, 5^1, 7^1 True
73 2 × 2 × 2 × 3 × 3 2^3, 3^2 True
79 2 × 3 × 13 2^1, 3^1, 13^1 True
83 2 × 41 2^1, 41^1 True
89 2 × 2 × 2 × 11 2^3, 11^1 True
97 2 × 2 × 2 × 2 × 2 × 3 2^5, 3^1 True
101 2 × 2 × 5 × 5 2^2, 5^2 True
103 2 × 3 × 17 2^1, 3^1, 17^1 False
107 2 × 53 2^1, 53^1 True
109 2 × 2 × 3 × 3 × 3 2^2, 3^3 True
113 2 × 2 × 2 × 2 × 7 2^4, 7^1 False
127 2 × 3 × 3 × 7 2^1, 3^2, 7^1 True
131 2 × 5 × 13 2^1, 5^1, 13^1 True
137 2 × 2 × 2 × 17 2^3, 17^1 False
139 2 × 3 × 23 2^1, 3^1, 23^1 True
149 2 × 2 × 37 2^2, 37^1 True
151 2 × 3 × 5 × 5 2^1, 3^1, 5^2 True
157 2 × 2 × 3 × 13 2^2, 3^1, 13^1 True
163 2 × 3 × 3 × 3 × 3 2^1, 3^4 False
167 2 × 83 2^1, 83^1 True
173 2 × 2 × 43 2^2, 43^1 True
179 2 × 89 2^1, 89^1 True
181 2 × 2 × 3 × 3 × 5 2^2, 3^2, 5^1 True
191 2 × 5 × 19 2^1, 5^1, 19^1 True
193 2 × 2 × 2 × 2 × 2 × 2 × 3 2^6, 3^1 False
197 2 × 2 × 7 × 7 2^2, 7^2 True
199 2 × 3 × 3 × 11 2^1, 3^2, 11^1 True
211 2 × 3 × 5 × 7 2^1, 3^1, 5^1, 7^1 True
223 2 × 3 × 37 2^1, 3^1, 37^1 True
227 2 × 113 2^1, 113^1 False
229 2 × 2 × 3 × 19 2^2, 3^1, 19^1 True
233 2 × 2 × 2 × 29 2^3, 29^1 True
239 2 × 7 × 17 2^1, 7^1, 17^1 False
241 2 × 2 × 2 × 2 × 3 × 5 2^4, 3^1, 5^1 False
251 2 × 5 × 5 × 5 2^1, 5^3 True
257 2 × 2 × 2 × 2 × 2 × 2 × 2 × 2 2^8 False
263 2 × 131 2^1, 131^1 True
269 2 × 2 × 67 2^2, 67^1 True
271 2 × 3 × 3 × 3 × 5 2^1, 3^3, 5^1 True
277 2 × 2 × 3 × 23 2^2, 3^1, 23^1 True
281 2 × 2 × 2 × 5 × 7 2^3, 5^1, 7^1 True
283 2 × 3 × 47 2^1, 3^1, 47^1 True
293 2 × 2 × 73 2^2, 73^1 True
307 2 × 3 × 3 × 17 2^1, 3^2, 17^1 False
311 2 × 5 × 31 2^1, 5^1, 31^1 True
313 2 × 2 × 2 × 3 × 13 2^3, 3^1, 13^1 True
317 2 × 2 × 79 2^2, 79^1 True
331 2 × 3 × 5 × 11 2^1, 3^1, 5^1, 11^1 True
337 2 × 2 × 2 × 2 × 3 × 7 2^4, 3^1, 7^1 False
347 2 × 173 2^1, 173^1 True
349 2 × 2 × 3 × 29 2^2, 3^1, 29^1 True
353 2 × 2 × 2 × 2 × 2 × 11 2^5, 11^1 True
359 2 × 179 2^1, 179^1 True
367 2 × 3 × 61 2^1, 3^1, 61^1 True
373 2 × 2 × 3 × 31 2^2, 3^1, 31^1 True
379 2 × 3 × 3 × 3 × 7 2^1, 3^3, 7^1 True
383 2 × 191 2^1, 191^1 True
389 2 × 2 × 97 2^2, 97^1 True
397 2 × 2 × 3 × 3 × 11 2^2, 3^2, 11^1 True
401 2 × 2 × 2 × 2 × 5 × 5 2^4, 5^2 False
409 2 × 2 × 2 × 3 × 17 2^3, 3^1, 17^1 False
419 2 × 11 × 19 2^1, 11^1, 19^1 True
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