miércoles, 18 de marzo de 2009

MATEMATICAS

Z









LA SUMA DE # ENTEROS
No es posible representar cualquier número dentro de la computadora, debido a que ello utilizaría demasiada memoria y tiempo para realizar las operaciones. Por ello se los dividen en diferentes tipos según el lenguaje, pero hay una gran división:
Enteros: Sólo pueden representar a los números enteros en cierto rango (por ejemplo entre -32768 y 32767), pero los representan de manera exacta. (Además las operaciones que los utilizan son más rápidas.)
Punto Flotante: Almacenan por separado las cifras más significativas del número y por otro lado el exponente. Esto permite representar números en un rango mucho mayor, pero sólo se almacenan las primeras 10 o 15 cifras y el resto se pierde.de.
Cada uno de ellos tiene una versión "larga" que permite representar número más grandes y con mayor precisión.
Estas aproximaciones hacen que a veces una cuenta no de el resultado esperado, o que dos expresiones aparentemente iguales den resultados distintos, por ejemplo:
Print (1 + 10 ^ 20) - 10 ^ 20'El resultado es 0!!!Print 1 + (10 ^ 20 - 10 ^ 20)'El resultado es 1.
Otro caso que es más frecuente en la vida real es al tratar de ver si un número es par, una forma de verlo es simplemente dividirlo por dos y ver si el resultado es entero, pero si el número original era muy grande entonces las últimas cifras se perdieron en los cálculos previos y por ello este método falla.Dim a As Singlea = 11 ^ 20If a / 2 = Int(a / 2) Then Print "11^20 es par"Else Print "11^20 es impar"End If'Salida: 11^20 es par!!!No siempre es necesario conocer todas las cifras, a veces alcanza con la última, como en el ejemplo anterior, y en otros casos alcanza con las primera (por ejemplo para aproximar la superficie de la tierra conociendo su radio). Si realmente quisiéramos operar con números muy largos conservando todas sus cifras, tenemos que realizar las operaciones "a mano", o sea hacer un programa que maneje los números de la misma manera que uno lo hace en lápiz y papel. En esta lección vamos a ver como sumar y restar (que es muy parecido). El producto y la división los vamos a dejar para más adelante.Para hacer esto tenemos que almacenar las cifras en algún lado. Las dos formas más fáciles son usar un vector (array), o usar una cadena de texto. Para hacer más fácil el programa vamos a utilizar un vector de largo fijo e igual para todos los números, por ejemplo 100. Las cifras van a estar ordenadas de atrás para adelante, o sea en la posición 1 van a estar las unidades, en la 2 las decenas, en la 3 las centenas y así siguiendo (En la posición vamos a poner el signo, así que por ahora no la usamos)Entonces podemos escribir una función con tres parámetros, los dos primeros son los números a sumar y el último es donde almacenar el resultado.Defint A-ZSub sumarpositivos (a() AS Integer, b() AS Integer, _ resultado() AS Integer) Const largo = 100 MeLlevo = 0' al principio no me llevo nada For i = 1 TO largo resultado(i) = a(i) + b(i) + MeLlevo ' sumo cifra por cifra If resultado(i) > 9 Then ' si es 10 o mas me llevo uno resultado(i) = resultado(i) - MeLlevo = 1 Else ' sino no me llevo nada MeLlevo = 0 End If Next i If MeLlevo = 1 Then 'si me llevo una es que el numero era muy grande Print "Error en la suma: resultado muy grande" Error 6' Genera el error correspondiente End IfEnd SubEn este ejemplo se utiliza esta función para calcular 2^50+5^35. En este caso también se da una idea de cModificando el programa anterior se puede lograr hacer una subrutina que reste dos números positivos o cero si el primero (a) es mayor o igual que el otro (b), llamamos a esta subrutina restarpositivos (queda como ejercicio). También podemos hacer una función que compare dos números positivos o cero y devuelva 1 si el primero es mayor, -1 si es menor y 0 si son iguales; a esta función la llamamos compararpositivos (también queda como ejercicio). Utilizando estas funciones podemos crear otras dos nuevas que permitan sumar y restar:
Defint A-ZSub sumar (a() AS Integer, b() AS Integer, resultado() AS Integer) Const largo = 100 If a(0)=b(0) Then 'si tienen el mismo signo sumar a(), b(), resultado() resultado(0)= a(0)'el signo es el mismo Else If compararpositivos(a(), b())=1 Then' Si a>b restarpositivos a(),b(),resultado() resultado(0)= a(0) Else 'Si a<=b restarpositivos b(),a(),resultado() resultado(0)= b(0) End IfEnd Sub Para restar lo que hacemos es cambiarle el signo al segundo número y luego sumarlo al primero usando la subrutina anterior. Defint A-ZSub restar (a() AS Integer, b() AS Integer, resultado() AS Integer) Const largo = 100 Dim menosb(0 To largo) as Integer For x=1 To 100 menosb(x)= b(x)'copio las cifras Next x menos(0)=-b(0)'invierto el signo sumar a(), menosb(), resultado()'End Sub También se puede hacer todo esto sin usar tantas funciones separadas aunque hay que tener más cuidado con los signos. También es interesante modificar estos programas de manera que los números puedan tener distinta cantidad de cifras. Ejercicios: Reescribir los programas para sumar y restar, pero almacenando los números en cadenas de texto. Hacer una función que indique si un número largo es múltiplo de 3. Usarla para ver si 2^50+5^35 es múltiplo de 3.(Nota: podés ver como calcular 2^50+5^35 en este ejemplo)
Escribir la función que indica si un número largo es mayor que otro. Comparar 2^50 con 5^35
La sucesión de Fibonacci se define de la siguiente manera : f(0)=0; f(1)=1; y si n>1 entonces f(n)=f(n-1)+f(n-2). Calcular la suma de las cifras de f(1000).
Ejercicios extra :
Calcular la ultima cifra de f(1000000)(Sugerencia no usar números largos, porque son muy lentos.)
Repasar el método para multiplicar y dividir con lápiz y papel antes de que aparezca la continuación de esta lección. :)
Lecciones siguientes:
BASES DE NUMERACION
Modificando el programa anterior se puede lograr hacer una subrutina que reste dos números positivos o cero si el primero (a) es mayor o igual que el otro (b), llamamos a esta subrutina restarpositivos (queda como ejercicio). También podemos hacer una función que compare dos números positivos o cero y devuelva 1 si el primero es mayor, -1 si es menor y 0 si son iguales; a esta función la llamamos compararpositivos (también queda como ejercicio). Utilizando estas funciones podemos crear otras dos nuevas que permitan sumar y restar:
Defint A-ZSub sumar (a() AS Integer, b() AS Integer, resultado() AS Integer) Const largo = 100 If a(0)=b(0) Then 'si tienen el mismo signo sumar a(), b(), resultado() resultado(0)= a(0)'el signo es el mismo Else If compararpositivos(a(), b())=1 Then' Si a>b restarpositivos a(),b(),resultado() resultado(0)= a(0) Else 'Si a<=b restarpositivos b(),a(),resultado() resultado(0)= b(0) End IfEnd Sub Para restar lo que hacemos es cambiarle el signo al segundo número y luego sumarlo al primero usando la subrutina anterior. Defint A-ZSub restar (a() AS Integer, b() AS Integer, resultado() AS Integer) Const largo = 100 Dim menosb(0 To largo) as Integer For x=1 To 100 menosb(x)= b(x)'copio las cifras Next x menosb(0)=-b(0)'invierto el signo sumar a(), menosb(), resultado()'End Sub También se puede hacer todo esto sin usar tantas funciones separadas aunque hay que tener más cuidado con los signos. También es interesante modificar estos programas de manera que los números puedan tener distinta cantidad de cifras. # CON IGUAL SIGNON Mejor respuesta - elegida por los votantes Para sumar dos números con signos iguales, haces la operación normal de suma y respetas el signo:4 + 3 = 7- 4 + ( - 3 ) = - 7Si lo signos son diferentes:12 - 14 = - 2 Al número mayor le restas el número menor y el signo del resultado es el del número de mayor valor absoluto ( en este caso 14 y es negativo)4 + ( - 3) = 1 Multiplicación y división de números enteros La multiplicación era considerada una operación muy difícil en Europa antes del siglo XVI, pues aún se utilizaban los números romanos y, en este sistema de numeración las operaciones con números grandes son más difíciles que con el sistema decimal posicional. Antes de que se adoptara este sistema en Europa, la multiplicación sólo se enseñaba en las universidades. Se considerará a continuación un grifo de agua que al abrirse, llena un tanque a razón de 4 litros por minuto. a. Si en el momento en que son las 6:00 p.m., hay 135 litros de agua en el tanque y el grifo estará abierto hasta las 6:05 p.m., ¿cuántos litros de agua habrá a esa hora? Como cada minuto entran 4 litros de agua al tanque, al cabo de 5 minutos habrán entrado (4)*(5) = 20 litros de agua al tanque. Como había 135 lts. a las 6:00 pm, a las 6:05 pm habrá litros de agua en el tanque. b. Si el grifo estuvo abierto desde antes de las 6:00 p.m., ¿cuántos litros de agua había en el tanque a las 5:55 p.m.? se pueden usar números negativos para las operaciones a realizar en la resolución de este problema. La hora considerada como presente, es las 6:00 p.m., los minutos antes de las 6:00 pueden considerarse negativos y los minutos después de las 6:00, como positivos. Por ejemplo, los 5 minutos antes de las 6:00 los escribimos así: -5. Como el tanque se ha estado llenando a razón de 4 litros por minuto, lo cual significa que en cada minuto que pasa, entran exactamente 4 litros de agua al tanque, es natural pensar que antes de las 6:00 había menos agua que a las 6:00. Por eso, se dice que: Es decir, 5 minutos antes de las 6:00 había 20 litros menos de agua que la cantidad que hay a las 6:00. Ejemplos: A.) 6 * (-5) = -(6*5) = -30 B.) -25 * 2 = -(25*2) = -50 C.) -3 * 11 = -(3*11) = -33 Volviendo al ejemplo anterior, sabiendo que en cada minuto el tanque recibe 4 litros de agua, para saber cuántos litros de agua había en el tanque a las 5:55, se realiza la operación indicada antes: Ahora, se deben sumar los litros de agua que había a las 6:00 con el -20 obtenido: 135 + (-20) = 115 Había, pues, 115 litros de agua a las 5:55 pm. c. Ahora se supone que en este momento el tanque tiene 200 litros de agua y que tiene un desagüe que deja escapar 2 litros de agua cada minuto. Dentro de 5 minutos, ¿cuántos litros de agua habrá? Para usar números negativos en este caso, igualmente se consideran los minutos futuros como positivos, pero como la variación en la cantidad de agua es, en este caso, una disminución, se toman los litros que se pierden en cada minuto como negativos. Así, la disminución de agua en los próximos 5 minutos será de (-2) 5 = -10 litrosLuego, al transcurrir 5 minutos perdiendo agua, el tanque tendrá litros de agua. d. En la misma situación descrita en c), se pregunta ahora: ¿cuántos litros había hace 5 minutos? Usando números negativos para los minutos ya pasados, y también para los litros de agua perdidos en cada minuto, se tendrá la operación: Ya que el tanque está PERDIENDO agua, a las 5:55 había más agua que a las 6:00 p.m. Si se asigna -5 al tiempo entre 5:55 y 6:00 p.m., y -2 a los litros perdidos en cada minuto, esto permite ver de alguna manera por qué el producto de (-5) por (-2) tiene como resultado el número positivo 10. A las 5:55 p.m. había exactamente 10 litros más que a las 6:00 p.m. Había entonces en el tanque a las 5:55 p.m. exactamente litros de agua. Así, al multiplicar números enteros, si se multiplican dos números de un mismo signo (ya sean los dos positivos o los dos negativos) el resultado es positivo. Si se multiplican dos números de signos opuestos, el resultado es negativo. Hay un cuento que relata que en la isla de Barataria, hay ciudadanos "buenos'' (a los que se asigna el signo +) y ciudadanos malos (se les da el signo -). Si alguien sale de la isla, se considera que se tiene el signo -, y si alguien entra, esto equivale al signo +. Así, si un ciudadano bueno (+) entra en Barataria (+), el resultado para la isla es positivo: . Si un ciudadano malo (-) sale de Barataria (-), el resultado para la isla es positivo: (-). Si un ciudadano bueno (+) sale de la isla (-), el resultado es negativo: . Si un ciudadano malo (-) entra a la isla (+), el resultado es negativo: Distributividad del producto respecto a la suma de números enteros Cuando se multiplica un número entero por otro, y éste último está escrito como la suma de otros dos, por ejemplo, 7(10+3), se sabe que esta operación es igual a Esta propiedad se conoce como la propiedad distributiva del producto con respecto a la suma de números enteros y se puede ver que es muy natural que esto se cumpla siempre, si se observa el siguiente cálculo con piedritas: Esta propiedad es válida para todos los números enteros, por lo tanto, si intervienen números negativos en las operaciones, sigue cumpliéndose la propiedad distributiva, por ejemplo: En otras palabras para ver una representación gráfica de esta situación, se puede interpretar así: es igual al área de un rectángulo que tiene lados 5 y 6: 5 * 10 es el área de un rectángulo delados 5 y 10: 5 * 4 es el área de un rectángulo de lados 5 y 4: Si al rectángulo de lados 5 y 10 se le quita un rectángulo de lados 5 y 4, como en la figura, se obtiene un rectángulo de lados 5 y 6: ¿Qué ocurre cuando el factor que está fuera del paréntesis es negativo? Por ejemplo, si se tiene el producto la propiedad distributiva asegura que División de números enteros Para dividir un número entero entre otro, se aplica la misma regla establecida para la multiplicación de números enteros: El cociente tendrá signo positivo si el dividendo y el divisor tienen igual signo. El cociente tendrá signo negativo si el dividendo y el divisor tienen signos opuestos. Por ejemplo: A continuación algunos ejemplos de operaciones combinadas entre números enteros: { [7( -8 )] ÷ [4( 5 + 2)] } - 1 se efectúan en primer lugar las operaciones que están dentro de los paréntesis, y luego las que están agrupados por los corchetes: { [7( -8 )] ÷ [4( 7)] } - 1 = { [-56] ÷ [28] } - 1 ahora se efectúa la división que está dentro de las llaves: { -56 ÷ 28 } - 1 = -2 -1 = -3 Otro ejemplo: 7 - {[4(-5)] ÷ [-1(2)]} + [7(3 - 1 + 8 - 10)] para efectuar las operaciones que están dentro del último paréntesis, es bueno reunir por un lado todos los números que tienen signo + y por otro todos los que tienen signo -. Esto mismo es lo que se hace muchas veces para calcular saldos: se suma todo lo que ha sido ganancia por un lado, todo lo que ha sido gasto por el otro y luego se resta a última suma de la primera. En este caso: 3 - 1 + 8 - 10 = 3 + 8 - (1 + 10) = 11 - 11 = 0 como en el último corchete se tiene 0, éste último término no añade nada a la expresión total, así es que se calcula el resto: 7 - {[4(-5)] ÷ [-1(2)]} = 7 -{(-20) ÷ (-2)} = 7 - {10} = -3