#include "nmod_vec.h"
#include "nmod_mat.h"
void nmod_mat_nmod_vec_mul(
ulong * c,
const ulong * a, slong alen,
const nmod_mat_t B)
{
slong i;
slong len = FLINT_MIN(B->r, alen);
slong ncols = B->c;
if (ncols < 1)
return;
if (len > 0)
_nmod_vec_scalar_mul_nmod(c, nmod_mat_entry_ptr(B, 0, 0), ncols, a[0], B->mod);
else
_nmod_vec_zero(c, ncols);
for (i = 1; i < len; i++)
_nmod_vec_scalar_addmul_nmod(c, nmod_mat_entry_ptr(B, i, 0), ncols, a[i], B->mod);
}
void nmod_mat_nmod_vec_mul_ptr(
ulong * const * c,
const ulong * const * a, slong alen,
const nmod_mat_t B)
{
slong i;
slong len = FLINT_MIN(B->r, alen);
slong ncols = B->c;
ulong * aa, * cc;
TMP_INIT;
TMP_START;
aa = TMP_ARRAY_ALLOC(len, ulong);
cc = TMP_ARRAY_ALLOC(ncols, ulong);
for (i = 0; i < len; i++)
aa[i] = a[i][0];
nmod_mat_nmod_vec_mul(cc, aa, len, B);
for (i = 0; i < ncols; i++)
c[i][0] = cc[i];
TMP_END;
}