Criba de Eratóstenes
De Ejercicios
Contenido |
Enunciado
La criba de Eratóstenes, renombrado astrónomo y geógrafo griego del siglo III a. De C., es una técnica para generar números primos. Se comienza escribiendo todos los enteros impares desde 3 hasta N; luego se elimina cada tercer elemento después de 3, cada quinto elemento después de 5, etc., hasta que los múltiplos de todos los enteros impares menores que hayan sido eliminados. Los enteros que quedan constituyen la lista exacta de los números primos entre 3 y N.
Diseñar un algoritmo para generar los números primos entre 2 y N, utilizando la técnica de la criba.
Soluciones
Diseño en Pseudocódigo por lperez
PROCEDIMIENTO Criba (N, VAR primos, VAR t) ENTRADAS: N: ENTERO, controla el número de primos que queremos obtener, N>0. SALIDAS: primos: ARRAY [1..t] DE ENTEROS, contiene los números primos menores que N. t: ENTERO, número de primos encontrados. VARIABLES: aux: ARRAY [m] DE ENTEROS; i, k, pos, j, tope,ele: ENTERO. INICIO i<--3 k<--1 MIENTRAS i<= N HACER aux(k)<--i k<--k+1 i<--i+2 FIN_MIENTRAS k<--k-1 tope<--Redondeo (Raiz(N)) pos<--1 MIENTRAS pos<tope HACER SI aux(pos)<>-1 ENTONCES ele<--aux(pos) PARA j=ele+pos HASTA k CON INCREMENTO DE ele aux(j)<---1 FIN_PARA FIN_SI pos<--pos+1 FIN_MIENTRAS primos(1)<--2 t<--1 PARA i=1 HASTA k CON INCREMENTO DE 1 SI aux(i)<>-1 ENTONCES t<--t+1 primos(t)<--aux(i) FIN_SI FIN_PARA FIN (**************************************************************) PROGRAMA Criba_Erastostenes VARIABLES numero,tamano,i,seguir:ENTERO; resultado:ARRAY[1..tamano] DE ENTEROS; INICIO REPETIR LEER(numero); Criba(numero,resultado,tamano); PARA i=1 HASTA tamano HACER ESCRIBIR resultado(i) LEER seguir; HASTA QUE seguir=0 FIN
Comentario
El algoritmo lee el número hasta el que queremos obtener la secuencia de primos, llama a un procedimiento que calcula dichos números primos y es el algoritmo el que los muestra por pantalla. En el procedimiento se ha utilizado Raiz(), se supone que es una función a la que se le da un número y devuelve un real que es su raíz cuadrada. En cuanto a Redondeo(), se supone que es una función a la que se le da un real y devuelve un entero resultado de redondear el real dado como entrada.
La operación se puede repetir hasta que deseemos terminar.
Programa en Pascal por lperez
program Criba_Erastostenes; uses crt; type vector=array[1..100] of integer; (*************************************) procedure Criba(N:integer; var primos:vector; var t:integer); {ENTRADAS: N: ENTERO, controla el número de primos que queremos obtener, N>0. SALIDAS: primos: ARRAY [1..t] DE ENTEROS, contiene los números primos menores que N. t: ENTERO, número de primos encontrados. } var aux: vector; i, k, pos, j, tope,ele: integer; begin i:=3; k:=1; while i<= N do begin aux[k]:=i; k:=k+1; i:=i+2; end; k:=k-1; tope:=round (sqrt(N)); pos:=1; while pos<tope do begin if aux[pos]<>-1 then begin ele:=aux[pos]; j:=ele+pos; while j<=k do begin aux[j]:=-1; j:=j+ele; end; end; pos:=pos+1 end; primos[1]:=2; t:=1; for i:=1 to k do if aux[i]<>-1 then begin t:=t+1 ; primos[t]:=aux[i]; end; end; (***********************************) var numero,tamano,i,seguir:integer; resultado:vector; begin repeat clrscr; writeln('El programa calcula los n£meros primos desde 2'); writeln(' hasta el número que introduzcas'); write('Introduce un número positivo: '); readln(numero); Criba(numero,resultado,tamano); writeln('Los n£meros primos menores que ',numero,' son:'); for i:=1 to tamano do writeln(resultado[i]); writeln('Si quieres terminar con el programa pulsa 0'); writeln('Si quieres continuar pulsa cualquier otro n£mero'); readln(seguir); until seguir=0; end.