# Integer logarithm.
def ilog_floor(x, base):
if x <= 0:
raise ValueError('math domain error')
r = 0
while True:
x //= base
if x == 0:
return r
r += 1
def ilog_ceil(x, base):
if x <= 0:
raise ValueError('math domain error')
r = 0
while x != 1:
x = -(x // -base)
r += 1
return r
# ..
import math
basemax = 10
xmax = 1000
for base in range(2, basemax+1):
for x in range(1, xmax+1):
u = math.floor(math.log(x, base))
v = ilog_floor(x, base)
if u != v:
print('floor/log:', (x, base), 'u:', u, 'v:', v)
print(f'{base}**{u} = {base**u}')
print(f'{base}**{v} = {base**v}')
for base in range(2, basemax+1):
for x in range(1, xmax+1):
u = math.ceil(math.log(x, base))
v = ilog_ceil(x, base)
if u != v:
print('ceil/log:', (x, base), 'u:', u, 'v:', v)
print(f'{base}**{u} = {base**u}')
print(f'{base}**{v} = {base**v}')
IyBJbnRlZ2VyIGxvZ2FyaXRobS4KCmRlZiBpbG9nX2Zsb29yKHgsIGJhc2UpOgogICAgaWYgeCA8PSAwOgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ21hdGggZG9tYWluIGVycm9yJykKICAgIHIgPSAwCiAgICB3aGlsZSBUcnVlOgogICAgICAgIHggLy89IGJhc2UKICAgICAgICBpZiB4ID09IDA6CiAgICAgICAgICAgIHJldHVybiByCiAgICAgICAgciArPSAxCgpkZWYgaWxvZ19jZWlsKHgsIGJhc2UpOgogICAgaWYgeCA8PSAwOgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ21hdGggZG9tYWluIGVycm9yJykKICAgIHIgPSAwCiAgICB3aGlsZSB4ICE9IDE6CiAgICAgICAgeCA9IC0oeCAvLyAtYmFzZSkKICAgICAgICByICs9IDEKICAgIHJldHVybiByCgojIC4uCgppbXBvcnQgbWF0aAoKYmFzZW1heCA9IDEwCnhtYXggPSAxMDAwCgpmb3IgYmFzZSBpbiByYW5nZSgyLCBiYXNlbWF4KzEpOgogICAgZm9yIHggaW4gcmFuZ2UoMSwgeG1heCsxKToKICAgICAgICB1ID0gbWF0aC5mbG9vcihtYXRoLmxvZyh4LCBiYXNlKSkKICAgICAgICB2ID0gaWxvZ19mbG9vcih4LCBiYXNlKQogICAgICAgIGlmIHUgIT0gdjoKICAgICAgICAgICAgcHJpbnQoJ2Zsb29yL2xvZzonLCAoeCwgYmFzZSksICd1OicsIHUsICd2OicsIHYpCiAgICAgICAgICAgIHByaW50KGYne2Jhc2V9Kip7dX0gPSB7YmFzZSoqdX0nKQogICAgICAgICAgICBwcmludChmJ3tiYXNlfSoqe3Z9ID0ge2Jhc2UqKnZ9JykKCmZvciBiYXNlIGluIHJhbmdlKDIsIGJhc2VtYXgrMSk6CiAgICBmb3IgeCBpbiByYW5nZSgxLCB4bWF4KzEpOgogICAgICAgIHUgPSBtYXRoLmNlaWwobWF0aC5sb2coeCwgYmFzZSkpCiAgICAgICAgdiA9IGlsb2dfY2VpbCh4LCBiYXNlKQogICAgICAgIGlmIHUgIT0gdjoKICAgICAgICAgICAgcHJpbnQoJ2NlaWwvbG9nOicsICh4LCBiYXNlKSwgJ3U6JywgdSwgJ3Y6JywgdikKICAgICAgICAgICAgcHJpbnQoZid7YmFzZX0qKnt1fSA9IHtiYXNlKip1fScpCiAgICAgICAgICAgIHByaW50KGYne2Jhc2V9Kip7dn0gPSB7YmFzZSoqdn0nKQ==