#!/usr/bin/env python3 from lib import primegen from math import log from operator import mul from functools import reduce def calc(pows): return (reduce(mul, (2*p + 1 for p in pows)) + 1) // 2 def increment(i, pows): n = 0 if i < len(pows): n = pows[i] return [n + 1] * (i+1) + pows[i+1:] def val(pows): return sum(p*v for p, v in zip(pows, vals)) def fpwof2(pows, n): if len(pows) == 1: return n-1 r = (2*n - 1) // reduce(mul, (2*p + 1 for p in pows[1:])) r = (r - 1) // 2 while calc([r] + pows[1:]) < n: r += 1 return r N = 10 ** 3 primes = list(primegen(100)) vals = [log(p) / log(2) for p in primes] i = 0 pows = [0] best = fpwof2(pows, N) best_pows = None while not (val(pows) >= best and sum(pows) == len(pows)): if not i: pows[0] = fpwof2(pows, N) if len(pows) > 1 and pows[0] < pows[1]: pows[0] = pows[1] if val(pows) < best: best = val(pows) best_pows = pows i = 1 pows = increment(i, pows) if val(pows) >= best: i += 1 else: i = 0 print(reduce(mul, (n**pw for n, pw in zip(primes, best_pows))))