Polynomial long division: Difference between revisions

m (shifting '''could''' be always avoided using subarrays; not so interesting anyway)
Line 437:
polyout(q, 'x');
polyout(r, 'x');</lang>
 
=={{header|Perl}}==
This solution keeps the highest power coefficient first, like [[Polynomial long division#OCaml|OCaml solution]] and [[Polynomial long division#Octave|Octave solution]].
 
{{trans|Octave}}
<lang perl>use strict;
use List::Util qw(min);
 
sub poly_long_div
{
my ($rn, $rd) = @_;
my @n = @$rn;
my $gd = scalar(@$rd);
if ( scalar(@n) >= $gd ) {
my @q = ();
while ( scalar(@n) >= $gd ) {
my $piv = $n[0]/$rd->[0];
push @q, $piv;
$n[$_] -= $rd->[$_] * $piv foreach ( 0 .. min(scalar(@n), $gd)-1 );
shift @n;
}
return ( \@q, \@n );
} else {
return ( [0], $rn );
}
}</lang>
 
<lang perl>sub poly_print
{
my @c = @_;
my $l = scalar(@c);
for(my $i=0; $i < $l; $i++) {
print $c[$i];
print "x^" . ($l-$i-1) . " + " if ($i < ($l-1));
}
print "\n";
}</lang>
 
<lang perl>my ($q, $r);
 
($q, $r) = poly_long_div([1, -12, 0, -42], [1, -3]);
poly_print(@$q);
poly_print(@$r);
print "\n";
($q, $r) = poly_long_div([1,-12,0,-42], [1,1,-3]);
poly_print(@$q);
poly_print(@$r);
print "\n";
($q, $r) = poly_long_div([1,3,2], [1,1]);
poly_print(@$q);
poly_print(@$r);
print "\n";
# the example from the OCaml solution
($q, $r) = poly_long_div([1,-4,6,5,3], [1,2,1]);
poly_print(@$q);
poly_print(@$r);</lang>
 
=={{header|Python}}==