roobre

Cálculo del determinante de una matriz cuadrada de orden N

Jun 10th, 2011
237
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 3.58 KB | None | 0 0
  1. #!/usr/bin/perl
  2. #Author @roobre (Roberto Santalla)
  3. use strict;
  4.  
  5. #--Código que he tomado prestado--------------------------------
  6. package List::Permutor;
  7. use strict;
  8. use vars qw($VERSION @ISA @EXPORT @EXPORT_OK);
  9. require Exporter;
  10. @ISA = qw(Exporter);
  11. @EXPORT = qw();
  12. $VERSION = '0.022';
  13. sub new {
  14.     my $class = shift;
  15.     my $items = [ @_ ];
  16.     bless [ $items, [ 0..$#$items ] ], $class;
  17. }
  18. sub reset {
  19.     my $self = shift;
  20.     my $items = $self->[0];
  21.     $self->[1] = [ 0..$#$items ];
  22.     1;      # No useful return value
  23. }
  24. sub peek {
  25.     my $self = shift;
  26.     my $items = $self->[0];
  27.     my $rv = $self->[1];
  28.     @$items[ @$rv ];
  29. }
  30. sub next {
  31.     my $self = shift;
  32.     my $items = $self->[0];
  33.     my $rv = $self->[1];    # return value array
  34.     return unless @$rv;
  35.     my @next = @$rv;
  36.     # The last N items in @next (for 1 <= N <= @next) are each
  37.     # smaller than the one before. Move those into @tail.
  38.     my @tail = pop @next;
  39.     while (@next and $next[-1] > $tail[-1]) {
  40.         push @tail, pop @next;
  41.     }
  42.     # Then there's one more. Right?
  43.     if (defined(my $extra = pop @next)) {
  44.     # The extra one exchanges with the next larger one in @tail
  45.     my($place) = grep $extra < $tail[$_], 0..$#tail;
  46.     ($extra, $tail[$place]) = ($tail[$place], $extra);
  47.     # And the next order is what you get by assembling the three
  48.     $self->[1] = [ @next, $extra, @tail ];
  49.     } else {
  50.         # Guess that's all....
  51.     $self->[1] = [];
  52.     }
  53.     return @$items[ @$rv ];
  54. }
  55. #--Fin del préstamo--------------------------------------------
  56.  
  57. package main;
  58. sub factor {
  59.     my @permutacion = @_;
  60.     my $elementos = $#permutacion + 1;
  61.     my $factor = 1;
  62.     for(my $i = 0; $i < $elementos - 1; $i++){
  63.             for(my $j = $i + 1; $j <= $elementos - 1; $j++){
  64.             if($permutacion[$i] > $permutacion[$j]){
  65.                 $factor = $factor * -1;
  66.             }
  67.             }
  68.     }
  69. return $factor;
  70. }
  71.  
  72. sub printdet {
  73.     my @determinante = @_;
  74.     my $orden = $#determinante + 1;
  75.     for(my $i = 0; $i < $orden; $i++) {
  76.             print("| ");
  77.             for(my $j = 0; $j < $orden; $j++) {
  78.                     print($determinante[$i][$j] . " ");
  79.             }
  80.             print("|");
  81.             print("\n");
  82.     }
  83. return 1;
  84. }
  85.  
  86. sub calculardet {
  87. my @determinante = @_;
  88. my $orden = $#determinante + 1;
  89. my $valor;
  90. if ($orden == 1) {
  91.     $valor = $determinante[0][0];
  92. } else {
  93.     $valor = 0;
  94.     my $fila = 1;
  95.     my $factor;
  96.     my $perm = new List::Permutor 0..$orden-1;
  97.     while (my @set = $perm->next){
  98.         $factor = &factor(@set);
  99.         #print("Usando la permutación @set\n");
  100.         #print("Factor $factor \n");
  101.         for(my $i = 0; $i < $orden; $i++){
  102.             my $permfila = $set[$i];
  103.             $fila = $fila * $determinante[$i][$permfila];
  104.         }
  105.         $fila = $fila * $factor;
  106.         #print("La \"fila\" vale $fila\n\n");
  107.         $valor = $valor + $fila;
  108.         $fila = 1;
  109.     }
  110. }
  111. return $valor;
  112. }
  113.  
  114. system("clear");
  115. print("\n==Cálculo del determinante de una matriz==\n");
  116. print("Ingresa el orden de la matriz: ");
  117. our $orden = <>;
  118. chomp($orden);
  119. my @determinante;
  120. print("\n");
  121. for (my $i = 0; $i < $orden; $i++){
  122.     for (my $j = 0; $j < $orden; $j++){
  123.             print("Introduce el elemento (");
  124.         print($i+1);
  125.         print(",");
  126.         print($j+1);
  127.         print("): ");
  128.         $determinante[$i][$j] = <>;
  129.         chomp($determinante[$i][$j]);
  130.     }
  131. }
  132. #Mostrar el determinante. Saldrá descuadrado con números de dos dígitos =)
  133. print("\n");
  134. print("Determinante recibido: \n");
  135. &printdet(@determinante);
  136. print("\n\n");
  137. print("Valor del determinante: " . &calculardet(@determinante));
  138. print("\n\n");
  139. print("Presiona <Enter> para salir...");
  140. my $foo = <>;
  141. exit(0);
Advertisement
Add Comment
Please, Sign In to add comment