/*
Copyright (C) 2020 Daniel Schultz
This file is part of FLINT.
FLINT is free software: you can redistribute it and/or modify it under
the terms of the GNU Lesser General Public License (LGPL) as published
by the Free Software Foundation; either version 2.1 of the License, or
(at your option) any later version. See .
*/
#include
#include
#include "flint.h"
#include "fmpz.h"
#include "mpn_extras.h"
/*
Try to compute y = a1*x1 - a2*x2 where x1 and x2 both have n > 0 limbs.
If y is negative or does not fit into n limbs, the return is -1. Otherwise,
the return is the size of y.
*/
mp_size_t flint_mpn_fmms1(mp_ptr y, mp_limb_t a1, mp_srcptr x1,
mp_limb_t a2, mp_srcptr x2, mp_size_t n)
{
mp_limb_t h0, h1;
FLINT_ASSERT(n > 0);
h0 = mpn_mul_1(y, x1, n, a1);
h1 = mpn_submul_1(y, x2, n, a2);
if (h1 != h0)
return -1;
while (n > 0 && y[n - 1] == 0)
n--;
return n;
}