From mercurial at gmplib.org Mon Dec 2 21:53:46 2019 From: mercurial at gmplib.org (mercurial at gmplib.org) Date: Mon, 02 Dec 2019 22:53:46 +0100 Subject: [Gmp-commit] /var/hg/gmp: 2 new changesets Message-ID: details: /var/hg/gmp/rev/c3413ffefdf2 changeset: 17983:c3413ffefdf2 user: Torbjorn Granlund date: Mon Dec 02 22:47:27 2019 +0100 description: Remove check for NATIVE_ implementation. details: /var/hg/gmp/rev/d5907dfa1bbc changeset: 17984:d5907dfa1bbc user: Torbjorn Granlund date: Mon Dec 02 22:52:52 2019 +0100 description: Finish change vs fat and gcd_11. Remove gcd_22 from fat functions for now, its calls to gcd_11 are problematic. diffstat: configure.ac | 3 ++- gmp-impl.h | 6 +++--- mpn/generic/gcd_11.c | 5 ++--- mpn/x86/fat/fat.c | 1 - mpn/x86/x86-defs.m4 | 2 +- mpn/x86_64/fat/fat.c | 1 - mpn/x86_64/x86_64-defs.m4 | 2 +- 7 files changed, 9 insertions(+), 11 deletions(-) diffs (114 lines): diff -r 5f237941addc -r d5907dfa1bbc configure.ac --- a/configure.ac Fri Nov 29 14:49:17 2019 +0100 +++ b/configure.ac Mon Dec 02 22:52:52 2019 +0100 @@ -2280,7 +2280,7 @@ fat_functions="add_n addmul_1 bdiv_dbm1c com cnd_add_n cnd_sub_n copyd copyi dive_1 divrem_1 - gcd_1 lshift lshiftc mod_1 mod_1_1 mod_1_1_cps mod_1_2 + gcd_11 lshift lshiftc mod_1 mod_1_1 mod_1_1_cps mod_1_2 mod_1_2_cps mod_1_4 mod_1_4_cps mod_34lsub1 mode1o mul_1 mul_basecase mullo_basecase pre_divrem_1 pre_mod_1 redc_1 redc_2 rshift sqr_basecase sub_n submul_1" @@ -3593,6 +3593,7 @@ #undef HAVE_NATIVE_mpn_divrem_2 #undef HAVE_NATIVE_mpn_gcd_1 #undef HAVE_NATIVE_mpn_gcd_11 +#undef HAVE_NATIVE_mpn_gcd_22 #undef HAVE_NATIVE_mpn_hamdist #undef HAVE_NATIVE_mpn_invert_limb #undef HAVE_NATIVE_mpn_ior_n diff -r 5f237941addc -r d5907dfa1bbc gmp-impl.h --- a/gmp-impl.h Fri Nov 29 14:49:17 2019 +0100 +++ b/gmp-impl.h Mon Dec 02 22:52:52 2019 +0100 @@ -91,8 +91,8 @@ __GMP_DECLSPEC mp_limb_t name (mp_ptr, mp_srcptr, mp_size_t, mp_limb_t) #define DECL_divrem_1(name) \ __GMP_DECLSPEC mp_limb_t name (mp_ptr, mp_size_t, mp_srcptr, mp_size_t, mp_limb_t) -#define DECL_gcd_1(name) \ - __GMP_DECLSPEC mp_limb_t name (mp_srcptr, mp_size_t, mp_limb_t) +#define DECL_gcd_11(name) \ + __GMP_DECLSPEC mp_limb_t name (mp_limb_t, mp_limb_t) #define DECL_lshift(name) \ __GMP_DECLSPEC mp_limb_t name (mp_ptr, mp_srcptr, mp_size_t, unsigned) #define DECL_lshiftc(name) \ @@ -4667,7 +4667,7 @@ DECL_copyi ((*copyi)); DECL_divexact_1 ((*divexact_1)); DECL_divrem_1 ((*divrem_1)); - DECL_gcd_1 ((*gcd_1)); + DECL_gcd_11 ((*gcd_11)); DECL_lshift ((*lshift)); DECL_lshiftc ((*lshiftc)); DECL_mod_1 ((*mod_1)); diff -r 5f237941addc -r d5907dfa1bbc mpn/generic/gcd_11.c --- a/mpn/generic/gcd_11.c Fri Nov 29 14:49:17 2019 +0100 +++ b/mpn/generic/gcd_11.c Mon Dec 02 22:52:52 2019 +0100 @@ -1,6 +1,7 @@ /* mpn_gcd_11 -- limb greatest common divisor. -Copyright 1994, 1996, 2000, 2001, 2009, 2012, 2019 Free Software Foundation, Inc. +Copyright 1994, 1996, 2000, 2001, 2009, 2012, 2019 Free Software Foundation, +Inc. This file is part of the GNU MP Library. @@ -31,7 +32,6 @@ #include "gmp-impl.h" #include "longlong.h" -#if !HAVE_NATIVE_mpn_gcd_11 mp_limb_t mpn_gcd_11 (mp_limb_t u, mp_limb_t v) { @@ -72,4 +72,3 @@ } return (u << 1) + 1; } -#endif /* !HAVE_NATIVE_mpn_gcd_11 */ diff -r 5f237941addc -r d5907dfa1bbc mpn/x86/fat/fat.c --- a/mpn/x86/fat/fat.c Fri Nov 29 14:49:17 2019 +0100 +++ b/mpn/x86/fat/fat.c Mon Dec 02 22:52:52 2019 +0100 @@ -175,7 +175,6 @@ __MPN(divexact_1_init), __MPN(divrem_1_init), __MPN(gcd_11_init), - __MPN(gcd_22_init), __MPN(lshift_init), __MPN(lshiftc_init), __MPN(mod_1_init), diff -r 5f237941addc -r d5907dfa1bbc mpn/x86/x86-defs.m4 --- a/mpn/x86/x86-defs.m4 Fri Nov 29 14:49:17 2019 +0100 +++ b/mpn/x86/x86-defs.m4 Mon Dec 02 22:52:52 2019 +0100 @@ -78,7 +78,7 @@ `copyi', `divexact_1', `divrem_1', -`gcd_1', +`gcd_11', `lshift', `lshiftc', `mod_1', diff -r 5f237941addc -r d5907dfa1bbc mpn/x86_64/fat/fat.c --- a/mpn/x86_64/fat/fat.c Fri Nov 29 14:49:17 2019 +0100 +++ b/mpn/x86_64/fat/fat.c Mon Dec 02 22:52:52 2019 +0100 @@ -161,7 +161,6 @@ __MPN(divexact_1_init), __MPN(divrem_1_init), __MPN(gcd_11_init), - __MPN(gcd_22_init), __MPN(lshift_init), __MPN(lshiftc_init), __MPN(mod_1_init), diff -r 5f237941addc -r d5907dfa1bbc mpn/x86_64/x86_64-defs.m4 --- a/mpn/x86_64/x86_64-defs.m4 Fri Nov 29 14:49:17 2019 +0100 +++ b/mpn/x86_64/x86_64-defs.m4 Mon Dec 02 22:52:52 2019 +0100 @@ -51,7 +51,7 @@ `copyi', `divexact_1', `divrem_1', -`gcd_1', +`gcd_11', `lshift', `lshiftc', `mod_1', From mercurial at gmplib.org Wed Dec 4 05:43:24 2019 From: mercurial at gmplib.org (mercurial at gmplib.org) Date: Wed, 04 Dec 2019 06:43:24 +0100 Subject: [Gmp-commit] /var/hg/gmp: 3 new changesets Message-ID: details: /var/hg/gmp/rev/a8cf296a6f07 changeset: 17985:a8cf296a6f07 user: Marco Bodrato date: Wed Dec 04 06:20:01 2019 +0100 description: mini-gmp/mini-gmp.c (mpn_invert_3by2): Limit size of an intermediate details: /var/hg/gmp/rev/c22e8feca8e3 changeset: 17986:c22e8feca8e3 user: Marco Bodrato date: Wed Dec 04 06:22:37 2019 +0100 description: mini-gmp/mini-gmp.c (mpn_invert_3by2): Remove special code for limb sizes. details: /var/hg/gmp/rev/79fa1e2e51b9 changeset: 17987:79fa1e2e51b9 user: Marco Bodrato date: Wed Dec 04 06:36:45 2019 +0100 description: mini-gmp/mini-gmp.c: indent diffstat: mini-gmp/mini-gmp.c | 219 +++++++++++++++++++++++---------------------------- 1 files changed, 98 insertions(+), 121 deletions(-) diffs (234 lines): diff -r d5907dfa1bbc -r 79fa1e2e51b9 mini-gmp/mini-gmp.c --- a/mini-gmp/mini-gmp.c Mon Dec 02 22:52:52 2019 +0100 +++ b/mini-gmp/mini-gmp.c Wed Dec 04 06:36:45 2019 +0100 @@ -770,132 +770,109 @@ mp_limb_t mpn_invert_3by2 (mp_limb_t u1, mp_limb_t u0) { - int GMP_LIMB_BITS_MUL_3 = GMP_LIMB_BITS * 3; - assert (u1 >= GMP_LIMB_HIGHBIT); - - if (sizeof (unsigned) * CHAR_BIT > GMP_LIMB_BITS * 3) - { - return (((unsigned) 1 << GMP_LIMB_BITS_MUL_3) - 1) / - (((unsigned) u1 << GMP_LIMB_BITS_MUL_3 / 3) + u0); - } - else if (GMP_ULONG_BITS > GMP_LIMB_BITS * 3) - { - return (((unsigned long) 1 << GMP_LIMB_BITS_MUL_3) - 1) / - (((unsigned long) u1 << GMP_LIMB_BITS_MUL_3 / 3) + u0); - } - else { - mp_limb_t r, m; - - if (GMP_ULONG_BITS >= GMP_LIMB_BITS * 2) - { - /* Set m to the 2/1 inverse of u1. */ - m = (((unsigned long) (u1 ^ GMP_LIMB_MAX) << GMP_LIMB_BITS_MUL_3 / 3) - | GMP_LIMB_MAX ) / u1; - r = ~(m * u1); - } - else - { - mp_limb_t p, ql; - unsigned ul, uh, qh; - - /* For notation, let b denote the half-limb base, so that B = b^2. - Split u1 = b uh + ul. */ - ul = u1 & GMP_LLIMB_MASK; - uh = u1 >> (GMP_LIMB_BITS / 2); - - /* Approximation of the high half of quotient. Differs from the 2/1 - inverse of the half limb uh, since we have already subtracted - u0. */ - qh = (u1 ^ GMP_LIMB_MAX) / uh; - - /* Adjust to get a half-limb 3/2 inverse, i.e., we want - - qh' = floor( (b^3 - 1) / u) - b = floor ((b^3 - b u - 1) / u + mp_limb_t r, m; + + { + mp_limb_t p, ql; + unsigned ul, uh, qh; + + /* For notation, let b denote the half-limb base, so that B = b^2. + Split u1 = b uh + ul. */ + ul = u1 & GMP_LLIMB_MASK; + uh = u1 >> (GMP_LIMB_BITS / 2); + + /* Approximation of the high half of quotient. Differs from the 2/1 + inverse of the half limb uh, since we have already subtracted + u0. */ + qh = (u1 ^ GMP_LIMB_MAX) / uh; + + /* Adjust to get a half-limb 3/2 inverse, i.e., we want + + qh' = floor( (b^3 - 1) / u) - b = floor ((b^3 - b u - 1) / u = floor( (b (~u) + b-1) / u), - - and the remainder - - r = b (~u) + b-1 - qh (b uh + ul) - = b (~u - qh uh) + b-1 - qh ul - - Subtraction of qh ul may underflow, which implies adjustments. - But by normalization, 2 u >= B > qh ul, so we need to adjust by - at most 2. - */ - - r = ((~u1 - (mp_limb_t) qh * uh) << (GMP_LIMB_BITS / 2)) | GMP_LLIMB_MASK; - - p = (mp_limb_t) qh * ul; - /* Adjustment steps taken from udiv_qrnnd_c */ - if (r < p) - { - qh--; - r += u1; - if (r >= u1) /* i.e. we didn't get carry when adding to r */ - if (r < p) - { - qh--; - r += u1; - } - } - r -= p; - - /* Low half of the quotient is - - ql = floor ( (b r + b-1) / u1). - - This is a 3/2 division (on half-limbs), for which qh is a - suitable inverse. */ - - p = (r >> (GMP_LIMB_BITS / 2)) * qh + r; - /* Unlike full-limb 3/2, we can add 1 without overflow. For this to - work, it is essential that ql is a full mp_limb_t. */ - ql = (p >> (GMP_LIMB_BITS / 2)) + 1; - - /* By the 3/2 trick, we don't need the high half limb. */ - r = (r << (GMP_LIMB_BITS / 2)) + GMP_LLIMB_MASK - ql * u1; - - if (r >= (p << (GMP_LIMB_BITS / 2))) - { - ql--; - r += u1; - } - m = ((mp_limb_t) qh << (GMP_LIMB_BITS / 2)) + ql; - if (r >= u1) - { - m++; - r -= u1; - } + + and the remainder + + r = b (~u) + b-1 - qh (b uh + ul) + = b (~u - qh uh) + b-1 - qh ul + + Subtraction of qh ul may underflow, which implies adjustments. + But by normalization, 2 u >= B > qh ul, so we need to adjust by + at most 2. + */ + + r = ((~u1 - (mp_limb_t) qh * uh) << (GMP_LIMB_BITS / 2)) | GMP_LLIMB_MASK; + + p = (mp_limb_t) qh * ul; + /* Adjustment steps taken from udiv_qrnnd_c */ + if (r < p) + { + qh--; + r += u1; + if (r >= u1) /* i.e. we didn't get carry when adding to r */ + if (r < p) + { + qh--; + r += u1; + } } - - /* Now m is the 2/1 inverse of u1. If u0 > 0, adjust it to become a - 3/2 inverse. */ - if (u0 > 0) + r -= p; + + /* Low half of the quotient is + + ql = floor ( (b r + b-1) / u1). + + This is a 3/2 division (on half-limbs), for which qh is a + suitable inverse. */ + + p = (r >> (GMP_LIMB_BITS / 2)) * qh + r; + /* Unlike full-limb 3/2, we can add 1 without overflow. For this to + work, it is essential that ql is a full mp_limb_t. */ + ql = (p >> (GMP_LIMB_BITS / 2)) + 1; + + /* By the 3/2 trick, we don't need the high half limb. */ + r = (r << (GMP_LIMB_BITS / 2)) + GMP_LLIMB_MASK - ql * u1; + + if (r >= (GMP_LIMB_MAX & (p << (GMP_LIMB_BITS / 2)))) + { + ql--; + r += u1; + } + m = ((mp_limb_t) qh << (GMP_LIMB_BITS / 2)) + ql; + if (r >= u1) { - mp_limb_t th, tl; - r = ~r; - r += u0; - if (r < u0) - { - m--; - if (r >= u1) - { - m--; - r -= u1; - } - r -= u1; - } - gmp_umul_ppmm (th, tl, u0, m); - r += th; - if (r < th) - { - m--; - m -= ((r > u1) | ((r == u1) & (tl > u0))); - } + m++; + r -= u1; } - - return m; } + + /* Now m is the 2/1 inverse of u1. If u0 > 0, adjust it to become a + 3/2 inverse. */ + if (u0 > 0) + { + mp_limb_t th, tl; + r = ~r; + r += u0; + if (r < u0) + { + m--; + if (r >= u1) + { + m--; + r -= u1; + } + r -= u1; + } + gmp_umul_ppmm (th, tl, u0, m); + r += th; + if (r < th) + { + m--; + m -= ((r > u1) | ((r == u1) & (tl > u0))); + } + } + + return m; } struct gmp_div_inverse From mercurial at gmplib.org Thu Dec 5 06:58:56 2019 From: mercurial at gmplib.org (mercurial at gmplib.org) Date: Thu, 05 Dec 2019 07:58:56 +0100 Subject: [Gmp-commit] /var/hg/gmp: mini-gmp/: remove some sizeof(mp_limb_t) Message-ID: details: /var/hg/gmp/rev/2109bbf292bd changeset: 17988:2109bbf292bd user: Marco Bodrato date: Thu Dec 05 07:44:46 2019 +0100 description: mini-gmp/: remove some sizeof(mp_limb_t) diffstat: mini-gmp/mini-gmp.c | 2 +- mini-gmp/mini-mpq.c | 25 ++++++++++++++++--------- 2 files changed, 17 insertions(+), 10 deletions(-) diffs (56 lines): diff -r 79fa1e2e51b9 -r 2109bbf292bd mini-gmp/mini-gmp.c --- a/mini-gmp/mini-gmp.c Wed Dec 04 06:36:45 2019 +0100 +++ b/mini-gmp/mini-gmp.c Thu Dec 05 07:44:46 2019 +0100 @@ -4499,7 +4499,7 @@ limb = u->_mp_d[un-1]; assert (limb != 0); - k = (sizeof (mp_limb_t) == 1); + k = (GMP_LIMB_BITS <= CHAR_BIT); if (!k) { do { diff -r 79fa1e2e51b9 -r 2109bbf292bd mini-gmp/mini-mpq.c --- a/mini-gmp/mini-mpq.c Wed Dec 04 06:36:45 2019 +0100 +++ b/mini-gmp/mini-mpq.c Thu Dec 05 07:44:46 2019 +0100 @@ -253,9 +253,10 @@ { mpq_t t; assert (d != 0); - if (sizeof (unsigned long) == sizeof (mp_limb_t)) - return mpq_cmp (q, mpq_roinit_normal_nn (t, (mp_srcptr) &n, n != 0, (mp_srcptr) &d, 1)); - else { + if (ULONG_MAX <= GMP_LIMB_MAX) { + mp_limb_t nl = n, dl = d; + return mpq_cmp (q, mpq_roinit_normal_nn (t, &nl, n != 0, &dl, 1)); + } else { int ret; mpq_init (t); @@ -277,14 +278,20 @@ else { mpq_t t; - unsigned long l_n = GMP_NEG_CAST (unsigned long, n); - if (sizeof (unsigned long) == sizeof (mp_limb_t)) - return mpq_cmp (q, mpq_roinit_normal_nn (t, (mp_srcptr) &l_n, -1, (mp_srcptr) &d, 1)); + if (ULONG_MAX <= GMP_LIMB_MAX) + { + mp_limb_t nl = GMP_NEG_CAST (unsigned long, n), dl = d; + return mpq_cmp (q, mpq_roinit_normal_nn (t, &nl, -1, &dl, 1)); + } + else + { + unsigned long l_n = GMP_NEG_CAST (unsigned long, n); - mpq_roinit_normal_nn (t, mpq_numref (q)->_mp_d, - mpq_numref (q)->_mp_size, - mpq_denref (q)->_mp_d, mpq_denref (q)->_mp_size); - return - mpq_cmp_ui (t, l_n, d); + mpq_roinit_normal_nn (t, mpq_numref (q)->_mp_d, - mpq_numref (q)->_mp_size, + mpq_denref (q)->_mp_d, mpq_denref (q)->_mp_size); + return - mpq_cmp_ui (t, l_n, d); + } } } From mercurial at gmplib.org Sun Dec 8 20:59:09 2019 From: mercurial at gmplib.org (mercurial at gmplib.org) Date: Sun, 08 Dec 2019 21:59:09 +0100 Subject: [Gmp-commit] /var/hg/gmp: 2 new changesets Message-ID: details: /var/hg/gmp/rev/c0d407af48fb changeset: 17989:c0d407af48fb user: Marco Bodrato date: Sun Dec 08 21:57:25 2019 +0100 description: mpz/powm.c: Full normalisation when e=1 & b<0... details: /var/hg/gmp/rev/8fb9e39a9d04 changeset: 17990:8fb9e39a9d04 user: Marco Bodrato date: Sun Dec 08 21:58:59 2019 +0100 description: tests/mpz/t-powm.c: Trigger the just removed bug. diffstat: mpz/powm.c | 2 +- tests/mpz/t-powm.c | 23 +++++++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletions(-) diffs (45 lines): diff -r 2109bbf292bd -r 8fb9e39a9d04 mpz/powm.c --- a/mpz/powm.c Thu Dec 05 07:44:46 2019 +0100 +++ b/mpz/powm.c Sun Dec 08 21:58:59 2019 +0100 @@ -138,7 +138,7 @@ { mpn_sub (rp, mp, n, bp, bn); rn = n; - rn -= (rp[rn - 1] == 0); + MPN_NORMALIZE_NOT_ZERO (rp, rn); } else { diff -r 2109bbf292bd -r 8fb9e39a9d04 tests/mpz/t-powm.c --- a/tests/mpz/t-powm.c Thu Dec 05 07:44:46 2019 +0100 +++ b/tests/mpz/t-powm.c Sun Dec 08 21:58:59 2019 +0100 @@ -71,6 +71,29 @@ mpz_init (exp2); mpz_init (base2); + mpz_set_ui (exp, 1); + mpz_set_ui (mod, 1); + mpz_setbit (mod, 10 * GMP_NUMB_BITS); + mpz_ui_sub (base, 3, mod); + mpz_powm (r1, base, exp, mod); + MPZ_CHECK_FORMAT (r1); + mpz_powm_sec (r2, base, exp, mod); + MPZ_CHECK_FORMAT (r2); + + if (mpz_cmp_ui (r1, 3) != 0 || mpz_cmp_ui (r2, 3) != 0) + { + fprintf (stderr, "\nIncorrect results in first test for operands:\n", i); + debug_mp (base, -16); + debug_mp (exp, -16); + debug_mp (mod, -16); + fprintf (stderr, "mpz_powm result:\n"); + debug_mp (r1, -16); + fprintf (stderr, "mpz_powm_sec result:\n"); + debug_mp (r2, -16); + fprintf (stderr, "reference result: 3\n"); + abort (); + } + memset (allsizes, 0, (1 << (SIZEM + 2 - 1)) * sizeof (int)); for (i = 0; i < reps || ! allsizes_seen (allsizes); i++) From mercurial at gmplib.org Mon Dec 9 08:55:56 2019 From: mercurial at gmplib.org (mercurial at gmplib.org) Date: Mon, 09 Dec 2019 09:55:56 +0100 Subject: [Gmp-commit] /var/hg/gmp: 3 new changesets Message-ID: details: /var/hg/gmp/rev/c29f74d4f396 changeset: 17991:c29f74d4f396 user: Marco Bodrato date: Mon Dec 09 09:44:10 2019 +0100 description: tests/mpz/t-powm.c: Randomised new test. details: /var/hg/gmp/rev/2587578dd78d changeset: 17992:2587578dd78d user: Marco Bodrato date: Mon Dec 09 09:54:55 2019 +0100 description: ChangeLog details: /var/hg/gmp/rev/505381b71d95 changeset: 17993:505381b71d95 user: Marco Bodrato date: Mon Dec 09 09:55:16 2019 +0100 description: Copyright year diffstat: ChangeLog | 7 +++++- mini-gmp/ChangeLog | 4 +++ mpz/powm.c | 2 +- tests/mpz/t-powm.c | 56 +++++++++++++++++++++++++++++------------------------ 4 files changed, 42 insertions(+), 27 deletions(-) diffs (130 lines): diff -r 8fb9e39a9d04 -r 505381b71d95 ChangeLog --- a/ChangeLog Sun Dec 08 21:58:59 2019 +0100 +++ b/ChangeLog Mon Dec 09 09:55:16 2019 +0100 @@ -1,3 +1,8 @@ +2019-12-08 Marco Bodrato + + * mpz/powm.c: Full normalisation when e=1 & b<0. + * tests/mpz/t-powm.c: More tests for the e=1 case. + 2019-11-24 Niels M??ller * mpn/generic/gcdext_1.c [USE_ZEROTAB]: Delete code variant for @@ -17,7 +22,7 @@ 2019-11-09 Marco Bodrato - * tune/speed.c (routine_t): Add R flago to mpz_powm + * tune/speed.c (routine_t): Add R flag to mpz_powm * tune/speed.h (SPEED_ROUTINE_MPZ_POWM): Use R flag as the base. 2019-10-02 Torbj??rn Granlund diff -r 8fb9e39a9d04 -r 505381b71d95 mini-gmp/ChangeLog --- a/mini-gmp/ChangeLog Sun Dec 08 21:58:59 2019 +0100 +++ b/mini-gmp/ChangeLog Mon Dec 09 09:55:16 2019 +0100 @@ -1,3 +1,7 @@ +2019-12-04 Marco Bodrato + + * mini-gmp/mini-gmp.c (mpn_invert_3by2): Remove shortcuts. + 2019-11-19 Marco Bodrato * mini-gmp/mini-gmp.c (mpn_invert_3by2): Shortcut for short limbs. diff -r 8fb9e39a9d04 -r 505381b71d95 mpz/powm.c --- a/mpz/powm.c Sun Dec 08 21:58:59 2019 +0100 +++ b/mpz/powm.c Mon Dec 09 09:55:16 2019 +0100 @@ -3,7 +3,7 @@ Contributed to the GNU project by Torbjorn Granlund. Copyright 1991, 1993, 1994, 1996, 1997, 2000-2002, 2005, 2008, 2009, -2011, 2012, 2015 Free Software Foundation, Inc. +2011, 2012, 2015, 2019 Free Software Foundation, Inc. This file is part of the GNU MP Library. diff -r 8fb9e39a9d04 -r 505381b71d95 tests/mpz/t-powm.c --- a/tests/mpz/t-powm.c Sun Dec 08 21:58:59 2019 +0100 +++ b/tests/mpz/t-powm.c Mon Dec 09 09:55:16 2019 +0100 @@ -1,7 +1,7 @@ /* Test mpz_powm, mpz_mul, mpz_mod, mpz_mod_ui, mpz_div_ui. -Copyright 1991, 1993, 1994, 1996, 1999-2001, 2009, 2012 Free Software -Foundation, Inc. +Copyright 1991, 1993, 1994, 1996, 1999-2001, 2009, 2012, 2019 Free +Software Foundation, Inc. This file is part of the GNU MP Library test suite. @@ -71,36 +71,41 @@ mpz_init (exp2); mpz_init (base2); - mpz_set_ui (exp, 1); - mpz_set_ui (mod, 1); - mpz_setbit (mod, 10 * GMP_NUMB_BITS); - mpz_ui_sub (base, 3, mod); - mpz_powm (r1, base, exp, mod); - MPZ_CHECK_FORMAT (r1); - mpz_powm_sec (r2, base, exp, mod); - MPZ_CHECK_FORMAT (r2); - - if (mpz_cmp_ui (r1, 3) != 0 || mpz_cmp_ui (r2, 3) != 0) - { - fprintf (stderr, "\nIncorrect results in first test for operands:\n", i); - debug_mp (base, -16); - debug_mp (exp, -16); - debug_mp (mod, -16); - fprintf (stderr, "mpz_powm result:\n"); - debug_mp (r1, -16); - fprintf (stderr, "mpz_powm_sec result:\n"); - debug_mp (r2, -16); - fprintf (stderr, "reference result: 3\n"); - abort (); - } - memset (allsizes, 0, (1 << (SIZEM + 2 - 1)) * sizeof (int)); + reps += reps >> 3; for (i = 0; i < reps || ! allsizes_seen (allsizes); i++) { mpz_urandomb (bs, rands, 32); size_range = mpz_get_ui (bs) % SIZEM + 2; + if ((i & 7) == 0) + { + mpz_set_ui (exp, 1); + + do /* Loop until mathematically well-defined. */ + { + mpz_urandomb (bs, rands, size_range / 2 + 2); + base_size = mpz_get_ui (bs); + mpz_rrandomb (base, rands, base_size); + } + while (mpz_cmp_ui (base, 0) == 0); + + mpz_urandomb (bs, rands, size_range / 2); + mod_size = mpz_get_ui (bs); + mod_size = MIN (mod_size, base_size); + mpz_rrandomb (mod, rands, mod_size); + + mpz_urandomb (bs, rands, size_range); + mod_size = mpz_get_ui (bs) + base_size + 2; + if ((i & 8) == 0) + mod_size += (GMP_NUMB_BITS - mod_size) % GMP_NUMB_BITS; + mpz_setbit (mod, mod_size); + + mpz_sub (base, base, mod); + } + else + { do /* Loop until mathematically well-defined. */ { mpz_urandomb (bs, rands, size_range); @@ -129,6 +134,7 @@ mpz_neg (base, base); /* printf ("%ld %ld %ld\n", SIZ (base), SIZ (exp), SIZ (mod)); */ + } mpz_set_ui (r2, 1); mpz_mod (base2, base, mod); From mercurial at gmplib.org Mon Dec 9 09:25:15 2019 From: mercurial at gmplib.org (mercurial at gmplib.org) Date: Mon, 09 Dec 2019 10:25:15 +0100 Subject: [Gmp-commit] /var/hg/gmp: mpz/powm.c: Use NORMALIZE_NOT_ZERO. Message-ID: details: /var/hg/gmp/rev/ab0543fdce2a changeset: 17994:ab0543fdce2a user: Marco Bodrato date: Mon Dec 09 10:22:42 2019 +0100 description: mpz/powm.c: Use NORMALIZE_NOT_ZERO. diffstat: mpz/powm.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diffs (17 lines): diff -r 505381b71d95 -r ab0543fdce2a mpz/powm.c --- a/mpz/powm.c Mon Dec 09 09:55:16 2019 +0100 +++ b/mpz/powm.c Mon Dec 09 10:22:42 2019 +0100 @@ -125,11 +125,11 @@ rn = n; MPN_NORMALIZE (rp, rn); - if (SIZ(b) < 0 && rn != 0) + if (rn != 0 && SIZ(b) < 0) { mpn_sub (rp, mp, n, rp, rn); rn = n; - MPN_NORMALIZE (rp, rn); + MPN_NORMALIZE_NOT_ZERO (rp, rn); } } else From mercurial at gmplib.org Fri Dec 20 20:55:14 2019 From: mercurial at gmplib.org (mercurial at gmplib.org) Date: Fri, 20 Dec 2019 21:55:14 +0100 Subject: [Gmp-commit] /var/hg/gmp: 5 new changesets Message-ID: details: /var/hg/gmp/rev/466af0bf61f5 changeset: 17995:466af0bf61f5 user: Marco Bodrato date: Thu Dec 19 18:25:17 2019 +0100 description: gmp-impl.h: Correct number of parameters for _nc macros. details: /var/hg/gmp/rev/2ef16eddb5f7 changeset: 17996:2ef16eddb5f7 user: Marco Bodrato date: Fri Dec 20 21:33:03 2019 +0100 description: mpz/lucmod.c: typo in a comment details: /var/hg/gmp/rev/ff896f7a1edd changeset: 17997:ff896f7a1edd user: Marco Bodrato date: Fri Dec 20 21:42:17 2019 +0100 description: tune/speed.c (routine): Add mpn_hgcd2_[45]. details: /var/hg/gmp/rev/4b01a4df5317 changeset: 17998:4b01a4df5317 user: Marco Bodrato date: Fri Dec 20 21:43:14 2019 +0100 description: Copyright years details: /var/hg/gmp/rev/12726da168ff changeset: 17999:12726da168ff user: Marco Bodrato date: Fri Dec 20 21:55:06 2019 +0100 description: tests/mpf/t-conv.c: Test also the base=0 case. diffstat: gmp-impl.h | 12 ++++++------ mpn/generic/fib2_ui.c | 2 +- mpz/lucmod.c | 2 +- mpz/lucnum2_ui.c | 3 ++- mpz/lucnum_ui.c | 2 +- mpz/random2.c | 3 ++- mpz/set_f.c | 2 +- tests/mpf/t-conv.c | 5 +++-- tune/speed.c | 2 ++ 9 files changed, 19 insertions(+), 14 deletions(-) diffs (161 lines): diff -r ab0543fdce2a -r 12726da168ff gmp-impl.h --- a/gmp-impl.h Mon Dec 09 10:22:42 2019 +0100 +++ b/gmp-impl.h Fri Dec 20 21:55:06 2019 +0100 @@ -850,7 +850,7 @@ #endif #if HAVE_NATIVE_mpn_addlsh_nc && ! HAVE_NATIVE_mpn_addlsh1_nc -#define mpn_addlsh1_nc(a,b,c,d) mpn_addlsh_nc(a,b,c,d,1) +#define mpn_addlsh1_nc(a,b,c,d,x) mpn_addlsh_nc(a,b,c,d,1,x) #define HAVE_NATIVE_mpn_addlsh1_nc 2 #endif @@ -870,7 +870,7 @@ #endif #if HAVE_NATIVE_mpn_addlsh_nc && ! HAVE_NATIVE_mpn_addlsh2_nc -#define mpn_addlsh2_nc(a,b,c,d) mpn_addlsh_nc(a,b,c,d,2) +#define mpn_addlsh2_nc(a,b,c,d,x) mpn_addlsh_nc(a,b,c,d,2,x) #define HAVE_NATIVE_mpn_addlsh2_nc 2 #endif @@ -890,7 +890,7 @@ #endif #if HAVE_NATIVE_mpn_sublsh_nc && ! HAVE_NATIVE_mpn_sublsh1_nc -#define mpn_sublsh1_nc(a,b,c,d) mpn_sublsh_nc(a,b,c,d,1) +#define mpn_sublsh1_nc(a,b,c,d,x) mpn_sublsh_nc(a,b,c,d,1,x) #define HAVE_NATIVE_mpn_sublsh1_nc 2 #endif @@ -910,7 +910,7 @@ #endif #if HAVE_NATIVE_mpn_sublsh_nc && ! HAVE_NATIVE_mpn_sublsh2_nc -#define mpn_sublsh2_nc(a,b,c,d) mpn_sublsh_nc(a,b,c,d,2) +#define mpn_sublsh2_nc(a,b,c,d,x) mpn_sublsh_nc(a,b,c,d,2,x) #define HAVE_NATIVE_mpn_sublsh2_nc 2 #endif @@ -930,7 +930,7 @@ #endif #if HAVE_NATIVE_mpn_rsblsh_nc && ! HAVE_NATIVE_mpn_rsblsh1_nc -#define mpn_rsblsh1_nc(a,b,c,d) mpn_rsblsh_nc(a,b,c,d,1) +#define mpn_rsblsh1_nc(a,b,c,d,x) mpn_rsblsh_nc(a,b,c,d,1,x) #define HAVE_NATIVE_mpn_rsblsh1_nc 2 #endif @@ -950,7 +950,7 @@ #endif #if HAVE_NATIVE_mpn_rsblsh_nc && ! HAVE_NATIVE_mpn_rsblsh2_nc -#define mpn_rsblsh2_nc(a,b,c,d) mpn_rsblsh_nc(a,b,c,d,2) +#define mpn_rsblsh2_nc(a,b,c,d,x) mpn_rsblsh_nc(a,b,c,d,2,x) #define HAVE_NATIVE_mpn_rsblsh2_nc 2 #endif diff -r ab0543fdce2a -r 12726da168ff mpn/generic/fib2_ui.c --- a/mpn/generic/fib2_ui.c Mon Dec 09 10:22:42 2019 +0100 +++ b/mpn/generic/fib2_ui.c Fri Dec 20 21:55:06 2019 +0100 @@ -4,7 +4,7 @@ CERTAIN TO BE SUBJECT TO INCOMPATIBLE CHANGES OR DISAPPEAR COMPLETELY IN FUTURE GNU MP RELEASES. -Copyright 2001, 2002, 2005, 2009 Free Software Foundation, Inc. +Copyright 2001, 2002, 2005, 2009, 2018 Free Software Foundation, Inc. This file is part of the GNU MP Library. diff -r ab0543fdce2a -r 12726da168ff mpz/lucmod.c --- a/mpz/lucmod.c Mon Dec 09 10:22:42 2019 +0100 +++ b/mpz/lucmod.c Fri Dec 20 21:55:06 2019 +0100 @@ -42,7 +42,7 @@ /* Requires n > 4; b0 > 0; -2*Q must not overflow a long. */ /* If U_{k+1}==0 (mod n) or V_{k+1}==0 (mod n), it returns 1, */ /* otherwise it returns 0 and sets V=V_{k+1} and Qk=Q^{k+1}. */ -/* V will never grove beyond SIZ(n), Qk not beyon 2*SIZ(n). */ +/* V will never grow beyond SIZ(n), Qk not beyon 2*SIZ(n). */ int mpz_lucas_mod (mpz_ptr V, mpz_ptr Qk, long Q, mp_bitcnt_t b0, mpz_srcptr n, mpz_ptr T1, mpz_ptr T2) diff -r ab0543fdce2a -r 12726da168ff mpz/lucnum2_ui.c --- a/mpz/lucnum2_ui.c Mon Dec 09 10:22:42 2019 +0100 +++ b/mpz/lucnum2_ui.c Fri Dec 20 21:55:06 2019 +0100 @@ -1,6 +1,7 @@ /* mpz_lucnum2_ui -- calculate Lucas numbers. -Copyright 2001, 2003, 2005, 2012, 2015 Free Software Foundation, Inc. +Copyright 2001, 2003, 2005, 2012, 2015, 2016, 2018 Free Software +Foundation, Inc. This file is part of the GNU MP Library. diff -r ab0543fdce2a -r 12726da168ff mpz/lucnum_ui.c --- a/mpz/lucnum_ui.c Mon Dec 09 10:22:42 2019 +0100 +++ b/mpz/lucnum_ui.c Fri Dec 20 21:55:06 2019 +0100 @@ -1,6 +1,6 @@ /* mpz_lucnum_ui -- calculate Lucas number. -Copyright 2001, 2003, 2005, 2011, 2012, 2015 Free Software Foundation, Inc. +Copyright 2001, 2003, 2005, 2011, 2012, 2015, 2016 Free Software Foundation, Inc. This file is part of the GNU MP Library. diff -r ab0543fdce2a -r 12726da168ff mpz/random2.c --- a/mpz/random2.c Mon Dec 09 10:22:42 2019 +0100 +++ b/mpz/random2.c Fri Dec 20 21:55:06 2019 +0100 @@ -2,7 +2,8 @@ long runs of consecutive ones and zeros in the binary representation. Meant for testing of other MP routines. -Copyright 1991, 1993, 1994, 1996, 2001, 2012 Free Software Foundation, Inc. +Copyright 1991, 1993, 1994, 1996, 2001, 2012, 2015 Free Software +Foundation, Inc. This file is part of the GNU MP Library. diff -r ab0543fdce2a -r 12726da168ff mpz/set_f.c --- a/mpz/set_f.c Mon Dec 09 10:22:42 2019 +0100 +++ b/mpz/set_f.c Fri Dec 20 21:55:06 2019 +0100 @@ -1,6 +1,6 @@ /* mpz_set_f (dest_integer, src_float) -- Assign DEST_INTEGER from SRC_FLOAT. -Copyright 1996, 2001, 2012 Free Software Foundation, Inc. +Copyright 1996, 2001, 2012, 2016 Free Software Foundation, Inc. This file is part of the GNU MP Library. diff -r ab0543fdce2a -r 12726da168ff tests/mpf/t-conv.c --- a/tests/mpf/t-conv.c Mon Dec 09 10:22:42 2019 +0100 +++ b/tests/mpf/t-conv.c Fri Dec 20 21:55:06 2019 +0100 @@ -190,14 +190,15 @@ { /* exercise the special case in get_str for for x==0 */ mpf_set_ui (x, 0L); - base = 10; + base = 0; } else { size = urandom () % (2 * SIZE) - SIZE; exp = urandom () % EXPO; mpf_random2 (x, size, exp); - base = urandom () % 61 + 2; + base = urandom () % 62; + base += base > 0; } str = mpf_get_str (0, &bexp, base, 0, x); diff -r ab0543fdce2a -r 12726da168ff tune/speed.c --- a/tune/speed.c Mon Dec 09 10:22:42 2019 +0100 +++ b/tune/speed.c Fri Dec 20 21:55:06 2019 +0100 @@ -289,6 +289,8 @@ { "mpn_hgcd2_1", speed_mpn_hgcd2_1, FLAG_NODATA }, { "mpn_hgcd2_2", speed_mpn_hgcd2_2, FLAG_NODATA }, { "mpn_hgcd2_3", speed_mpn_hgcd2_3, FLAG_NODATA }, + { "mpn_hgcd2_4", speed_mpn_hgcd2_4, FLAG_NODATA }, + { "mpn_hgcd2_5", speed_mpn_hgcd2_5, FLAG_NODATA }, { "mpn_hgcd", speed_mpn_hgcd }, { "mpn_hgcd_lehmer", speed_mpn_hgcd_lehmer }, { "mpn_hgcd_appr", speed_mpn_hgcd_appr }, From mercurial at gmplib.org Mon Dec 23 20:26:52 2019 From: mercurial at gmplib.org (mercurial at gmplib.org) Date: Mon, 23 Dec 2019 21:26:52 +0100 Subject: [Gmp-commit] /var/hg/gmp: Rewrite to invoke mpn_sqr when appropriate. Message-ID: details: /var/hg/gmp/rev/755155b633f6 changeset: 18000:755155b633f6 user: Torbjorn Granlund date: Mon Dec 23 21:26:40 2019 +0100 description: Rewrite to invoke mpn_sqr when appropriate. diffstat: mpf/mul.c | 132 +++++++++++++++++++++++++++++++++++++++---------------------- 1 files changed, 85 insertions(+), 47 deletions(-) diffs (160 lines): diff -r 12726da168ff -r 755155b633f6 mpf/mul.c --- a/mpf/mul.c Fri Dec 20 21:55:06 2019 +0100 +++ b/mpf/mul.c Mon Dec 23 21:26:40 2019 +0100 @@ -1,6 +1,6 @@ /* mpf_mul -- Multiply two floats. -Copyright 1993, 1994, 1996, 2001, 2005 Free Software Foundation, Inc. +Copyright 1993, 1994, 1996, 2001, 2005, 2019 Free Software Foundation, Inc. This file is part of the GNU MP Library. @@ -33,64 +33,102 @@ void mpf_mul (mpf_ptr r, mpf_srcptr u, mpf_srcptr v) { - mp_srcptr up, vp; - mp_size_t usize, vsize; mp_size_t sign_product; mp_size_t prec = r->_mp_prec; - - usize = u->_mp_size; - vsize = v->_mp_size; - sign_product = usize ^ vsize; + mp_size_t rsize; + mp_limb_t cy_limb; + mp_ptr rp, tp; + mp_size_t adj; + TMP_DECL; - usize = ABS (usize); - vsize = ABS (vsize); - - up = u->_mp_d; - vp = v->_mp_d; - if (usize > prec) + if (u == v) { - up += usize - prec; - usize = prec; - } - if (vsize > prec) - { - vp += vsize - prec; - vsize = prec; - } + mp_srcptr up; + mp_size_t usize; + + usize = u->_mp_size; + sign_product = usize; + + usize = ABS (usize); + + up = u->_mp_d; + if (usize > prec) + { + up += usize - prec; + usize = prec; + } - if (usize == 0 || vsize == 0) - { - r->_mp_size = 0; - r->_mp_exp = 0; /* ??? */ + if (usize == 0) + { + r->_mp_size = 0; + r->_mp_exp = 0; /* ??? */ + return; + } + else + { + TMP_MARK; + rsize = 2 * usize; + tp = TMP_ALLOC_LIMBS (rsize); + + mpn_sqr (tp, up, usize); + cy_limb = tp[rsize - 1]; + } } else { - mp_size_t rsize; - mp_limb_t cy_limb; - mp_ptr rp, tp; - mp_size_t adj; - TMP_DECL; + mp_srcptr up, vp; + mp_size_t usize, vsize; + + usize = u->_mp_size; + vsize = v->_mp_size; + sign_product = usize ^ vsize; + + usize = ABS (usize); + vsize = ABS (vsize); - TMP_MARK; - rsize = usize + vsize; - tp = TMP_ALLOC_LIMBS (rsize); - cy_limb = (usize >= vsize - ? mpn_mul (tp, up, usize, vp, vsize) - : mpn_mul (tp, vp, vsize, up, usize)); + up = u->_mp_d; + vp = v->_mp_d; + if (usize > prec) + { + up += usize - prec; + usize = prec; + } + if (vsize > prec) + { + vp += vsize - prec; + vsize = prec; + } - adj = cy_limb == 0; - rsize -= adj; - prec++; - if (rsize > prec) + if (usize == 0 || vsize == 0) + { + r->_mp_size = 0; + r->_mp_exp = 0; + return; + } + else { - tp += rsize - prec; - rsize = prec; + TMP_MARK; + rsize = usize + vsize; + tp = TMP_ALLOC_LIMBS (rsize); + cy_limb = (usize >= vsize + ? mpn_mul (tp, up, usize, vp, vsize) + : mpn_mul (tp, vp, vsize, up, usize)); + } - rp = r->_mp_d; - MPN_COPY (rp, tp, rsize); - r->_mp_exp = u->_mp_exp + v->_mp_exp - adj; - r->_mp_size = sign_product >= 0 ? rsize : -rsize; + } - TMP_FREE; + adj = cy_limb == 0; + rsize -= adj; + prec++; + if (rsize > prec) + { + tp += rsize - prec; + rsize = prec; } + rp = r->_mp_d; + MPN_COPY (rp, tp, rsize); + r->_mp_exp = u->_mp_exp + v->_mp_exp - adj; + r->_mp_size = sign_product >= 0 ? rsize : -rsize; + + TMP_FREE; } From mercurial at gmplib.org Mon Dec 23 21:47:43 2019 From: mercurial at gmplib.org (mercurial at gmplib.org) Date: Mon, 23 Dec 2019 22:47:43 +0100 Subject: [Gmp-commit] /var/hg/gmp: Amend last change. Message-ID: details: /var/hg/gmp/rev/5870bab2f759 changeset: 18001:5870bab2f759 user: Torbjorn Granlund date: Mon Dec 23 22:47:38 2019 +0100 description: Amend last change. diffstat: mpf/mul.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diffs (12 lines): diff -r 755155b633f6 -r 5870bab2f759 mpf/mul.c --- a/mpf/mul.c Mon Dec 23 21:26:40 2019 +0100 +++ b/mpf/mul.c Mon Dec 23 22:47:38 2019 +0100 @@ -47,7 +47,7 @@ mp_size_t usize; usize = u->_mp_size; - sign_product = usize; + sign_product = 0; usize = ABS (usize);