diff --git a/lib/cm-impl.h b/lib/cm-impl.h index c3b651a8ea524caec65eb37ed0d9558d4343af57..78399645d96f64631a0a453406dc3ec2d33d8b61 100644 --- a/lib/cm-impl.h +++ b/lib/cm-impl.h @@ -129,6 +129,10 @@ extern char* cm_pari_sprintf_hfactor (int_cl_t d); #ifdef HAVE_FLINT /* functions depending on FLINT */ +#ifdef HAVE_FLINT3 +extern void cm_flint_mpz_powm (mpz_ptr z, mpz_srcptr a, mpz_srcptr e, + mpz_srcptr p); +#endif extern void cm_flint_mpzx_xplusa_pow_modmod (mpzx_ptr g, unsigned long int a, mpz_srcptr e, mpzx_srcptr m, mpz_srcptr p); extern void cm_flint_mpzx_gcd_mod (mpzx_ptr h, mpzx_srcptr f, mpzx_srcptr g, diff --git a/lib/flint.c b/lib/flint.c index 7a625d2a28bb022b789244bc6bee8e8098a6dd15..738065ccd2d4e80d9acf6f043226933c837cd283 100644 --- a/lib/flint.c +++ b/lib/flint.c @@ -113,6 +113,39 @@ void cm_flint_print_library () printf ("FLINT: include %s, lib %s\n", FLINT_VERSION, flint_version); } +/*****************************************************************************/ +/* */ +/* Functions for mpz modulo p relying on FLINT. */ +/* */ +/*****************************************************************************/ + +#ifdef HAVE_FLINT3 +void cm_flint_mpz_powm (mpz_ptr z, mpz_srcptr a, mpz_srcptr e, mpz_srcptr p) +{ + fmpz_t zp, ap, ep, pp; + fmpz_mod_ctx_t ctx; + + fmpz_init (pp); + fmpz_set_mpz (pp, p); + fmpz_init (ap); + fmpz_set_mpz (ap, a); + fmpz_init (ep); + fmpz_set_mpz (ep, e); + fmpz_mod_ctx_init (ctx, pp); + fmpz_init (zp); + + fmpz_mod_pow_fmpz (zp, ap, ep, ctx); + + fmpz_get_mpz (z, zp); + + fmpz_clear (pp); + fmpz_clear (ap); + fmpz_clear (ep); + fmpz_mod_ctx_clear (ctx); + fmpz_clear (zp); +} +#endif + /*****************************************************************************/ /* */ /* Functions for mpzx modulo p relying on FLINT. */ diff --git a/lib/nt.c b/lib/nt.c index b4586675bd98d1023ecd1bd8773704a93855e335..308aa808208bb5c49b2a3df9bdf27f29e5f425b7 100644 --- a/lib/nt.c +++ b/lib/nt.c @@ -2,7 +2,7 @@ nt.c - number theoretic helper functions -Copyright (C) 2009, 2010, 2015, 2021, 2022 Andreas Enge +Copyright (C) 2009, 2010, 2015, 2021, 2022, 2023 Andreas Enge This file is part of CM. @@ -23,6 +23,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "cm-impl.h" +static void cm_mpz_powm (mpz_ptr z, mpz_srcptr a, mpz_srcptr e, mpz_srcptr p); static void tree_gcd (mpz_t *gcd, mpz_srcptr n, mpz_t *m, int no_m); static int miller_rabin (mpz_srcptr n); static void cm_nt_mpz_tonelli_with_generator (mpz_ptr root, mpz_srcptr a, @@ -129,6 +130,17 @@ int cm_nt_kronecker (int_cl_t a, int_cl_t b) /*****************************************************************************/ +static void cm_mpz_powm (mpz_ptr z, mpz_srcptr a, mpz_srcptr e, mpz_srcptr p) +{ +#ifdef HAVE_FLINT3 + cm_flint_mpz_powm (z, a, e, p); +#else + mpz_powm (z, a, e, p); +#endif +} + +/*****************************************************************************/ + static int miller_rabin (mpz_srcptr n) /* Return whether the odd positive integer n is a strong pseudoprime to base 2. */ @@ -316,7 +328,7 @@ unsigned int cm_nt_mpz_tonelli_generator (mpz_ptr q, mpz_ptr z, mpz_tdiv_q_2exp (q, p, e); for (mpz_set_ui (z, 2ul); mpz_legendre (z, p) != -1; mpz_add_ui (z, z, 1ul)); - mpz_powm (z, z, q, p); + cm_mpz_powm (z, z, q, p); } return e; @@ -348,7 +360,7 @@ static void cm_nt_mpz_tonelli_with_generator (mpz_ptr root, mpz_srcptr a, if (e == 1) /* p=3 (mod 4) */ { mpz_add_ui (tmp, p, 1ul); mpz_tdiv_q_2exp (tmp, tmp, 2ul); - mpz_powm (x, a_local, tmp, p); + cm_mpz_powm (x, a_local, tmp, p); } else { /* initialisation */ @@ -356,7 +368,7 @@ static void cm_nt_mpz_tonelli_with_generator (mpz_ptr root, mpz_srcptr a, r = e; mpz_sub_ui (tmp, q, 1ul); mpz_tdiv_q_2exp (tmp, tmp, 1ul); - mpz_powm (x, a_local, tmp, p); + cm_mpz_powm (x, a_local, tmp, p); mpz_powm_ui (b, x, 2ul, p); mpz_mul (b, b, a_local); mpz_mod (b, b, p);