Hi everyone, attached is a patch to make the is_zero -> __nonzero__ change, to summarize:
> Conclusions: > (1) Do not eliminate the is_zero method. I.e., it should still be > possible to write x.is_zero() for x an element. It is in element.pyx. Nick, does the documentation satisfy your request or should it be more prominent? > (2) Do implement __nonzero__, and redefine is_zero in the base to be > def is_zero(self): > return not self.__nonzero__() See above. > (3) Make sure no derived classes define is_zero; they should instead > always define __nonzero__. Almost, done. Exception: ./libs/ntl/ntl.pyx: def is_zero(self): ./libs/ntl/ntl.pyx: def is_zero(self): ./libs/ntl/ntl.pyx: def is_zero(ntl_GF2E self): ./libs/ntl/ntl.pyx: def is_zero(self): Does not inherit from Element. ./modular/hecke/module.py: def is_zero(self): Does not inherit from Element. ./structure/element.pyx: def is_zero(self): Does not inherit from Element. ./rings/morphism.py: def is_zero(self): Does not inherit from Element. ./rings/number_field/number_field_ideal.py: def is_zero(self): ./rings/number_field/number_field_ideal.py: def is_zero(self): Does not inherit from Element. ./rings/padics/padic_lazy_element.py: def is_zero(self, prec): ./rings/padics/padic_capped_relative_element.py: def is_zero(self, prec = None): ./rings/padics/padic_extension_generic_element.py: def is_zero(self, prec): ./rings/padics/padic_ring_fixed_mod_element.py.orig: def is_zero(self, prec = None): ./rings/padics/local_generic_element.py: def is_zero(self, prec): ./rings/padics/padic_ring_fixed_mod_element.py: def is_zero(self, prec = None): Require additional prec parameter which doesn't fit into the __nonzero__ concept, so I left it as is. Ideas? Martin -- name: Martin Albrecht _pgp: http://pgp.mit.edu:11371/pks/lookup?op=get&search=0x8EF0DC99 _www: http://www.informatik.uni-bremen.de/~malb _jab: [EMAIL PROTECTED] --~--~---------~--~----~------------~-------~--~----~ To post to this group, send email to sage-devel@googlegroups.com To unsubscribe from this group, send email to [EMAIL PROTECTED] For more options, visit this group at http://groups.google.com/group/sage-devel URLs: http://sage.scipy.org/sage/ and http://modular.math.washington.edu/sage/ -~----------~----~----~----~------~----~------~--~---
# HG changeset patch # User 'Martin Albrecht <[EMAIL PROTECTED]>' # Date 1176936753 -7200 # Node ID 7a77bea899e0a396854646ff62bfee5240ab0857 # Parent a62ae3f310f2a583235aaf13c382f52fa5b276d8 is_zero methods replaced by __nonzero__ methods, is_zero now in Element as "not self.__nonzero__()" diff -r a62ae3f310f2 -r 7a77bea899e0 sage/interfaces/gap.py --- a/sage/interfaces/gap.py Wed Apr 18 15:18:44 2007 +0200 +++ b/sage/interfaces/gap.py Thu Apr 19 00:52:33 2007 +0200 @@ -591,6 +591,9 @@ class GapElement(ExpectElement): raise RuntimeError, "An error occured creating an object in %s from:\n'%s'\n%s"%(self.parent().name(), self._createu, s) return s + def __nonzero__(self): + return self.bool() + def __len__(self): """ EXAMPLES: diff -r a62ae3f310f2 -r 7a77bea899e0 sage/interfaces/macaulay2.py --- a/sage/interfaces/macaulay2.py Wed Apr 18 15:18:44 2007 +0200 +++ b/sage/interfaces/macaulay2.py Thu Apr 19 00:52:33 2007 +0200 @@ -376,9 +376,9 @@ class Macaulay2Element(ExpectElement): else: return self.parent().new('%s %% %s'%(self.name(), x.name())) - def is_zero(self): + def __nonzero__(self): P = self.parent() - return P.eval('%s == 0'%self.name()) == 'true' + return P.eval('%s == 0'%self.name()) == 'false' def sage_polystring(self): """ diff -r a62ae3f310f2 -r 7a77bea899e0 sage/interfaces/singular.py --- a/sage/interfaces/singular.py Wed Apr 18 15:18:44 2007 +0200 +++ b/sage/interfaces/singular.py Thu Apr 19 00:52:33 2007 +0200 @@ -793,9 +793,9 @@ class SingularElement(ExpectElement): else: P.eval('%s[%s] = %s'%(self.name(), n, value.name())) - def is_zero(self): + def __nonzero__(self): P = self.parent() - return P.eval('%s == 0'%self.name()) == '1' + return P.eval('%s == 0'%self.name()) == '0' def sage_polystring(self): """ diff -r a62ae3f310f2 -r 7a77bea899e0 sage/libs/cf/cf.pyxe --- a/sage/libs/cf/cf.pyxe Wed Apr 18 15:18:44 2007 +0200 +++ b/sage/libs/cf/cf.pyxe Thu Apr 19 00:52:33 2007 +0200 @@ -872,15 +872,13 @@ cdef class CanonicalForm: #}embed return bool(CF_isOne(self.thisptr)) - def is_zero(CanonicalForm self): - """ - This predicate returns true if self represents the zero - element of the current base domain. Like the predicate is_one - using the predicate f.is_zero() is also faster than a - comparison via f == 0. + def __nonzero__(CanonicalForm self): + """ + This predicate returns true if self does not represent the zero + element of the current base domain. """ #embed{ int CF_isZero(void *e) - return ((CanonicalForm*)e)->isZero(); + return not ((CanonicalForm*)e)->isZero(); #}embed return bool(CF_isZero(self.thisptr)) diff -r a62ae3f310f2 -r 7a77bea899e0 sage/matrix/matrix_integer_dense.pyx --- a/sage/matrix/matrix_integer_dense.pyx Wed Apr 18 15:18:44 2007 +0200 +++ b/sage/matrix/matrix_integer_dense.pyx Thu Apr 19 00:52:33 2007 +0200 @@ -496,14 +496,14 @@ cdef class Matrix_integer_dense(matrix_d # def _list(self): # def _dict(self): - def is_zero(self): + def __nonzero__(self): cdef mpz_t *a, *b cdef Py_ssize_t i, j cdef int k for i from 0 <= i < self._nrows * self._ncols: if mpz_cmp_si(self._entries[i], 0): - return False - return True + return True + return False def _multiply_linbox(self, Matrix right): """ diff -r a62ae3f310f2 -r 7a77bea899e0 sage/modular/modform/element.py --- a/sage/modular/modform/element.py Wed Apr 18 15:18:44 2007 +0200 +++ b/sage/modular/modform/element.py Thu Apr 19 00:52:33 2007 +0200 @@ -102,8 +102,8 @@ class ModularFormElement(element.HeckeMo "case not implemented yet." return chi - def is_zero(self): - return self.element().is_zero() + def __nonzero__(self): + return not self.element().is_zero() def level(self): return self.parent().level() diff -r a62ae3f310f2 -r 7a77bea899e0 sage/rings/contfrac.py --- a/sage/rings/contfrac.py Wed Apr 18 15:18:44 2007 +0200 +++ b/sage/rings/contfrac.py Thu Apr 19 00:52:33 2007 +0200 @@ -763,9 +763,9 @@ class ContinuedFraction(FieldElement): """ return self._rational_().is_one() - def is_zero(self): - """ - Return True if self is zero. + def __nonzero__(self): + """ + Return False if self is zero. EXAMPLES: sage: continued_fraction(0).is_zero() @@ -773,7 +773,7 @@ class ContinuedFraction(FieldElement): sage: continued_fraction(1).is_zero() False """ - return self._rational_().is_zero() + return not self._rational_().is_zero() def _pari_(self): """ diff -r a62ae3f310f2 -r 7a77bea899e0 sage/rings/finite_field_givaro.pyx --- a/sage/rings/finite_field_givaro.pyx Wed Apr 18 15:18:44 2007 +0200 +++ b/sage/rings/finite_field_givaro.pyx Thu Apr 19 00:52:33 2007 +0200 @@ -1224,9 +1224,9 @@ cdef class FiniteField_givaroElement(Fin """ return (<FiniteField_givaro>self._parent) - def is_zero(FiniteField_givaroElement self): + def __nonzero__(FiniteField_givaroElement self): r""" - Return True if \code{self == k(0)}. + Return True if \code{self != k(0)}. EXAMPLES: sage: k.<a> = GF(3^4); k @@ -1236,7 +1236,7 @@ cdef class FiniteField_givaroElement(Fin sage: k(0).is_zero() True """ - return bool((<FiniteField_givaro>self._parent).objectptr.isZero(self.element)) + return not bool((<FiniteField_givaro>self._parent).objectptr.isZero(self.element)) def is_one(FiniteField_givaroElement self): r""" diff -r a62ae3f310f2 -r 7a77bea899e0 sage/rings/ideal.py --- a/sage/rings/ideal.py Wed Apr 18 15:18:44 2007 +0200 +++ b/sage/rings/ideal.py Thu Apr 19 00:52:33 2007 +0200 @@ -185,8 +185,8 @@ class Ideal_generic(MonoidElement): # check if x, which is assumed to be in the ambient ring, is actually in this ideal. raise NotImplementedError - def is_zero(self): - return self.gens() == [self.ring()(0)] + def __nonzero__(self): + return self.gens() != [self.ring()(0)] def base_ring(self): return self.ring().base_ring() diff -r a62ae3f310f2 -r 7a77bea899e0 sage/rings/integer.pyx --- a/sage/rings/integer.pyx Wed Apr 18 15:18:44 2007 +0200 +++ b/sage/rings/integer.pyx Thu Apr 19 00:52:33 2007 +0200 @@ -1066,9 +1066,6 @@ cdef class Integer(sage.structure.elemen def __long__(self): return mpz_get_pylong(self.value) - def __nonzero__(self): - return not self.is_zero() - def __float__(self): return mpz_get_d(self.value) @@ -1317,9 +1314,9 @@ cdef class Integer(sage.structure.elemen """ return bool(mpz_cmp_si(self.value, 1) == 0) - def is_zero(self): + def __nonzero__(self): r""" - Returns \code{True} if the integers is $0$, otherwise \code{False}. + Returns \code{True} if the integers is not $0$, otherwise \code{False}. EXAMPLES: sage: Integer(1).is_zero() @@ -1327,7 +1324,7 @@ cdef class Integer(sage.structure.elemen sage: Integer(0).is_zero() True """ - return bool(mpz_cmp_si(self.value, 0) == 0) + return bool(mpz_cmp_si(self.value, 0) != 0) def is_unit(self): r""" diff -r a62ae3f310f2 -r 7a77bea899e0 sage/rings/integer_mod.pyx --- a/sage/rings/integer_mod.pyx Wed Apr 18 15:18:44 2007 +0200 +++ b/sage/rings/integer_mod.pyx Thu Apr 19 00:52:33 2007 +0200 @@ -834,9 +834,9 @@ cdef class IntegerMod_gmp(IntegerMod_abs """ return bool(mpz_cmp_si(self.value, 1) == 0) - def is_zero(IntegerMod_gmp self): - """ - Returns \code{True} if this is $0$, otherwise \code{False}. + def __nonzero__(IntegerMod_gmp self): + """ + Returns \code{True} if this is not $0$, otherwise \code{False}. EXAMPLES: sage: mod(13,5^23).is_zero() @@ -844,7 +844,7 @@ cdef class IntegerMod_gmp(IntegerMod_abs sage: (mod(25,5^23)^23).is_zero() True """ - return bool(mpz_cmp_si(self.value, 0) == 0) + return bool(mpz_cmp_si(self.value, 0) != 0) def is_unit(self): return bool(self.lift().gcd(self.modulus()) == 1) @@ -1159,9 +1159,9 @@ cdef class IntegerMod_int(IntegerMod_abs """ return bool(self.ivalue == 1) - def is_zero(IntegerMod_int self): - """ - Returns \code{True} if this is $0$, otherwise \code{False}. + def __nonzero__(IntegerMod_int self): + """ + Returns \code{True} if this is not $0$, otherwise \code{False}. EXAMPLES: sage: mod(13,5).is_zero() @@ -1169,7 +1169,7 @@ cdef class IntegerMod_int(IntegerMod_abs sage: mod(25,5).is_zero() True """ - return bool(self.ivalue == 0) + return bool(self.ivalue != 0) def is_unit(IntegerMod_int self): return bool(gcd_int(self.ivalue, self.__modulus.int32) == 1) @@ -1670,9 +1670,9 @@ cdef class IntegerMod_int64(IntegerMod_a """ return bool(self.ivalue == 1) - def is_zero(IntegerMod_int64 self): - """ - Returns \code{True} if this is $0$, otherwise \code{False}. + def __nonzero__(IntegerMod_int64 self): + """ + Returns \code{True} if this is not $0$, otherwise \code{False}. EXAMPLES: sage: mod(13,5^10).is_zero() @@ -1680,7 +1680,7 @@ cdef class IntegerMod_int64(IntegerMod_a sage: mod(5^12,5^10).is_zero() True """ - return bool(self.ivalue == 0) + return bool(self.ivalue != 0) def is_unit(IntegerMod_int64 self): return bool(gcd_int64(self.ivalue, self.__modulus.int64) == 1) @@ -2222,4 +2222,4 @@ def slow_lucas(k, P, Q=1): elif k == 1: return P else: - return P*slow_lucas(k-1, P, Q) - Q*slow_lucas(k-2, P, Q) \ No newline at end of file + return P*slow_lucas(k-1, P, Q) - Q*slow_lucas(k-2, P, Q) diff -r a62ae3f310f2 -r 7a77bea899e0 sage/rings/laurent_series_ring_element.py --- a/sage/rings/laurent_series_ring_element.py Wed Apr 18 15:18:44 2007 +0200 +++ b/sage/rings/laurent_series_ring_element.py Thu Apr 19 00:52:33 2007 +0200 @@ -111,7 +111,7 @@ class LaurentSeries(ring_element.RingEle """ return self.__u.is_unit() - def is_zero(self): + def __nonzero__(self): """ EXAMPLES: sage: x = Frac(QQ[['x']]).0 @@ -122,7 +122,7 @@ class LaurentSeries(ring_element.RingEle sage: z.is_zero() 1 """ - return self.__u.is_zero() + return not self.__u.is_zero() def _im_gens_(self, codomain, im_gens): return codomain(self(im_gens[0])) diff -r a62ae3f310f2 -r 7a77bea899e0 sage/rings/multi_polynomial_element.py --- a/sage/rings/multi_polynomial_element.py Wed Apr 18 15:18:44 2007 +0200 +++ b/sage/rings/multi_polynomial_element.py Thu Apr 19 00:52:33 2007 +0200 @@ -970,13 +970,13 @@ class MPolynomial_polydict(Polynomial_si return self._richcmp_(right,3) return self._MPolynomial__element != right._MPolynomial__element - def is_zero(self): - """ - Returns True if self == 0 + def __nonzero__(self): + """ + Returns True if self != 0 \note{This is much faster than actually writing self == 0} """ - return self._MPolynomial__element.dict()=={} + return self._MPolynomial__element.dict()!={} ############################################################################ # END: Some functions added by Martin Albrecht <[EMAIL PROTECTED]> diff -r a62ae3f310f2 -r 7a77bea899e0 sage/rings/polynomial_element.pyx --- a/sage/rings/polynomial_element.pyx Wed Apr 18 15:18:44 2007 +0200 +++ b/sage/rings/polynomial_element.pyx Thu Apr 19 00:52:33 2007 +0200 @@ -1242,9 +1242,6 @@ cdef class Polynomial(CommutativeAlgebra def is_gen(self): return bool(self._is_gen) - - def is_zero(self): - return bool(self.degree() == -1) def leading_coefficient(self): return self[self.degree()] diff -r a62ae3f310f2 -r 7a77bea899e0 sage/rings/polynomial_pyx.pyx --- a/sage/rings/polynomial_pyx.pyx Wed Apr 18 15:18:44 2007 +0200 +++ b/sage/rings/polynomial_pyx.pyx Thu Apr 19 00:52:33 2007 +0200 @@ -1143,8 +1143,8 @@ cdef class Polynomial_rational(sage.stru def degree(self): return self.pq.degree - def is_zero(self): - return self.pq.degree == -1 + def __nonzero__(self): + return self.pq.degree != -1 def list(self): return PQ_list(self.pq) diff -r a62ae3f310f2 -r 7a77bea899e0 sage/rings/power_series_ring_element.py --- a/sage/rings/power_series_ring_element.py Wed Apr 18 15:18:44 2007 +0200 +++ b/sage/rings/power_series_ring_element.py Thu Apr 19 00:52:33 2007 +0200 @@ -604,9 +604,9 @@ class PowerSeries(ring_element.RingEleme # endif return self._mul_(right, prec) - def is_zero(self): - """ - Return True if this power series equals 0. + def __nonzero__(self): + """ + Return True if this power series doesn't equal 0. EXAMPLES: sage: R.<q> = ZZ[[ ]]; R @@ -621,7 +621,7 @@ class PowerSeries(ring_element.RingEleme sage: (0 + O(q^1000)).is_zero() True """ - return self.polynomial().is_zero() + return not self.polynomial().is_zero() def is_unit(self): """ diff -r a62ae3f310f2 -r 7a77bea899e0 sage/rings/quotient_ring_element.py --- a/sage/rings/quotient_ring_element.py Wed Apr 18 15:18:44 2007 +0200 +++ b/sage/rings/quotient_ring_element.py Thu Apr 19 00:52:33 2007 +0200 @@ -79,8 +79,8 @@ class QuotientRingElement(ring_element.R def lift(self): return self.__rep - def is_zero(self): - return self.__rep in self.parent().defining_ideal() + def __nonzero__(self): + return self.__rep not in self.parent().defining_ideal() def is_unit(self): if self.__rep.is_unit(): diff -r a62ae3f310f2 -r 7a77bea899e0 sage/rings/rational.pyx --- a/sage/rings/rational.pyx Wed Apr 18 15:18:44 2007 +0200 +++ b/sage/rings/rational.pyx Thu Apr 19 00:52:33 2007 +0200 @@ -686,9 +686,6 @@ cdef class Rational(sage.structure.eleme mpq_neg(x.value, self.value) return x - def __nonzero__(self): - return not self.numerator().is_zero() - def __abs__(self): cdef Rational x x = <Rational> PY_NEW(Rational) @@ -1037,8 +1034,8 @@ cdef class Rational(sage.structure.eleme def is_one(self): return bool(mpz_cmp_si(mpq_numref(self.value), 1) == 0) - def is_zero(self): - return bool(mpz_cmp_si(mpq_numref(self.value), 0) == 0) + def __nonzero__(self): + return bool(mpz_cmp_si(mpq_numref(self.value), 0) != 0) cdef _lshift(self, long int exp): r""" diff -r a62ae3f310f2 -r 7a77bea899e0 sage/rings/sparse_poly.pyx --- a/sage/rings/sparse_poly.pyx Wed Apr 18 15:18:44 2007 +0200 +++ b/sage/rings/sparse_poly.pyx Thu Apr 19 00:52:33 2007 +0200 @@ -130,7 +130,7 @@ cdef class Polynomial: def is_irreducible(self): raise NotImplementedError - def is_zero(self): + def __nonzero__(self): raise NotImplementedError def leading_coefficient(self): diff -r a62ae3f310f2 -r 7a77bea899e0 sage/schemes/elliptic_curves/ell_point.py --- a/sage/schemes/elliptic_curves/ell_point.py Wed Apr 18 15:18:44 2007 +0200 +++ b/sage/schemes/elliptic_curves/ell_point.py Thu Apr 19 00:52:33 2007 +0200 @@ -142,7 +142,7 @@ class EllipticCurvePoint_field(SchemeMor """ return self.scheme() - def is_zero(self): + def __nonzero__(self): """ Return True if this is the zero point on the curve. @@ -156,7 +156,7 @@ class EllipticCurvePoint_field(SchemeMor sage: P.is_zero() False """ - return self[2] == 0 + return self[2] != 0 def is_finite_order(self): """ diff -r a62ae3f310f2 -r 7a77bea899e0 sage/schemes/hyperelliptic_curves/jacobian_morphism.py --- a/sage/schemes/hyperelliptic_curves/jacobian_morphism.py Wed Apr 18 15:18:44 2007 +0200 +++ b/sage/schemes/hyperelliptic_curves/jacobian_morphism.py Thu Apr 19 00:52:33 2007 +0200 @@ -177,5 +177,5 @@ class JacobianMorphism_divisor_class(Sch def __rmul__(self, n): return self.__mul__(n) - def is_zero(self): - return self.__polys[0] == 1 + def __nonzero__(self): + return self.__polys[0] != 1 diff -r a62ae3f310f2 -r 7a77bea899e0 sage/structure/element.pyx --- a/sage/structure/element.pyx Wed Apr 18 15:18:44 2007 +0200 +++ b/sage/structure/element.pyx Thu Apr 19 00:52:33 2007 +0200 @@ -313,8 +313,21 @@ cdef class Element(sage_object.SageObjec s = str(self) return PyBool_FromLong(s.find("+") == -1 and s.find("-") == -1 and s.find(" ") == -1) + def __nonzero__(self): + """ + Return True if self does not equal self.parent()(0). + """ + return PyBool_FromLong(self != self._parent(0)) + def is_zero(self): - return PyBool_FromLong(self == self._parent(0)) + """ + Return True if self equals self.parent()(0). The default + implementation is to fall back to 'not self.__nonzero__'. + + NOTE: Do not re-implement this method in your subclass but + implement __nonzero__ instead. + """ + return PyBool_FromLong(not self) def _cmp_(left, right): return left._cmp(right) @@ -439,10 +452,7 @@ cdef class ModuleElement(Element): """ Generic element of a module. """ - ################################################## - def is_zero(self): - return PyBool_FromLong(self == self._parent(0)) - + ################################################## # Addition ################################################## @@ -1050,9 +1060,6 @@ def is_RingElement(x): cdef class RingElement(ModuleElement): ################################################## - def is_zero(self): - return PyBool_FromLong(self == self.parent()(0)) - def is_one(self): return PyBool_FromLong(self == self.parent()(1)) diff -r a62ae3f310f2 -r 7a77bea899e0 sage/structure/formal_sum.py --- a/sage/structure/formal_sum.py Wed Apr 18 15:18:44 2007 +0200 +++ b/sage/structure/formal_sum.py Thu Apr 19 00:52:33 2007 +0200 @@ -154,13 +154,13 @@ class FormalSum(ModuleElement): def _rmul_(self, s): return self.__class__([(s*c, x) for (c, x) in self], check=False, parent=self.parent()) - def is_zero(self): + def __nonzero__(self): if len(self._data) == 0: - return True + return False for c, _ in self._data: if not c.is_zero(): - return False - return True + return True + return False def reduce(self): if len(self) == 0: