Vamos ahora a analizar una conjuntos de programas para la GAE en álgebra elemental. El propósito de estudiarlos es que el lector intente emplear estas ideas en otros problemas de matemáticas de su interés. Mathematica nos permite presentar los resultados de estos programas de distintas formas. De hecho, podemos usar Mathematica como un editor de textos para la confección de un examen o prueba. Sin embargo, en este trabajo se intentará dar la salida de los programas para la GAE, de forma tal que su transición a código LATEX o TEX sea sencilla.
ok = True;
While[ok == True,
a = Random[Integer, {2, 40}];
b = Random[Integer, {2, 40}];
c = Random[Integer, {2, 40}];
If[c^2 == a^2 + b^2, ok = False]
]
Print["{(", a, ",", b, ",", c ")}" ]
La variable ok nos permite determinar si se ha hallado o no una terna pitagórica. Dicha variable se mantendrá con valor de verdad igual a True toda vez que no se haya conseguido el resultado esperado. Las asignaciones
a = Random[Integer, {2, 40}];
b = Random[Integer, {2, 40}];
c = Random[Integer, {2, 40}];
generan tres números enteros aleatorios cuyos valores se encuentra entre 2 y 40. Preguntamos luego si dichos números satisfacen la igualdad pitagórica
c^2 == a^2 + b^2 o bien
c2 = a2 + b2. En el caso de que la terna sea pitagórica se hace la variable ok=False.
La buena programación insta a garantizar que los ciclos que se programen, eventualmente terminen. Nosotros hemos obviado este detalle. Si el rango en que se buscan los números es
"amplio" y la computadora es "rápida", el programa dará una respuesta casi instantánea. Además en el menú de Mathematica denominado kernel existe una opción llamada abort evaluation que puede suspender la ejecución del programa.
Una solución un poco más elegante es definir un contador que registre cuántas iteraciones se han llevado a cabo y que dé por terminado el proceso si se excede un número de iteraciones preestablecidas. Con el fin de simplificar el código de los programas, en este ejemplo y en los siguientes, nos abstendremos de esta práctica.
Al ejecutar el programa anterior, obtenemos en un caso {(20, 15, 25)}. Con el código presentado, no hay garantía de que esta tripleta vuelva a aparecer en una futura corrida del programa. Por supuesto es posible modificar el código para que se determine si esto ocurre o no. No obstante, esta mejora, en muchas ocasiones, no es necesaria y también la omitiremos.
Consideremos ahora el problema de calcular el área de un triángulo rectángulo cuando conocemos (respectivamente) las proyecciones x y y de los catetos a y b sobre la hipotenusa c. Tratemos de confeccionar un ejercicio en el que todas las cantidades involucradas sean enteras, las longitudes de las proyecciones estén entre las 2 y 200 unidades y el área sea inferior a 1000 unidades cuadradas. El código es el siguiente:
ok = True;
EsT[a_, b_, c_] := And[a + b > c, a + c > b, b + c > a]
While[ok == True,
x = Random[Integer, {2, 200}];
y = Random[Integer, {2, 200}];
a = Sqrt[x(x + y)];
b = Sqrt[y(x + y)];
h = Sqrt[x y];
area = (x + y) h /2;
If[And[ area == Round[area], area < 1000, area != x y, x < y,
EsT[a, x, h], EsT[b, h, y], EsT[a, b, y + x] ] , ok = False]
]
Print["{", x, "}{", y, "}{", area, "}"]
En este caso empezamos definiendo una función llamada
EsT que se encarga de regresar
True si los valores
a,
b y
c
satisfacen la desigualdad triangular y
False en el caso contrario. Se supone además que
EsT se aplicará solo a cantidades positivas.
La variable
ok se inicia en
True y se mantiene así toda vez que no se cumplan las condiciones posteriormente estipuladas.
En cada iteración del ciclo se generan dos candidatos para ser las proyecciones deseadas. De ser así se cumplirá entonces que
a =
y
b = y(x + y). Además la altura sobre la hipotenusa estará dada por
h =
Veamos las condiciones. Para que el área se entera
se debe cumplir que al aplicar la función
Round, se obtenga el mismo valor. La condición
area < 1000 es clara. La restricción
area
x se agrega pues después de varias corridas, esta situación (no deseada) ocurría con demasiada regularidad. Con el propósito de estar seguros que los valores generados realmente tienen sentido (además de ejemplificar el uso de las funciones), aplicamos entonces la función
EsT a los 3 triángulos involucrados.
Una salida típica de este programa es {4}{9}{39}.
c1 = Random[Integer, {-8, 8}];
c2 = Random[Integer, {-8, 8}];
c3 = Random[Integer, {-8, 8}];
c4 = Random[Integer, {-8, 8}];
ecua = (c1 x + c2)(c3 x + c4) == c2 c4
sol = Solve[ecua, x]
Primero generamos los coeficientes, después construimos la ecuación y finalmente la resolvemos. Si tuviéramos algún interés en controlar el tipo de solución, podemos insertar este código en un ciclo y agregar ahí los requisitos deseados.
En una corrida típica obtenemos
(2 - 4x)(- 8 - 3x) = - 16 cuya solución está dada por
x = -
y
x = 0.
fl1 = x y^(Random[Integer, {0, 2}])z^(Random[Integer, {0, 2}]);
fl2 = a^(Random[Integer, {0, 2}]) b^(Random[Integer, {0, 2}])
c^(Random[Integer, {0, 2}]);
ld = Random[Integer, {1, 8}] fl1 + Random[Integer, {-8, 8}] fl2;
li = Random[Integer, {1, 8}] fl1 + Random[Integer, {-8, 8}] fl2;
ecua = li == ld
sol = Solve[ecua, x]
La primera instrucción se encarga de generar un factor literal que contenga la variable
x y que pueda contener las variables
y y
z hasta grado 2 inclusive. Al incluir el 0 en rango de la función Random, esto hace que eventualmente la variable
y o
z no aparezcan.
El lado derecho de la ecuación
ld se construye combinando los factores literales
fl1
fl2. Análogamente se procede con el lado izquierdo de la ecuación,
li. Finalmente se resuelve la ecuación desarrollada.
En una corrida típica se genera
- bc + xy = 8bc + 7xy con solución
x = -
.
ok = True;
EsT[a_, b_, c_] := And[a + b > c, a + c > b, b + c > a]
While[ok == True,
a = Random[Integer, {2, 200}];
b = Random[Integer, {2, 200}];
c = Random[Integer, {2, 200}];
s = (a + b + c)/2;
area = Sqrt[Abs[s(s - a)(s - b)(s - c)]];
hab = 2 area/c;
hac = 2 area/b;
hbc = 2 area/a;
sh = hab + hac + hbc;
If[And[Denominator[sh] < 5, a != b, b != c, a != c, area < 800,
EsT[a, b, c] ] , ok = False]
]
Print["{", a, "}{", b, "}{", c, "}{", sh, "}"]
La función
Est es la misma que se empleó en el ejemplo 2. La variable
ok es para mantenerse en el ciclo toda vez que no se satisfagan las condiciones deseadas.
Iniciamos generando tres candidatos para las medidas del
ABC en cuestión. El lado con media
a se opone a
A y así sucesivamente con los otros elementos. La idea es aplicar la fórmula
de Herón:
, en donde s =
.
A =
, y por lo tanto,
hab =
. Esto explica las instrucciones
hab = 2area/c;,
hac = 2area/b; y
hbc = 2area/a;. Con el fin de que la expresión correspondiente a la suma de las alturas tenga un aspecto no muy complejo, solicitamos que el denominador de esta suma no sea mayor que 5. Pedimos además que
a
b,
b
c,
a
c y que el área sea inferior a las 800 unidades cuadradas.
Una corrida típica de este programa arroja
24![]()
32![]()
28![]()
![]()

