นี่คือวิธีแก้ไขตามความคิดเห็นของฉันด้านบน ฉันไม่ได้อ้างสิทธิ์นี้เป็นสิ่งที่ดีที่สุด
ความคิดคือการพิจารณา T( n , m )ซึ่งเรานิยามว่า "จำนวนเต็มบวกที่เล็กที่สุดด้วย n ตัวหารและ ม. ปัจจัยสำคัญเฉพาะ "เราทำการสังเกตได้ง่าย:
T( n , 1 )T(2ม., m )=2n - 1=พี1พี2⋯พีม.
และเราก็มีการเกิดขึ้นอีก:
T( n , m ) =นาทีd| n[ T(nd, m - 1 ) ⋅พีd- 1ม.]
ในที่สุดปริมาณที่คุณต้องการคือ
นาที1 ≤ ฉัน≤ ⌈ บันทึก( n ) ⌉T( n , ฉัน)
ในตอนท้ายนี่คือรหัส Python บางส่วนที่เห็นด้วยกับตัวเลขทั้งหมดที่คุณให้ไว้ด้านบน round(2**smallest(n))
โปรดทราบว่าจะทำงานร่วมกับลอการิทึมเพื่อให้ตัวเลขที่มีขนาดเล็กลงเพื่อให้จำนวนเต็มจริงที่คุณแสวงหาก็คือ
import functools
import itertools
import math
# All primes less than 100.
PRIMES = [
2, 3, 5, 7, 11,
13, 17, 19, 23, 29,
31, 37, 41, 43, 47,
53, 59, 61, 67, 71,
73, 79, 83, 89, 97,
]
LOG_PRIMES = [math.log2(p) for p in PRIMES]
def smallest(n):
max_factors = math.ceil(math.log2(n))
min_so_far = float('Infinity')
factors = factorize(n)
memo = {}
for i in range(1, max_factors+1):
t = T(n,i, factors, memo)
if 0.0 < t < min_so_far:
min_so_far = t
return min_so_far
def T(n, m, factors=None, memo=None):
if memo is None:
memo = {}
if n < 2 or m < 1:
return 0
elif m == 1:
# Everything on the smallest prime.
return (n-1) * LOG_PRIMES[0]
elif n < 2**m:
return 0
elif n == 2**m:
# Product of first m primes, in log.
return sum(LOG_PRIMES[:m])
elif (n,m) in memo:
return memo[(n,m)]
if factors is None:
factors = factorize(n)
if len(factors) < m:
return 0
smallest = float('Infinity')
for factor_list in powerset(factors):
divisor = product(factor_list)
first = T(divisor, m-1, factor_list, memo)
# No such product.
if first < 1.0:
continue
second = (n/divisor - 1) * LOG_PRIMES[m-1]
total = first + second
if total < smallest:
smallest = total
memo[(n,m)] = smallest
return smallest
def product(nums):
return functools.reduce(lambda x,y: x*y, nums, 1)
def factorize(n):
prime_factors = []
for p in PRIMES:
while n%p == 0:
n //= p
prime_factors.append(p)
if n == 1:
break
return prime_factors
def powerset(lst):
# No empty set.
return itertools.chain.from_iterable(itertools.combinations(lst, r)
for r in range(1, len(lst)+1))