summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gmp-impl.h139
1 files changed, 133 insertions, 6 deletions
diff --git a/gmp-impl.h b/gmp-impl.h
index 251ff0540..324043a98 100644
--- a/gmp-impl.h
+++ b/gmp-impl.h
@@ -10,7 +10,7 @@ This file is part of the GNU MP Library.
The GNU MP Library is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
-the Free Software Foundation; either version 2.1 of the License, or (at your
+the Free Software Foundation; either version 3 of the License, or (at your
option) any later version.
The GNU MP Library is distributed in the hope that it will be useful, but
@@ -19,9 +19,7 @@ or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
License for more details.
You should have received a copy of the GNU Lesser General Public License
-along with the GNU MP Library; see the file COPYING.LIB. If not, write to
-the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
-MA 02110-1301, USA. */
+along with the GNU MP Library. If not, see http://www.gnu.org/licenses/. */
/* __GMP_DECLSPEC must be given on any global data that will be accessed
@@ -1005,12 +1003,30 @@ void mpn_kara_mul_n _PROTO((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t, mp_ptr));
#define mpn_kara_sqr_n __MPN(kara_sqr_n)
void mpn_kara_sqr_n _PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_ptr));
+#define mpn_toom_interpolate_5pts __MPN(toom_interpolate_5pts)
+void mpn_toom_interpolate_5pts _PROTO ((mp_ptr, mp_ptr, mp_ptr, mp_size_t, mp_size_t, int, mp_limb_t, mp_ptr));
+
+enum toom4_flags { toom4_w1_neg = 1, toom4_w3_neg = 2 }; /* FIXME */
+#define mpn_toom_interpolate_7pts __MPN(toom_interpolate_7pts)
+void mpn_toom_interpolate_7pts (mp_ptr, mp_size_t, enum toom4_flags, mp_ptr, mp_ptr, mp_ptr, mp_ptr, mp_size_t, mp_ptr);
+
#define mpn_toom3_mul_n __MPN(toom3_mul_n)
void mpn_toom3_mul_n _PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t,mp_ptr));
+#define mpn_mul_toom44 __MPN(mul_toom44)
+void mpn_mul_toom44 _PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t));
+
#define mpn_toom3_sqr_n __MPN(toom3_sqr_n)
void mpn_toom3_sqr_n _PROTO((mp_ptr, mp_srcptr, mp_size_t, mp_ptr));
+#define mpn_mul_toom22 __MPN(mul_toom22)
+void mpn_mul_toom22 (mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t, mp_ptr);
+
+#define mpn_mul_toom32 __MPN(mul_toom32)
+void mpn_mul_toom32 (mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t);
+
+#define mpn_mul_toom42 __MPN(mul_toom42)
+void mpn_mul_toom42 (mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t);
#define mpn_fft_best_k __MPN(fft_best_k)
int mpn_fft_best_k _PROTO ((mp_size_t n, int sqr)) ATTRIBUTE_CONST;
@@ -1036,8 +1052,74 @@ mp_limb_t mpn_sb_divrem_mn _PROTO ((mp_ptr, mp_ptr, mp_size_t,
#define mpn_dc_divrem_n __MPN(dc_divrem_n)
mp_limb_t mpn_dc_divrem_n _PROTO ((mp_ptr, mp_ptr, mp_srcptr, mp_size_t));
-/* #define mpn_tdiv_q __MPN(tdiv_q) */
-/* void mpn_tdiv_q _PROTO ((mp_ptr, mp_size_t, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t)); */
+#define mpn_sb_div_qr __MPN(sb_div_qr)
+mp_limb_t mpn_sb_div_qr _PROTO ((mp_ptr, mp_ptr, mp_size_t, mp_srcptr, mp_size_t, mp_srcptr));
+#define mpn_sb_div_q __MPN(sb_div_q)
+mp_limb_t mpn_sb_div_q _PROTO ((mp_ptr, mp_ptr, mp_size_t, mp_srcptr, mp_size_t, mp_srcptr));
+#define mpn_sb_divappr_q __MPN(sb_divappr_q)
+mp_limb_t mpn_sb_divappr_q _PROTO ((mp_ptr, mp_ptr, mp_size_t, mp_srcptr, mp_size_t, mp_srcptr));
+#define mpn_dc_div_qr __MPN(dc_div_qr)
+mp_limb_t mpn_dc_div_qr _PROTO ((mp_ptr, mp_ptr, mp_size_t, mp_srcptr, mp_size_t));
+#define mpn_dc_div_qr_n __MPN(dc_div_qr_n)
+mp_limb_t mpn_dc_div_qr_n _PROTO ((mp_ptr, mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_ptr));
+#define mpn_dc_div_q __MPN(dc_div_q)
+mp_limb_t mpn_dc_div_q _PROTO ((mp_ptr, mp_ptr, mp_size_t, mp_srcptr, mp_size_t));
+#define mpn_preinv_dc_div_qr __MPN(preinv_dc_div_qr)
+mp_limb_t mpn_preinv_dc_div_qr _PROTO ((mp_ptr, mp_ptr, mp_size_t, mp_srcptr, mp_size_t, mp_srcptr));
+#define mpn_dc_divappr_q __MPN(dc_divappr_q)
+mp_limb_t mpn_dc_divappr_q _PROTO ((mp_ptr, mp_ptr, mp_size_t, mp_srcptr, mp_size_t));
+#define mpn_dc_divappr_q_n __MPN(dc_divappr_q_n)
+mp_limb_t mpn_dc_divappr_q_n _PROTO ((mp_ptr, mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_ptr));
+#define mpn_preinv_dc_divappr_q __MPN(preinv_dc_divappr_q)
+mp_limb_t mpn_preinv_dc_divappr_q _PROTO ((mp_ptr, mp_ptr, mp_size_t, mp_srcptr, mp_size_t, mp_srcptr));
+#define mpn_mu_div_qr __MPN(mu_div_qr)
+mp_limb_t mpn_mu_div_qr _PROTO ((mp_ptr, mp_ptr, mp_ptr, mp_size_t, mp_srcptr, mp_size_t, mp_ptr));
+#define mpn_mu_div_qr_itch __MPN(mu_div_qr_itch)
+mp_size_t mpn_mu_div_qr_itch _PROTO ((mp_size_t, mp_size_t, int));
+#define mpn_preinv_mu_div_qr __MPN(preinv_mu_div_qr)
+void mpn_preinv_mu_div_qr _PROTO ((mp_ptr, mp_ptr, mp_ptr, mp_size_t, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t, mp_ptr));
+#define mpn_mu_divappr_q __MPN(mu_divappr_q)
+mp_limb_t mpn_mu_divappr_q _PROTO ((mp_ptr, mp_ptr, mp_size_t, mp_srcptr, mp_size_t, mp_ptr));
+#define mpn_mu_divappr_q_itch __MPN(mu_divappr_q_itch)
+mp_size_t mpn_mu_divappr_q_itch _PROTO ((mp_size_t, mp_size_t, int));
+#define mpn_preinv_mu_divappr_q __MPN(preinv_mu_divappr_q)
+void mpn_preinv_mu_divappr_q _PROTO ((mp_ptr, mp_ptr, mp_size_t, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t, mp_ptr));
+#define mpn_mu_div_q __MPN(mu_div_q)
+mp_limb_t mpn_mu_div_q _PROTO ((mp_ptr, mp_ptr, mp_size_t, mp_srcptr, mp_size_t, mp_ptr));
+#define mpn_invert __MPN(invert)
+void mpn_invert _PROTO ((mp_ptr, mp_srcptr, mp_size_t));
+
+#define mpn_binvert __MPN(binvert)
+void mpn_binvert _PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_ptr));
+#define mpn_binvert_itch __MPN(binvert_itch)
+mp_size_t mpn_binvert_itch _PROTO ((mp_size_t));
+#define mpn_sb_bdiv_qr __MPN(sb_bdiv_qr)
+mp_limb_t mpn_sb_bdiv_qr _PROTO ((mp_ptr, mp_ptr, mp_size_t, mp_srcptr, mp_size_t, mp_limb_t));
+#define mpn_sb_bdiv_q __MPN(sb_bdiv_q)
+void mpn_sb_bdiv_q _PROTO ((mp_ptr, mp_ptr, mp_size_t, mp_srcptr, mp_size_t, mp_limb_t));
+#define mpn_dc_bdiv_qr __MPN(dc_bdiv_qr)
+mp_limb_t mpn_dc_bdiv_qr _PROTO ((mp_ptr, mp_ptr, mp_size_t, mp_srcptr, mp_size_t, mp_limb_t));
+#define mpn_dc_bdiv_qr_n_itch __MPN(dc_bdiv_qr_n_itch)
+mp_size_t mpn_dc_bdiv_qr_n_itch _PROTO ((mp_size_t n));
+#define mpn_dc_bdiv_qr_n __MPN(dc_bdiv_qr_n)
+mp_limb_t mpn_dc_bdiv_qr_n _PROTO ((mp_ptr qp, mp_ptr np, mp_srcptr dp, mp_size_t n, mp_limb_t dinv, mp_ptr tp));
+#define mpn_dc_bdiv_q __MPN(dc_bdiv_q)
+void mpn_dc_bdiv_q _PROTO ((mp_ptr, mp_ptr, mp_size_t, mp_srcptr, mp_size_t, mp_limb_t));
+#define mpn_dc_bdiv_q_n_itch __MPN(dc_bdiv_q_n_itch)
+mp_size_t mpn_dc_bdiv_q_n_itch _PROTO ((mp_size_t n));
+#define mpn_dc_bdiv_q_n __MPN(dc_bdiv_q_n)
+void mpn_dc_bdiv_q_n _PROTO ((mp_ptr qp, mp_ptr np, mp_srcptr dp, mp_size_t n, mp_limb_t dinv, mp_ptr tp));
+
+#define mpn_mu_bdiv_q __MPN(mu_bdiv_q)
+void mpn_mu_bdiv_q _PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t, mp_ptr));
+#define mpn_mu_bdiv_q_itch __MPN(mu_bdiv_q_itch)
+mp_size_t mpn_mu_bdiv_q_itch _PROTO ((mp_size_t, mp_size_t));
+
+#define mpn_divexact __MPN(divexact)
+void mpn_divexact _PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t, mp_ptr));
+#define mpn_divexact_itch __MPN(divexact_itch)
+mp_size_t mpn_divexact_itch _PROTO ((mp_size_t, mp_size_t));
+
#define mpz_divexact_gcd __gmpz_divexact_gcd
void mpz_divexact_gcd _PROTO ((mpz_ptr q, mpz_srcptr a, mpz_srcptr d));
@@ -1432,6 +1514,50 @@ __GMP_DECLSPEC extern const mp_limb_t __gmp_fib_table[];
#define SQR_TOOM3_THRESHOLD_LIMIT SQR_TOOM3_THRESHOLD
#endif
+#ifndef DC_DIV_QR_THRESHOLD
+#define DC_DIV_QR_THRESHOLD 43
+#endif
+
+#ifndef DC_DIVAPPR_Q_THRESHOLD
+#define DC_DIVAPPR_Q_THRESHOLD 208
+#endif
+
+#ifndef DC_DIV_Q_THRESHOLD
+#define DC_DIV_Q_THRESHOLD 228
+#endif
+
+#ifndef DC_BDIV_QR_THRESHOLD
+#define DC_BDIV_QR_THRESHOLD 52
+#endif
+
+#ifndef DC_BDIV_Q_THRESHOLD
+#define DC_BDIV_Q_THRESHOLD 224
+#endif
+
+#ifndef DIVEXACT_JEB_THRESHOLD
+#define DIVEXACT_JEB_THRESHOLD 25
+#endif
+
+#ifndef INV_NEWTON_THRESHOLD
+#define INV_NEWTON_THRESHOLD 654
+#endif
+
+#ifndef BINV_NEWTON_THRESHOLD
+#define BINV_NEWTON_THRESHOLD 807
+#endif
+
+#ifndef MU_DIVAPPR_Q_THRESHOLD
+#define MU_DIVAPPR_Q_THRESHOLD 4000
+#endif
+
+#ifndef MU_DIV_Q_THRESHOLD
+#define MU_DIV_Q_THRESHOLD 4000
+#endif
+
+#ifndef MU_BDIV_Q_THRESHOLD
+#define MU_BDIV_Q_THRESHOLD 2000
+#endif
+
/* First k to use for an FFT modF multiply. A modF FFT is an order
log(2^k)/log(2^(k-1)) algorithm, so k=3 is merely 1.5 like karatsuba,
whereas k=4 is 1.33 which is faster than toom3 at 1.485. */
@@ -2396,6 +2522,7 @@ __GMP_DECLSPEC extern const unsigned char modlimb_invert_table[128];
ASSERT ((__inv * __n & GMP_NUMB_MASK) == 1); \
(inv) = __inv & GMP_NUMB_MASK; \
} while (0)
+#define binvert_limb modlimb_invert /* backward compatibility */
/* Multiplicative inverse of 3, modulo 2^GMP_NUMB_BITS.
Eg. 0xAAAAAAAB for 32 bits, 0xAAAAAAAAAAAAAAAB for 64 bits.