#!/usr/bin/python3 -u

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

# Please adjust following values

minbase   = 2
maxbase   = 36
minpower  = 2
maxpower  = 10
minnumber = 2
maxnumber = 1000

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

# Don't edit after this line

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt # requires "python3 -m pip install matplotlib"
import numpy as np
import math

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

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

ax.set_xlabel('Decimal number (n)')
ax.set_ylabel('Base (b)')
ax.set_zlabel('Power (p)')

for b in range(minbase,maxbase+1):
    for p in range(minpower,maxpower+1):
        for n in range(minnumber,maxnumber+1):
            if isImmortal(n,b,p):
                xs = n
                ys = b
                zs = p
                c = "#%02X%02X%02X" % (math.floor(255*((b-minbase)/(maxbase-minbase+1))), math.floor(255*((p-minpower)/(maxpower-minpower+1))), 0)
                m = 'o' # filled_markers = ('o', 'v', '^', '<', '>', '8', 's', 'p', '*', 'h', 'H', 'D', 'd', 'P', 'X')
                ax.scatter(xs, ys, zs, c=c, marker=m)

plt.show()

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