def growth_rate(M):
# M is a Coxeter matrix; the final line uses [3,5,3].
t = polygen(QQ, 't')
total = 0
for T in Subsets(range(len(M))):
T = sorted(T)
C = CoxeterMatrix([[M[i][j] for j in T] for i in T]) if T else None
if T and not C.is_finite():
continue
W_T = prod(sum(t^k for k in range(d)) for d in CoxeterGroup(C).degrees()) if T else 1
total += (-1)^len(T) / W_T
q = (1 / total(1/t)).denominator()
return max(q.roots(AA, multiplicities=False)).n(digits=100)
growth_rate([[1,3,2,2], [3,1,5,2], [2,5,1,3], [2,2,3,1]])The generator computes the rational growth series exactly from (1), using the finite special subgroups of each Coxeter diagram. It factors the reciprocal denominator, isolates the largest real root greater than $1$ in interval arithmetic, and writes $100$ digits.
As checks, the minimal polynomial printed for $[3,5,3]$ was reproduced exactly, the Coxeter relations were checked in the exact Tits representation, and the first growth-series coefficients of every row were compared with breadth-first counts in that representation.