1 /* mpz_sub_ui -- Subtract an unsigned one-word integer from an MP_INT.
3 Copyright (C) 1991, 1993, 1994, 1996 Free Software Foundation, Inc.
5 This file is part of the GNU MP Library.
7 The GNU MP Library is free software; you can redistribute it and/or modify
8 it under the terms of the GNU Library General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or (at your
10 option) any later version.
12 The GNU MP Library is distributed in the hope that it will be useful, but
13 WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
15 License for more details.
17 You should have received a copy of the GNU Library General Public License
18 along with the GNU MP Library; see the file COPYING.LIB. If not, write to
19 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
20 MA 02111-1307, USA. */
27 mpz_sub_ui (mpz_ptr w, mpz_srcptr u, unsigned long int v)
37 mp_size_t usize, wsize;
41 abs_usize = ABS (usize);
43 /* If not space for W (and possible carry), increase space. */
44 wsize = abs_usize + 1;
45 if (w->_mp_alloc < wsize)
46 _mpz_realloc (w, wsize);
48 /* These must be after realloc (U may be the same as W). */
55 w->_mp_size = -(v != 0);
62 cy = mpn_add_1 (wp, up, abs_usize, v);
64 wsize = -(abs_usize + cy);
68 /* The signs are different. Need exact comparison to determine
69 which operand to subtract from which. */
70 if (abs_usize == 1 && up[0] < v)
77 mpn_sub_1 (wp, up, abs_usize, v);
78 /* Size can decrease with at most one limb. */
79 wsize = abs_usize - (wp[abs_usize - 1] == 0);