<< Divisor común mayor>> |
Dificultad: Se necesitan conocimientos elementales de computación y de matemática. Lecciones anteriores: Los Primos (más o menos) |
|
Resumen: En esta lección vamos a comenzar a ver algunos métodos para calcular el Divisor Común Mayor (DCM) entre dos números, o sea el mayor entero que los divide a ambos. Introducción: Para cada método vamos a definir una función que devuelve el DCM entre sus dos parámetros. Los nombres de estas funciones serán DCMAlgo, por ejemplo DCMTodos, DCMRaiz,... . Sería interesante que trates de escribir una función que calcule el DCM (por ejemplo DCMYo) antes de seguir leyendo. La forma de las funciones va a ser como la siguiente. Tiene dos parámetros que son números enteros. Después hace algunas cuentas (que no están en este ejemplo). Y al final devuelve un número entero que es (esperamos) el DCM.
Tenemos un par de ejemplos para usar estas funciones.
Estos ejemplos vienen con una función que calcula el DCM, pero que es lenta. La idea es que la reemplacen por alguna de las que aparece acá o en las lecciones siguientes. (Para evitar deltalles técnicos vamos a suponer que los dos números son positivos, más adelante analizaremos los casos en que son cero o negativos.) Mirando a todos: La primera posibilidad es calcular todos los divisores de a y todos los de b y luego compararlos. El problema es que hay que guardarlos en algún lado, por lo que es más difícil. Una solución más sencilla consiste en probar con todos los números y ver si dividen a ambos. La siguiente función utiliza este método, pero antes elige el menor entre a y b(¿Por qué?).
Para que sea más rápido (mucho más rápido) se utilizó modulo, que solo hace cuentas con enteros. Si no conocés este operador mirá la ayuda o leé está página. Divisores: En la lección sobre primos vimos que por algunas propiedades de los divisores, no hacía falta probar con todos los números, sino que alcanzaba con probar hasta la raíz cuadrada. Con un truco parecido vamos a poder mejorar bastante el programa. Antes que nada vamos a escribir un programa que imprime todos los divisores de un número.
Para cada valor de n deberían aparecer dos columnas, en la primera aparecen todos los divisores y en la segunda el resultado de dividir a n por el divisor. Por ejemplo:
Al dividir un número por un divisor también se obtiene un entero (¡por la misma definición de divisor!). Así que en la segunda columna figuran todos los divisores pero en el orden inverso, de mayor a menor. Lo interesante es calcular hasta que valor la columna de la izquierda es mayor que la de la derecha. Veamos primero un casos especial. Si llamamos d=n y es justo un divisor de n entonces n/d es el mismo número. Por ejemplo si
En la primera columna están antes del 6 todos los divisores más chicos y en la segunda están antes que el 6 todos los más grandes. Así que si quiero los divisores en cualquier orden puedo simplemente probar hasta el 6 en este caso y cortar el programa. La ventaja es que tengo que hacer muchas menos divisiones, en este caso sólo 6 (que se podrían hacer a mano) en vez de 36 (que ya no dan ganas). Esto es mucho más útil cuando N es grande por ejemplo N=10000, ya que en vez de 10000 cuentas hago sólo 100, con el correspondiente ahorro de tiempo. El caso general es completamente análogo. Si prueba con todos los números hasta la raíz cuadrada, me aparecen todos los divisores.
|
|
DCM más rápido: Ahora vamos a calcular el DCM utilizando esta propiedad. La idea es que si es divisor de ambos entonces seguro que es divisor del más chico. Entonces buscamos todos sus divisores y nos fijamos si dividen al otro. Si además es más grande que todos los que habíamos encontrado lo anotamos en MayorDivisorHastaAhora.
(¿Qué pasa si justo la raíz cuadrada de min es entera? ¿Por qué no hay ningún problema?) Se puede mejorar ligeramente esta función teniendo en cuenta el orden en que aparecen los divisores. Por ejemplo si algún e divide a max cualquier otro divisor que uno encuentre después va a ser más chico (¿por qué?), por lo que la función puede dejar de probar en ese punto. Además después de esta modificación los divisores que se obtienen son los que figuran como d por lo que no hace falta fijarse si el MayorDivisorHastaAhora es menor(¿por qué?). Hacer una función DCMRaizMejor con estos cambios y corregirla hasta que se obtengan los mismos resultados que con DCMRaiz . Ejercicios:
Lecciones siguientes: |
|
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.
OmaNet Curso CyM98 | OmaNet - Educación Interactiva www.oma.org.ar/omanet | omanet@oma.org.ar |
mensajes: webmaster@oma.org.ar |