(root)/
mpfr-4.2.1/
src/
rec_sqrt.c
       1  /* mpfr_rec_sqrt -- inverse square root
       2  
       3  Copyright 2008-2023 Free Software Foundation, Inc.
       4  Contributed by the AriC and Caramba projects, INRIA.
       5  
       6  This file is part of the GNU MPFR Library.
       7  
       8  The GNU MPFR Library is free software; you can redistribute it and/or modify
       9  it under the terms of the GNU Lesser General Public License as published by
      10  the Free Software Foundation; either version 3 of the License, or (at your
      11  option) any later version.
      12  
      13  The GNU MPFR Library is distributed in the hope that it will be useful, but
      14  WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
      15  or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
      16  License for more details.
      17  
      18  You should have received a copy of the GNU Lesser General Public License
      19  along with the GNU MPFR Library; see the file COPYING.LESSER.  If not, see
      20  https://www.gnu.org/licenses/ or write to the Free Software Foundation, Inc.,
      21  51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */
      22  
      23  #define MPFR_NEED_LONGLONG_H /* for umul_ppmm */
      24  #include "mpfr-impl.h"
      25  
      26  #define LIMB_SIZE(x) ((((x)-1)>>MPFR_LOG2_GMP_NUMB_BITS) + 1)
      27  
      28  #define MPFR_COM_N(x,y,n)                               \
      29    do                                                    \
      30      {                                                   \
      31        mp_size_t i;                                      \
      32        for (i = 0; i < n; i++)                           \
      33          *((x)+i) = ~*((y)+i);                           \
      34      }                                                   \
      35    while (0)
      36  
      37  /* Put in X a p-bit approximation of 1/sqrt(A),
      38     where X = {x, n}/B^n, n = ceil(p/GMP_NUMB_BITS),
      39     A = 2^(1+as)*{a, an}/B^an, as is 0 or 1, an = ceil(ap/GMP_NUMB_BITS),
      40     where B = 2^GMP_NUMB_BITS.
      41  
      42     We have 1 <= A < 4 and 1/2 <= X < 1.
      43  
      44     The error in the approximate result with respect to the true
      45     value 1/sqrt(A) is bounded by 1 ulp(X), i.e., 2^{-p} since 1/2 <= X < 1.
      46  
      47     Note: x and a are left-aligned, i.e., the most significant bit of
      48     a[an-1] is set, and so is the most significant bit of the output x[n-1].
      49  
      50     If p is not a multiple of GMP_NUMB_BITS, the extra low bits of the input
      51     A are taken into account to compute the approximation of 1/sqrt(A), but
      52     whether or not they are zero, the error between X and 1/sqrt(A) is bounded
      53     by 1 ulp(X) [in precision p].
      54     The extra low bits of the output X (if p is not a multiple of GMP_NUMB_BITS)
      55     are set to 0.
      56  
      57     Assumptions:
      58     (1) A should be normalized, i.e., the most significant bit of a[an-1]
      59         should be 1. If as=0, we have 1 <= A < 2; if as=1, we have 2 <= A < 4.
      60     (2) p >= 12
      61     (3) {a, an} and {x, n} should not overlap
      62     (4) GMP_NUMB_BITS >= 12 and is even
      63  
      64     Note: this routine is much more efficient when ap is small compared to p,
      65     including the case where ap <= GMP_NUMB_BITS, thus it can be used to
      66     implement an efficient mpfr_rec_sqrt_ui function.
      67  
      68     References:
      69     [1] Modern Computer Algebra, Richard Brent and Paul Zimmermann,
      70     https://members.loria.fr/PZimmermann/mca/pub226.html
      71  */
      72  static void
      73  mpfr_mpn_rec_sqrt (mpfr_limb_ptr x, mpfr_prec_t p,
      74                     mpfr_limb_srcptr a, mpfr_prec_t ap, int as)
      75  
      76  {
      77    /* the following T1 and T2 are bipartite tables giving initial
      78       approximation for the inverse square root, with 13-bit input split in
      79       5+4+4, and 11-bit output. More precisely, if 2048 <= i < 8192,
      80       with i = a*2^8 + b*2^4 + c, we use for approximation of
      81       2048/sqrt(i/2048) the value x = T1[16*(a-8)+b] + T2[16*(a-8)+c].
      82       The largest error is obtained for i = 2054, where x = 2044,
      83       and 2048/sqrt(i/2048) = 2045.006576...
      84    */
      85    static short int T1[384] = {
      86  2040, 2033, 2025, 2017, 2009, 2002, 1994, 1987, 1980, 1972, 1965, 1958, 1951,
      87  1944, 1938, 1931, /* a=8 */
      88  1925, 1918, 1912, 1905, 1899, 1892, 1886, 1880, 1874, 1867, 1861, 1855, 1849,
      89  1844, 1838, 1832, /* a=9 */
      90  1827, 1821, 1815, 1810, 1804, 1799, 1793, 1788, 1783, 1777, 1772, 1767, 1762,
      91  1757, 1752, 1747, /* a=10 */
      92  1742, 1737, 1733, 1728, 1723, 1718, 1713, 1709, 1704, 1699, 1695, 1690, 1686,
      93  1681, 1677, 1673, /* a=11 */
      94  1669, 1664, 1660, 1656, 1652, 1647, 1643, 1639, 1635, 1631, 1627, 1623, 1619,
      95  1615, 1611, 1607, /* a=12 */
      96  1603, 1600, 1596, 1592, 1588, 1585, 1581, 1577, 1574, 1570, 1566, 1563, 1559,
      97  1556, 1552, 1549, /* a=13 */
      98  1545, 1542, 1538, 1535, 1532, 1528, 1525, 1522, 1518, 1515, 1512, 1509, 1505,
      99  1502, 1499, 1496, /* a=14 */
     100  1493, 1490, 1487, 1484, 1481, 1478, 1475, 1472, 1469, 1466, 1463, 1460, 1457,
     101  1454, 1451, 1449, /* a=15 */
     102  1446, 1443, 1440, 1438, 1435, 1432, 1429, 1427, 1424, 1421, 1419, 1416, 1413,
     103  1411, 1408, 1405, /* a=16 */
     104  1403, 1400, 1398, 1395, 1393, 1390, 1388, 1385, 1383, 1380, 1378, 1375, 1373,
     105  1371, 1368, 1366, /* a=17 */
     106  1363, 1360, 1358, 1356, 1353, 1351, 1349, 1346, 1344, 1342, 1340, 1337, 1335,
     107  1333, 1331, 1329, /* a=18 */
     108  1327, 1325, 1323, 1321, 1319, 1316, 1314, 1312, 1310, 1308, 1306, 1304, 1302,
     109  1300, 1298, 1296, /* a=19 */
     110  1294, 1292, 1290, 1288, 1286, 1284, 1282, 1280, 1278, 1276, 1274, 1272, 1270,
     111  1268, 1266, 1265, /* a=20 */
     112  1263, 1261, 1259, 1257, 1255, 1253, 1251, 1250, 1248, 1246, 1244, 1242, 1241,
     113  1239, 1237, 1235, /* a=21 */
     114  1234, 1232, 1230, 1229, 1227, 1225, 1223, 1222, 1220, 1218, 1217, 1215, 1213,
     115  1212, 1210, 1208, /* a=22 */
     116  1206, 1204, 1203, 1201, 1199, 1198, 1196, 1195, 1193, 1191, 1190, 1188, 1187,
     117  1185, 1184, 1182, /* a=23 */
     118  1181, 1180, 1178, 1177, 1175, 1174, 1172, 1171, 1169, 1168, 1166, 1165, 1163,
     119  1162, 1160, 1159, /* a=24 */
     120  1157, 1156, 1154, 1153, 1151, 1150, 1149, 1147, 1146, 1144, 1143, 1142, 1140,
     121  1139, 1137, 1136, /* a=25 */
     122  1135, 1133, 1132, 1131, 1129, 1128, 1127, 1125, 1124, 1123, 1121, 1120, 1119,
     123  1117, 1116, 1115, /* a=26 */
     124  1114, 1113, 1111, 1110, 1109, 1108, 1106, 1105, 1104, 1103, 1101, 1100, 1099,
     125  1098, 1096, 1095, /* a=27 */
     126  1093, 1092, 1091, 1090, 1089, 1087, 1086, 1085, 1084, 1083, 1081, 1080, 1079,
     127  1078, 1077, 1076, /* a=28 */
     128  1075, 1073, 1072, 1071, 1070, 1069, 1068, 1067, 1065, 1064, 1063, 1062, 1061,
     129  1060, 1059, 1058, /* a=29 */
     130  1057, 1056, 1055, 1054, 1052, 1051, 1050, 1049, 1048, 1047, 1046, 1045, 1044,
     131  1043, 1042, 1041, /* a=30 */
     132  1040, 1039, 1038, 1037, 1036, 1035, 1034, 1033, 1032, 1031, 1030, 1029, 1028,
     133  1027, 1026, 1025 /* a=31 */
     134  };
     135    static unsigned char T2[384] = {
     136      7, 7, 6, 6, 5, 5, 4, 4, 4, 3, 3, 2, 2, 1, 1, 0, /* a=8 */
     137      6, 5, 5, 5, 4, 4, 3, 3, 3, 2, 2, 2, 1, 1, 0, 0, /* a=9 */
     138      5, 5, 4, 4, 4, 3, 3, 3, 2, 2, 2, 1, 1, 1, 0, 0, /* a=10 */
     139      4, 4, 3, 3, 3, 3, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, /* a=11 */
     140      3, 3, 3, 3, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0, /* a=12 */
     141      3, 3, 3, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0, 0, /* a=13 */
     142      3, 3, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 0, 0, 0, 0, /* a=14 */
     143      2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, /* a=15 */
     144      2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, /* a=16 */
     145      2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, /* a=17 */
     146      3, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 0, /* a=18 */
     147      2, 2, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, /* a=19 */
     148      1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, /* a=20 */
     149      1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, /* a=21 */
     150      1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* a=22 */
     151      2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, /* a=23 */
     152      1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* a=24 */
     153      1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, /* a=25 */
     154      1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, /* a=26 */
     155      1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* a=27 */
     156      1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, /* a=28 */
     157      1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, /* a=29 */
     158      1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* a=30 */
     159      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0  /* a=31 */
     160  };
     161    mp_size_t n = LIMB_SIZE(p);   /* number of limbs of X */
     162    mp_size_t an = LIMB_SIZE(ap); /* number of limbs of A */
     163  
     164    /* A should be normalized */
     165    MPFR_ASSERTD((a[an - 1] & MPFR_LIMB_HIGHBIT) != 0);
     166    /* We should have enough bits in one limb and GMP_NUMB_BITS should be even.
     167       Since that does not depend on MPFR, we always check this. */
     168    MPFR_STAT_STATIC_ASSERT ((GMP_NUMB_BITS & 1) == 0);
     169    /* {a, an} and {x, n} should not overlap */
     170    MPFR_ASSERTD((a + an <= x) || (x + n <= a));
     171    MPFR_ASSERTD(p >= 11);
     172  
     173    if (MPFR_UNLIKELY(an > n)) /* we can cut the input to n limbs */
     174      {
     175        a += an - n;
     176        an = n;
     177      }
     178  
     179    if (p == 11) /* should happen only from recursive calls */
     180      {
     181        unsigned long i, ab, ac;
     182        unsigned int t;
     183  
     184        /* take the 12+as most significant bits of A */
     185  #if GMP_NUMB_BITS >= 16
     186        i = a[an - 1] >> (GMP_NUMB_BITS - (12 + as));
     187  #else
     188        MPFR_STAT_STATIC_ASSERT (GMP_NUMB_BITS == 8);
     189        {
     190          unsigned int a12 = a[an - 1] << 8;
     191          if (an >= 2)
     192            a12 |= a[an - 2];
     193          MPFR_ASSERTN(GMP_NUMB_BITS >= 4 + as);
     194          i = a12 >> (GMP_NUMB_BITS - (4 + as));
     195        }
     196  #endif
     197        /* if one wants faithful rounding for p=11, replace #if 0 by #if 1 */
     198        ab = i >> 4;
     199        ac = (ab & 0x3F0) | (i & 0x0F);
     200        t = T1[ab - 0x80] + T2[ac - 0x80];  /* fits on 16 bits */
     201  #if GMP_NUMB_BITS >= 16
     202        /* x has only one limb */
     203        x[0] = (mp_limb_t) t << (GMP_NUMB_BITS - p);
     204  #else
     205        MPFR_STAT_STATIC_ASSERT (GMP_NUMB_BITS == 8);
     206        MPFR_ASSERTD (1024 <= t && t <= 2047);
     207        x[1] = t >> 3; /* 128 <= x[1] <= 255 */
     208        x[0] = MPFR_LIMB_LSHIFT(t, 5);
     209  #endif
     210      }
     211    else /* p >= 12 */
     212      {
     213        mpfr_prec_t h, pl;
     214        mpfr_limb_ptr r, s, t, u;
     215        mp_size_t xn, rn, th, ln, tn, sn, ahn, un;
     216        mp_limb_t neg, cy, cu;
     217        MPFR_TMP_DECL(marker);
     218  
     219        /* compared to Algorithm 3.9 of [1], we have {a, an} = A/2 if as=0,
     220           and A/4 if as=1. */
     221  
     222        /* h = max(11, ceil((p+3)/2)) is the bitsize of the recursive call */
     223        h = (p < 18) ? 11 : (p >> 1) + 2;
     224  
     225        xn = LIMB_SIZE(h);       /* limb size of the recursive Xh */
     226        rn = LIMB_SIZE(2 * h);   /* a priori limb size of Xh^2 */
     227        ln = n - xn;             /* remaining limbs to be computed */
     228  
     229        /* Since |Xh - A^{-1/2}| <= 2^{-h}, then by multiplying by Xh + A^{-1/2}
     230           we get |Xh^2 - 1/A| <= 2^{-h+1}, thus |A*Xh^2 - 1| <= 2^{-h+3},
     231           thus the h-3 most significant bits of t should be zero,
     232           which is in fact h+1+as-3 because of the normalization of A.
     233           This corresponds to th=floor((h+1+as-3)/GMP_NUMB_BITS) limbs.
     234  
     235           More precisely we have |Xh^2 - 1/A| <= 2^{-h} * (Xh + A^{-1/2})
     236           <= 2^{-h} * (2 A^{-1/2} + 2^{-h}) <= 2.001 * 2^{-h} * A^{-1/2}
     237           since A < 4 and h >= 11, thus
     238           |A*Xh^2 - 1| <= 2.001 * 2^{-h} * A^{1/2} <= 1.001 * 2^{2-h}.
     239           This is sufficient to prove that the upper limb of {t,tn} below is
     240           less that 0.501 * 2^GMP_NUMB_BITS, thus cu = 0 below.
     241        */
     242        th = (h + 1 + as - 3) >> MPFR_LOG2_GMP_NUMB_BITS;
     243        tn = LIMB_SIZE(2 * h + 1 + as);
     244  
     245        /* we need h+1+as bits of a */
     246        ahn = LIMB_SIZE(h + 1 + as); /* number of high limbs of A
     247                                        needed for the recursive call */
     248        if (MPFR_UNLIKELY(ahn > an))
     249          ahn = an;
     250        mpfr_mpn_rec_sqrt (x + ln, h, a + an - ahn, ahn * GMP_NUMB_BITS, as);
     251        /* the most h significant bits of X are set, X has ceil(h/GMP_NUMB_BITS)
     252           limbs, the low (-h) % GMP_NUMB_BITS bits are zero */
     253  
     254        /* compared to Algorithm 3.9 of [1], we have {x+ln,xn} = X_h */
     255  
     256        MPFR_TMP_MARK (marker);
     257        /* first step: square X in r, result is exact */
     258        un = xn + (tn - th);
     259        /* We use the same temporary buffer to store r and u: r needs 2*xn
     260           limbs where u needs xn+(tn-th) limbs. Since tn can store at least
     261           2h bits, and th at most h bits, then tn-th can store at least h bits,
     262           thus tn - th >= xn, and reserving the space for u is enough. */
     263        MPFR_ASSERTD(2 * xn <= un);
     264        u = r = MPFR_TMP_LIMBS_ALLOC (un);
     265        if (2 * h <= GMP_NUMB_BITS) /* xn=rn=1, and since p <= 2h-3, n=1,
     266                                       thus ln = 0 */
     267          {
     268            MPFR_ASSERTD(ln == 0);
     269            cy = x[0] >> (GMP_NUMB_BITS >> 1);
     270            r ++;
     271            r[0] = cy * cy;
     272          }
     273        else if (xn == 1) /* xn=1, rn=2 */
     274          umul_ppmm(r[1], r[0], x[ln], x[ln]);
     275        else
     276          {
     277            mpn_sqr (r, x + ln, xn);
     278            /* we have {r, 2*xn} = X_h^2 */
     279            if (rn < 2 * xn)
     280              r ++;
     281          }
     282        /* now the 2h most significant bits of {r, rn} contains X^2, r has rn
     283           limbs, and the low (-2h) % GMP_NUMB_BITS bits are zero */
     284  
     285        /* Second step: s <- A * (r^2), and truncate the low ap bits,
     286           i.e., at weight 2^{-2h} (s is aligned to the low significant bits)
     287         */
     288        sn = an + rn;
     289        s = MPFR_TMP_LIMBS_ALLOC (sn);
     290        if (rn == 1) /* rn=1 implies n=1, since rn*GMP_NUMB_BITS >= 2h,
     291                             and 2h >= p+3 */
     292          {
     293            /* necessarily p <= GMP_NUMB_BITS-3: we can ignore the two low
     294               bits from A */
     295            /* since n=1, and we ensured an <= n, we also have an=1 */
     296            MPFR_ASSERTD(an == 1);
     297            umul_ppmm (s[1], s[0], r[0], a[0]);
     298          }
     299        else
     300          {
     301            /* we have p <= n * GMP_NUMB_BITS
     302               2h <= rn * GMP_NUMB_BITS with p+3 <= 2h <= p+4
     303               thus n <= rn <= n + 1 */
     304            MPFR_ASSERTD(rn <= n + 1);
     305            /* since we ensured an <= n, we have an <= rn */
     306            MPFR_ASSERTD(an <= rn);
     307            mpn_mul (s, r, rn, a, an);
     308            /* s should be near B^sn/2^(1+as), thus s[sn-1] is either
     309               100000... or 011111... if as=0, or
     310               010000... or 001111... if as=1.
     311               We ignore the bits of s after the first 2h+1+as ones.
     312               We have {s, rn+an} = A*X_h^2/2 if as=0, A*X_h^2/4 if as=1. */
     313          }
     314  
     315        /* We ignore the bits of s after the first 2h+1+as ones: s has rn + an
     316           limbs, where rn = LIMBS(2h), an=LIMBS(a), and tn = LIMBS(2h+1+as). */
     317        t = s + sn - tn; /* pointer to low limb of the high part of t */
     318        /* the upper h-3 bits of 1-t should be zero,
     319           where 1 corresponds to the most significant bit of t[tn-1] if as=0,
     320           and to the 2nd most significant bit of t[tn-1] if as=1 */
     321  
     322        /* compute t <- 1 - t, which is B^tn - {t, tn+1},
     323           with rounding toward -Inf, i.e., rounding the input t toward +Inf.
     324           We could only modify the low tn - th limbs from t, but it gives only
     325           a small speedup, and would make the code more complex.
     326        */
     327        neg = t[tn - 1] & (MPFR_LIMB_HIGHBIT >> as);
     328        if (neg == 0) /* Ax^2 < 1: we have t = th + eps, where 0 <= eps < ulp(th)
     329                         is the part truncated above, thus 1 - t rounded to -Inf
     330                         is 1 - th - ulp(th) */
     331          {
     332            /* since the 1+as most significant bits of t are zero, set them
     333               to 1 before the one-complement */
     334            t[tn - 1] |= MPFR_LIMB_HIGHBIT | (MPFR_LIMB_HIGHBIT >> as);
     335            MPFR_COM_N (t, t, tn);
     336            /* we should add 1 here to get 1-th complement, and subtract 1 for
     337               -ulp(th), thus we do nothing */
     338          }
     339        else /* negative case: we want 1 - t rounded toward -Inf, i.e.,
     340                th + eps rounded toward +Inf, which is th + ulp(th):
     341                we discard the bit corresponding to 1,
     342                and we add 1 to the least significant bit of t */
     343          {
     344            t[tn - 1] ^= neg;
     345            mpn_add_1 (t, t, tn, 1);
     346          }
     347        tn -= th; /* we know at least th = floor((h+1+as-3)/GMP_NUMB_LIMBS) of
     348                     the high limbs of {t, tn} are zero */
     349  
     350        /* tn = rn - th, where rn * GMP_NUMB_BITS >= 2*h and
     351           th * GMP_NUMB_BITS <= h+1+as-3, thus tn > 0 */
     352        MPFR_ASSERTD(tn > 0);
     353  
     354        /* u <- x * t, where {t, tn} contains at least h+3 bits,
     355           and {x, xn} contains h bits, thus tn >= xn */
     356        MPFR_ASSERTD(tn >= xn);
     357        if (tn == 1) /* necessarily xn=1 */
     358          umul_ppmm (u[1], u[0], t[0], x[ln]);
     359        else
     360          mpn_mul (u, t, tn, x + ln, xn);
     361  
     362        /* we have {u, tn+xn} = T_l X_h/2 if as=0, T_l X_h/4 if as=1 */
     363  
     364        /* we have already discarded the upper th high limbs of t, thus we only
     365           have to consider the upper n - th limbs of u */
     366        un = n - th; /* un cannot be zero, since p <= n*GMP_NUMB_BITS,
     367                        h = ceil((p+3)/2) <= (p+4)/2,
     368                        th*GMP_NUMB_BITS <= h-1 <= p/2+1,
     369                        thus (n-th)*GMP_NUMB_BITS >= p/2-1.
     370                     */
     371        MPFR_ASSERTD(un > 0);
     372        u += (tn + xn) - un; /* xn + tn - un = xn + (original_tn - th) - (n - th)
     373                                             = xn + original_tn - n
     374                                = LIMBS(h) + LIMBS(2h+1+as) - LIMBS(p) > 0
     375                                since 2h >= p+3 */
     376        MPFR_ASSERTD(tn + xn > un); /* will allow to access u[-1] below */
     377  
     378        /* In case as=0, u contains |x*(1-Ax^2)/2|, which is exactly what we
     379           need to add or subtract.
     380           In case as=1, u contains |x*(1-Ax^2)/4|, thus we need to multiply
     381           u by 2. */
     382  
     383        if (as == 1)
     384          /* shift on un+1 limbs to get most significant bit of u[-1] into
     385             least significant bit of u[0] */
     386          mpn_lshift (u - 1, u - 1, un + 1, 1);
     387  
     388        /* now {u,un} represents U / 2 from Algorithm 3.9 */
     389  
     390        pl = n * GMP_NUMB_BITS - p;       /* low bits from x */
     391        /* We want that the low pl bits are zero after rounding to nearest,
     392           thus we round u to nearest at bit pl-1 of u[0] */
     393        if (pl > 0)
     394          {
     395            cu = mpn_add_1 (u, u, un,
     396                            u[0] & MPFR_LIMB_LSHIFT(MPFR_LIMB_ONE, pl - 1));
     397            /* mask bits 0..pl-1 of u[0] */
     398            u[0] &= MPFR_LIMB(~MPFR_LIMB_MASK(pl));
     399          }
     400        else /* round bit is in u[-1] */
     401          cu = mpn_add_1 (u, u, un, u[-1] >> (GMP_NUMB_BITS - 1));
     402        MPFR_ASSERTN(cu == 0);
     403  
     404        /* We already have filled {x + ln, xn = n - ln}, and we want to add or
     405           subtract {u, un} at position x.
     406           un = n - th, where th contains <= h+1+as-3<=h-1 bits
     407           ln = n - xn, where xn contains >= h bits
     408           thus un > ln.
     409           Warning: ln might be zero.
     410        */
     411        MPFR_ASSERTD(un > ln);
     412        /* we can have un = ln + 2, for example with GMP_NUMB_BITS=32 and
     413           p=62, as=0, then h=33, n=2, th=0, xn=2, thus un=2 and ln=0. */
     414        MPFR_ASSERTD(un == ln + 1 || un == ln + 2);
     415        /* the high un-ln limbs of u will overlap the low part of {x+ln,xn},
     416           we need to add or subtract the overlapping part {u + ln, un - ln} */
     417        /* Warning! th may be 0, in which case the mpn_add_1 and mpn_sub_1
     418           below (with size = th) mustn't be used. */
     419        if (neg == 0)
     420          {
     421            if (ln > 0)
     422              MPN_COPY (x, u, ln);
     423            cy = mpn_add (x + ln, x + ln, xn, u + ln, un - ln);
     424            /* cy is the carry at x + (ln + xn) = x + n */
     425          }
     426        else /* negative case */
     427          {
     428            /* subtract {u+ln, un-ln} from {x+ln,un} */
     429            cy = mpn_sub (x + ln, x + ln, xn, u + ln, un - ln);
     430            /* cy is the borrow at x + (ln + xn) = x + n */
     431  
     432            /* cy cannot be non-zero, since the most significant bit of Xh is 1,
     433               and the correction is bounded by 2^{-h+3} */
     434            MPFR_ASSERTD(cy == 0);
     435            if (ln > 0)
     436              {
     437                MPFR_COM_N (x, u, ln);
     438                /* we must add one for the 2-complement ... */
     439                cy = mpn_add_1 (x, x, n, MPFR_LIMB_ONE);
     440                /* ... and subtract 1 at x[ln], where n = ln + xn */
     441                cy -= mpn_sub_1 (x + ln, x + ln, xn, MPFR_LIMB_ONE);
     442              }
     443          }
     444  
     445        /* cy can be 1 when A=1, i.e., {a, n} = B^n. In that case we should
     446           have X = B^n, and setting X to 1-2^{-p} satisfies the error bound
     447           of 1 ulp. */
     448        if (MPFR_UNLIKELY(cy != 0))
     449          {
     450            cy -= mpn_sub_1 (x, x, n, MPFR_LIMB_ONE << pl);
     451            MPFR_ASSERTD(cy == 0);
     452          }
     453  
     454        MPFR_TMP_FREE (marker);
     455      }
     456  }
     457  
     458  int
     459  mpfr_rec_sqrt (mpfr_ptr r, mpfr_srcptr u, mpfr_rnd_t rnd_mode)
     460  {
     461    mpfr_prec_t rp, up, wp;
     462    mp_size_t rn, wn;
     463    int s, cy, inex;
     464    mpfr_limb_ptr x;
     465    MPFR_TMP_DECL(marker);
     466    MPFR_ZIV_DECL (loop);
     467  
     468    MPFR_LOG_FUNC
     469      (("x[%Pd]=%.*Rg rnd=%d", mpfr_get_prec (u), mpfr_log_prec, u, rnd_mode),
     470       ("y[%Pd]=%.*Rg inexact=%d", mpfr_get_prec (r), mpfr_log_prec, r, inex));
     471  
     472    /* special values */
     473    if (MPFR_UNLIKELY(MPFR_IS_SINGULAR(u)))
     474      {
     475        if (MPFR_IS_NAN(u))
     476          {
     477            MPFR_SET_NAN(r);
     478            MPFR_RET_NAN;
     479          }
     480        else if (MPFR_IS_ZERO(u)) /* 1/sqrt(+0) = 1/sqrt(-0) = +Inf */
     481          {
     482            /* +0 or -0 */
     483            MPFR_SET_INF(r);
     484            MPFR_SET_POS(r);
     485            MPFR_SET_DIVBY0 ();
     486            MPFR_RET(0); /* Inf is exact */
     487          }
     488        else
     489          {
     490            MPFR_ASSERTD(MPFR_IS_INF(u));
     491            /* 1/sqrt(-Inf) = NAN */
     492            if (MPFR_IS_NEG(u))
     493              {
     494                MPFR_SET_NAN(r);
     495                MPFR_RET_NAN;
     496              }
     497            /* 1/sqrt(+Inf) = +0 */
     498            MPFR_SET_POS(r);
     499            MPFR_SET_ZERO(r);
     500            MPFR_RET(0);
     501          }
     502      }
     503  
     504    /* if u < 0, 1/sqrt(u) is NaN */
     505    if (MPFR_UNLIKELY(MPFR_IS_NEG(u)))
     506      {
     507        MPFR_SET_NAN(r);
     508        MPFR_RET_NAN;
     509      }
     510  
     511    MPFR_SET_POS(r);
     512  
     513    rp = MPFR_PREC(r); /* output precision */
     514    up = MPFR_PREC(u); /* input precision */
     515    wp = rp + 11;      /* initial working precision */
     516  
     517    /* Let u = U*2^e, where e = EXP(u), and 1/2 <= U < 1.
     518       If e is even, we compute an approximation of X of (4U)^{-1/2},
     519       and the result is X*2^(-(e-2)/2) [case s=1].
     520       If e is odd, we compute an approximation of X of (2U)^{-1/2},
     521       and the result is X*2^(-(e-1)/2) [case s=0]. */
     522  
     523    /* parity of the exponent of u */
     524    s = 1 - ((mpfr_uexp_t) MPFR_GET_EXP (u) & 1);
     525  
     526    rn = LIMB_SIZE(rp);
     527  
     528    /* for the first iteration, if rp + 11 fits into rn limbs, we round up
     529       up to a full limb to maximize the chance of rounding, while avoiding
     530       to allocate extra space */
     531    wp = rp + 11;
     532    if (wp < rn * GMP_NUMB_BITS)
     533      wp = rn * GMP_NUMB_BITS;
     534    MPFR_ZIV_INIT (loop, wp);
     535    for (;;)
     536      {
     537        MPFR_TMP_MARK (marker);
     538        wn = LIMB_SIZE(wp);
     539        if (r == u || wn > rn) /* out of place, i.e., we cannot write to r */
     540          x = MPFR_TMP_LIMBS_ALLOC (wn);
     541        else
     542          x = MPFR_MANT(r);
     543        mpfr_mpn_rec_sqrt (x, wp, MPFR_MANT(u), up, s);
     544        /* If the input was not truncated, the error is at most one ulp;
     545           if the input was truncated, the error is at most two ulps
     546           (see algorithms.tex). */
     547        if (MPFR_LIKELY (mpfr_round_p (x, wn, wp - (wp < up),
     548                                       rp + (rnd_mode == MPFR_RNDN))))
     549          break;
     550  
     551        /* We detect only now the exact case where u=2^(2e), to avoid
     552           slowing down the average case. This can happen only when the
     553           mantissa is exactly 1/2 and the exponent is odd. */
     554        if (s == 0 && mpfr_cmp_ui_2exp (u, 1, MPFR_EXP(u) - 1) == 0)
     555          {
     556            mpfr_prec_t pl = wn * GMP_NUMB_BITS - wp;
     557  
     558            /* we should have x=111...111 */
     559            mpn_add_1 (x, x, wn, MPFR_LIMB_ONE << pl);
     560            x[wn - 1] = MPFR_LIMB_HIGHBIT;
     561            s += 2;
     562            break; /* go through */
     563          }
     564        MPFR_TMP_FREE(marker);
     565  
     566        MPFR_ZIV_NEXT (loop, wp);
     567      }
     568    MPFR_ZIV_FREE (loop);
     569    cy = mpfr_round_raw (MPFR_MANT(r), x, wp, 0, rp, rnd_mode, &inex);
     570    MPFR_EXP(r) = - (MPFR_EXP(u) - 1 - s) / 2;
     571    if (MPFR_UNLIKELY(cy != 0))
     572      {
     573        MPFR_EXP(r) ++;
     574        MPFR_MANT(r)[rn - 1] = MPFR_LIMB_HIGHBIT;
     575      }
     576    MPFR_TMP_FREE(marker);
     577    return mpfr_check_range (r, inex, rnd_mode);
     578  }