use strict; use warnings; use Math::Polynomial; use Data::Dumper; #points to interpolate tghrough #(x,y) my @points = @ARGV; my @pair_points; #the followin line is only for debugging @points = ( 1,3,5,9,20,30) ; while ( scalar @points ) { push @pair_points , [ pop @points , pop @points ]; } sub P_j { my $n = scalar @points / 2; my $j = shift; my $pol = Math::Polynomial->new(1); $pol *= $pair_points[$j]->[1]; for( my $k = 0 ; $k < $n ; $k++ ) { my $generic_pol = Math::Polynomial->new( 1, -$pair_points[$k]->[0] ) / ( $pair_points[$j]->[0] - $pair_points[$k]->[0]) unless $k == $j; $pol *= $generic_pol; } return $pol; } print P_j 4;