Foros del Web » Administración de Sistemas » Unix / Linux »

Explicación script números primos, quien se atreve?

Estas en el tema de Explicación script números primos, quien se atreve? en el foro de Unix / Linux en Foros del Web. Este script lo cogí de internet y modifiqué 2 lineas para hacer un trabajo, el script funciona correctamente y muestra los números primos que hay ...
  #1 (permalink)  
Antiguo 31/05/2012, 14:55
 
Fecha de Ingreso: abril-2011
Ubicación: Alicante
Mensajes: 52
Antigüedad: 13 años
Puntos: 3
Información Explicación script números primos, quien se atreve?

Este script lo cogí de internet y modifiqué 2 lineas para hacer un trabajo, el script funciona correctamente y muestra los números primos que hay comprendidos entre el dos y el numero introducido por parámetro: ./primos de 50, sacaría todos los números primos comprendidos entre 2 y 50.
El problema es que no entiendo muy bien como actúa a la hora de calcular los números primos, si alguien pudiera ayudarme y explicarme que es lo que hace exactamente...

Código:
#!/bin/bash
   # Script que calcula los numeros primos menores de uno pasado por parametro en la llamada.
   
   #  Este script testea cada numero candidato a ser primo

   
  LIMITE="$1"                   #Numeros primos a partir de 2 y el parametro pasado $1
 
  Primos()			#Creo la funcion Primos
  {
   (( n = $1 + 1 ))             # n es una lista de numeros que apunta a la siguiente direccion de memoria. Salto al siguiente entero.
   shift                        # Guardo los numeros enteros menores al introducido en la lista, ejemplo si introduco 20 guardo los numeros 							menores que 21
   #echo "_n=$n i=$i_"
  
   if (( n == LIMITE ))		#Cuando llego al limite, si n es igual al limite entonces, muestro todos los parametros.
   then echo $*			#Muestro todos los parametros
   return
   fi
  
   for i; do                    # defino i como "@" para todos los valores previos de $n
     #echo "-n=$n i=$i-"
     (( i * i > n )) && break   # Optimizacion: si i * i (factor*factor) es mayor que n salgo del bucle for. Es el caso base para la recursividad 						El caso que hace que el bucle infinito sea finito, es decir acabe.
      (( n % i )) && continue    # si no es mayor, desplazo fuera a los numeros no primos utlizando el operador modulo, ejemp: de 20%5 el resto0 					por lo tanto primo, y 20%4 el resto es diferente de 0 por lo tanto no es un nomero primo.
      Primos $n $@               # Recursividad en el interior del bucle. Vuelvo a llamar a la funcion primos y le paso el contenido de la lista 						normal y la lista de primos
     return
     done
  
     Primos $n $@ $n            # Recursividad fuera del bucle. Paso a primos la lista de numeros, la lista de primos y la lista de numeros
                                # Sucesivamente se acumulan los parámetros de posición.
                                # $@ "Es la lista de la acumulación de los números primos.
  }
  
  Primos 1
  
   #  Descomenta las lineas de echo para entender mejor lo que hace el algoritmo
  #2 (permalink)  
Antiguo 01/06/2012, 11:43
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Explicación script números primos, quien se atreve?

Es un script recursivo que va calculando los números primos y los agrega a la línea de comandos.

Podés hacer sh -x script para ver cómo se van dando los cálculos.

Cuando pasé el código a un archivo, lo que vi fue un bucle infinito, ese código no es correcto.

Además de los comentarios que ya tiene, agregaría:

* Se guarda en LIMITE el parámetro de la línea de comandos, supongamos 4
* Se llama a la función Primos con el parámetro 1
* Se calcula n como $1 + 1 (en el primer caso, n=2 porque se llamó a Primos con 1)
* shift elimina uno de los argumentos de la línea de comandos, en este caso como solamente hay 1, queda vacía.
* n = 2, LIMITE=4, por lo que no se sale en el IF
* el FOR itera, si está escrito en esta forma abreviada, sobre los argumentos de línea de comandos ($@). En este caso, como el shift eliminó el único que había, no se hace nada.
* Se llama a Primos con $n $@ $n, es decir "Primos 2 2"
* Se vuelve a calcular n, esta vez quedando con el valor 3 (primer argumento + 1).
* shift deja a $@ como "2" en vez de "2 2"
* n=3, LIMITE=4 => no se sale en el IF
* se entra en el FOR con i=2.
* 2*2 = 4 > 3, por lo que se sale del for vía break.
* Se lama a Primos con $n $@ $n, es decir 3 2 3
* Se vuelve a calcular $n, resultando n = 4
* shift elimina el primer 3 de $@, resultando "2 3"
* n=4=LIMITE, se sale por el IF, imprimiendo el resultado "2 3"

Me parece muy rebuscado, a menos que se quiera explicar un concepto puntual yo lo haría así:

Código BASH:
Ver original
  1. X=2
  2. N=10 # o $1 si se quiere utilizar en un script y que tome el primer argumento
  3. RESULTADO=""
  4.  
  5. while (( $X * $X < $N ))
  6. do
  7.     if (( $N % $X ))
  8.     then
  9.         echo -n $X # o imprimimos el número, o lo vamos guardando en una variable
  10.         RESULTADO="$RESULTADO $X"
  11.     fi
  12. done
  13.  
  14. echo $RESULTADO
Puede tener algún error, lo escribí de memoria. Pero se ve claramente que es mucho más simple :)

Saludos.

Última edición por AlvaroG; 03/06/2012 a las 09:07 Razón: borrado comentario que no aplica
  #3 (permalink)  
Antiguo 02/06/2012, 16:43
 
Fecha de Ingreso: abril-2011
Ubicación: Alicante
Mensajes: 52
Antigüedad: 13 años
Puntos: 3
Respuesta: Explicación script números primos, quien se atreve?

Hola AlvaroG, la verdad gracias a ti lo he entendido mucho mejor.
Muchisimas gracias por contestar.

Lo que no me queda claro es lo del bucle infinito...

He estado probando con sh -x Primos.sh 4 y el resultado que me imprime es el siguiente:

capixi ~ $ sh -x ./Primos.sh 4
+ LIMITE=4
+ Primos 1
+ n = 1 + 1
./Primos.sh: 1: n: not found
+ shift
+ n == LIMITE
./Primos.sh: 1: n: not found
+ Primos
+ n = + 1
./Primos.sh: 1: n: not found
+ shift
shift: 1: can't shift that many

Es asi como detectaste el bucle infinito?¿Por qué motivo termina el script?
  #4 (permalink)  
Antiguo 03/06/2012, 09:07
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Explicación script números primos, quien se atreve?

No, disculpa, en realidad ese comentario del bucle infinito quedó de una "versión" anterior de mi respuesta, no se aplica en realidad.


saludos.

Etiquetas: numeros, primo, primos, scripting
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:15.