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)