Ticket #7931: 7931_fix3.patch

File 7931_fix3.patch, 4.8 KB (added by roed, 9 years ago)

Apply on top of previous patches

  • sage/rings/finite_rings/element_base.pyx

    # HG changeset patch
    # User David Roe <roed@math.harvard.edu>
    # Date 1285943222 14400
    # Node ID 5eb432d59dc6f2cf6296a8729b25ee895e0d8ded
    # Parent  74423238ccd88ebd93604185c5d82d3d2cf285af
    [mq]: 7931_fix3.patch
    
    diff -r 74423238ccd8 -r 5eb432d59dc6 sage/rings/finite_rings/element_base.pyx
    a b  
    567567            ...               if (y^41).nth_root(41*r)**(41*r) != y^41: raise RuntimeError
    568568            ...               if (y^307).nth_root(307*r)**(307*r) != y^307: raise RuntimeError
    569569
     570            sage: k.<a> = GF(4)
     571            sage: a.nth_root(0,all=True)
     572            []
     573            sage: k(1).nth_root(0,all=True)
     574            [a, a + 1, 1]
     575
    570576        ALGORITHMS:
    571577
    572578        - The default is currently an algorithm described in the following paper:
     
    578584        - David Roe (2010-02-13)
    579585        """
    580586        if self.is_zero():
    581             if n < 0:
    582                 raise ZeroDivisionError
     587            if n <= 0:
     588                if all: return []
     589                else: raise ValueError
    583590            if all: return [self]
    584591            else: return self
     592        if n < 0:
     593            self = ~self
     594            n = -n
     595        elif n == 0:
     596            if self == 1:
     597                if all: return [a for a in self.parent().list() if a != 0]
     598                else: return self
     599            else:
     600                if all: return []
     601                else: raise ValueError
    585602        if extend:
    586603            raise NotImplementedError
    587604        from sage.rings.integer import Integer
  • sage/rings/finite_rings/integer_mod.pyx

    diff -r 74423238ccd8 -r 5eb432d59dc6 sage/rings/finite_rings/integer_mod.pyx
    a b  
    10031003
    10041004        .. warning::
    10051005           The 'extend' option is not implemented (yet).
     1006
     1007        NOTES:
     1008
     1009        - If `n = 0`
     1010           - ``all=True``
     1011             - ``self=1``; all nonzero elements of the parent are returned in a list.
     1012               Note that this could be very expensive for large parents.
     1013             - otherwise; an empty list is returned
     1014           - ``all=False``
     1015             - ``self=1``; ``self`` is returned
     1016             - otherwise; a ``ValueError`` is raised
     1017        - If `n < 0`
     1018          - if self is invertible, the `(-n)`\th root of the inverse of self is returned
     1019          - otherwise a ValueError is raised or empty list returned.
    10061020       
    10071021        EXAMPLES::
    10081022       
     
    10321046            sage: mod(3,6).nth_root(0)
    10331047            Traceback (most recent call last):
    10341048            ...
    1035             ZeroDivisionError
     1049            ValueError
    10361050            sage: mod(1,6).nth_root(0,all=True)
    10371051            [1, 2, 3, 4, 5]
    10381052
    10391053        TESTS::
    10401054
    1041             sage: for p in [1009,2003,10007,100003]: # long time
     1055            sage: for p in [1009,2003,10007,100003]:
    10421056            ...       K = GF(p)
    10431057            ...       for r in (p-1).divisors():
    10441058            ...           if r == 1: continue
     
    10481062            ...           if (y^41).nth_root(41*r)**(41*r) != y^41: raise RuntimeError
    10491063            ...           if (y^307).nth_root(307*r)**(307*r) != y^307: raise RuntimeError
    10501064
     1065            sage: for t in xrange(200):
     1066            ...       n = randint(1,2^63)
     1067            ...       K = Integers(n)
     1068            ...       b = K.random_element()
     1069            ...       e = randint(-2^62, 2^63)
     1070            ...       try:
     1071            ...           a = b.nth_root(e)
     1072            ...           if a^e != b:
     1073            ...               print n, b, e, a
     1074            ...               raise NotImplementedError
     1075            ...       except ValueError:
     1076            ...           pass
     1077
    10511078        ALGORITHMS:
    10521079
    10531080        - The default for prime modulus is currently an algorithm described in the following paper:
     
    10681095                else: return self
    10691096            else:
    10701097                if all: return []
    1071                 else: raise ZeroDivisionError
     1098                else: raise ValueError
    10721099        F = K.factored_order()
    10731100        if len(F) == 0:
    10741101            if all:
     
    10931120        if self.is_zero():
    10941121            if n < 0:
    10951122                if all: return []
    1096                 else: raise ZeroDivisionError
     1123                else: raise ValueError
    10971124            if all:
    10981125                if k == 1:
    10991126                    return [self]
     
    11031130            else:
    11041131                return self
    11051132        if n < 0:
    1106             self = ~self
     1133            try:
     1134                self = ~self
     1135            except ZeroDivisionError:
     1136                if all: return []
     1137                else: raise ValueError
    11071138            n = -n
    11081139        if p == 2 and k == 1:
    11091140            if all: return [self]