Ver Mensaje Individual
  #1 (permalink)  
Antiguo 31/05/2012, 14:55
capixi
 
Fecha de Ingreso: abril-2011
Ubicación: Alicante
Mensajes: 52
Antigüedad: 13 años, 6 meses
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