There is a small old bug in mpz_powm, which can be detected with the
following program:

#include "gmp-impl.h"
int
main (int argc, char *argv[])
{
  mpz_t M, N, E;

  mpz_init_set_ui (M, 1);
  mpz_init_set_ui (E, 1);
  mpz_init (N);
  mpz_setbit (M, 10 * GMP_NUMB_BITS);
  mpz_setbit (M, 0);
  mpz_ui_sub (N, 17, M);
  mpz_powm (N, N, E, M);
  MPZ_CHECK_FORMAT (N);
  mpz_clear (M);
  mpz_clear (N);
  mpz_clear (E);
}

I'd suggest the following patch:

diff -r 2109bbf292bd mpz/powm.c
--- a/mpz/powm.c        Thu Dec 05 07:44:46 2019 +0100
+++ b/mpz/powm.c        Sun Dec 08 17:27:56 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
            {


Ĝis,
m

-- 
http://bodrato.it/papers/

_______________________________________________
gmp-devel mailing list
gmp-devel@gmplib.org
https://gmplib.org/mailman/listinfo/gmp-devel

Reply via email to