From 11da511c784eca003deb90c23570f0873954e0de Mon Sep 17 00:00:00 2001 From: Duncan Wilkie Date: Sat, 18 Nov 2023 06:11:09 -0600 Subject: Initial commit. --- gmp-6.3.0/mpz/lcm_ui.c | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 gmp-6.3.0/mpz/lcm_ui.c (limited to 'gmp-6.3.0/mpz/lcm_ui.c') diff --git a/gmp-6.3.0/mpz/lcm_ui.c b/gmp-6.3.0/mpz/lcm_ui.c new file mode 100644 index 0000000..1f199b7 --- /dev/null +++ b/gmp-6.3.0/mpz/lcm_ui.c @@ -0,0 +1,78 @@ +/* mpz_lcm_ui -- least common multiple of mpz and ulong. + +Copyright 2001, 2002, 2004 Free Software Foundation, Inc. + +This file is part of the GNU MP Library. + +The GNU MP Library is free software; you can redistribute it and/or modify +it under the terms of either: + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at your + option) any later version. + +or + + * the GNU General Public License as published by the Free Software + Foundation; either version 2 of the License, or (at your option) any + later version. + +or both in parallel, as here. + +The GNU MP Library is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received copies of the GNU General Public License and the +GNU Lesser General Public License along with the GNU MP Library. If not, +see https://www.gnu.org/licenses/. */ + +#include "gmp-impl.h" +#include "longlong.h" + + +void +mpz_lcm_ui (mpz_ptr r, mpz_srcptr u, unsigned long v) +{ + mp_size_t usize; + mp_srcptr up; + mp_ptr rp; + unsigned long g; + mp_limb_t c; + +#if BITS_PER_ULONG > GMP_NUMB_BITS /* avoid warnings about shift amount */ + if (v > GMP_NUMB_MAX) + { + mpz_t vz; + mp_limb_t vlimbs[2]; + vlimbs[0] = v & GMP_NUMB_MASK; + vlimbs[1] = v >> GMP_NUMB_BITS; + PTR(vz) = vlimbs; + SIZ(vz) = 2; + mpz_lcm (r, u, vz); + return; + } +#endif + + /* result zero if either operand zero */ + usize = SIZ(u); + if (usize == 0 || v == 0) + { + SIZ(r) = 0; + return; + } + usize = ABS(usize); + + MPZ_REALLOC (r, usize+1); + + up = PTR(u); + g = (unsigned long) mpn_gcd_1 (up, usize, (mp_limb_t) v); + v /= g; + + rp = PTR(r); + c = mpn_mul_1 (rp, up, usize, (mp_limb_t) v); + rp[usize] = c; + usize += (c != 0); + SIZ(r) = usize; +} -- cgit v1.2.3