Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
La criba de Eratóstenes es un algoritmo que permite hallar todos los números primos
menores que un número natural dado N. Se forma una tabla con todos los números
naturales comprendidos entre 2 y N y se van tachando los números que no son primos
de la siguiente manera: cuando se encuentra un número entero que no ha sido tachado,
ese número es declarado primo, y se procede a tachar todos sus múltiplos. El proceso
termina cuando el cuadrado del mayor número confirmado como primo es mayor que N.
Contenido
[ocultar]
• 1 Proceso de criba
• 2 Pseudocódigo
• 3 Implementacion
• 4 Refinamiento
• 5 Véase también
• 6 Referencias
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
3. Tercer paso: Tachamos todos los múltiplos del número que acabamos de
marcar como primo.
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
Resultado: Los números primos comprendidos entre 2 y 20 son: 2, 3, 5, 7, 11, 13, 17,
19.
Pseudocódigo [editar]
Acerca de la notación:
Implementacion [editar]
En lenguaje Python
n=input()
d={}
p=2,
for i in range(2,floor(sqrt(n))+1):
if i not in d.keys():
for j in range(i,n/i+1): d[i*j]=1
for i in range(n,1,-1):
if i not in d.keys(): print i
begin
for Iter in 1 .. 10 loop
count := 0;
Result := count;
end Eratosthenes;
En lenguaje Basic
defint a-z
size=50
dim flags(50)
for i=2 to size
flags(i)=-1
next
for i=2 to sqr(size)
if flags(i) then
for k=i*i to size step i
flags(k)=0
next
end if
next
En lenguaje Bash
#!/bin/bash
UPPER_LIMIT=$1
let SPLIT=UPPER_LIMIT/2
i=1
until (( ( i += 1 ) > SPLIT ))
do
if [[ -n $Primes[i] ]]
then
t=$i
until (( ( t += i ) > UPPER_LIMIT ))
do
Primes[t]=
done
fi
done
echo ${Primes[*]}
exit 0
En Lenguaje de programación C
/* Sieve Of Erathosthenes by Denis Sureau */
#include <stdlib.h>
#include <stdio.h>
printf("1 ");
skip:
prime+=2;
}
puts("");
return;
}
En lenguaje Fortran
logical*2 flags(top)
integer*2 i,j,k,count,iter,prime
n = long(362)
do 92 iter = 1,10
count=0
i=0
do 10 i = 1,top
10 flags(i) = .true.
do 91 i = 1,top
if (.not. flags(i)) go to 91
prime = i + i + 3
count = count + 1
k = i + prime
if (k .gt. top) go to 91
do 60 j = k, top, prime
60 flags(j) = .false.
91 continue
92 continue
write (9,*) count," primes in ",(long(362)-n)/60.0," seconds "
pause
end
int primes = 0;
for (int i = 2; i <= N; i++)
{
if (isPrime[i])
System.out.println(" " + i);
}
}
}
program Eratosthenes;
const N=1000;
begin
for i:=1 TO N do A[i]:=TRUE;
m:=truncC(sqrt(N));
for i:=2 to m do
if a[i] then for j:=2 to N DIV i do a[i*j]:=FALSE;
for i:=1 to N do if a[i] then write(i:4);
end.
En lenguaje Perl
#!/usr/bin/perl
$n = 50;
for ( $i=1; $i<=$n; $i++ ) {
$p[$i] = $i;
}
$k = int( sqrt($n) );
$i=2;
while ( $i <= $k ) {
while ( $p[ $i ] == 0 ) {
$i ++;
}
for ( $j=2; $j<=$n; $j++ ) {
$a = $i * $j;
$p[ $a ] = 0;
}
$i++;
}
for ( $i=1; $i<=$n; $i++ ) {
if ( $p[$i] != 0 ) {
printf ( "%d\n", $p[$i] );
}
}
En lenguaje PHP
<?php
function eratosthenes($n)
{
$all=array();
$prime=1;
echo 1," ",2;
$i=3;
while($i<=$n)
{
if(!in_array($i,$all))
{
echo " ",$i;
$prime+=1;
$j=$i;
while($j<=($n/$i))
{
array_push($all,$i*$j);
$j+=1;
}
}
$i+=2;
}
echo "\n";
return;
}
eratosthenes(50);
?>
En lenguaje Ruby
for i in 2 .. Math.sqrt(top)
next unless sieve[i]
(i*i).step(top, i) do |j|
sieve[j] = nil
end
end
puts sieve.compact.join " "
Module Eratosthenes
'Sieve of Eratosthenes by Marcelo Rivera
Sub Main()
Dim number As Integer
number = 20
Refinamiento [editar]
Una implementación más eficiente requiere crear un arreglo con solo los impares (pues
los pares distintos de 2 ya se sabe que no son primos). En este caso se deben tachar los
múltiplos impares de 3,4,5,...
Los múltiplos impares del primo p = 2i + 3 son (2k + 1)(2i + 3). Debemos tachar desde
k = i + 1 en adelante pues siempre se empieza a tachar desde p2. Note que si k = i + 1
entonces el primer múltiplo de p = 2i + 3 es (2k + 1)(2i + 3) = p2.
Si corresponde tachar los múltiplos del primo k − ésimo pk, se inicia en pues antes de
pk, ya se han tachado 2pk (los pares), 3pk (los múltiplos de 3), 5pk,..., .
Así, si ya no habría algo que tachar, por eso terminamos ahí el programa.
En la implementación se usa un arreglo "esPrimo()" tipo boolean. Aquí, "esPrimo(i)"
representa al número impar 2i + 3.
Así, si se sabe que p = 2i + 3 es primo, sus múltiplos (impares) no son primos, es decir,
debemos poner
"esPrimo(((2k+1)p-3)/2)=false, k=i+1,i+2,..."
En la implementación iniciamos con el arreglo "esPrimo()" con todas sus entradas true.
Iniciando en p = 3, ponemos "esPrimo(((2k+1)3-3)/2)=false, k=0+1,0+2,..." y así
sucesivamente: para cada nuevo i primero preguntamos si "esPrimo(i)=true", si es así,
"tachamos" sus múltiplos poniendo la respectiva entrada "false".
La siguiente función, en VBA, es una función que recibe n y devuelve un arreglo con
los primos (ver más detalles en la segunda referencia)
For i = 0 To max
If esPrimo(i) Then
contaPrimos = contaPrimos + 1 '3,5,...
Primos(contaPrimos) = 2 * i + 3
End If
Next i
Referencias [editar]
• Samuel Horsley (1772). «KOΣKINON EPATOΣΘENOΥΣ. or, The Sieve of
Eratosthenes. Being an Account of His Method of Finding All the Prime
Numbers, by the Rev. Samuel Horsley, F. R. S.». Philosophical Transactions
(1683-1775) 62.
• Walter Mora F.. «Criba de Eratóstenes». Revista digital Matemática: Educación
e Internet 7 (2).
Obtenido de "http://es.wikipedia.org/wiki/Criba_de_Eratóstenes"
Categoría: Tests de primalidad
Vistas
• Artículo
• Discusión
• Editar
• Historial
Herramientas personales
• Registrarse/Entrar
Buscar
Ir Buscar
Navegación
• Portada
• Portal de la comunidad
• Actualidad
• Cambios recientes
• Página aleatoria
• Ayuda
• Donaciones
Crear un libro
Herramientas
En otros idiomas
• Български
• Bosanski
• Català
• Česky
• Dansk
• Deutsch
• English
• Esperanto
• فارسی
• Suomi
• Français
• עברית
• Hrvatski
• Magyar
• Bahasa Indonesia
• Italiano
• 日本語
• ქართული
• 한국어
• Lietuvių
• Македонски
• Nederlands
• Norsk (bokmål)
• Polski
• Português
• Română
• Русский
• Sicilianu
• Simple English
• Slovenčina
• Slovenščina
• Српски / Srpski
• Svenska
• Türkçe
• Українська
• 中文
• Esta página fue modificada por última vez el 20:05, 12 jun 2009.
• Contenido disponible bajo los términos de la Licencia de documentación libre de
GNU (véase Derechos de autor).
Wikipedia® es una marca registrada de la organización sin ánimo de lucro
Wikimedia Foundation, Inc.
• Política de privacidad
• Acerca de Wikipedia
• Limitación de responsabilidad