coreutils
[Top][All Lists]

Re: 70x speed-up for seq's common cases

 From: Jim Meyering Subject: Re: 70x speed-up for seq's common cases Date: Sat, 15 Sep 2012 20:18:12 +0200

Torbjorn Granlund wrote:
> For general seq use, I suppose we should do away with `incr' and instead
> use a general `add'.  Below is a suggested implementation, and as bonus
> also a `sub'.
>
> Like `incr', `add' needs an extra byte if space, since if the end value
> is within the increment from a power of 10, a number with one more digit
> than the end value will be created.
>
> Implementing negative values is a bit tricky.  If a-b is wanted and a <
> b, one must of course compute b-a and separately store a minus sign.  I
> just write a `sub' function, not any code actually handling negative
> numbers.
>
> The function `add' is reasonably well-tested.  The function `sub' is
> minimally tested (but as a trivial edit of `add' it might b correct
> anyway).

Thanks.  I'm sure someone will find time to experiment with those.

Looking at factor.c, I saw this bit of code,
and confirm that the current tests do not exercise it.

{
/* The found factor is two words.  This is highly unlikely, thus hard
to trigger.  Please be careful before you change this code!  */
uintmax_t ginv;

binv (ginv, g0);      /* Compute n = n / g.  Since the result will */
n0 = ginv * n0;       /* fit one word, we can compute the quotient */
n1 = 0;               /* modulo B, ignoring the high divisor word. */

if (!prime2_p (g1, g0))
factor_using_pollard_rho2 (g1, g0, a + 1, factors);
else
factor_insert_large (factors, g1, g0);
}

Can you provide a test case that exercises that code?