looking for patterns in primes as co_p_factor numbers
This commit is contained in:
parent
9c4ab2708e
commit
8b83c5cae3
76
primes_patterns.py
Normal file
76
primes_patterns.py
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
import math
|
||||||
|
|
||||||
|
def primes_up_to(n: int):
|
||||||
|
"""Generate all primes ≤ n using sieve of Eratosthenes."""
|
||||||
|
if n < 2:
|
||||||
|
return []
|
||||||
|
sieve = [True] * (n + 1)
|
||||||
|
sieve[0] = sieve[1] = False
|
||||||
|
for p in range(2, int(math.isqrt(n)) + 1):
|
||||||
|
if sieve[p]:
|
||||||
|
step = p
|
||||||
|
start = p * p
|
||||||
|
sieve[start:n + 1:step] = [False] * ((n - start) // step + 1)
|
||||||
|
return [i for i, is_p in enumerate(sieve) if is_p]
|
||||||
|
|
||||||
|
def factor_exponents(n: int):
|
||||||
|
"""Return dict {prime: exponent} for n (n ≥ 1)."""
|
||||||
|
exps = {}
|
||||||
|
if n <= 1:
|
||||||
|
return exps
|
||||||
|
limit = math.isqrt(n)
|
||||||
|
for p in primes_up_to(limit):
|
||||||
|
if p * p > n:
|
||||||
|
break
|
||||||
|
while n % p == 0:
|
||||||
|
exps[p] = exps.get(p, 0) + 1
|
||||||
|
n //= p
|
||||||
|
if n > 1: # leftover prime
|
||||||
|
exps[n] = exps.get(n, 0) + 1
|
||||||
|
return exps
|
||||||
|
|
||||||
|
def exponents_in_prime_order(n: int, min_len=7):
|
||||||
|
"""
|
||||||
|
Produce exponents in order [2, 3, 5, 7, 11, 13, ...],
|
||||||
|
padded with zeros to length >= min_len.
|
||||||
|
"""
|
||||||
|
if n == 1:
|
||||||
|
return [0] * min_len
|
||||||
|
|
||||||
|
exps = factor_exponents(n)
|
||||||
|
|
||||||
|
# generate primes in ascending order until we cover all factors
|
||||||
|
primes_needed = sorted(exps.keys())
|
||||||
|
max_prime = max(primes_needed) if primes_needed else 2
|
||||||
|
primes_list = primes_up_to(max_prime)
|
||||||
|
|
||||||
|
out = [exps.get(p, 0) for p in primes_list]
|
||||||
|
|
||||||
|
# pad with zeros
|
||||||
|
while len(out) < min_len:
|
||||||
|
out.append(0)
|
||||||
|
|
||||||
|
return out
|
||||||
|
|
||||||
|
def format_exponents(exps):
|
||||||
|
"""Format as comma-separated list with zero-padded width=3."""
|
||||||
|
return ",".join(f"{e:03d}" for e in exps)
|
||||||
|
|
||||||
|
def main():
|
||||||
|
for s in range(1,100):
|
||||||
|
#s = input("Enter a positive integer (1..10000000): ").strip()
|
||||||
|
try:
|
||||||
|
n = int(s)
|
||||||
|
except ValueError:
|
||||||
|
print("Error: please enter an integer.")
|
||||||
|
return
|
||||||
|
if n < 1 or n > 10_000_000:
|
||||||
|
print("Error: number must be between 1 and 10,000,000.")
|
||||||
|
return
|
||||||
|
|
||||||
|
exps = exponents_in_prime_order(n, min_len=7)
|
||||||
|
print(s, ': ',format_exponents(exps))
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
|
|
Loading…
Reference in New Issue
Block a user