use strict; use warnings; use Math::Pari; my $STRIDE = 8192; # pulled out of a hat mult( @ARGV ); sub mult { my ( $infile, $div, $rem ) = @_; my $n = PARI $div; my $carry = PARI $rem; my $outfile = "$infile.$$"; open my $in, '<', $infile or die "Can't read $infile: $!\n"; open my $out, '>', $outfile or die "Can't write to $outfile: $!\n"; { defined( sysread $in, my $chunk, $STRIDE ) or die "sysread error: $!\n"; last unless length $chunk; my $num = ( $n * PARI( scalar reverse $chunk ) + $carry )->pari_print; print $out scalar reverse substr( $num, -$STRIDE, $STRIDE, '' ); $carry = PARI( $num || 0 ); redo; } ( my $last = $carry->pari_print ) =~ s/^0+//; print $out scalar reverse $last; close $in; close $out; } __END__