my $prod = Math::BigInt->new( 1 ); $prod->bmul( $_ ) for split m{}, $nVal->bstr(); #### my $prod = Math::BigInt->new( 1 ); my %digits; $digits{ $_ } ++ for split m{}, $nVal->bstr(); $prod->bmul( $_ ) for map { $digits{ $_ } > 1 ? Math::BigInt->new( $_ )->bpow( $digits{ $_ } ) : $_ } keys %digits; #### use 5.018; use warnings; use Math::BigInt; use Time::HiRes qw{ gettimeofday tv_interval }; use Fcntl; STDOUT->autoflush( 1 ); STDERR->autoflush( 1 ); my $startDigits; my $stopDigits; if ( scalar @ARGV == 2 ) { ( $startDigits, $stopDigits ) = @ARGV; } elsif ( scalar @ARGV == 1 ) { $startDigits = 2; $stopDigits = shift; } else { $startDigits = 2; $stopDigits = 8; } my $maxSteps = 0; my $nTried = 0; my $rcGenDigits; $rcGenDigits = sub { my( $depth, $start ) = @_; return [] unless $depth; my $raValues; foreach my $digit ( $start .. 9 ) { my $raInner = $rcGenDigits->( $depth - 1, $digit ); push @{ $raValues }, scalar @{ $raInner } ? map { $digit . $_ } @{ $raInner } : $digit; } return $raValues; }; my $steps; my $raRecord; my $startTV = my $lastTV = [ gettimeofday() ]; my $nowTV; my $elapsed; my $delta; foreach my $nDigits ( $startDigits .. $stopDigits ) { print q{ } x $stopDigits, qq{\rGenerating ${nDigits}-digit values ... }; my $raValues = $rcGenDigits->( $nDigits, 1 ); $nowTV = [ gettimeofday() ]; $delta = tv_interval( $lastTV, $nowTV ); $elapsed = tv_interval( $startTV, $nowTV ); $lastTV = $nowTV; say qq{found @{ [ scalar @{ $raValues } ] }, }, qq{took @{ [ scaleSecs( $delta ) ] }\n}, qq{Trying ${nDigits}-digit values, }, qq{at elapsed time @{ [ scaleSecs( $elapsed ) ] }\n}; foreach my $value ( @{ $raValues } ) { $nTried ++; print STDERR qq{$value\r} unless $nTried %1000; $raRecord = []; try( $value ); } $nowTV = [ gettimeofday() ]; $delta = tv_interval( $lastTV, $nowTV ); $lastTV = $nowTV; say q{ } x $stopDigits, qq{\nTrying ${nDigits}-digit values }, qq{took @{ [ scaleSecs( $delta ) ] }\n}; } say q{ } x $stopDigits, q{}; $nowTV = [ gettimeofday() ]; $elapsed = tv_interval( $startTV, $nowTV ); say qq{Total elapsed time @{ [ scaleSecs( $elapsed ) ] }\n}; sub per { my $nStr = shift; my $nVal = Math::BigInt->new( $nStr ); push @{ $raRecord }, [ $steps ++, $nVal->bstr() ]; return if $nVal->bcmp( 10 ) == -1; my $prod = Math::BigInt->new( 1 ); my %digits; $digits{ $_ } ++ for split m{}, $nVal->bstr(); $prod->bmul( $_ ) for map { $digits{ $_ } > 1 ? Math::BigInt->new( $_ )->bpow( $digits{ $_ } ) : $_ } keys %digits; return per( $prod->bstr() ); } sub scaleSecs { my $tv = shift; my $secs = int $tv; my( $fracPart ) = $tv =~ m{(?<=\.)(\d+)}; my $wks = 0; my $days = 0; my $hrs = 0; my $mins = 0; while($secs >= 604800) { $wks ++; $secs -= 604800; } while($secs >= 86400) { $days ++; $secs -= 86400; } while($secs >= 3600) { $hrs ++; $secs -= 3600; } while($secs >= 60) { $mins ++; $secs -= 60; } my $retStr = ( $wks ? qq{${wks}w } : q{} ) . ( $days ? qq{${days}d } : q{} ) . ( $hrs ? qq{${hrs}h } : q{} ) . ( $mins ? qq{${mins}m } : q{} ) . qq{$secs.${fracPart}s}; } sub try { my $nStr = shift; $steps = 0; per( $nStr ); my $actualSteps = $steps - 1; if ( $actualSteps > $maxSteps ) { $nowTV = [ gettimeofday() ]; $elapsed = tv_interval( $startTV, $nowTV ); say q{ } x $stopDigits, qq{\rFound steps: $actualSteps -- }, qq{at elapsed time @{ [ scaleSecs( $elapsed ) ] }}; printf qq{%7d %s\n}, @{ $_ } for @{ $raRecord }; $maxSteps = $actualSteps; } } #### Generating 2-digit values ... found 45, took 0.000142s Trying 2-digit values, at elapsed time 0.000142s Found steps: 1 -- at elapsed time 0.000444s 0 11 1 1 Found steps: 2 -- at elapsed time 0.002256s 0 25 1 10 2 0 Found steps: 3 -- at elapsed time 0.00473s 0 39 1 27 2 14 3 4 Found steps: 4 -- at elapsed time 0.009294s 0 77 1 49 2 36 3 18 4 8 Trying 2-digit values took 0.010699s Generating 3-digit values ... found 165, took 0.000462s Trying 3-digit values, at elapsed time 0.011303s Found steps: 5 -- at elapsed time 0.06251s 0 679 1 378 2 168 3 48 4 32 5 6 Trying 3-digit values took 0.057506s Generating 4-digit values ... found 495, took 0.001567s Trying 4-digit values, at elapsed time 0.070376s Found steps: 6 -- at elapsed time 0.249183s 0 6788 1 2688 2 768 3 336 4 54 5 20 6 0 Trying 4-digit values took 0.187418s Generating 5-digit values ... found 1287, took 0.00469s Trying 5-digit values, at elapsed time 0.262484s Found steps: 7 -- at elapsed time 0.773186s 0 68889 1 27648 2 2688 3 768 4 336 5 54 6 20 7 0 Trying 5-digit values took 0.522252s Generating 6-digit values ... found 3003, took 0.016299s Trying 6-digit values, at elapsed time 0.801035s Trying 6-digit values took 1.34961s Generating 7-digit values ... found 6435, took 0.029679s Trying 7-digit values, at elapsed time 2.180324s Found steps: 8 -- at elapsed time 4.382705s 0 2677889 1 338688 2 27648 3 2688 4 768 5 336 6 54 7 20 8 0 Trying 7-digit values took 3.047357s Generating 8-digit values ... found 12870, took 0.069061s Trying 8-digit values, at elapsed time 5.296742s Found steps: 9 -- at elapsed time 10.071529s 0 26888999 1 4478976 2 338688 3 27648 4 2688 5 768 6 336 7 54 8 20 9 0 Trying 8-digit values took 6.295458s Total elapsed time 11.593337s #### Generating 26-digit values ... found 18156204, took 4m 56.352544s Trying 26-digit values, at elapsed time 4m 56.352544s Found steps: 1 -- at elapsed time 4m 56.352979s 0 11111111111111111111111111 1 1 Found steps: 2 -- at elapsed time 4m 56.35532s 0 11111111111111111111111125 1 10 2 0 Found steps: 3 -- at elapsed time 4m 56.35849s 0 11111111111111111111111139 1 27 2 14 3 4 Found steps: 4 -- at elapsed time 4m 56.364262s 0 11111111111111111111111177 1 49 2 36 3 18 4 8 Found steps: 5 -- at elapsed time 4m 56.408053s 0 11111111111111111111111679 1 378 2 168 3 48 4 32 5 6 Found steps: 6 -- at elapsed time 4m 56.552653s 0 11111111111111111111116788 1 2688 2 768 3 336 4 54 5 20 6 0 Found steps: 7 -- at elapsed time 4m 56.92614s 0 11111111111111111111168889 1 27648 2 2688 3 768 4 336 5 54 6 20 7 0 Found steps: 8 -- at elapsed time 4m 58.708825s 0 11111111111111111112677889 1 338688 2 27648 3 2688 4 768 5 336 6 54 7 20 8 0 Found steps: 9 -- at elapsed time 5m 1.542849s 0 11111111111111111126888999 1 4478976 2 338688 3 27648 4 2688 5 768 6 336 7 54 8 20 9 0 Found steps: 10 -- at elapsed time 5m 19.523648s 0 11111111111111113778888999 1 438939648 2 4478976 3 338688 4 27648 5 2688 6 768 7 336 8 54 9 20 10 0 Found steps: 11 -- at elapsed time 9m 34.047507s 0 11111111111277777788888899 1 4996238671872 2 438939648 3 4478976 4 338688 5 27648 6 2688 7 768 8 336 9 54 10 20 11 0 Trying 26-digit values took 3h 46m 34.174622s Generating 27-digit values ... found 23535820, took 6m 47.473396s Trying 27-digit values, at elapsed time 3h 58m 18.000562s Trying 27-digit values took 4h 57m 27.198992s Total elapsed time 8h 55m 47.367434s