# (0) (1 2 3) (4 5 6) (7 8 9) (10 11 12) (13 14 15) (16 17 18) (19 20 21) (22 23 24)
def phi_gen1():
    l = [0] * 25

    l[0] = 0
    for i in range(8):
        k = i*3
        l[k+1] = k+2
        l[k+2] = k+3
        l[k+3] = k+1
    return tuple(l)

# (0 1 8 21 2 23 14 10) (3 4 19 6 12 11 22 7) (5 24 15 9 18 16 13 17) (20)
def phi_gen2():
    l = [0] * 25
    l[0] = 1; l[1] = 8; l[8] = 21; l[21] = 2; l[2] = 23; l[23] = 14; l[14] = 10; l[10] = 0
    l[3] = 4; l[4] = 19; l[19] = 6; l[6] = 12; l[12] = 11; l[11] = 22; l[22] = 7; l[7] = 3
    l[5] = 24; l[24] = 15; l[15] = 9; l[9] = 18; l[18] = 16; l[16] = 13; l[13] = 17; l[17] = 5
    l[20] = 20
    return tuple(l)

def compose(a, b):
    l = [0] * 25
    for i in range(25):
        l[i] = a[b[i]]
    return tuple(l)

def inv(x):
    l = [0] * 25
    for i in range(25):
        l[x[i]] = i
    return tuple(l)

PHIS = {phi_gen1(), phi_gen2()}
for _ in range(3):
    for phi1 in list(PHIS):
        for phi2 in list(PHIS):
            PHIS.add(compose(phi1, phi2))

def f(x, y):
    if x == y: return x
    for phi in PHIS:
        # f(x, y) = phi⁻¹(f(phi(x), phi(y)))
        # f(x, y) = phi⁻¹(f(0, 1))
        # f(x, y) = phi⁻¹(4)
        if phi[x] == 0 and phi[y] == 1:
            return inv(phi)[4]

for x in range(25):
    for y in range(25):
        assert(x == f(y, f(x, f(f(y, x), y))))
