from polybori.PyPolyBoRi import Monomial, Polynomial, top_index, BooleConstant


def used_vars(l, bound=None):
    if not l:
        return BooleConstant(1)
    m = Monomial(Polynomial(iter(l).next()).vars_as_monomial())
    for p in l[1:]:
        m = m * Polynomial(p).vars_as_monomial()
        if bound and len(m) > bound:
            return m
    return m


def used_vars_set(l, bound=None):
    if not l:
        return BooleConstant(1)
    s = set()
    for p in l:
        s.update(Polynomial(p).vars_as_monomial().variables())
        if bound and len(s) > bound:
            break
    sorted_s = sorted(list(s), key=top_index, reverse=True)
    m = Monomial(iter(l).next().ring())
    for v in sorted_s:
        m = v * m

    return m
