python3 - <<'PY' import math ln2=math.log(2) c=2/ln2 def f(x): return 0.0 if x<=0 else -x*math.log(x)/ln2 def HB(pA,pC,m,A,B): if m<3 or pA<9 or pC<3 or abs(pA+pC+m-20)>1e-6: return -1e9 if A<3/m or B<3/m or A>6/m or B>4/m or A+B<1+2/m or A+B>1+3/m or A>1 or B>1: return -1e9 HA=-(9/pA*math.log(9/pA)+2*((pA-9)/2/pA)*math.log((pA-9)/2/pA))/ln2 if pA>9 else 0 HC=-(3/pC*math.log(3/pC)+2*((pC-3)/2/pC)*math.log((pC-3)/2/pC))/ln2 if pC>3 else 0 bb=2-c*(2*abs(3/m-A*B)+(A-.5)**2+(B-.5)**2) return (pA*HA+pC*HC+m*bb)/20 def golden(fun,a,b,tol=1e-10): g=(math.sqrt(5)-1)/2;cc=b-g*(b-a);dd=a+g*(b-a);fc=fun(cc);fd=fun(dd) while b-a>tol: if fc>fd: b,dd,fd=dd,cc,fc;cc=b-g*(b-a);fc=fun(cc) else: a,cc,fc=cc,dd,fd;dd=a+g*(b-a);fd=fun(dd) return (a+b)/2 best=(-1,None) for pA0 in [10,12,14,16]: for m0 in [3.5,4.5,5.5,6.5]: pC0=20-pA0-m0 if pC0<3: continue v=[pA0,pC0,m0,min(.9,6/m0),min(.9,4/m0)] for it in range(30): for j in range(5): lo=max(0.0001,v[j]-1);hi=min(1,v[j]+1) if j>=3 else v[j]+1 def g(x,j=j): vv=v.copy();vv[j]=x;return HB(vv[0],vv[1],vv[2],vv[3],vv[4]) v[j]=golden(g,lo,hi) val=HB(*v) if val>best[0]: best=(val,v) print('bound',best) print('I_lower',2.1822287-best[0]) PY