My initial though was to just skip the leading zero's in the mpz_set_str function by something like this:
while (isspace( (unsigned char) *sp) || (*sp == '0')) sp++; Only problems is that this doesn't work for negative numbers that still have a bunch of leading zeros; mpz_t v; mpz_init_set_str(v, "-00000000000000000005", 10); would it be too inefficient to do another check for zeros within mpz_set_str right after the check for the sign? while (isspace( (unsigned char) *sp) || (*sp == '0')) sp++; sign = (*sp == '-'); sp += sign; while (*sp == '0') sp++; if (base == 0) { if (*sp == '0') { sp++; ...... Regards, Austyn On Wed, Jul 20, 2016 at 8:04 PM, Axel Miller <axel.mil...@ppi.de> wrote: > Hi! > > The execution of the following code snippet fails with an assertion > "mini-gmp.c:502: mpn_mul_1: Assertion `n >= 1' failed.": > > mpz_t v; > mpz_init_set_str(v, "00000000000000000005", 10); > > > If I remove the leading zeroes, everythine works fine. > > I used mini-gmp.c from GMP 6.1.1. > > Output from uname -a and gcc --version: > > mil@mil-vm-debian64-1:~/mini-gmp$ uname -a > Linux mil-vm-debian64-1 2.6.32-5-amd64 #1 SMP Tue May 13 16:34:35 UTC 2014 > x86_64 GNU/Linux > > mil@mil-vm-debian64-1:~/mini-gmp$ gcc --version > gcc (Debian 4.4.5-8) 4.4.5 > Copyright (C) 2010 Free Software Foundation, Inc. > This is free software; see the source for copying conditions. There is NO > warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR > PURPOSE. > > > The error seems to be in function mpn_set_str_other. > With a sufficient number of leading zeroes in sp, the computation in lines > 1314-1317 will assign zero to the variable w. > > 1314 j = 0; > 1315 w = sp[j++]; > 1316 while (--k != 0) > 1317 w = w * b + sp[j++]; > 1318 > > If we have some digits left, j will still be smaller than sn. Thus, the > loop in line 1321 will be executed at least once: > > 1321 for (rn = (w > 0); j < sn;) > 1322 { > 1323 mp_limb_t cy; > 1324 > 1325 w = sp[j++]; > 1326 for (k = 1; k < info->exp; k++) > 1327 w = w * b + sp[j++]; > 1328 > 1329 cy = mpn_mul_1 (rp, rp, rn, info->bb); > 1330 cy += mpn_add_1 (rp, rp, rn, w); > 1331 if (cy > 0) > 1332 rp[rn++] = cy; > 1333 } > 1334 assert (j == sn); > 1321 for (rn = (w > 0); j < sn;) > > Since w is zero, the loop will assing zero to rn at the beginning. > This causes the assertion in mpn_mul_1 (called in line 1329). > > > HTH > Axel Miller > _______________________________________________ > gmp-bugs mailing list > gmp-bugs@gmplib.org > https://gmplib.org/mailman/listinfo/gmp-bugs _______________________________________________ gmp-bugs mailing list gmp-bugs@gmplib.org https://gmplib.org/mailman/listinfo/gmp-bugs