• Publicidad

Ayuda con programa números primos

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

Ayuda con programa números primos

Notapor QUEDIFICILPERL » 2005-06-01 19:57 @873

He estado intentando sacar un programa que calcule números primos y me preguntaba si alguien del foro lo ha hecho ya (pero con programación simple o básica :twisted: )

Lo seguiré intentando y cuando lo saque lo publicaré :twisted:
QUEDIFICILPERL
Perlero nuevo
Perlero nuevo
 
Mensajes: 15
Registrado: 2004-11-17 14:07 @630
Ubicación: México

Publicidad

Notapor kidd » 2005-06-02 07:48 @366

Hola:

Checate el siguiente artículo:
http://www.stonehenge.com/merlyn/UnixReview/col26.html

SALUDOS
Uriel Lizama Perl programmer fundador de Perl en Español
Perl Programming Language
Avatar de Usuario
kidd
Creador de Perl en Español
Creador de Perl en Español
 
Mensajes: 1166
Registrado: 2003-10-15 16:52 @744
Ubicación: México

Gracias Kidd

Notapor QUEDIFICILPERL » 2005-06-02 15:59 @708

gracias Kidd ya lo cheque pero creo que necesito estudiar un poco más, saludos

:twisted:
QUEDIFICILPERL
Perlero nuevo
Perlero nuevo
 
Mensajes: 15
Registrado: 2004-11-17 14:07 @630
Ubicación: México

PROGRAMA QUE CALCULA LOS NUMEROS NO PRIMOS

Notapor QUEDIFICILPERL » 2005-06-02 21:54 @954

:twisted:

Hola. No me podía ir a dormir si no intentaba por última vez hallar mi propia forma de resolver el problema de los números primos con lo único que se (forma diferente a la que me sugirió kidd), pero en mi búsqueda hallé algo curioso:

Hice un programa que me calcula los números no primos del 1 al 200 del cual el código es el siguiente:

Código: Seleccionar todo
for ($n=2;$n<=200;$n++)
{
   for($m=2;$m<$n;$m++)
      {
        $primo= $n % $m;
       
         if ($primo==0)
            {
              print "del 2 al 2000 no es primo el $n\n";
              last;
            }
       }
}
Pregunta ¿de alguna forma y a partir de este programa puedo hallar los números primos?
QUEDIFICILPERL
Perlero nuevo
Perlero nuevo
 
Mensajes: 15
Registrado: 2004-11-17 14:07 @630
Ubicación: México

Notapor kidd » 2005-06-02 22:29 @978

Hola:

Realmente en el artículo que te dí vas a encontrar de las mejores formas de conseguir lo que quieres, y aparte usando sencillas operaciones matemáticas.

Te recomiendo que estudies un poco el artículo, es bastante sencillo y más porque va implementando el código poco a poco para que comprendas cómo funciona.

NOTA: Si alguien siguiendo la discusión no comprende que son los número primos :roll: aquí va unos links para que aprendan un poco de matemáticas :wink:
http://thales.cica.es/rd/Recursos/rd97/ ... rimos.html
http://descartes.cnice.mecd.es/Algebra/ ... ompues.htm


SALUDOS
Uriel Lizama Perl programmer fundador de Perl en Español
Perl Programming Language
Avatar de Usuario
kidd
Creador de Perl en Español
Creador de Perl en Español
 
Mensajes: 1166
Registrado: 2003-10-15 16:52 @744
Ubicación: México

Que tal

Notapor QUEDIFICILPERL » 2005-06-04 00:04 @044

:twisted:

Que tal kidd, ya leí el artículo sobre números primos que me sugeriste, gracias, está buenísimo.
Cuando tengas tiempo me gustaría que me sugirieras algún ejercicio o problemilla que me ayude a mejorar mis conceptos de Perl, no se, de esos ejercicios que te enseñen algo, gracias :twisted:
QUEDIFICILPERL
Perlero nuevo
Perlero nuevo
 
Mensajes: 15
Registrado: 2004-11-17 14:07 @630
Ubicación: México

Notapor kidd » 2005-06-04 10:07 @463

Hola:

Siguiendo con lo que estamos haciendo de matemáticas, podrías hacer un ejercicio y hacer un script que te saque la sucesión de Fibonacci.

Aquí te pongo un link que explica en que consiste:
http://www.geocities.com/Athens/Acropol ... ibonac.htm


SALUDOS
Uriel Lizama Perl programmer fundador de Perl en Español
Perl Programming Language
Avatar de Usuario
kidd
Creador de Perl en Español
Creador de Perl en Español
 
Mensajes: 1166
Registrado: 2003-10-15 16:52 @744
Ubicación: México

Sucession de Fibonacci

Notapor macgregor » 2005-06-08 04:38 @235

Hola a todos.

Respecto a la sucesion de fibonacci.

1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368, 75025, 121393, 196418, 317811, 514229.....

Para calcular la sucesión hay varias posibilidades. La más instructiva desde el punto de vista de la programación creo que es mediante la recursividad.
(Siempre en todo problema la solución más eficiente es aquella que tiene coste constante, solución que expongo más abajo).

