Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/fmpz_mpoly/test/t-scalar_divexact_fmpz.c
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ TEST_FUNCTION_START(fmpz_mpoly_scalar_divexact_fmpz, state)
fmpz_mpoly_randtest_bits(f, state, len, coeff_bits, exp_bits, ctx);
fmpz_mpoly_randtest_bits(h, state, len, coeff_bits, exp_bits, ctx);

fmpz_randtest(c, state, n_randint(state, 200));
fmpz_randtest_not_zero(c, state, n_randint(state, 200) + 1);

fmpz_mpoly_scalar_mul_fmpz(f, f, c, ctx);

Expand Down
60 changes: 60 additions & 0 deletions src/fmpz_vec/profile/p-divexact_ui.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
#include "ulong_extras.h"
#include "fmpz.h"
#include "fmpz_vec.h"
#include "profiler.h"

void
_fmpz_vec_scalar_divexact_ui_naive(fmpz * vec1, const fmpz * vec2,
slong len2, ulong c)
{
slong i;
for (i = 0; i < len2; i++)
fmpz_divexact_ui(vec1 + i, vec2 + i, c);
}

int main()
{
slong len, bits;

flint_rand_t state;
flint_rand_init(state);

fmpz *A, *Ac, *B;
ulong c;

double t1, t2, FLINT_SET_BUT_UNUSED(__);

flint_printf(" len bits(A*c) bits(c) old new speedup\n");

for (len = 1; len <= 10; len++)
{
for (bits = 5; bits <= 10000; bits *= 2)
{
A = _fmpz_vec_init(len);
Ac = _fmpz_vec_init(len);
B = _fmpz_vec_init(len);

_fmpz_vec_randtest(A, state, len, bits);
c = n_randtest_not_zero(state);
_fmpz_vec_scalar_mul_ui(Ac, A, len, c);

TIMEIT_START
_fmpz_vec_scalar_divexact_ui_naive(B, Ac, len, c);
TIMEIT_STOP_VALUES(__, t1)
TIMEIT_START
_fmpz_vec_scalar_divexact_ui(B, Ac, len, c);
TIMEIT_STOP_VALUES(__, t2)

flint_printf("%6wd %6wd %6wd %8g %8g %.3f\n",
len, _fmpz_vec_max_bits(Ac, len), FLINT_BIT_COUNT(c),
t1, t2, t1 / t2);

_fmpz_vec_clear(A, len);
_fmpz_vec_clear(Ac, len);
_fmpz_vec_clear(B, len);
}
}

flint_rand_clear(state);
}

43 changes: 3 additions & 40 deletions src/fmpz_vec/scalar.c
Original file line number Diff line number Diff line change
Expand Up @@ -126,46 +126,6 @@ _fmpz_vec_scalar_addmul_ui(fmpz * vec1, const fmpz * vec2, slong len2, ulong c)
fmpz_addmul_ui(vec1 + ix, vec2 + ix, c);
}

void
_fmpz_vec_scalar_divexact_fmpz(fmpz * vec1, const fmpz * vec2,
slong len2, const fmpz_t x)
{
fmpz c = *x;

if (!COEFF_IS_MPZ(c))
{
if (c == 1)
_fmpz_vec_set(vec1, vec2, len2);
else if (c == -1)
_fmpz_vec_neg(vec1, vec2, len2);
else
_fmpz_vec_scalar_divexact_si(vec1, vec2, len2, c);
}
else
{
slong i;
for (i = 0; i < len2; i++)
fmpz_divexact(vec1 + i, vec2 + i, x);
}
}

void
_fmpz_vec_scalar_divexact_si(fmpz * vec1, const fmpz * vec2, slong len2, slong c)
{
slong i;
for (i = 0; i < len2; i++)
fmpz_divexact_si(vec1 + i, vec2 + i, c);
}

void
_fmpz_vec_scalar_divexact_ui(fmpz * vec1, const fmpz * vec2,
slong len2, ulong c)
{
slong i;
for (i = 0; i < len2; i++)
fmpz_divexact_ui(vec1 + i, vec2 + i, c);
}

void
_fmpz_vec_scalar_fdiv_q_2exp(fmpz * vec1, const fmpz * vec2, slong len2,
ulong exp)
Expand Down Expand Up @@ -209,6 +169,8 @@ _fmpz_vec_scalar_fdiv_r_2exp(fmpz * vec1, const fmpz * vec2, slong len2,
fmpz_fdiv_r_2exp(vec1 + i, vec2 + i, exp);
}

/* todo: preinvert p when appropriate; or better, make sure we don't
call this function in places where we have an fmpz_mod */
void _fmpz_vec_scalar_mod_fmpz(fmpz *res, const fmpz *vec, slong len, const fmpz_t p)
{
slong i;
Expand Down Expand Up @@ -267,6 +229,7 @@ _fmpz_vec_scalar_mul_ui(fmpz * vec1, const fmpz * vec2, slong len2, ulong c)
fmpz_mul_ui(vec1 + i, vec2 + i, c);
}

/* todo: preinvert p when appropriate */
void _fmpz_vec_scalar_smod_fmpz(fmpz *res, const fmpz *vec, slong len, const fmpz_t p)
{
slong i;
Expand Down
Loading