正实数拆分成非负数之和,怎么拆分两两差值的乘积最大?
0<=a0
求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))