x = Random[Integer, {-10, 20}]/Random[Integer, {3, 20}];
y = Random[Integer, {-10, 20}]/Random[Integer, {3, 20}];
Print["Ejercicio sumar:"]
Print["@frac{", Numerator[x], "}{", Denominator[x], "}+
@frac{", Numerator[y], "}{", Denominator[y], "}"]
z = x + y;
Print["Opcion A:"]
Print["@frac{", Numerator[z], "}{", Denominator[z], "}"]
z = Max[x, y] - Min[x, y];
Print["Opcion B:"]
Print["@frac{", Numerator[z], "}{", Denominator[z], "}"]
z = Max[x, y]*Min[x, y];
Print["Opcion C:"]
Print["@frac{", Numerator[z], "}{", Denominator[z], "}"]
z = x/y;
Print["Opcion D:"]
Print["@frac{", Numerator[z], "}{", Denominator[z], "}"]
Iniciamos generando dos fracciones
x y
y. Tanto el numerador de
x como
y son valores entre
-10 y 20. Los denominadores son valores entre 3 y 20. Mathematica se encarga de simplificar la fracción, en el caso de que sea necesario. Usamos
@ en lugar del
\ debido a que el caracter
\f es una instrucción especial de Mathematica. Una vez generado el código, se debe realizar un proceso de encuentre/reemplace para convertir
@frac en
\frac.
La opción correcta es z = x + y. Usando las funciones Numerator y Denominator para tomar el numerador y el denominador de las expresiones involucradas. En la segunda opción se toma la diferencia entre el máximo de x y y y mínimo de los mismos. En la opción siguiente se usa como distractor el producto entre el máximo y el mínimo de x y y. En la última opción se usa como distractor el cociente entre x y y. En este último caso, Mathematica se encarga de efectuar la simplificación correspondiente.
Una salida típica de este programa es:
Ejercicio sumar:
@frac{ -1 }{ 16 }+@frac{ 19 }{ 10 }
Opcion A:
@frac{ 147 }{ 80 }
Opcion B:
@frac{ 157 }{ 80 }
Opcion C:
@frac{ -19 }{ 160 }
Opcion D:
@frac{ -5 }{ 152 }
Este código lo podemos arreglar convenientemente para obtener el siguiente ítem. Observe.
Al efectuar la suma
-
+
, obtenemos:
exp1 = Random[Integer, {-2, 2}] a + Random[Integer, {-8, 8}] b + Random[Integer, {-8, 8}] c
exp2 = Random[Integer, {-2, 2}] a + Random[Integer, {-8, 8}] b + Random[Integer, {-8, 8}] c
f1 = Random[Integer, {-5, 5}] x^(exp1)
f2 = Random[Integer, {-5, 7}] x^(exp2)
expre = f1 f2
Comenzamos construyendo los exponentes de los monomios. Para ello usamos las variables
exp1 y
exp2. Seguidamente formamos los monomios
f1 y
f2. Seguidamente efectuamos el producto que, como sabemos, Mathematica se encarga de simplificar.
Una corrida típica de este programa nos produce un ejercicio tal como
ok = True;
While[ok == True,
p = Random[Integer, {2, 4}];
q = Random[Integer, {2, 4}];
r = Random[Integer, {2, 4}];
P = Sum[(Random[Integer, {-4, 4}])x^k, {k, 0, p}] ;
Q = Sum[(Random[Integer, {-4, 4}])x^k, {k, 0, q}];
R = Sum[(Random[Integer, {-4, 4}])x^k, {k, 0, r}] ;
W = Expand[P (Q - R)];
If[Length[W] < 5, ok = False];
]
P
Q
R
W
Como de costumbre, la variable ok nos mantiene en el ciclo mientras no se hallado el resultado solicitado. Comenzamos definiendo el grado de los polinomios con los que vamos a trabajar. Estos grados se hallan entre 2 y 4. Usando el comando Sum construimos los polinomios
P,
Q y
R. En
W almacenamos el resultado de desarrollar
P(Q - R). Como no queremos que
W exceda los 4 términos, nos mantenemos en el ciclo toda vez que su longitud sea mayor o igual que 4.
Una corrida típica del programa genera un ejercicio como:
ok = True;
While[ok == True,
a = Random[Integer, {1, 200}];
b = Random[Integer, {1, 200}];
c = Random[Integer, {1, 200}];
If[And[a < b + c, b < a + c, c < a + b, a < b, b < c, c^2 < a^2 + b^2] ,
ok = False]
]
Datos
a
b
g = ArcCos[c^2 - a^2 - b^2/(-2 a b)];
g 180.0/Pi
Respuesta
c
Distractores
d1 = c + (-1)^(Random[Integer, {0, 1}]) * Random[Integer, {1, 10}]
d2 = c + (-1)^(Random[Integer, {0, 1}]) * Random[Integer, {1, 10}]
d3 = c + (-1)^(Random[Integer, {0, 1}]) * Random[Integer, {1, 10}]
Después de generar valores aleatorios entre 1 y 200 para las variables
a,
b y
c, verificamos la desigualdad triangular, comprobamos
que
a < b < c y que el triángulo generado sea acutángulo. Usando la ley de cosenos obtenemos el ángulo que se opone al lado
c.
La información que suministramos al estudiante es entonces
a,
b y
g. La respuesta es
c. Seguidamente calculamos
3 distractores
d1,
d2 y
d3 usando la función Random.
c1 = Random[Integer, {-8, 8}]/Random[Integer, {1, 1}];
c2 = Random[Integer, {-8, 8}]/Random[Integer, {1, 1}];
c3 = Random[Integer, {-8, 8}];
c4 = Random[Integer, {-8, 8}];
c5 = Random[Integer, {-8, 8}];
c6 = Random[Integer, {-8, 8}]/Random[Integer, {1, 1}];
c7 = Random[Integer, {-8, 8}]/Random[Integer, {1, 1}];
c8 = Random[Integer, {-8, 8}]/Random[Integer, {1, 1}];
c9 = Random[Integer, {-8, 8}]/Random[Integer, {1, 1}];
If[Random[] < 0.5,
d = c4(c1 x + c2) + c5(c6 x + c7) < c3(c8 x + c9) ,
d = c4(c1 x + c2) + c5(c6 x + c7) > c3(c8 x + c9)]
RD = Module[{li, ld, s, t},
li = d[[1]];
ld = d[[2]];
s = Solve[li == ld][[1]][[1]][[2]];
Print[s];
t = s - 1;
If[d /. x -> t,
TeXForm["{", d, "}{", x < s, "}"],
TeXForm["{", d, "}{", x > s, "}"]
]]
En este último ejemplo no vamos a explicar con detalle el código, esto con el propósito de dejarlo como ejercicio para el lector.
Una corrida típica de este programa proporcionó el siguiente resultado:
{,8\,\left( -6 - 3\,x \right) > 7\,\left( -7 - 2\,x \right) ,}{,x < \frac{1}{10},}
Después de arreglarlo convenientemente obtenemos:
Revista Matemática, Educación e Internet
Derechos Reservados