from matplotlib import pyplot as plt # returns a number n' so that base^n = goal and |n - n'| <= epsilon def log(base, goal, epsilon = 1e-8): assert base > 0 and base != 1 and goal > 0, 'bad argument for log function: base={}, goal={}'.format(base, goal) if goal == 1: return 0 if base > 1e1 or base < 1e-1: return 0.5*log(base**0.5, goal) if goal > 1e2 or goal < 1e-2: return 2*log(base, goal**0.5) ma = 2*max(base, goal, base/goal, goal/base) mi = -ma while ma-mi > epsilon: #print(mi, ma) av = (ma+mi)/2 if base > 1: if base**av < goal: mi = (ma+mi)/2 else: ma = (ma+mi)/2 else: if base**av < goal: ma = (ma+mi)/2 else: mi = (ma+mi)/2 return mi xs = [] step = 0.025 max_x = 8 x = step while x < max_x: xs.append(x) x += step ys = [log(3000000, x) for x in xs] plt.plot(xs, ys) plt.show()