Artículos

2.1: El tamiz de Eratóstenes


Un primo es un número entero mayor que 1 que solo es divisible por 1 y por sí mismo. Los números enteros 2, 3, 5, 7, 11 son números primos. Tenga en cuenta que cualquier número entero mayor que 1 que no sea primo se dice que es un compuesto número.

El tamiz de Eratóstenes

El tamiz de Eratóstenes es un método antiguo para encontrar números primos hasta un entero especificado. Hay varios otros métodos que se utilizan para determinar si un número es primo o compuesto. Primero presentamos un lema que será necesario en la demostración de varios teoremas.

Todo entero mayor que uno tiene un divisor primo.

Presentamos la prueba de este Lema por contradicción. Suponga que hay un número entero mayor que uno que no tiene divisores primos. Dado que el conjunto de números enteros con elementos mayores que uno sin divisores primos no está vacío, entonces, según el principio de ordenamiento correcto, existe un entero menos positivo (n ) mayor que uno que no tiene divisores primos. Por lo tanto, (n ) es compuesto ya que (n ) divide (n ). Por lo tanto, [n = ab mbox {con} 1

Si (n ) es un número entero compuesto, entonces n tiene un factor primo que no excede ( sqrt {n} ).

Como (n ) es compuesto, entonces (n = ab ), donde (a ) y (b ) son números enteros con (1 sqrt {n} ), entonces

[ sqrt {n}

y como un resultado

[ab> sqrt {n} sqrt {n} = n. ]

Por lo tanto (a leq sqrt {n} ). Además, según el Lema 3, (a ) debe tener un divisor primo (a_1 ) que también es un divisor primo de (n ) y, por lo tanto, este divisor es menor que (a_1 leq a leq sqrt {norte}).

Ahora presentamos el algoritmo del Tamiz de Eratóstenes que se usa para determinar números primos hasta un entero dado.

El algoritmo del tamiz de Eratóstenes

  1. Escribe una lista de números del 2 al número más grande (n ) que quieras probar. Tenga en cuenta que todo entero compuesto menor que (n ) debe tener un factor primo menor que ( sqrt {n} ). Por lo tanto, debe tachar los múltiplos de los números primos que sean menores que ( sqrt {n} )
  2. Tacha todos los múltiplos de 2 mayores que 2 de la lista. El primer número restante de la lista es un número primo.
  3. Tacha todos los múltiplos de este número de la lista.
  4. Repita los pasos anteriores hasta que no se encuentren más múltiplos de los números primos que sean menores que ( sqrt {n} )

Ejercicios

  1. Usa el tamiz de Eratóstenes para encontrar todos los números primos menores que 100.
  2. Usa el tamiz de Eratóstenes para encontrar todos los números primos menores a 200.
  3. Demuestre que ningún número entero de la forma (a ^ 3 + 1 ) es primo excepto (2 = 1 ^ 3 + 1 ).
  4. Demuestre que si (2 ^ n-1 ) es primo, entonces (n ) es primo.
    Sugerencia: use la identidad ((a ^ {kl} -1) = (a ^ {k} -1) (a ^ {k (l-1)} + a ^ {k (l-2)} +. .. + a ^ k + 1) ).

Complejidad del tiempo: Tamiz de Eratóstenes

Cuando intentamos hacer una función hash (por favor refiérase a la función de hash de Java), necesitamos usar un primo como base de la función hash para evitar que se colisionen. Aunque hay tres métodos que se pueden utilizar para generar un número primo. Pero, Sieve of Eratosthenes entre estas funciones principales es un algoritmo muy popular y simple.

El concepto de Sieve of Eratosthenes es eliminar todos los múltiplos imposibles, los pasos como:

  1. Quita los números múltiplo de 2
  2. Quita los números múltiplo de 3
  3. Quita los números múltiplo de 5

Algoritmo (Tamiz de Eratóstenes):Suponga que la matriz a contiene el booleano de los números de 1 a n. Enumere todos los números primos hasta n. La complejidad del tiempo del algoritmo es O (nloglogn).

Análisis:Al principio, deberíamos saber que la complejidad temporal de la serie armónica es O (logn). Ahora, analice el tamiz de eratóstenes.

El bucle interno se puede expresar mediante:
j = 2, el bucle interno se ejecutará → el límite superior es (n / 2) veces
j = 9, el bucle interno se ejecutará → el límite superior es (n / 3) veces
j = 25, el bucle interno se ejecutará → el límite superior es (n / 5) veces

j = n, el bucle interno se ejecutará → el límite superior es 1 veces

La complejidad temporal de la serie anterior es menor que la serie armónica: n / 2 + n / 4 + .. + 1 → n (1/2 + 1/3 + 1/4 +… 1 / n), según la serie armónica y Big -O, podemos concluir que la complejidad del tiempo del bucle interno es O (registro). Pero, como sabemos, el algoritmo que se muestra arriba, tamizará algunos números antes de la ejecución. Por lo tanto, los tiempos del ciclo de ejecución deben ser n (1/2 + 1/3 + 1/5 + 1/7 + 1/11 + 1/13 +…). Por eso, en algún artículo, la complejidad temporal se define en O (loglogn). (La p es prima en la siguiente ecuación)


El tamiz de Eratóstenes

Eratóstenes fue el tercer bibliotecario de la famosa biblioteca de Alejandría y un erudito destacado. El tamiz de Eratóstenes es un algoritmo para recopilar números primos, cuya invención se le atribuye. Se pueden encontrar más detalles en el enlace de Wikipedia para Eratosthenes (http://en.wikipedia.org/wiki/Eratosthenes).

El algoritmo funciona de la siguiente manera :

Para recopilar todos los números primos por debajo de un cierto número (digamos N), comience identificando primero todos los números compuestos y eliminándolos de una secuencia numérica predefinida (1 a N). Por lo tanto, lo que queda son todos números primos.

La identificación de números compuestos se realiza encontrando iterativamente los múltiplos de todos los números desde 2 (1 no es un número primo) hasta el límite máximo y eliminando los números compuestos en cada paso.

Es decir, se eliminan todos los múltiplos de 2 (excepto el 2 en sí). Se encuentra el siguiente número disponible. En este caso es 3.

Luego, se eliminan todos los múltiplos de 3 (excepto el 3 en sí). Se encuentra el siguiente número disponible. En este caso es 5.

Luego, se eliminan todos los múltiplos de 5 (excluyendo el 5 en sí). Se encuentra el siguiente número disponible. En este caso es 7.

Y así sucesivamente hasta alcanzar el límite máximo.

Intento aquí proporcionar una implementación de SAP del Tamiz de Eratóstenes.

DATOS: var tipo i, max tipo i,

temp tipo i, recuento tipo i valor 2,

t_prime tipo tabla de i, wa_prime tipo i.

PANTALLA DE SELECCIÓN comienza del bloque b1 con el marco.

PANTALLA DE SELECCIÓN final del bloque b1.

BORRAR t_prime de 1 a 1.

BORRAR t_prime donde table_line = temp.

LEER TABLA t_prime en wa_prime con la clave table_line = var.

LEER TABLA t_prime en var index var.

LOOP AT t_prime en wa_prime.

Una ejecución del programa anterior ha arrojado resultados precisos al encontrar todos los números primos hasta 30.000.

Estoy seguro de que esto se puede optimizar aún más, tanto en términos de lógica como de implementación.

Sin embargo, he intentado permanecer fiel al algoritmo original del tamiz de Eratóstenes.


Para ayudarlo a comprender mejor los números primos, le explicaremos un ejercicio.

Sara tiene 6 caramelos que quiere compartir, pero no sabe con cuántas personas puede compartirlos para que todos reciban la misma cantidad y no quede ninguno. ¿De cuántas formas puede hacer esto?

Aquí está Sara y sus 6 caramelos:

La primera y más sencilla forma es dárselas a una persona, es decir, dividir entre 1. De esta forma esa persona tendrá 6 caramelos.

La siguiente posibilidad es dividirlos entre 2 personas. Dado que 6 dividido entre 2 es 3, ¡cada persona recibe 3 caramelos!

Vamos a continuar con el siguiente número, 3. Si dividimos 6 caramelos entre 3 personas también es una división exacta y cada persona obtendrá 2 caramelos:

Dejemos que & # 8217s continúe con los números. No tenemos divisiones exactas con 4 y 5, pero sí con 6.

Dado que 6 dividido entre 6 es 1, podemos dar a 6 niños 1 caramelos a cada uno.

Vamos a recopilar información. Tenemos 6 caramelos que podemos compartir (con una división exacta) entre 1, 2, 3 y 6 personas. En otras palabras, podemos dividir el número 6 y obtener 0 como resto cuando lo dividimos entre 1, 2, 3 y 6. Estos números se conocen como divisores de 6..

Vamos a probar con otro número, el 7 por ejemplo.

Ahora Sara tiene 7 caramelos y quiere compartirlos, pero no sabe con cuántas personas puede compartirlos para que todos reciban la misma cantidad y no quede ninguno. ¿De cuántas formas puede hacer esto?

¡Henry tiene tanta suerte! ¡Consiguió todos los dulces!

¿Hay otras formas de hacerlo? No podemos dividir 7 entre 2, 3, 4, 5 o 6, & # 8230, ¡pero 7 es posible!

Sara puede comparta los dulces entre 7 personas, dándoles uno a cada uno:

Entonces, 7 solo se puede dividir entre 1 y 7, sus únicos divisores son 1 y 7. Estos son los tipos de números a los que llamamos números primos.

¿Hay más números primos? ¡Por supuesto! Busquemos & # 8217s más:

  • ¿4? ¡No! Como sus divisores son 1, 2, y 4.
  • ¿Es 5? ¡Sí! Porque sus divisores son 1 y 5.
  • ¿8? ¡No! Como sus divisores son 1, 2, 4, y 8.

En breve, un número es primo si solo tiene 2 divisores: 1 y él mismo.

¡Ahora puedes buscar muchos números primos!


Inicialmente, se supone que cada número es primo, es decir, todos los elementos de isPrime se establecen en 1. Entonces todos los múltiplos de i deben establecerse en 0. Un escaneo final sobre la matriz cuenta el número de primos.

Mi primer intento se basó en una matriz bool en lugar de char, verdadero en lugar de 1 y falso en lugar de 0. Aunque los bool s eran más intuitivos, eran un poco más lentos (& aproximadamente un 7%) porque el escaneo final contenía una rama que a menudo limpiaba la tubería de la CPU después de una mala predicción.

Ambos tipos de datos utilizan 1 byte por elemento. Además, verdadero se representa internamente de forma predeterminada como 1 y falso se representa internamente como 0. Eso significa que el código binario generado por el compilador de C ++ para isPrime es idéntico para bool y char, excepto por el escaneo final más eficiente de char.

Tiempo para lastNumber = mil millones: 13,5 segundos


2.1: El tamiz de Eratóstenes

Dado un número n, imprima todos los números primos menores o iguales an. También se da que n es un número pequeño.

Aporte : n = 10
Producción : 2 3 5 7

Aporte : n = 20
Producción: 2 3 5 7 11 13 17 19

El tamiz de Eratóstenes es una de las formas más eficientes de encontrar todos los números primos menores que n cuando n es menor que 10 millones aproximadamente (Ref Wiki).

Explicación con ejemplo:
Tomemos un ejemplo cuando n = 50. Entonces, necesitamos imprimir todos los números primos menores o iguales que 50.
Creamos una lista de todos los números del 2 al 50.

Según el algoritmo marcaremos todos los números que sean divisibles por 2 y sean mayores o iguales al cuadrado del mismo.

Ahora pasamos a nuestro próximo número 3 sin marcar y marcamos todos los números que son múltiplos de 3 y son mayores o iguales que su cuadrado.

Pasamos a nuestro próximo número 5 sin marcar y marcamos todos los múltiplos de 5 y son mayores o iguales al cuadrado del mismo.

Continuamos este proceso y nuestra mesa final se verá a continuación:

Entonces, los números primos son los que no están marcados: 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47.
Gracias a Krishan Kumar por proporcionar la explicación anterior.
Implementación:
A continuación se muestra la implementación del algoritmo anterior. En la siguiente implementación, se usa una matriz booleana arr [] de tamaño n para marcar múltiplos de números primos.


Contenido

Divisibilidad

Un número primo solo es divisible por uno o por sí mismo, por lo que un número es primo si y solo si no es divisible por ningún número entero mayor que y menos de . Uno solo necesita verificar enteros hasta porque dividir números mayores daría como resultado un cociente menor que .

Aritmética modular

La aritmética modular puede ayudar a determinar si un número no es primo.

  • Si un número no es igual a es congruente con , entonces el número no es primo.
  • Si un número no es igual a termina con un dígito par o , entonces el número no es primo.

Tamiz de Eratóstenes

El Tamiz de Eratóstenes es un algoritmo relativamente simplista para generar una lista de los primeros números primos. Es un método en el que los múltiplos de todos los números primos conocidos se etiquetan como compuestos y luego se tachan, comenzando con múltiplos de dos, luego tres, luego cinco, y así sucesivamente. Por ejemplo, circule el 2 y tache todos los demás múltiplos de dos. Luego encierra en un círculo el 3 y tacha todos los múltiplos de tres. Repita con todos los demás números primos según sea necesario. Aunque es fácil de entender, es ineficaz para encontrar números primos grandes.

Tamiz de Sundaram

El tamiz de Sundaram es un algoritmo relativamente simplista para generar todos los números primos impares, menos de . Es un método por el cual todos los índices tal que tiene un factor no trivial. Emplea el hecho de que y si esta es una factorización no trivial.


Trabajo usando el ejemplo

Paso 1

Cree una memoria que contenga números del 2 al N (aquí tomamos 100).

Paso 2

Marque todos los múltiplos del primer número sin marcar en la memoria que es 2.

Paso 3

Ahora marque todos los múltiplos del siguiente número sin marcar que es 3 en la memoria.

Paso 4

Pase al siguiente número de desmarcar que es 5. Ahora marque todos los múltiplos de 5.

Paso: 5

Pase al siguiente número sin marcar, que es nuestro último número sin marcar en el rango 2 a la raíz cuadrada de N.

Paso: 6

Todos los números restantes sin marcar son nuestros números primos.

Números primos: 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 41, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89 , 97.


Implementación principal

Para ahorrar espacio y tiempo adicionales, a costa de cierta complejidad adicional, elegimos no representar ni siquiera números enteros en nuestro tamiz. En cambio, el elemento en el índice k indicará principalmente el número 2k + 3. Resumimos esta complejidad envolviendo BitSet en una clase que expone métodos especiales de indexación:

Las clases de biblioteca estándar BitSet, List y ArrayList se importan para su conveniencia en un uso posterior:

El tamiz en sí comienza creando una matriz de tamices y luego buscando la primera entrada cero. Todos los múltiplos impares de esta entrada se establecen en verdadero para indicar que son compuestos. Comenzamos con el cuadrado i * i de i, porque todos los múltiplos de i más pequeños que eso ya se habrán establecido como verdaderos al tratar con primos más pequeños. Tenga en cuenta que, de forma predeterminada, un BitSet se inicializa a todos los ceros, como lo requiere el algoritmo.

Cuando terminamos, iteramos a través del tamiz, formando una ArrayList de elementos aún configurados en falso, que devolvemos:


Función omega

omega (k) (o ω (k)) se define como el número de factores primos distintos que tiene k.

k omega (k)
00
10
21
31
41
51
62
71
81
91
102
111
122
131
142
152
161
171
182
191
202
212
222
231
242
251
262
271
282
291
303

Tenga en cuenta que para un m dado, el k más pequeño tal que omega (k) = m viene dado por k = primorial (m). Además, la función crece con bastante lentitud, porque omega (k) ≤ log2(k).


Ver el vídeo: NÚMEROS PRIMOS DEL 1 AL 100 CRIBA DE ERATÓSTENES (Septiembre 2021).