def solve_reduced_system(system, entry=False): """Recursively solves reduced polynomial systems. """ basis = poly_groebner(system) if len(basis) == 1 and basis[0].is_one: if not entry: return [] else: return None univariate = filter(is_univariate, basis) if len(univariate) == 1: f = univariate.pop() else: raise PolynomialError("Not a zero-dimensional system") zeros = roots(Poly(f, f.symbols[-1])).keys() if not zeros: return [] if len(basis) == 1: return [ [zero] for zero in zeros ] solutions = [] for zero in zeros: new_system = [] for poly in basis[:-1]: eq = poly.evaluate((poly.symbols[-1], zero)) if not eq.is_zero: new_system.append(eq) for solution in solve_reduced_system(new_system): solutions.append(solution + [zero]) return solutions
def solve_reduced_system(system, entry=False): """Recursively solves reduced polynomial systems. """ basis = poly_groebner(system) if len(basis) == 1 and basis[0].is_one: if not entry: return [] else: return None univariate = filter(is_univariate, basis) if len(univariate) == 1: f = univariate.pop() else: raise PolynomialError("Not a zero-dimensional system") zeros = roots(Poly(f, f.symbols[-1])).keys() if not zeros: return [] if len(basis) == 1: return [[zero] for zero in zeros] solutions = [] for zero in zeros: new_system = [] for poly in basis[:-1]: eq = poly.evaluate((poly.symbols[-1], zero)) if not eq.is_zero: new_system.append(eq) for solution in solve_reduced_system(new_system): solutions.append(solution + [zero]) return solutions
def test_poly_groebner(): assert poly_groebner(0, x) == [Poly((), x)] assert poly_groebner(x*y, x) == [Poly(x, x)] assert poly_groebner(x*y, z) == [Poly(1, z)] assert poly_groebner((x**2 + 2*x*y**2, x*y + 2*y**3 - 1), y, x, order='lex') == \ [Poly(y**3 - Rational(1,2), y, x, order='lex'), Poly(x, y, x, order='lex')] assert poly_groebner((y-x**2, z-x**3), y, z, x, order='lex') == \ [Poly(-x**2+y, y, z, x, order='lex'), Poly(z-x**3, y, z, x, order='lex')] assert poly_groebner((x**3-2*x*y, x**2*y-2*y**2+x), x, y, order='grlex') == \ [Poly(x**2, x, y, order='grlex'), Poly(x*y, x, y, order='grlex'), Poly(y**2-x/2, x, y, order='grlex')]