El número de fibonacci se calcula como
f(1)=1 caso base
f(2)=1 caso base
f(n)=f(n-1)+f(n-2) caso recursivo


La verdad es que hace mucho tiempo que no me veo en la necesidad de utilizar la recursividad y para ser sinceros este va a ser mi primera función recursiva en perl :) espero que este bien 8D

Código: Seleccionar todo
sub fibo
{
  my $n=@_[0];
 
  if ($n==0){return 1;}
  else
  {
     if ($n==1){return 1;}
     else
     {
        return( fibo($n-1)+fibo($n-2) );
     {
  }
}


Ahora bastaria (por ejemplo) con crear un bucle que guarde los resultados de cada número en un vector y los muestre por pantalla.

Mediante la recursividad si se pretenden calcular los 100 primeros números y mostrarlos por pantalla veremos que el ordenador tarda un poco en mostrar el resultado.
Si se pretenden mostrar los 101 primeros de la sucesión al trabajar con números cada vez más grandes el tiempo se incrementa de forma exponencial :(

También existe la solución a esta sucesión con coste de ejecución constante, por lo tanto más eficiente.
Consiste en crear un vector con tantas posiciones como números queramos calcular (en Perl con crearlo basta XD )

En las dos primeras posiciones ponemos los dos casos base (dos unos).
Y el resto los calculamos modificando la función del caso recursivo.
(¡¡¡cada valor es igual a la suma de sus dos anteriores!!!)
Código: Seleccionar todo
$num= cantidad de números que se quieren calcular de la serie;

@fibo=('1','1');
for (my $i=2;$i=$num;$i++)
{
   $fibo[$i]=$fibo[$i-1]+$fibo[$i-2];
}
$"=',';
print @fibo;


De hecho con esta función se pueden calcular muchísimos números de la sucesión de fibonacci, mientras que con la versión recursiva además de tardar más es muy probable que suceda un error de desbordamiento interno de pila :(

Espero que esto sirva para activar las neuronas y le sea útil a alguien.

(KIDD creo que si pones esto un poco mejor explicado y algún ejemplo más como el cálculo del factorial en un tutorial sobre recursividad recibiría muchas visitas).

Un saludo

MAC.
MACGREGOR [TM]
Avatar de Usuario
macgregor
Perlero nuevo
Perlero nuevo
 
Mensajes: 80
Registrado: 2004-12-09 07:32 @355
Ubicación: españa

Recursividad

Notapor macgregor » 2005-06-08 04:55 @246

En el mensaje anterior parece que dejé en mal lugar a la recursividad y no es esa mi intención.

Suele ser una solución muy intuitiva y sencilla de programar.

En el caso de los números de fibonacci al tratar con números muy grandes se llega a tener problemas de memoria, pero normalmente no sucede esto.

Además aunque con recursividad se realizan muchas veces los mismos cálculos, hay que tener en cuenta que los aciertos de la caché serán altísimos, mientras que sin recursividad hay menos aciertos :shock:

En el caso de fibonacci por el tipo de datos la solución más rápida y efectiva es la segunda, pero muchas veces la solución recursiva es la más potente y sencilla.

PD: hace unos años un profesor de programación de la universidad nos puso como problema calcular de forma recursiva el número de fibonacci que desbordaba las maquinas SUN del laboratorio.

Todos dimos el mismo resultado y nos suspendió a todos :shock:
Nos dijo: Ese es el último número que la máquina es capaz de calcular, no el que hace desbordar la pila..... :cry:
MACGREGOR [TM]
Avatar de Usuario
macgregor
Perlero nuevo
Perlero nuevo
 
Mensajes: 80
Registrado: 2004-12-09 07:32 @355
Ubicación: españa

Notapor kidd » 2005-06-08 08:39 @402

Hola:

Desde cuando puse el planteamiento del problema estuve probando y llegué a una posible solución. Aquí se las pongo a ver que les parece:
Código: Seleccionar todo
#!/usr/bin/perl -w

use strict;

#Números iniciales
my ($a,$b) = (1,1);

#Switch para que siga el bucle while
my $loop = "true";

#Vamos a calcular los números hasta:
my $ln = 100000000;


while($loop eq "true"){

    print "$a\n"; #imprimimos el número
    ($a, $b) = ($b, $a+$b); #asignamos nuevos valores

      $loop = "false" if $a > $ln; #checamos si llegamos al límite
}


La opción no usa recursividad como la de MacGregor, pero es bastante eficiente.

Si tienen otras soluciones pónganlas; es interesante ver como cada uno de nosotros llega a la solución de problemas :wink:


SALUDOS
Uriel Lizama Perl programmer fundador de Perl en Español
Perl Programming Language
Avatar de Usuario
kidd
Creador de Perl en Español
Creador de Perl en Español
 
Mensajes: 1166
Registrado: 2003-10-15 16:52 @744
Ubicación: México

Siguiente

Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados