大兔子袁哥
25-03-19 18:14

正实数拆分成非负数之和,怎么拆分两两差值的乘积最大?

0<=a0∑ai=S
求s=∏(aj-ai) (j>i)的最大值?

显然最大时候a0=0。

分成0和n个数,两两之差乘积最大时这些数是方程f(x)=0的根。

f(x)=∑(-1)**i*S**i*comb(n+1,i)*comb(n,i)*factorial(i)*(n**2+n)**(n-i)*x**(n+1-i)
(0<=i<=n)

最大乘积等于:

s=(n+1)^((n+1)/2)*(S/(n(n+1))^(n(n+1)/2)*∏ i^i。

再选取最大值的n就可以得到具体的拆分了。

下面程序计算了和为20的9个拆分(其中1个为0)

2025的拆分为749个数(0和748个不为0的数之和)最大,最大值为9.76e+61327。

#数拆分成非负数之和,两两差值乘积最大
#yuange 2025.3.19
from sympy import *
#from math import *
from mpmath import *

mp.dps=40
mpf1=mpf(1.0)

x= symbols('x')

def fx(n,ss):
f=0
for i in range(0,n+1):
f=f+(-1)**i*ss**i*comb(n+1,i)*comb(n,i)*factorial(i)*(n**2+n)**(n-i)*x**(n+1-i)
f=f/factor_list(f)[0]
return f

def fcm(n,S):
f=fx(n,S)
print("f(x)=",factor(f),"=0")
xn=solve(f*1.0)
print("xn=",xn)
L=len(xn)
s=1
for i in range(0,L):
for j in range(i+1,L):
s=s*abs(xn[j]-xn[i])

print("ok! s=",s)

def H(n):
s=1
for i in range(1,n+1):
s=s*i**i
return s
def fns(n,S):
L=n*(n+1)
l=L/2
s=mpf1*H(n)
s=s*(mpf1*S/L)**l
s=s*(mpf1*(n+1))**((n+1)/2)
return s
n=8
S=20
fcm(n,S)
print("fns=",fns(n,S))

S=2025
n=747
print("fns=",fns(n,S))
n=748
print("fns=",fns(n,S))
n=749
print("fns=",fns(n,S))

发布于 韩国