/* Copyright (C) 2008-2011 William Hart 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 "fmpz_vec.h" #include "fmpz_poly.h" #include "fft.h" slong _fmpz_vec_get_fft(mp_limb_t ** coeffs_f, const fmpz * coeffs_m, slong l, slong length) { slong size_f = l + 1; mp_limb_t * coeff; mp_limb_t mask = WORD(-1); slong bits = 0, limbs = 0, size_j, i, c; int sign = 1, signed_c; for (i = 0; i < length; i++, coeffs_m++) { c = *coeffs_m; signed_c = 0; if (!COEFF_IS_MPZ(c)) /* coeff is small */ { size_j = 1; if (c < 0) { signed_c = 1; c = -c; coeff = (mp_limb_t *) &c; } else coeff = (mp_limb_t *) coeffs_m; } else /* coeff is an mpz_t */ { __mpz_struct * mpz_ptr = COEFF_TO_PTR(c); size_j = mpz_ptr->_mp_size; if (size_j < 0) { signed_c = 1; size_j = -size_j; } coeff = mpz_ptr->_mp_d; } if (signed_c) sign = -1; if (size_j > limbs + 1) /* coeff is at least 1 limb bigger */ { limbs = size_j - 1; bits = FLINT_BIT_COUNT(coeff[size_j - 1]); if (bits == FLINT_BITS) mask = WORD(0); else mask = WORD(-1) - ((WORD(1)<