Resumen:
En varias
lecciones escribimos funciones que calculaban el Diviso
Común Mayor entre dos números. Todas se llamaban DCMAlgo
por ejemplo DCMTodos, DCMFactoriza, ...
y se podían intercambiar. Queremos ver la diferencia
entre las velocidades de cada una de estas funciones.
Para eso, podemos usar este programa que genera muchos
pares de números y les calcula el DCM con la función
elegida.
Midiendo
los tiempos:
Vimos varios
métodos para calcular el DCM. A cada método lo
escribimos dentro de una función con nombre diferente.
Podes buscarlas en las lecciones que figuran al final.
Por supuesto, también podes usarla con los métodos que
programes. Demostrar cuales son los mejores métodos es
complicado y nos vamos a limitar a determinar
"experimentalmente" cuales andan más rápido.
Todas las
funciones que definimos tienen la misma forma. Tienen dos
parámetros que son números enteros y después devuelven
como resultado un número entero. Por eso es posible
intercambiarlas una con otras sin problemas.
En el ejemplo
aparecen tres funciones:
- La primera es
DCMError: sólo genera un mensaje de error al
tratar de dividir uno por cero, está solamente
para que te acuerdes de cambiarla.
- La segunda es
DCMUno: como se ve no hace nada, o más
precisamente siempre responde 1, que es casi lo
mismo. Esta función es útil para tener una idea
de cuánto tiempo gasta la maquina en el resto
del programa (generar números al azar, llamar a
las funciones, etc. ) y cuánto tiempo utiliza en
realizar las cuentas que a uno le interesan.
En esta función no hacemos ninguna cuenta
interesante, así que todo lo que tarda
corresponde a las otras actividades.
- La tercera es
DCMLenta: Es una de las formas más lentas de
calcular el DCM, probando con todos los números
y encima haciendo las cuentas con números
reales.
Quizás lo más
conveniente sea primero cambiar en la parte principal del
programa DCMError por DCMLenta y probarlo un rato.
Después copiar una función DCMALgo de otra de
las lecciones que figuran abajo y probar un rato más.
Conviene
ejecutarlo y esperar un poco. Si tarda demasiado,
cortamos el programa y cambiamos la constante repeticiones
por un número más chico. Si es instantaneo o tarda
demasiado poco, cambiamos la constante repeticiones
por un número más grande. Hay que repetir estos cambios
hasta que tarde un tiempo razonable, digamos 10 segundos.
(En la lección Midiendo
Tiempos se
explica como utilizar las funciones apropiadas para medir
el tiempo en los otros lenguajes.)
Deflng A-Z
'Todas las variables son enteros largos
Const maximo = 1000000'numero maximo que el programa
elege al azar
Const repeticiones = 1000000'numero de repeticiones
'Modificar hasta que el programa tarde algunos
segundos o minutos
Dim inicio as Single
Dim finaliza as Single
inicio=Timer
Randomize Timer
For i=1 To repeticiones 'repite muchas veces
a=Int(rnd*maximo)+1
b=Int(rnd*maximo)+1
c=DCMError(a,b)'Cambiar!!!!!
'Print "El DCM
entre";a;" y";b;" es";c
'La comentamos porque en
general escribir en pantalla es muy lento
Next i'Repite hasta este punto
finaliza=Timer
Print "Tiempo total=";finaliza-inicio
Print
"Promedio=";(finaliza-inicio)/repeticiones
Deflng A-Z 'Todas las variables son enteros largos
Function DCMError(a,b) 'Esta funcion genera siempre
un error!!
Print "NO
ANDA!!!!!!!!!!!!!!!"
DCMError=1/0'Genera un error
'En general hay formas mas
civilizadas, consultar la ayuda
'Cambiar en la parte
principal DCMError por otra
'por ejemplo por DCMLenta
End Function
Deflng A-Z 'Todas las variables son enteros largos
Function DCMUno(a,b) 'Esta funcion no anda bien!!
DCMUnoRaiz=1' no calculo
nada, solo respondo "1"
End Function
Deflng A-Z 'Todas las variables son enteros largos
Function DCMLenta(a,b) 'Esta funcion no anda bien!!
For d = 1 to a+b
If
a/d=int(a/d) and b/d=int(b/d) then
MaximoDivisorHastaAhora
= d
End
If
Next d
DCMLenta =
MaximoDivisorHastaAhora
End Function
Después de
probarlo un rato, pueden buscar las funciones DCM de las
otras lecciones, copiarlas y ejecutarlas.
- Una
posibilidad es dejar fijo el número de
repeticiones y el maximo, y ver cuanto tarda cada
función. Con esto vemos cuáles andan más
rápido y cuáles más despacio.
- Se puede
agarra un máximo más chico y volver a modificar
el valor de repeticiones hasta que tarde un
tiempo razonable. Ahi podemos comparar de vuelta
todas las funciones. (En general, para valores
chicos la diferencia entre las funciones
"rapidas" y las "lentas" no
es tan grande.)
Sería interesante
que nos mandaran los resultados que obtengan a cym98@oma.org.ar indicando: Nombre, Edad,
Lenguaje, Maquina, el programa (sin compilar), los
resultados y algún comentario. Por ejemplo es
interesante analizar que pasa al variar la constante maximo o si uno utiliza otro tipo de
números (enteros cortos, reales, etc.)
Lecciones
relacionadas:
Midiendo
Tiempos 
Como medir el tiempo que tarda un programa.
Divisor
común mayor 
Una función que calcula el DCM probando a lo bruto.
Divisor
común mayor factorizando 
Otra función que calcula el DCM factorizando los
números.
Algoritmo
de Euclides

Otra función más astuta que calcula el DCM utilizando
el Algoritmo de Euclides.
Usando
las funciones DCM 
Permite usar las distintas funciones DCM, preguntando los
números a utilizar a traves de la pantalla.
|