The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
This is a big factor that works reasonably well.  The algorithm
is pretty stupid, but it works.  It will fail to work if there is a prime
factor at about 1.6e19.  But I am not concerned that people will
encounter this in practice because it will fail slooowly. :-)

The only significant improvement that I see is to have a smarter
switch to integer behaviour.  Specifically what I am thinking is
that once you switch to integer operations, you speed up a lot.
If $d, $q and $r are divisor, quotient and remainder, then the
result of $d+= 2 can be calculated by:

$d += 2;
$r -= (2*$q) % $d;
$q -= int((2*$q) / $d);
if ($r < 0) {
    $r = $d + $r;
    $q--;
}

Using this logic with Math::BigInt in effect is a huge loss.  But I
think that using this logic to move to using integer operations
sooner might be a good win..

Regards,
Ben (having fun) Tilly