From 99c9d21e53ac687000811b614214e6a083eb8b63 Mon Sep 17 00:00:00 2001 From: Michael Orlitzky Date: Mon, 18 Feb 2019 11:01:14 -0500 Subject: [PATCH] mjo/polynomial.py: improve tests for new multidiv function. --- mjo/polynomial.py | 46 +++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 43 insertions(+), 3 deletions(-) diff --git a/mjo/polynomial.py b/mjo/polynomial.py index 3e90ba5..c3fbf56 100644 --- a/mjo/polynomial.py +++ b/mjo/polynomial.py @@ -51,8 +51,14 @@ def multidiv(f, gs): sage: x,y = R.gens() sage: f = x*y^2 + 1 sage: gs = [ x*y + 1, y + 1 ] - sage: multidiv(f, gs) + sage: (qs, r) = multidiv(f, gs) + sage: (qs, r) ([y, -1], 2) + sage: r + sum( qs[i]*gs[i] for i in range(len(gs)) ) == f + True + sage: not any( g.lt().divides(m) for m in r.monomials() + ....: for g in gs ) + True Example 2 in Section 2.3 of Cox, Little, and O'Shea:: @@ -60,12 +66,46 @@ def multidiv(f, gs): sage: x,y = R.gens() sage: f = x^2*y + x*y^2 + y^2 sage: gs = [ x*y - 1, y^2 - 1 ] - sage: multidiv(f, gs) + sage: (qs, r) = multidiv(f, gs) + sage: (qs, r) ([x + y, 1], x + y + 1) + sage: r + sum( qs[i]*gs[i] for i in range(len(gs)) ) == f + True + sage: not any( g.lt().divides(m) for m in r.monomials() + ....: for g in gs ) + True TESTS: - Derp. + If we get a zero remainder, then the numerator should belong to + the ideal generated by the denominators:: + + sage: set_random_seed() + sage: R = PolynomialRing(QQ, 'x,y,z') + sage: x,y,z = R.gens() + sage: s = ZZ.random_element(1,5).abs() + sage: gs = [ R.random_element() for idx in range(s) ] + sage: f = R.random_element(ZZ.random_element(10).abs()) + sage: (qs, r) = multidiv(f,gs) + sage: r != 0 or f in R.ideal(gs) + True + + The numerator is always the sum of the remainder and the quotients + times the denominators, and the remainder's monomials aren't divisible + by the leading term of any denominator:: + + sage: set_random_seed() + sage: R = PolynomialRing(QQ, 'x,y,z') + sage: x,y,z = R.gens() + sage: s = ZZ.random_element(1,5).abs() + sage: gs = [ R.random_element() for idx in range(s) ] + sage: f = R.random_element(ZZ.random_element(10).abs()) + sage: (qs, r) = multidiv(f,gs) + sage: r + sum( qs[i]*gs[i] for i in range(len(gs)) ) == f + True + sage: r == 0 or (not any( g.lt().divides(m) for m in r.monomials() + ....: for g in gs )) + True """ R = f.parent() -- 2.43.2