YoushouldhavereceivedcopiesoftheGNUGeneralPublicLicenseandthe GNULesserGeneralPublicLicensealongwiththeGNUMPLibrary.Ifnot,
see https://www.gnu.org/licenses/. */
#include"gmp-impl.h"
int
mpz_congruent_2exp_p (mpz_srcptr a, mpz_srcptr c, mp_bitcnt_t d) __GMP_NOTHROW
{
mp_size_t i, dlimbs; unsigned dbits;
mp_ptr ap, cp;
mp_limb_t dmask, alimb, climb, sum;
mp_size_t as, cs, asize, csize;
dlimbs = d / GMP_NUMB_BITS;
dbits = d % GMP_NUMB_BITS;
dmask = (CNST_LIMB(1) << dbits) - 1;
ap = PTR(a);
cp = PTR(c);
if (csize == 0) goto a_zeros;
if ((cs ^ as) >= 0)
{ /* same signs, direct comparison */
/* a==c for limbs in common */ if (mpn_cmp (ap, cp, MIN (csize, dlimbs)) != 0) return0;
/* if that's all of dlimbs, then a==c for remaining bits */ if (csize > dlimbs) return ((ap[dlimbs]-cp[dlimbs]) & dmask) == 0;
a_zeros: /* a remains, need all zero bits */
/* if d covers all of a and c, then must be exactly equal */ if (asize <= dlimbs) return asize == csize;
/* whole limbs zero */ for (i = csize; i < dlimbs; i++) if (ap[i] != 0) return0;
/* partial limb zero */ return (ap[dlimbs] & dmask) == 0;
} else
{ /* different signs, negated comparison */
/* common low zero limbs, stopping at first non-zeros, which must
match twos complement */
i = 0; do
{
ASSERT (i < csize); /* always have a non-zero limb on c */
alimb = ap[i];
climb = cp[i];
sum = (alimb + climb) & GMP_NUMB_MASK;
if (i >= dlimbs) return (sum & dmask) == 0;
++i;
/* require both zero, or first non-zeros as twos-complements */ if (sum != 0) return0;
} while (alimb == 0);
/* further limbs matching as ones-complement */ for (; i < csize; ++i)
{
alimb = ap[i];
climb = cp[i];
sum = alimb ^ climb ^ GMP_NUMB_MASK;
if (i >= dlimbs) return (sum & dmask) == 0;
if (sum != 0) return0;
}
/* no more c, so require all 1 bits in a */
if (asize < dlimbs) return0; /* not enough a */
/* whole limbs */ for ( ; i < dlimbs; i++) if (ap[i] != GMP_NUMB_MAX) return0;
/* if only whole limbs, no further fetches from a */ if (dbits == 0) return1;
/* need enough a */ if (asize == dlimbs) return0;
return ((ap[dlimbs]+1) & dmask) == 0;
}
}
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.10 Sekunden
(vorverarbeitet am 2026-09-27)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.