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:

Reply via email to