Ticket #12173: sqrt_normalization_fix.diff

File sqrt_normalization_fix.diff, 1.5 KB (added by fredrik.johansson, 10 years ago)

Fix normalization of sqrt for fraction field elements

  • sage/rings/fraction_field_FpT.pyx

    diff --git a/sage/rings/fraction_field_FpT.pyx b/sage/rings/fraction_field_FpT.pyx
    a b  
    688688            return self
    689689        cdef nmod_poly_t numer
    690690        cdef nmod_poly_t denom
     691        cdef long a
    691692        cdef FpTElement res
    692693
    693694        nmod_poly_init(denom, self.p)
    694695        nmod_poly_init(numer, self.p)
    695696
    696697        if nmod_poly_sqrt(numer, self._numer) and nmod_poly_sqrt(denom, self._denom):
     698            # Make denominator monic
     699            a = nmod_poly_leading(denom)
     700            if a != 1:
     701                a = mod_inverse_int(a, self.p)
     702                nmod_poly_scalar_mul_nmod(numer, numer, a)
     703                nmod_poly_scalar_mul_nmod(denom, denom, a)
     704            # Choose numerator with smaller leading coefficient
     705            a = nmod_poly_leading(numer)
     706            if a > self.p - a:
     707                nmod_poly_neg(numer, numer)
    697708            res = self._new_c()
    698709            nmod_poly_swap(numer, res._numer)
    699710            nmod_poly_swap(denom, res._denom)
     
    736747       
    737748            sage: from sage.rings.fraction_field_FpT import *
    738749            sage: K = GF(7)['t'].fraction_field(); t = K.gen(0)
    739             sage: ((t + 2)^2/(3*t^3 + 1)^4).sqrt()
     750            sage: p = (t + 2)^2/(3*t^3 + 1)^4
     751            sage: p.sqrt()
    740752            (3*t + 6)/(t^6 + 3*t^3 + 4)
     753            sage: p.sqrt()^2 == p
     754            True
     755
    741756        """
    742757        s = self._sqrt_or_None()
    743758        if s is None: