bridge/class-master/depend/pari/src/basemath/elliptic.c
/* prec = working precision, prec0 = target precision */
prec = working precision, prec0 = target precision
prec = working precision prec0 = target precision
static GEN
doellR_roots_i(GEN e, long prec, long prec0)
{
  GEN d1, d2, d3, e1, e2, e3, R = roots(ec_bmodel(e), prec);
  long s = ellR_get_sign(e);
  if (s > 0)
  { 
    R = real_i(R);
    gen_sort_inplace(R, NULL, &invcmp, NULL);
    e1 = gel(R,1); e2 = gel(R,2); e3 = gel(R,3);
    d3 = subrr(e1,e2);
    d1 = subrr(e2,e3);
    d2 = subrr(e1,e3);
    if (realprec(d3) < prec0 || realprec(d1) < prec0) return NULL;
  } else {
    e1 = gel(R,1); e2 = gel(R,2); e3 = gel(R,3);
    if (s < 0)
    { 
      e1 = real_i(e1);
      if (signe(gel(e2,2)) < 0) swap(e2, e3);
    }
    d3 = gsub(e1,e2);
    d1 = gsub(e2,e3);
    d2 = gsub(e1,e3);
    if (precision(d1) < prec0
        || precision(d2) < prec0
        || precision(d3) < prec0) return NULL;
  }
  return mkcol6(e1,e2,e3,d1,d2,d3);
}
static GEN doellR_roots_i ( GEN e , long prec , long prec0 ) { GEN d1 , d2 , d3 , e1 , e2 , e3 , R = roots ( ec_bmodel ( e ) , prec ) ; long s = ellR_get_sign ( e ) ; if ( s > 0 ) { R = real_i ( R ) ; gen_sort_inplace ( R , NULL , & invcmp , NULL ) ; e1 = gel ( R , 1 ) ; e2 = gel ( R , 2 ) ; e3 = gel ( R , 3 ) ; d3 = subrr ( e1 , e2 ) ; d1 = subrr ( e2 , e3 ) ; d2 = subrr ( e1 , e3 ) ; if ( realprec ( d3 ) < prec0 || realprec ( d1 ) < prec0 ) return NULL ; } else { e1 = gel ( R , 1 ) ; e2 = gel ( R , 2 ) ; e3 = gel ( R , 3 ) ; if ( s < 0 ) { e1 = real_i ( e1 ) ; if ( signe ( gel ( e2 , 2 ) ) < 0 ) swap ( e2 , e3 ) ; } d3 = gsub ( e1 , e2 ) ; d1 = gsub ( e2 , e3 ) ; d2 = gsub ( e1 , e3 ) ; if ( precision ( d1 ) < prec0 || precision ( d2 ) < prec0 || precision ( d3 ) < prec0 ) return NULL ; } return mkcol6 ( e1 , e2 , e3 , d1 , d2 , d3 ) ; }
prec = working precision, prec0 = target precision
prec = working precision prec0 = target precision
/* sort 3 real roots in decreasing order */ /* make sure e1 is real, imag(e2) > 0 and imag(e3) < 0 */