#!/usr/bin/python3 -u

# --------------------------------------------------------------

# Please adjust following values

maxlen   = 250  # the higher, the more accurate the I/D value
minbase  = 2
maxbase  = 36
minpower = 2
maxpower = 10
minlen   = 10 # set to "1" for "usual behavior".
              # set to a higher value to get a better result (especially if maxlen is not big enough!)
              # use case: b/p tuple (2,9) will have their "normal" behavior (8 branches) beginning with 5 digits,
              # so to get 8.0 as result, we need an extremely high "maxlen", or a minlen of 5.

# --------------------------------------------------------------

# Don't edit after this line

print("IMMORTALITY OVERVIEW")
print("Base:       {:>2} to {:>2}".format(minbase,maxbase))
print("Power:      {:>2} to {:>2}".format(minpower,maxpower))
print("Min length: {}".format(minlen))
print("Max length: {}".format(maxlen))
print("")

def isImmortal(n,b,p):
	len = 1
	z = b
	while z < n:
		z = z * b
		len = len + 1
	return n**p % (b**len) == n

def rec_(n,b,p,l=1,m=10):
	out = []
	if isImmortal(n,b,p):
		if m > 0:
			if l >= minlen:
				out.append(n)
		if l<maxlen:
			for bx in range(0,b):
				nx = bx*b**l+n # add the digit "bx" in front of the number "n" and assign it to "nx"
				out_ = rec_(nx, b, p, l+1, bx)
				out = out + out_
	return out

def findImmort(b,p):
	out = []
	for bx in range(0,b):
		out = out + rec_(bx, b, p)
	x = len(out)/(maxlen-minlen+1)
	print("Base {}, Power {}: Immortals/Digit: {}".format(b, p, x))

for b in range(minbase,maxbase+1):
	for p in range(minpower,maxpower+1):
		findImmort(b,p)

# --------------------------------------------------------------
