package math_module; sub get_det($\@) { my ($m__size, $m_matrix)=@_; my $m_det=0; my @new_matrix; my $i_mat; if ($m__size ==1) { return $$m_matrix[0][0]; # Line 10 } if ( $m__size ==2) { $m_det=$$m_matrix[0][0]*$$m_matrix[1][1]-$$m_matrix[0][1]*$$m_matrix[1][0]; return $m_det; } else { for ($i_mat=0; $i_mat<$m__size; $i_mat++) { # Line 20 for ($m_r=1; $m_r<$m__size; $m_r++) { my $k_ajust=0; # Line 23 for ($m_k=0; $m_k < $m__size; $m_k++) { if ($m_k != $i_mat) { $new_matrix[$m_r-1][$m_k-$k_ajust] =$$m_matrix[$m_r][$m_k]; } else # Line 30 { $k_ajust=1; } } } $m_det=$m_det + (-1)**(2+$i_mat) * $$m_matrix[0][$i_mat] * get_det($m__size-1, \@new_matrix); } return $m_det; } } # Line 40 sub get_inverse ($\@) { my ($matrix_size, $m) =@_; for ($i=0; $i<$matrix_size; $i++) { for ($j=0; $j<$matrix_size; $j++) { $m5[$i][$j]=$$m[$i][$j]; $mt[$i][$j]=$$m[$j][$i]; } # Line 50 } for ($ii=0; $ii<$matrix_size; $ii++) { for ($jj=0; $jj<$matrix_size; $jj++) { @aa=remove_row_col($ii,$jj,$matrix_size, @m5); $inverse_matrix[$ii][$jj]=math_module::get_det($matrix_size-1, @aa) / math_module::get_det($matrix_size,@mt); $inverse_matrix[$ii][$jj]=((-1)**($ii+$jj+2))*$inverse_matrix[$ii][$jj]; } } # Line 60 for ($ii=0; $ii<$matrix_size; $ii++) { for ($jj=0; $jj<$matrix_size; $jj++) { $inverse_matrix1[$ii][$jj]=$inverse_matrix[$jj][$ii]; } } return @inverse_matrix1; } sub remove_row_col ($$$@) { my ($X_X, $Y_Y, $matrix_size, @matrix) =@_; for($i_i=0; $i_i < $matrix_size-1; $i_i++) { for($j_j=0; $j_j < $matrix_size; $j_j++) { if ($i_i < $X_X) { $new_matrix[$i_i][$j_j]=$matrix[$i_i][$j_j]; } if ($i_i >= $X_X) { $new_matrix[$i_i][$j_j]=$matrix[$i_i+1][$j_j]; } } } for($i_i=0; $i_i < $matrix_size-1; $i_i++) { for($j_j=0; $j_j < $matrix_size-1; $j_j++) { if ($j_j < $Y_Y) { $new_matrix[$i_i][$j_j]=$new_matrix[$i_i][$j_j]; } if ($j_j >= $Y_Y) { $new_matrix[$i_i][$j_j]=$new_matrix[$i_i][$j_j+1]; } } $new_matrix[$i_i][$matrix_size-1]=""; } return @new_matrix; } return 1;