#include "nmod.h"
#include "fmpz.h"
#include "fmpz_mod.h"
void _fmpz_mod_add1(fmpz_t a, const fmpz_t b, const fmpz_t c,
const fmpz_mod_ctx_t ctx)
{
ulong a0, b0, c0;
FLINT_ASSERT(fmpz_mod_is_canonical(b, ctx));
FLINT_ASSERT(fmpz_mod_is_canonical(c, ctx));
b0 = fmpz_get_ui(b);
c0 = fmpz_get_ui(c);
a0 = nmod_add(b0, c0, ctx->mod);
fmpz_set_ui(a, a0);
FLINT_ASSERT(fmpz_mod_is_canonical(a, ctx));
}
void _fmpz_mod_add2s(fmpz_t a, const fmpz_t b, const fmpz_t c,
const fmpz_mod_ctx_t FLINT_UNUSED(ctx))
{
ulong a0, b0, c0;
FLINT_ASSERT(fmpz_mod_is_canonical(b, ctx));
FLINT_ASSERT(fmpz_mod_is_canonical(c, ctx));
b0 = fmpz_get_ui(b);
c0 = fmpz_get_ui(c);
a0 = b0 + c0;
fmpz_set_ui(a, a0);
FLINT_ASSERT(fmpz_mod_is_canonical(a, ctx));
}
void _fmpz_mod_add2(fmpz_t a, const fmpz_t b, const fmpz_t c,
const fmpz_mod_ctx_t ctx)
{
ulong t2, t1, t0, a2, a1, a0, b1, b0, c1, c0;
FLINT_ASSERT(fmpz_mod_is_canonical(b, ctx));
FLINT_ASSERT(fmpz_mod_is_canonical(c, ctx));
fmpz_get_uiui(&b1, &b0, b);
fmpz_get_uiui(&c1, &c0, c);
add_sssaaaaaa(a2, a1, a0, 0, b1, b0, 0, c1, c0);
sub_dddmmmsss(t2, t1, t0, a2, a1, a0, 0, ctx->n_limbs[1], ctx->n_limbs[0]);
if ((slong)(t2) >= 0)
{
a1 = t1;
a0 = t0;
}
fmpz_set_uiui(a, a1, a0);
FLINT_ASSERT(fmpz_mod_is_canonical(a, ctx));
}
void _fmpz_mod_addN(fmpz_t a, const fmpz_t b, const fmpz_t c,
const fmpz_mod_ctx_t ctx)
{
FLINT_ASSERT(fmpz_mod_is_canonical(b, ctx));
FLINT_ASSERT(fmpz_mod_is_canonical(c, ctx));
fmpz_add(a, b, c);
if (fmpz_cmp(a, ctx->n) >= 0)
{
fmpz_sub(a, a, ctx->n);
}
FLINT_ASSERT(fmpz_mod_is_canonical(a, ctx));
}
void fmpz_mod_add_fmpz(fmpz_t a, const fmpz_t b, const fmpz_t c,
const fmpz_mod_ctx_t ctx)
{
FLINT_ASSERT(fmpz_mod_is_canonical(b, ctx));
fmpz_add(a, b, c);
fmpz_mod(a, a, ctx->n);
FLINT_ASSERT(fmpz_mod_is_canonical(a, ctx));
}
void fmpz_mod_add_ui(fmpz_t a, const fmpz_t b, ulong c,
const fmpz_mod_ctx_t ctx)
{
FLINT_ASSERT(fmpz_mod_is_canonical(b, ctx));
fmpz_add_ui(a, b, c);
fmpz_mod(a, a, ctx->n);
FLINT_ASSERT(fmpz_mod_is_canonical(a, ctx));
}
void fmpz_mod_add_si(fmpz_t a, const fmpz_t b, slong c,
const fmpz_mod_ctx_t ctx)
{
FLINT_ASSERT(fmpz_mod_is_canonical(b, ctx));
fmpz_add_si(a, b, c);
fmpz_mod(a, a, ctx->n);
FLINT_ASSERT(fmpz_mod_is_canonical(a, ctx));
}