CyM98 << Los números primos >>

Lecciones anteriores:

Ninguna


Resumen:

Vamos a ver un par de formas de determinar si un número es primo o no. Además discutimos algunas propiedades de los primos.

Importancia de los primos:

Los números primos son aquellos que sólo se pueden dividir por 1 y por si mismos (el 1 no es primo). Ellos tienen un importante papel entre los enteros ya que :

Estos dos resultados son muy importantes, ¡y no son obvios!, aunque la demostración detallada es engorrosa, así que por ahora síganlos creyendo y usando cuando sea necesario.

Buscando Primos:

Una forma de ver si un número es primo es probar dividirlo por todos los números menores que él y si ninguno lo divide, ¡ganamos!, el número es primo. Este método se puede implementar en la siguiente función:

Defint A-Z 'Todas las variables son enteras
Function EsPrimoLenta(N)
     Resultado = -1 
     For i = 2 To N-1
          If N / i = Int ( N / i ) Then
               Resultado = 0 
               Exit For 'Sale del For...Next
          End If
     Next i
     EsPrimoLenta = Resultado
End Function

La función devuelve un 0 si no es primo y un -1 si es primo. Ojo que anda mal si N=1.

Como indica el nombre, la función es un poco lenta, sobre todo cuando N es muy grande.

Pueden ver un ejemplo de como usar esta función en Testeador de primos.

La Raíz cuadrada:

Sin embargo, el divisor (distinto de n) más grande posible es n/2, así que podríamos probar sólo hasta n/2 en vez de n-1. Pero si n/2 es un número entero que es divisor de n, entonces 2 también es divisor (¡porque n dividido 2 es entero!), pero ya probamos antes si el 2 dividía a n. Así que no hace falta probar con el n/2. Entonces el siguiente divisor más grande posible es n/3, pero por un razonamiento análogo, tampoco hace falta probarlo ya que antes habíamos probado con 3.

¿Hasta cuando podemos repetir esto? Bueno hasta que n/i = i, o sea hasta que n = i2, o sea hasta que i=n. Una forma más formal de ver esto es que si d es un divisor de n, entonces n/d es un divisor de n. Así que en vez de probar con estos dos números hace falta probar sólo con el más chico. Pero si uno es mayor que n entonces el otro es menor que n/n =n. Por ello el más chico seguro que es menor que n y entonces sólo hace falta probar hasta n.

Defint A-Z 'Todas las variables son enteras
Function EsPrimo( N )
     Resultado = -1 'Si llega a ser primo devuelve -1
     For i = 2 To Sqr( N )'Raiz cuadrada de n
          If N / i = Int ( N / i ) Then
               Resultado = 0 'No, no es primo y devuelve 0
               Exit For 'Sale del For...Next
          End If
     Next i
     EsPrimo = Resultado
End Function

Esta nueva forma es mucho más rápida que la anterior, y no por ello más difícil de escribir. Así que traten de usarla siempre. Otra mejora consiste en reemplazar la división con decimales por la división entera, que es mucho más rápida. En realidad usamos mod que nos da el resto de la división entera. En el programa hay que reemplazar la condición "N / i = Int ( N / i )" por "N Mod i = 0".

Otras Aplicaciones:

En general ver si un número grande (Muy Grande) es primo o no, es un problema difícil, aunque hay algoritmos bastante rápidos, pero basados en matemática más avanzada. Si tratamos de utilizar los métodos que vimos antes para ver si 10000000000000001 es primo, utilizando la criba nos quedamos sin memoria, y si tratamos de probar dividiendo por los anteriores es demasiado lento.

Sin embargo por más que sepamos que un número no es primo, factorizarlo en primos es muchísimo más difícil si el número es grande (digamos menos de 10 años). En esta dificultad se basa la seguridad de algunos sistemas de encriptación de clave pública por ejemplo el PGP, en este caso se tienen dos claves :

En realidad, la clave publica es el producto de dos primos grandes, y la privada son los dos primos.


Ejercicios:

  1. Modificar el programa para ver si un número es primo usando mod. Comparar el tiempo de ejecución con el que usa la división con decimales.

  2. Buscar un númeror primo que termine en 417.

  3. Escribir un programa que factorice un número en primos, modificando la función EsPrimo.

  4. Buscar el primo más grande que entre en una variable entera (Integer y Longint). ¿Tarda mucho la función EsPrimo?

Lecciones siguientes:

La criba de Eratóstenes Comp. Comp. Mate.

Factorizando al azar Comp. Comp. Mate. Mate.

Divisor común mayor Comp. Mate.

Divisor común mayor factorizando Comp. Mate. Mate.


La idea es que hagan los ejercicios y piensen que otras cosas interesantes se pueden hacer relacionadas con estos temas. Cuéntennos lo que consiguieron y pregunten lo que no les salió. Envíen sus preguntas, dudas, sugerencias, experiencias y propuestas. Nuestra dirección es cym98@oma.org.ar .

También nos gustaría saber tu opinión sobre esta clase. Les pedimos que se tomen unos instantes y contesten estas preguntas. Con tu ayuda podremos hacer un curso cada vez mejor.

¿Cuál es tu calificación general de esta clase?

No entendí nada   Mala   Regular   Buena   Muy buena

El contenido de esta clase te resultó:

Nuevo   Conocido en parte   Conocido

El contenido de esta clase te pareció:

Difícil   Regular   Fácil

Los ejercicios de esta clase te parecieron:

Difíciles   Regulares   Fáciles

Comentarios, preguntas, sugerencias:

Agregar más información o una nueva lección sobre:

Cómo funcionan los ciclos (For ... Next)

Tomando decisiones ( If ... End If )

Definiendo Funciones ( Function )

Traducciones a Pascal o C/C++

Nombre y apellido (opcional):

E-mail (opcional):

    


OmaNet   Curso CyM98 OmaNet - Educación Interactiva
   
www.oma.org.ar/omanet | omanet@oma.org.ar
mensajes: webmaster@oma.org.ar
duty free alcohol duty free cigarettes free shipping buy duty free cuban cigars buy cosmetics online duty free perfume online buy duty free tobacco online