from polybori.PyPolyBoRi import GroebnerStrategy, Polynomial, ReductionStrategy


def interred(l, completely=False):
    """computes a new generating system (g1, ...,gn),
    spanning the same ideal modulo field equations.
    The system is interreduced: For i!=j:
    gi.lead() does not divide any leading term of gj.
    If completely is set to True, then also terms in the
    tail are not reducible by other polynomials.
    """
    l = [Polynomial(p) for p in l if not p == 0]
    if not l:
        return []
    ring = l[0].ring()
    l_old = None
    l = tuple(l)
    while l_old != l:
        l_old = l
        l = sorted(l, key=Polynomial.lead)
        g = ReductionStrategy(ring)
        if completely:
            g.opt_red_tail = True
        for p in l:
            p = g.nf(p)
            if not p.is_zero():
                g.add_generator(p)
        l = tuple([e.p for e in g])
    return list(l)
