Skip to content
Open
Show file tree
Hide file tree
Changes from 6 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
Loading