• Publicidad

Capacidad de un array

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Capacidad de un array

Notapor otronovato » 2013-08-29 20:31 @896

Estoy con unas funciones que pienso aplicar al criptoanálisis, (cálculo de frecuencias, generación de dígrafos y todos esos rollos). He hecho una función que genera los posibles grupos de dos caracteres para una cadena dada... Y es asombrosa la cantidad de ellos que salen, (como para generar los de tres caracteres...).

Las pruebas las he hecho con conjuntos pequeños, pero a nada que un mensaje se alargue, el array puede ser kilométrico. ¿Sería necesario volcar los conjuntos a un archivo e ir leyéndolos de éste? ¿Dónde estaría el límite?

Por otro lado, en una subrutina de cálculo de factorial, si se calcula el factorial de un número algo por encima de 120, aplicando Stirling, sale "inf" (infinito).

Sin embargo recuerdo, hace años, haber hecho alguna cosa en Perl con números enormes... Pero no recuerdo cómo... ¿Alguna idea?

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. use strict;
  4. use warnings;
  5. use utf8::all;
  6. use constant PI =>4 * atan2(1,1);
  7. use constant E =>2.7182818;
  8. use constant LIM => 100;
  9.  
  10. sub factorial{
  11.  
  12. #Recibe un entero como parámetro
  13. #Devuelve el factorial. Utilizo la aproximación de Stirling para valores superiores a LIM
  14. #y un bucle para los menores.
  15.  
  16.     print "Calculando el factorial de $_[0]\n";
  17.  
  18.     my $n_factorial=1;
  19.    
  20.  
  21.     if($_[0] >= LIM) {
  22.  
  23.         print "Calculando mediante Stirling\n";
  24.         $n_factorial = ($_[0]**$_[0])*(E**(-$_[0]))*sqrt(2*PI*$_[0])*(1 + 1/(12*$_[0]));
  25.     }
  26.     else{
  27.  
  28.         print "Calculando directamente\n";
  29.         for(my $i = $_[0] ; $i > 1 ; $i--){
  30.  
  31.  
  32.             $n_factorial *= $i;
  33.         }
  34.     }
  35.     $n_factorial;
  36.  
  37. }
  38.  
  39. sub var_rep{
  40.  
  41. #Recibe dos parámetros: el total de elementos y el número de seleccionados
  42. #Devuelve el número de variaciones con repetición
  43.  
  44.     print "Calculando las variaciones con repetición de $_[0] elementos tomados de $_[1] en $_[1]\n";
  45.  
  46.     my $var_rep = &factorial($_[0]) / &factorial($_[0]-$_[1]);
  47.    
  48.     print "Hay $var_rep variaciones con repetición\n";
  49. }
  50.  
  51. sub generador_var_rep{
  52.  
  53. #Recibe una cadena y genera todas las variaciones con repetición
  54. # de los n elementos sin repetición de la cadena tomados de 2 en 2.
  55.  
  56.     my @cadena = split //,$_[0];
  57.     my @digrafos;
  58.     my %depuración;
  59.     my @salida;
  60.  
  61.     for(my $ind = 0; $ind <= $#cadena ; $ind++){
  62.  
  63.         for(my $i = 0; $i <= $#cadena ; $i++){
  64.  
  65.             if( $ind != $i) {push @digrafos, $cadena[$ind].$cadena[$i];}
  66.  
  67.         }
  68.     }
  69.  
  70.     foreach(@digrafos){
  71.        
  72.         $depuración{$_}=1;
  73.     }
  74.  
  75.     @salida = sort keys %depuración;
  76.    
  77.     return \@salida;
  78.  
  79. }
  80.  
  81. my $cadena = qw(ABCDE);
  82. my $ref_digrafos = &generador_var_rep($cadena);
  83. my @digrafos = @{$ref_digrafos};
  84. my $num_digrafos = @digrafos;
  85. print $num_digrafos, "\t",join("\t",@digrafos), "\n\n";
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
otronovato
Perlero nuevo
Perlero nuevo
 
Mensajes: 44
Registrado: 2013-08-26 06:12 @300

Publicidad

Re: Capacidad de un array

Notapor explorer » 2013-08-29 21:00 @917

Prácticamente todo lo que quieres hacer ya está hecho en CPAN, así que consultar algún módulo referente a lo que quieres hacer, y ver su código, te puede servir de inspiración.

El límite de un array está en el tamaño de espacio libre de la memoria de tu ordenador.

Para hacer cálculos con números grandes, existe la familia de módulos Math::Big* . Consulta la última sección de perlop, que se llama Bigger Numbers. Por estos foros hemos hecho algunos cálculos así. Usa el sistema de búsqueda para encontrarlos. Busca por Math::BigInt. Ejemplo: Números mayores de 16 dígitos.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: Bing [Bot] y 11 invitados