in reply to Division of big integers

Holiday fun !!

#!/usr/bin/perl use strict; # https://perlmonks.org/?node_id=11163460 use warnings; use List::AllUtils qw( zip_by before ); $SIG{__WARN__} = sub { die @_ }; sub bigdivide { my ($t, $d) = map s/^0+(?=.)//r, @_; my $q = ''; my @pad = before { length $t < length $d . 0 x $_ || length $t == $_ + length $d && $t lt $d . 0 x $_ } 0 .. length $t; for( reverse @pad ) { my $digit = 0; while( length $t > $_ + length $d || length $t == $_ + length $d && $t ge $d . 0 x $_ ) { $digit++; $t = bigsubtract( $t, $d . 0 x $_ ); } $q .= $digit; } return $q || 0; } my $xx = '123888888888888888888888888888888888888888888888455555555588 +8888888888888888888888888555555555555'; my $yy = '555333577778888888888888888888888888887555555'; my $quo = bigdivide($xx, $yy); print "bigdivide $quo\n"; { use bigint; my $tmp = ($xx+0) / ($yy+0); print " bigint $tmp\n"; } sub bigsubtract { my ($top, $bottom) = map s/^0+(?=.)//r, @_; if( length $top > length $bottom || length $top == length $bottom && $top ge $bottom ) { my @top = reverse split //, $top; my @bottom = reverse split //, $bottom; my $borrow = 0; my $answer = reverse join '', zip_by { my $digit = $_[0] - ($_[1] // 0) - $borrow; $borrow = $digit >= 0 ? 0 : 1; $digit >= 0 ? $digit : $digit % 10; } \@top, \@bottom; return $answer =~ s/^0+(?=.)//r; } print "failed\n"; use Data::Dump 'dd'; dd undef; return undef; }

Outputs:

bigdivide 2230891374953314563617132232227474545270207356483795 bigint 2230891374953314563617132232227474545270207356483795

Partially tested :)

Replies are listed 'Best First'.
Re^2: Division of big integers
by tybalt89 (Monsignor) on Dec 31, 2024 at 22:28 UTC

    And here's a shorter 'bigdivide'.

    sub bigdivide { my ($t, $d) = map s/^0+(?=.)//r, @_; my $q = 0; $d .= 0 x (my $zeros = length($t) - length $d); for ( 0 .. $zeros ) { $q .= 0; while( defined( my $try = bigsubtract( $t, $d ) ) ) { $t = $try; $q++; } chop $d; } return ($q || 0) =~ s/^0+(?=.)//r; }
    UPDATE: Should be 'defined' in the while :(