Ticket #9466: 9466.2.patch

File 9466.2.patch, 3.9 KB (added by mstreng, 8 years ago)
  • sage/rings/finite_rings/element_givaro.pyx

    # HG changeset patch
    # User Marco Streng <marco.streng@gmail.com>
    # Date 1374775673 -3600
    # Node ID bcfe7162d96865647a260ec14450339d531b11b4
    # Parent  5d8c13e7b81a1e152855073f97a4d48ee97255d1
    9466 all square roots of non-square elements
    
    diff --git a/sage/rings/finite_rings/element_givaro.pyx b/sage/rings/finite_rings/element_givaro.pyx
    a b  
    10931093            sage: K = GF(8, 'a')
    10941094            sage: all([a.sqrt()*a.sqrt() == a for a in K if a.is_square()])
    10951095            True
     1096            sage: K.<a>=FiniteField(9)
     1097            sage: a.sqrt(extend = False, all = True)
     1098            []
     1099
    10961100        """
    10971101        if all:
    1098             a = self.sqrt()
    1099             return [a, -a] if -a != a else [a]
     1102            if self.is_square():
     1103                a = self.sqrt()
     1104                return [a, -a] if -a != a else [a]
     1105            return []
    11001106        cdef Cache_givaro cache = <Cache_givaro>self._cache
    11011107        if self.element == cache.objectptr.one:
    11021108            return make_FiniteField_givaroElement(cache, cache.objectptr.one)
  • sage/rings/finite_rings/integer_mod.pyx

    diff --git a/sage/rings/finite_rings/integer_mod.pyx b/sage/rings/finite_rings/integer_mod.pyx
    a b  
    869869            9
    870870            sage: Mod(1/25, next_prime(2^90)).sqrt()^(-2)
    871871            25
     872
     873        Finding all square roots works in some cases::
     874
     875            sage: t = FiniteField(next_prime(2^100))(4)
     876            sage: t.sqrt(extend = False, all = True)
     877            [2, 1267650600228229401496703205651]
     878            sage: t = FiniteField(next_prime(2^100))(2)
     879            sage: t.sqrt(extend = False, all = True)
     880            []
     881            sage: mod(4, 75).sqrt(all=True)
     882            Traceback (most recent call last):
     883            ...
     884            NotImplementedError: all=True not yet implemented for finding roots modulo non-prime integers
    872885       
    873886        ::
    874887       
     
    944957                z = Q.gen()
    945958                if all:
    946959                    # TODO
    947                     raise NotImplementedError
     960                    raise NotImplementedError, "all=True not yet implemented " \
     961                                           "for finding roots modulo integers"
    948962                return z
     963            if all:
     964                return []
    949965            raise ValueError, "self must be a square"
    950966           
    951967        F = self._parent.factored_order()
     
    28232839                    if (i*i) % n == self.ivalue:
    28242840                        return self._new_c(i)
    28252841                if not extend:
    2826                     raise ValueError, "self must be a square"
     2842                    if not all:
     2843                         raise ValueError, "self must be a square"
     2844                    else:
     2845                        return []
    28272846        # Either it failed but extend was True, or the generic algorithm is better
    28282847        return IntegerMod_abstract.sqrt(self, extend=extend, all=all)
    28292848       
  • sage/rings/integer.pyx

    diff --git a/sage/rings/integer.pyx b/sage/rings/integer.pyx
    a b  
    51665166            <type 'sage.rings.real_mpfr.RealNumber'>
    51675167            sage: type(Integer(-5).sqrt(prec=53))
    51685168            <type 'sage.rings.complex_number.ComplexNumber'>
     5169
     5170        TESTS:
     5171
     5172        Check that :trac:`9466` is fixed::
     5173
     5174            sage: 3.sqrt(extend=False, all=True)
     5175            []
    51695176        """
    51705177        if mpz_sgn(self.value) == 0:
    51715178            return [self] if all else self
     
    51885195
    51895196        if non_square:
    51905197            if not extend:
    5191                 raise ValueError, "square root of %s not an integer"%self
     5198                if not all:
     5199                   raise ValueError, "square root of %s not an integer"%self
     5200                else:
     5201                    return []
    51925202            from sage.functions.other import _do_sqrt
    51935203            return _do_sqrt(self, prec=prec, all=all)
    51945204