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);