From c63a25695be076e90849fda8275295c786c12458 Mon Sep 17 00:00:00 2001 From: Marco Bodrato Date: Sat, 16 Nov 2019 08:18:13 +0100 Subject: tune/: tune/speed support for mpn_perfect_{power,square}_p (by Seth Troisi) --- tune/common.c | 13 +++++++++++++ tune/speed.c | 3 +++ tune/speed.h | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 69 insertions(+) (limited to 'tune') diff --git a/tune/common.c b/tune/common.c index 6f4332700..e6f60613b 100644 --- a/tune/common.c +++ b/tune/common.c @@ -1821,6 +1821,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) { 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) \ -- cgit v1.2.1