def pretty_print(poly): R_terms = [] r_terms = [] x_terms = [] mixed_terms = [] if isinstance(poly, int): return str(poly) has_const = bool(poly.constant_coefficient()) for monom in poly: vars_in_term = [str(v) for v in monom.variables()] if not vars_in_term: continue term = "*".join(vars_in_term) families = {v[0] for v in vars_in_term} if families == {"R"}: R_terms.append(term) elif families == {"r"}: r_terms.append(term) elif families == {"x"}: x_terms.append(term) else: mixed_terms.append(term) parts = [] if has_const: parts.append("1") if R_terms: parts.append("f(Ri)") if r_terms: parts.append("f(ri)") parts.extend(x_terms) parts.extend(mixed_terms) return " + ".join(parts) if parts else "0" def pretty_print_vec(vec): return "[" + ",\n ".join(pretty_print(p) for p in vec) + "]"