python/dist.py
import math
print(__file__ , "begin python dist")
def dist(f, t, c):
x = math.exp(math.log(t/f) / c)
a = [f]
for i in range(c-1):
a.append(math.floor(a[-1] * x))
a.append(t)
maO = t + 999
for i in range(13):
ma = a[1] / a[0] # maximum of a[x]/a[x-1]
mi = (a[1]+1) / a[0] # minimum of (a[x]+1)/a[x-1]
miX = 1
for x in range(2, c):
ma = max(ma, a[x] / a[x-1])
r = (a[x] + 1) / a[x-1]
if r < mi :
miX = x
mi = r
ma = max(ma, t/a[-2])
print(f"dist({f}, {t}, {c}) => ma={ma} mi={mi} miX={miX}", a)
if ma > maO: # over minimum
break
aO = a.copy()
maO = ma
for x in range(miX, c):
a[x] += 1
return maO, aO
def distO(f, t, c):
x = math.exp(math.log(t/f) / c)
r = []
for xx in range(25):
a = [f]
m=-1
for i in range(c-1):
n = math.floor(a[-1] * x)
m = max(m, n / a[-1])
a.append(n)
mL = t / a[-1]
mA = max(m, mL)
a.append(t)
print(f" dist({f}, {t}, {c}) => x={x} m={m} mL={mL} a=", a)
if len(r) == 0 :
if mL <= m:
x *= .9
else:
r[0: 5] = x, mA, m, mL, a
x = mL
elif len(r) == 5 and mL >= m:
x *= 1.1
else :
if mL < m:
r[5: 10] = x, mA, m, mL, a
else:
r[0: 5] = x, mA, m, mL, a
print(f" x={x} r=", r)
if r[4][-2] + 1 == r[9][-2] :
break
x = (r[0] + r[5]) / 2
if r[1] <= r[6] :
r = r[0:5]
else :
r = r[5:10]
print(f"dist({f}, {t}, {c}) final{xx} .....>", r)
dist(16, 32, 2)
dist(256, 512, 2)
dist(16, 32, 3)
dist(16, 32, 5)
dist(16, 32, 6)
dist(16, 32, 7)
dist(256, 512, 3)
dist(256, 512, 4)
dist(256, 512, 5)
dist(256, 512, 6)
dist(256, 512, 7)
print("res", dist(256, 512, 8))
dist(256, 512, 4)
dist(512, 1024, 4)
dist(1024, 2048, 4)
dist(2048, 4096, 4)