in reply to Re: Incrementing a large number without Math::BigInt
in thread Incrementing a large number without Math::BigInt

I'd like it to go as fast as possible and not restrict myself to a certain size, if possible. Doing some tests on my 400mhz laptop, it takes about 5 minutes to create a number with 10 million digits. I haven't tried incrementing it at all.
use Math::BigInt; my $i = 10000000; while (1) { my $num = Math::BigInt->new('1' . '0' x $i); print $i . "\n"; $i++; }
Update: As a side note, Math::BigInt has some really weird memory usage. It jumps around like crazy, but my first test used about 50 megabytes on average while the second uses about 160.

Replies are listed 'Best First'.
Re^3: Incrementing a large number without Math::BigInt
by GrandFather (Saint) on Apr 26, 2006 at 03:00 UTC

    You may be interested that:

    use strict; use warnings; my $i = 100000000; my $num = '9' x $i; $num++; print length ($num) . ' ' . substr $num, 0, 10;

    Prints:

    100000001 1000000000

    and executes in about 1 second.


    DWIM is Perl's answer to Gödel
      Wow, that is impressive. Silly me, not even trying the obvious way because I thought Perl couldn't handle it. I've learned my lesson.

      Just curious, what other numerical operations can Perl handle as a string that it can't handle as a number? Deincrementing doesn't seem to work.

        Only auto-increment (++) is magical in that fashion and only when the variable is a "string". From perlop:

        The auto-increment operator has a little extra builtin magic to it. If you increment a variable that is numeric, or that has ever been used in a numeric context, you get a normal increment. If, however, the variable has been used in only string contexts since it was set, and has a value that is not the empty string and matches the pattern /^a-zA-Z*0-9*\z/, the increment is done as a string, preserving each character within its range, with carry:
        print ++($foo = '99'); # prints '100' print ++($foo = 'a0'); # prints 'a1' print ++($foo = 'Az'); # prints 'Ba' print ++($foo = 'zz'); # prints 'aaa'
        The auto-decrement operator is not magical.

        DWIM is Perl's answer to Gödel