X-Git-Url: http://gitweb.michael.orlitzky.com/?a=blobdiff_plain;f=mjo%2Fpolynomial.py;h=e50fece270e78be01904872cbd3d3571698325ea;hb=1a8af0a2d9398932b8e4ac2b35a7fb4d7094654c;hp=8b493711924d705e17eb612efd56e390ea98e88e;hpb=892a138853b8152e35605deedbfc8160309c2bc6;p=sage.d.git diff --git a/mjo/polynomial.py b/mjo/polynomial.py index 8b49371..e50fece 100644 --- a/mjo/polynomial.py +++ b/mjo/polynomial.py @@ -135,12 +135,12 @@ def multidiv(f, gs): 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: # hack for SageMath Trac #28855 + sage: f = R(R.random_element(ZZ.random_element(10).abs())) sage: (qs, r) = multidiv(f,gs) sage: r != 0 or f in R.ideal(gs) True @@ -149,12 +149,11 @@ def multidiv(f, gs): 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: # hack for SageMath Trac #28855 + sage: f = R(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 @@ -162,6 +161,19 @@ def multidiv(f, gs): ....: for g in gs )) True + Exercise 8 in Section 2.4 of Cox, Little, and O'Shea says that we + should always get a zero remainder if we divide an element of a + monomial ideal by its generators:: + + sage: R = PolynomialRing(QQ,'x,y,z') + sage: gs = R.random_element().monomials() + sage: I = R.ideal(gs) + sage: # hack for SageMath Trac #28855 + sage: f = R(I.random_element(ZZ.random_element(5).abs())) + sage: (qs, r) = multidiv(f, gs) + sage: r.is_zero() + True + """ R = f.parent() s = len(gs) @@ -171,9 +183,8 @@ def multidiv(f, gs): qs = [R.zero()]*s while p != R.zero(): - i = 0 - division_occurred = false - while i < s: + for i in range(0,s): + division_occurred = false # If gs[i].lt() divides p.lt(), then this remainder will # be zero and the quotient will be in R (and not the # fraction ring, which is important). @@ -182,13 +193,7 @@ def multidiv(f, gs): qs[i] += factor p -= factor*gs[i] division_occurred = true - # Don't increment "i" here because we want to try - # again with this "denominator" g[i]. We might - # get another factor out of it, but we know that - # we can't get another factor out of an *earlier* - # denominator g[i-k] for some k. - else: - i += 1 + break if not division_occurred: r += p.lt()