14b6a78b7SSimon Schubert /* mpz_divisible_2exp_p -- mpz by 2^n divisibility test 24b6a78b7SSimon Schubert 34b6a78b7SSimon Schubert Copyright 2001, 2002 Free Software Foundation, Inc. 44b6a78b7SSimon Schubert 54b6a78b7SSimon Schubert This file is part of the GNU MP Library. 64b6a78b7SSimon Schubert 74b6a78b7SSimon Schubert The GNU MP Library is free software; you can redistribute it and/or modify 84b6a78b7SSimon Schubert it under the terms of the GNU Lesser General Public License as published by 94b6a78b7SSimon Schubert the Free Software Foundation; either version 3 of the License, or (at your 104b6a78b7SSimon Schubert option) any later version. 114b6a78b7SSimon Schubert 124b6a78b7SSimon Schubert The GNU MP Library is distributed in the hope that it will be useful, but 134b6a78b7SSimon Schubert WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 144b6a78b7SSimon Schubert or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public 154b6a78b7SSimon Schubert License for more details. 164b6a78b7SSimon Schubert 174b6a78b7SSimon Schubert You should have received a copy of the GNU Lesser General Public License 184b6a78b7SSimon Schubert along with the GNU MP Library. If not, see http://www.gnu.org/licenses/. */ 194b6a78b7SSimon Schubert 204b6a78b7SSimon Schubert #include "gmp.h" 214b6a78b7SSimon Schubert #include "gmp-impl.h" 224b6a78b7SSimon Schubert 234b6a78b7SSimon Schubert 244b6a78b7SSimon Schubert int mpz_divisible_2exp_p(mpz_srcptr a,mp_bitcnt_t d)25*d2d4b659SJohn Marinompz_divisible_2exp_p (mpz_srcptr a, mp_bitcnt_t d) __GMP_NOTHROW 264b6a78b7SSimon Schubert { 2754028e53SJohn Marino mp_size_t i, dlimbs; 2854028e53SJohn Marino unsigned dbits; 294b6a78b7SSimon Schubert mp_ptr ap; 304b6a78b7SSimon Schubert mp_limb_t dmask; 314b6a78b7SSimon Schubert mp_size_t asize; 324b6a78b7SSimon Schubert 334b6a78b7SSimon Schubert asize = ABSIZ(a); 344b6a78b7SSimon Schubert dlimbs = d / GMP_NUMB_BITS; 354b6a78b7SSimon Schubert 364b6a78b7SSimon Schubert /* if d covers the whole of a, then only a==0 is divisible */ 374b6a78b7SSimon Schubert if (asize <= dlimbs) 384b6a78b7SSimon Schubert return asize == 0; 394b6a78b7SSimon Schubert 404b6a78b7SSimon Schubert /* whole limbs must be zero */ 414b6a78b7SSimon Schubert ap = PTR(a); 424b6a78b7SSimon Schubert for (i = 0; i < dlimbs; i++) 434b6a78b7SSimon Schubert if (ap[i] != 0) 444b6a78b7SSimon Schubert return 0; 454b6a78b7SSimon Schubert 464b6a78b7SSimon Schubert /* left over bits must be zero */ 474b6a78b7SSimon Schubert dbits = d % GMP_NUMB_BITS; 484b6a78b7SSimon Schubert dmask = (CNST_LIMB(1) << dbits) - 1; 494b6a78b7SSimon Schubert return (ap[dlimbs] & dmask) == 0; 504b6a78b7SSimon Schubert } 51