summaryrefslogtreecommitdiff
path: root/tune
diff options
context:
space:
mode:
authorMarco Bodrato <bodrato@mail.dm.unipi.it>2019-11-16 08:18:13 +0100
committerMarco Bodrato <bodrato@mail.dm.unipi.it>2019-11-16 08:18:13 +0100
commitc63a25695be076e90849fda8275295c786c12458 (patch)
tree9f8d4de46ddb61160bc92cca037ee022e9714070 /tune
parentfbaa036972bad78bb7a5b9650a0176727df9d04c (diff)
downloadgmp-c63a25695be076e90849fda8275295c786c12458.tar.gz
tune/: tune/speed support for mpn_perfect_{power,square}_p (by Seth Troisi)
Diffstat (limited to 'tune')
-rw-r--r--tune/common.c13
-rw-r--r--tune/speed.c3
-rw-r--r--tune/speed.h53
3 files changed, 69 insertions, 0 deletions
diff --git a/tune/common.c b/tune/common.c
index 6f4332700..e6f60613b 100644
--- a/tune/common.c
+++ b/tune/common.c
@@ -1822,6 +1822,19 @@ speed_mpn_root (struct speed_params *s)
double
+speed_mpn_perfect_power_p (struct speed_params *s)
+{
+ SPEED_ROUTINE_MPN_PERFECT_POWER (mpn_perfect_power_p);
+}
+
+double
+speed_mpn_perfect_square_p (struct speed_params *s)
+{
+ SPEED_ROUTINE_MPN_PERFECT_SQUARE (mpn_perfect_square_p);
+}
+
+
+double
speed_mpz_fac_ui (struct speed_params *s)
{
SPEED_ROUTINE_MPZ_FAC_UI (mpz_fac_ui);
diff --git a/tune/speed.c b/tune/speed.c
index b861fa491..d6c1d98ab 100644
--- a/tune/speed.c
+++ b/tune/speed.c
@@ -403,6 +403,9 @@ const struct routine_t {
{ "mpn_sqrt", speed_mpn_sqrt },
{ "mpn_root", speed_mpn_root, FLAG_R },
+ { "mpn_perfect_power_p", speed_mpn_perfect_power_p, },
+ { "mpn_perfect_square_p", speed_mpn_perfect_square_p, },
+
{ "mpn_fib2_ui", speed_mpn_fib2_ui, FLAG_NODATA },
{ "mpz_fib_ui", speed_mpz_fib_ui, FLAG_NODATA },
{ "mpz_fib2_ui", speed_mpz_fib2_ui, FLAG_NODATA },
diff --git a/tune/speed.h b/tune/speed.h
index d66a79418..4bc73c9ac 100644
--- a/tune/speed.h
+++ b/tune/speed.h
@@ -342,6 +342,8 @@ double speed_mpn_sqrtrem (struct speed_params *);
double speed_mpn_rootrem (struct speed_params *);
double speed_mpn_sqrt (struct speed_params *);
double speed_mpn_root (struct speed_params *);
+double speed_mpn_perfect_power_p (struct speed_params *);
+double speed_mpn_perfect_square_p (struct speed_params *);
double speed_mpn_sub_n (struct speed_params *);
double speed_mpn_sub_1 (struct speed_params *);
double speed_mpn_sub_1_inplace (struct speed_params *);
@@ -3430,6 +3432,57 @@ int speed_routine_count_zeros_setup (struct speed_params *, mp_ptr, int, int);
}
+/* Calculate worst case for perfect_power
+ Worst case is multiple prime factors larger than trial div limit. */
+#define SPEED_ROUTINE_MPN_PERFECT_POWER(function) \
+ { \
+ mpz_t r, p; \
+ unsigned i, power; \
+ double t; \
+ \
+ SPEED_RESTRICT_COND (s->size >= 10); \
+ \
+ mpz_init_set_ui (p, (1 << 16) + 1); /* larger than 1000th prime */ \
+ mpz_init_set_ui (r, (1 << 17) - 1); \
+ power = s->size * GMP_NUMB_BITS / 17; \
+ mpz_pow_ui(r, r, power - 1); \
+ mpz_mul(r, r, p); \
+ \
+ speed_starttime (); \
+ i = s->reps; \
+ do \
+ function (PTR(r), SIZ(r)); \
+ while (--i != 0); \
+ t = speed_endtime (); \
+ \
+ mpz_clear (r); \
+ mpz_clear (p); \
+ return t; \
+ }
+
+/* Calculate worst case (larger prime) for perfect_square */
+#define SPEED_ROUTINE_MPN_PERFECT_SQUARE(function) \
+ { \
+ mpz_t r; \
+ unsigned i, power; \
+ double t; \
+ \
+ SPEED_RESTRICT_COND (s->size >= 2); \
+ mpz_init_set_n (r, s->xp, s->size / 2); \
+ mpz_pow_ui(r, r, 2); \
+ \
+ speed_starttime (); \
+ i = s->reps; \
+ do \
+ function (PTR(r), SIZ(r)); \
+ while (--i != 0); \
+ t = speed_endtime (); \
+ \
+ mpz_clear (r); \
+ return t; \
+ }
+
+
/* s->size controls the number of limbs in the input, s->r is the base, or
decimal by default. */
#define SPEED_ROUTINE_MPN_GET_STR(function) \