Logo Studenta

matyprogversionfinal

¡Este material tiene más páginas!

Vista previa del material en texto

MATEMÁTICA
PROGRAMACIÓN
 Y 
Daniela Pagés
Franco Vuan
Luis Langon
María Teresita Carrión
Patricia Añón
Santiago Martorell
Santiago Vigo
 
Teresa Pérez
Sylvia da Rosa
ÍNDICE
Acortando distancias ........................................................ 3
Numeración posicional ..................................................... 9
Cédula de identidad. Dígito detrás del guión ...................... 17
Propuesta sobre conjuntos ................................................ 21
Divisibilidad ..................................................................... 30
Geometría analítica .......................................................... 43
Conectivos lógicos ............................................................ 53
Breve manual de programación en python ......................... 57
Correos de contacto ......................................................... 75
Matemática y Programación
- 3 -
En esta pasantía se han elaborado algunas secuencias didácticas y actividades para el 
aula, dirigidas a los profesores, con las que se busca que los estudiantes: 
•	Reconozcan un problema algorítmico, puedan enunciarlo, busquen una solución y la 
expresen como un algoritmo. 
•	Aprendan los fundamentos básicos de un lenguaje de programación (en este caso 
python), y lo utilicen en la implementación de los algoritmos que han escrito en lenguaje 
natural y/o matemático.
•	Refuercen, a través de las actividades anteriores, los conocimientos matemáticos que 
utilizan en la elaboración de los algoritmos. 
En este material se incluyen los problemas seleccionados y trabajados por los pasantes, 
como una primera aproximación. Complementa el material, un breve manual de python que 
recoge fundamentalmente los aspectos que surgieron durante este trabajo.
Objetivos
El objetivo principal de este trabajo consiste en fomentar la interacción entre docentes 
e investigadores del área informática y profesores de la enseñanza media (de matemática 
y/o de informática), para introducir aspectos de la informática como ciencia básica en dicho 
nivel del sistema educativo.
El objetivo específico de este trabajo consiste en introducir aspectos del pensamiento 
algorítmico	en	cursos	de	matemática	(y/o	de	informática),	tomando	la	definición	de	pensa-
miento algorítmico dada por Jeannette Wing [4]. Uno de los aspectos más importantes que 
señala la autora, es que el factor principal del aprendizaje de informática es la conceptuali-
zación del proceso de solución de un problema, y no el uso de las herramientas tecnológicas 
de que disponemos (que constituyen sin duda una ayuda importante). Los problemas que 
tratamos son algorítmicos, por lo cual una solución puede expresarse mediante un algorit-
mo. Otro aspecto importante es que integramos una etapa de implementación de la solu-
ción construida en un lenguaje de programación (python (http://www.python.org/) es decir 
construimos un programa. De esta forma es posible introducir el aprendizaje de conceptos 
básicos	de	programación	en	la	enseñanza	media,	que	es	parte	del	objetivo	específico.
Informe de la Pasantía
* Algoritmia e integración de programación al proceso de resolución de problemas en cursos 
de matemática e informática de la enseñanza media.
Introducción
ACORTANDO DISTANCIAS
 Pedeciba Área Informática, investigadora Sylvia da Rosa, 
Instituto de Computación - Facultad de Ingeniería
Matemática y Programación
- 4 -
Metodología
Para la elaboración de las distintas secuencias y/o actividades, el equipo se subdividió en 
pequeños grupos, que trabajaron con distintas temáticas del curriculum de Ciclo Básico y 
Bachillerato de Educación Secundaria y Técnico Profesional. 
La metodología empleada apunta a la conceptualización del proceso de resolución de pro-
blemas algorítmicos y al aprendizaje de sus distintas etapas.
Como introducción a dicho aprendizaje se abordan problemas matemáticos sencillos, selec-
cionados por los profesores pasantes de los siguientes temas:
•	Divisibilidad
•	Geometría analítica
•	Determinación	del	dígito	verificador	de	la	cédula	de	identidad
•	Operaciones con conjuntos
•	Conectivos lógicos
•	Sistema posicional de numeración
El	proceso	de	resolución	se	divide	en	la	especificación	del	problema	(algorítmico),	el	diseño	
de una solución, y la implementación en un lenguaje de programación (python). Un proble-
ma algorítmico [1] consiste en:
•	Una	especificación	de	una	colección	válida,	posiblemente	infinita	de	conjuntos	de	en-
trada,
•	Una	especificación	de	los	elementos	de	salida	deseados	en	función	de	los	de	entrada.
El	término	especificación	representa	una	descripción	sin	ambigüedades.	¿Cómo	plantear	el	
problema? Este es uno de los primeros aspectos a tener en cuenta en la introducción de con-
ceptos de algoritmia. Muchos de los errores de los estudiantes provienen de la no compren-
sión	de	la	especificación	del	problema	planteado,	muchas	veces	porque	dicha	especificación	
es	ambigua	y/o	incompleta.	Esto	los	lleva	a	confundir	el	problema	(¿qué	se	quiere	obtener?)	
con	su	solución	(¿cómo	se	debe	proceder?)
Para diseñar un algoritmo que solucione el problema se usa, en este trabajo, el lenguaje 
natural (español) en primera instancia. De este modo los estudiantes conceptualizan los 
pasos necesarios para arribar a una solución, sin preocuparse de detalles del lenguaje de 
programación. Una vez trabajado el algoritmo en lenguaje natural, se introduce la etapa de 
implementación en el lenguaje python, conceptualizando el pasaje de un lenguaje al otro. 
La interacción entre una y otra etapa es dialéctica, por ejemplo, al implementar se pueden 
detectar fallas en el diseño.
Desarrollo 
Algunos aspectos teóricos estudiados y discutidos en la pasantía fueron:
* El concepto de informática
Acordamos con Gilles Dowek [3] en utilizar el término “informática” en el sentido de que 
Matemática y Programación
- 5 -
los estudiantes aprendan a escribir un programa. Según este autor, el aprendizaje de un 
lenguaje de programación y de algoritmos elementales, puede aportar mucho a su desarro-
llo	personal	y	a	su	relación	con	el	conocimiento.	El	mismo	autor	agrega	como	beneficio	del	
escribir programas, que el estudiante aplica y pone en práctica sus conocimientos. También, 
que la elaboración de programas tiende un puente entre el lenguaje y la acción, ya que un 
programa	tiene	la	doble	cualidad	de	ser	un	texto,	y	a	la	vez	ser	ejecutable.	Y	finalmente,	
Dowek considera que el aprendizaje de la informática permite al estudiante aprender el ri-
gor de la ciencia, no por la sanción del docente, si no porque la falta de rigor impide que los 
programas funcionen. Y esto tiene el valor agregado de permitir mejorar el aprendizaje, por 
parte	de	los	estudiantes	de,	por	ejemplo,	el	uso	correcto	de	los	cuantificadores.
* El pensamiento computacional
Pensamos que incluir la elaboración de algoritmos en la educación media ayudará al desa-
rrollo del pensamiento computacional, que “involucra la resolución de problemas, el diseño 
de sistemas y la comprensión del comportamiento humano, basados en los conceptos fun-
damentales de la ciencia de la computación” como plantea J.Wing en [4]. Además plantea 
que	al	resolver	un	problema	deberían	surgir	como	interrogantes:	¿Cuán	difícil	es	hallar	una	
solución?	¿Cuál	es	el	mejor	camino	para	resolverlo?	¿La	solución	que	encontré	es	suficien-
temente buena? El pensamiento computacional nos permite transformar un problema difícil 
en otro que sepamos resolver. También incluye, según Wing, el uso de la abstracción y des-
composición	al	enfrentarse	a	una	tarea	compleja.	Significa	elegir	las	representaciones	ade-
cuadas y/o modelar los aspectos relevantes de un problema para hacerlo más manejable. El 
pensamiento computacional consiste en usar la heurística al razonar buscando una solución, 
planificar,	esquematizar	y	aprender	frente	a	la	incertidumbre.	
* Los estándares curriculares del NCTM
Entre los estándares curriculares planteados por el NationalCouncil of Teachers of Mathe-
matics [6], en la parte dedicada a los estándares de proceso, se plantea:
* Resolución de problemas
“...	 los	estudiantes	debieran	ser	estimulados	a	reflexionar	sobre	sus	razonamientos		du-
rante el proceso de resolución de problemas, de manera tal que sean capaces de aplicar y 
adaptar las estrategias que han desarrollado en otros problemas y contextos.” Nos parece 
que el planteo de problemas algorítmicos y la consecuente elaboración de algoritmos por 
parte de los estudiantes, colabora con este estándar.
* Comunicación
“La	comunicación	matemática	es	un	camino	para	compartir	y	clarificar	ideas	matemáticas.	
A	través	de	la	comunicación,	las	ideas	se	transforman	en	objetos	de	reflexión,	perfeccio-
namiento,	 discusión	 	 y	 rectificación.	 Cuando	 se	motiva	 a	 los	 estudiantes	 a	 comunicarse	
con otros estudiantes sus resultados y razonamientos, sea en forma oral o escrita, ellos 
aprenden a ser más claros, convincentes y precisos en el uso del lenguaje matemático. Las 
explicaciones dadas por los estudiantes deben incluir argumentos matemáticos y racionales, 
no solamente descripciones de procedimientos y resúmenes. A su vez, escuchando las ex-
plicaciones de otros, los estudiantes podrán desarrollar sus propias comprensiones.” Pensa-
Matemática y Programación
- 6 -
mos que en la redacción de los algoritmos, y la explicación de los fundamentos de la sintaxis 
elegida, los estudiantes se verán enfrentados a la comunicación constante, ya sea con sus 
compañeros como con el docente.
* Representaciones
“ Las ideas matemáticas pueden ser representadas en formas variadas: imágenes, mate-
riales	concretos,	tablas,	gráficos,	números	y	letras,	hojas	de	cálculo,	y	muchas	otras	más.	
Las formas en las cuales se representan las ideas matemáticas son fundamentales para 
determinar cómo las personas comprenden y utilizan esas ideas. ... Cuando los estudian-
tes tienen acceso a las representaciones matemáticas y a las ideas que éstas expresan, y 
cuando además los estudiantes pueden crear representaciones para capturar conceptos 
matemáticos o relaciones, ellos adquieren un conjunto de herramientas que expanden sig-
nificativamente	su	capacidad	para	modelar	e	interpretar	fenómenos	físicos,	sociales	y	ma-
temáticos.” La escritura de un algoritmo constituye una representación escrita en lenguaje 
natural, y su implementación constituye otro tipo de representación, más vinculada con la 
representación simbólica que usa la matemática. Esta conversión de registros le da fuerza 
conceptual a la actividad. 
* Los estándares de la CSTA
Por otro lado, cabe señalar que la introducción de la informática en la Enseñanza Media 
como ciencia básica es preocupación de comunidades académicas internacionales [5,2] y 
nacionales, que intentan seguir e implementar recomendaciones elaboradas en los estánda-
res de la CSTA (Computer Science Teacher Association). En particular, es una recomenda-
ción fuerte de los referentes en la materia a nivel nacional: la Universidad de la República 
y el Instituto de Computación de la Facultad de Ingeniería, y el PEDECIBA, a través de, por 
ejemplo, esta pasantía.
CSTA es una organización cuyo objetivo es dar soporte a la educación en computación 
tanto en la educación primaria como secundaria y universitaria. En especial, en lo relativo 
al currículo, trabaja en pos de establecer el currículo descrito en el documento [2] , sobre la 
educación en ciencia de la computación de los 4-5 años a los 16-19. Esta currícula se basa 
en el principio de que los estudiantes necesitan la comprensión del lugar de la ciencia de la 
computación en el mundo moderno y que la disciplina ciencia de la computación comprende 
principios y habilidades, no provistos por otras asignaturas.
Para el nivel 2 (Educación Secundaria), los estándares plantean como objetivos, entre 
otros, que el estudiante sea capaz de:
1. Usar los pasos básicos de resolución algorítmica de problemas para diseñar soluciones 
(ej: enunciado del problema y exploración, examen de casos, diseño, implementación de 
una solución, testeo, evaluación).
2.	Definir	un	algoritmo	como	una	secuencia	de	instrucciones	que	pueden	ser	procesadas	
por un computador.
3. Evaluar los modos en que diferentes algoritmos pueden ser usados para resolver el mis-
mo problema.
4. Describir y analizar una secuencia de instrucciones a ser seguida.
5. Evaluar qué tipos de problemas pueden ser resueltos usando modelización y simulación.
6. Usar la abstracción para descomponer un problema en sub problemas.
Matemática y Programación
- 7 -
7. Examinar conexiones entre elementos de la matemática y la ciencia de la computación, 
incluyendo números binarios, lógica, conjuntos y funciones.
Los cursos de matemática proveen un gran número de problemas interesantes que permi-
ten trabajar para conseguir dichos objetivos.
Aportes de la investigación
Como se señala en los objetivos, se busca introducir aspectos de la informática como cien-
cia básica en la enseñanza media, utilizando la riqueza de problemas y situaciones adecua-
das que proveen para ello los cursos de matemática. Es necesario para ello, distinguir cla-
ramente dicha ciencia de los servicios y productos tecnológicos derivados de su desarrollo. 
A propósito de las relaciones entre la tecnología y la educación matemática, citamos a Ar-
tigue, M [7]:
“Ciertamente	estas	tecnologías	son	social	y	científicamente	legítimas,	pero	en	el	nivel	de	
la	escuela,	esas	legitimidades	no	son	suficientes	para	asegurar	su	integración,	pues	no	se	
busca que la enseñanza forme alumnos aptos para funcionar matemáticamente con esas 
herramientas —lo que sería el caso, por ejemplo, de una formación de carácter profesional— 
se busca mucho más. Efectivamente, lo que se espera en esencia de esas herramientas es 
que permitan aprender más rápidamente, mejor, de manera más motivante, una matemáti-
ca cuyos valores son pensados independientemente de esas herramientas.” 
“ ... Partiendo del principio de que una técnica posee un valor pragmático que corresponde 
a las potencialidades que ofrece para producir resultados, y también un valor epistémico, 
en el sentido de que nos ayuda a comprender los objetos que pone en juego. Nos interesan 
las	modificaciones	introducidas	en	el	vínculo	entre	esos	dos	valores	debido	a	la	introducción	
de herramientas informáticas tales como calculadoras y programas... La investigación debe 
entonces encontrar los medios de reforzar, mediante la elección de situaciones adecuadas, 
el valor epistémico de las técnicas instrumentadas, si desea contribuir a asegurar su legiti-
midad dentro de las instituciones educativas.”
Las nuevas tecnologías han dado a la educación herramientas innovadoras, capaces de 
producir	fuertes	modificaciones	prácticas	y	operativas	en	la	práctica	docente.	Sin	embargo,	
tales tecnologías no pueden por sí mismas reemplazar a la pedagogía si no que deben su-
bordinarse	a	su	servicio.	El	concepto	mismo	de	tecnología	educativa	refiere	básicamente	al	
manejo de instrumental técnico con el propósito de mejorar el proceso didáctico.
La pedagogía y la tecnología siempre han estado relacionadas. El auge que han tenido (y 
tienen) las tecnologías digitales en la sociedad en los últimos años, ha hecho esa relación 
mucho más explícita debido a la abundancia de productos y servicios tecnológicos en todas 
las actividades de la sociedad y especialmente en el sistema educativo. Esa abundancia no 
ha sido acompañada con la articulación e integración de los recursos e instrumentos de la 
tecnología	en	la	actividad	educativa.	El	riesgo	consiste	en	que	el	uso	instrumental	e	irreflexi-
vo de tecnología desplace a la pedagogía de su rol conductor de los procesos de enseñanza-
aprendizaje. Disminuir (o evitar) ese riesgo implica una responsabilidad y un compromiso 
del sistema educativo y es en ese sentido que se ubica esta pasantía. 
Matemática y Programación
- 8 -
Reflexiones finales
Esta pasantía nos ha aportado, en primer lugar, la experienciadel trabajo en conjun-
to, desde la diversidad de miradas que supone la integración del equipo: profesores 
de informática, profesores de matemática e investigadores en informática. Fue un desafío 
para los docentes, en primer lugar aprender el uso del lenguaje python. Esto nos permitió, 
sin	embargo,	pasar	por	las	dificultades	que	tendrán	los	estudiantes	cuando	trabajemos	con	
ellos. También tuvimos oportunidad de discutir distintos abordajes posibles de cada uno de 
los temas que seleccionamos, aportando cada pasante desde su subjetividad. 
No fue posible avanzar sobre el uso de Python en GeoGebra, que era una de las motivaciones de la 
elección de este lenguaje (en la versión 5 de GeoGebra que se está desarrollando, hay una ventana 
Python). Las razones fueron, por un lado, la falta de tiempo de la pasantía, y por otro, que la versión 
del lenguaje que aparece en GeoGebra es Jython, que es Python con Java, y esto implica cambios en 
la forma de usar el intérprete. Nos parece muy importante avanzar sobre esto en el futuro, ya que 
GeoGebra es un software muy utilizado por los docentes, y el aprendizaje del uso de esta ventana 
será de provecho para profesores y estudiantes.
Bibliografía
1. D. Harel, Algorithmics: The Spirit of Computing, Addison-Wesley, Reading, MA, (425 pp.) 1987. 2nd edition, 
1992; 3rd edition, 2004.
2. CSTA (Computer Science Teachers Association) http://csta.acm.org/Curriculum/sub/ACMK12CSModel.
html, A.T.F.C. Comitee, A Model Curriculum for K-12 Computer Science, Tech. rep., Computer Science Teachers 
Association (csta), Association for Computing Machinery (ACM), 2003. 
3. Gilles Dowek, Quelle informatique enseigner au lycee?, https://who.rocq.inria.fr/Gilles.Dowek/lycee.html 
(2005)
4. Jeannette M. Wing, Computational Thinking, Communications of the ACM, Vol. 49, Nr. 3, 2006. 
5. EPI (Enseignement Public & Informatique ) Association Enseignement Public & Informatique (EPI) (2011), 
http://www.epi.asso.fr/. 
6. NCTM. PRINCIPIOS Y ESTÁNDARES PARA LA EDUCACIÓN MATEMÁTICA. Traducción de Manuel Fernández 
SAEM Thales Sevilla 2003 ISBN 84-933040-3-4
7. Artigue, M (2004).- Problemas y desafíos en educación matemática: ¿Qué nos ofrece hoy la didáctica de la 
matemática para afrontarlos?.- Educación Matemática, Diciembre, año/vol. 16, número 003. Santillana. Distrito 
Federal, México pp 5-28.
Matemática y Programación
- 9 -
NUMERACIÓN POSICIONAL 
Santiago Vigo (Liceo "Tomás Berreta" N°1 Ciudad de Canelones)
El objetivo de la secuencia es, estudiar la numeración posicional, a través de la elabora-
ción de algoritmos que permitan escribir, en base 10, números expresados en otra base 
y viceversa. 
Por más que la noción de numeración posicional se trabaja desde los primeros años de 
educación primaria, la expresión en una base distinta de 10 es en general desconocida y su 
abordaje puede ser una vía de entrada al estudio de algunas propiedades de los números 
naturales.
Estas actividades pueden ser trabajadas en varios niveles, en 2°DC en matemática espe-
cífica	está	concretamente	el	tema	bases	de	numeración,	pero	como	se	mencionó	anterior-
mente se puede trabajar en 1°CB1 donde se tratan propiedades de los números naturales y 
operaciones sobre ellos, concretamente división entera. 
La algoritmia, que también es un objetivo de estas actividades, es un tema al que los profe-
sores de matemática en general rehuimos, sin embargo los razonamientos necesarios para 
lograr desarrollar, expresar y evaluar un algoritmo tienen una gran riqueza, en especial en 
lógica.
Las actividades que se detallan a continuación son ejemplos de cómo se puede abordar el 
tema, no pretenden ser un bloque de actividades rígido, si no que el profesor puede creer 
conveniente	agregar,	intercalar,	modificar	y/o	eliminar	algunas.
Actividad 1 
Es	una	actividad	introductoria	que	pretende	provocar	la	reflexión	sobre	los	temas	a	tratar	
y sentar las bases para un trabajo posterior.
Analizaremos cómo escribimos los números:
Cuanto	más	grande	es	un	número,	¿mayor	cantidad	de	cifras	tiene?
Escribe el 88 en números romanos, y escribe el 90. 
Discute sobre por qué crees que los números romanos no se usan cotidianamente como 
los arábigos.
•	¿Qué		ventajas	tienen	los	números	arábigos	sobre	los	romanos?
•	¿Cuánto	vale	el	1	en	3124?	
•	¿Cuánto	vale	el	1	en	3412?	
•	¿Por	qué	valen	distinto?	
Escribe al 3412 en función de potencias de 10
1 2° DC refiere a 2° de bachillerato diversificación científica en enseñanza secundaria, y 1°CB refiere a 1° año de Ciclo Básico el 
primer año de educación secundaria 
Objetivo
Matemática y Programación
- 10 -
Actividad 2 
Introduce la numeración en base 3 a partir de un juego, se toma como disparador para el 
trabajo posterior.
Juego
* Preparación:
•	Se hace pasar a 3 estudiantes al frente de la clase (pueden ser más). 
•	Se los ubica mirando de frente a sus compañeros en una hilera.
* Desarrollo:
Cada vez que el profesor aplaude el primer estudiante hará un movimiento, con el primer 
aplauso, levanta una mano, con el segundo aplauso, manteniendo la mano levantada, le-
vanta la otra mano, con el tercer aplauso el estudiante baja ambas manos, con el cuarto 
aplauso, levanta una mano otra vez, el ciclo se repite hasta que termine el juego. 
El segundo estudiante levantará una mano cuando el primero las baje, levantará la segun-
da mano (manteniendo la primera levantada) cuando el primer estudiante vuelva a bajar 
sus manos. Es decir que sube una mano con el tercer aplauso, la otra mano con el sexto 
aplauso, baja las manos con el noveno, y así.
El tercer estudiante realizará los mismos movimientos y cada vez que el segundo estudian-
te baja los brazos. Si hay más estudiantes el proceso continúa de la misma manera. 
* Objetivo del juego.
Dar la cantidad de aplausos que el profesor realiza cuando, súbitamente, se detiene y es-
cribe en el pizarrón la posición en que quedaron cada uno de los estudiantes. 
Nota: Obviamente este objetivo no debe decirse antes de comenzar el juego para evitar 
que cuenten.
* Preguntas: 
¿Se	puede	saber	la	cantidad	de	aplausos	que	hubo	sólo	con	mirar	el	pizarrón?	
¿Cuántos	aplausos	hubo?	
¿Puedes	encontrar	algún	vínculo	con	la	actividad	anterior?	
¿Cada	cuántos	aplausos	realiza	el	segundo	estudiante	un	movimiento?	
¿Cada	cuántos	aplausos	realiza	el	tercer	estudiante	un	movimiento?	
Escribe una secuencia de pasos para a partir del dibujo del pizarrón saber la cantidad de 
aplausos. 
Actividad 3 
En esta actividad se formaliza una forma de escribir en base 3 y se genera el algoritmo 
para pasar de base 3 a base 10, aunque aún se sigue trabajando a partir del juego de la 
Actividad 2.
Supone que a la posición de los estudiantes los representamos con tres números, cada uno 
de ellos representando el número de brazos levantados de cada estudiante, por ejemplo, el 
número	[2,1,0]	significa	que	el	estudiante	de	la	derecha	no	tiene	los	brazos	levantados,	el	
del medio un brazo levantado, y el de la izquierda ambos brazos levantados.
Matemática y Programación
- 11 -
¿Cómo	hay	que	proceder	para,	a	partir	de	una	terna	tipo	[2,1,1],	decodificar	la	cantidad	de	
aplausos que se dieron? Escríbelo esquemáticamente
 
Utiliza el esquema anterior para saber la cantidad de aplausos que hubo para que los estu-
diantes queden en las posiciones siguientes:
a) [2,0,0]
b) [1,0,1]
c) [1,1,1] 
Escribe la posición para cada uno de los estudiantes para: 
a) 20 aplausos 
b) 24 aplausos 
c) 45 aplausos 
d) 80 aplausos 
Escribe una secuencia de pasos para que, a partir de un número, se devuelva una lista con 
la posición en que quedan los estudiantes si se hacen tantos aplausos como indica el núme-
ro. Escríbelo esquemáticamente.
* Posibles pasos a seguir
La generalización es una parte importante de la actividad matemática de estudiantes a 
nivel secundario,, aquí presentamos algunas posibles actividades en este sentido.
¿Cuál	es	el	mayor	número	que	podemos	representar?	¿Y	si	ponemos	un	estudiante	más,	o	
2 o 3...?
Los números que representacada estudiante nunca son mayo-
res	 a	 2	 por	 un	 problema	 antropomórfico,	 	 pero	 ¿qué	 pasaría	 si	 octópo-
dos	 ocuparan	 el	 lugar	 de	 los	 estudiantes?¿Cómo	 representarían	 33	 aplausos? 
 Otra forma de cambiar la base podría ser que los estudiantes representen su canti-
dad con los dedos de una mano mientras esconden el resto de sus cuerpos atrás del escri-
torio (base 6) , o representar las cifras parándose y agachándose (base 2).
Implementación
El profesor tomará los algoritmos hechos por los estudiantes y los ayudará a implementar-
los en python.
Los errores en los mismos pueden ser tratados antes de la implementación o después.
Soluciones posibles para los esquemas del algoritmo.
* Resolución esquemática del problema de pasar de la posición de los estudiantes al número que 
representa:
El primer número vale tanto como el mismo, así que no hay que hacer nada con él, el se-
gundo número cuenta de a 3, se mueve una vez por cada 3 aplausos por lo tanto hay que 
multiplicarlo por 3, el tercer número cuenta de a 9, se mueve cada 9 aplausos por lo tanto 
hay que multiplicarlo por 9.
Entonces [a,b,c]---> a*9+b*3+c (o [a,b,c]--->a+b*3+c*9) 
Matemática y Programación
- 12 -
* Resolución esquemática del problema de pasar de un número de aplausos a la posición de los 
estudiantes:
Opción 1
Si el número es mayor o igual a 9 (pero menor a 26, si no no se puede representar con 3 
cifras) se divide entre 9, el cociente es la última cifra. El resto, que es menor a 9 se lo divide 
entre 3 y el cociente es la penúltima cifra, el resto que es menor a 3 son las unidades.
Si es menor a 9 la ultima cifra es 0 y se divide al número entre 3 y el cociente es la segun-
da cifra y el resto las unidades. A continuación usamos la siguiente notación, para cociente 
(//) y resto (%) de la división entera respectivamente, que es la misma que usa python para 
esas operaciones.
Si n>=9 la ultima cifra es n//9 (cociente de la división entera de n entre 9), la segunda cifra 
es (n%9)//3 (el cociente de la división entera del resto de n entre 9 entre 3), la primera cifra 
es (n%9)%3 (el resto de la división anterior).
Si n<9 la última cifra es 0, la segunda es n//3 y la primera es n%3.
 Opción 2
Se divide el número entre 3 y el resto son las unidades, al cociente se lo divide entre 3 y el 
resto es la segunda cifra. El cociente, que es menor a 3 es la tercer cifra. 
Primera cifra n%3
Segunda cifra (n//3)%3
Tercera cifra (n//3)//3
La última opción es ciertamente más elegante, sobre todo si se observa que la tercer cifra 
también es ((n//3)//3)%3, el problema es que es menos intuitiva. En todo caso es muy difícil 
predecir el algoritmo exacto que los estudiantes van a desarrollar, este es sólo un ejemplo, 
la siguiente demostración es importante para el curso de 2°BD si se toma como objetivo 
formalizar razonamientos.
Proposición: Ambos métodos son equivalentes
n=3q1+r1 r1<3
q1=3q2+r2 r2<3
q2=3 0+r3 r3=q2<3
De la opción 2 a la opción 1
==>
n=3*(3q2+r2)+r1=3*(3*(r3)+r2)+r1=9r3+3r2+r1	ALQQL	(a	lo	que	queríamos	llegar)	
De la opción 1 a la opción 2
Además si n= 9r3+3r2+r1 ==> n//9 =r3 ya que 3r2+r1<9 y (3r2+r1)//3= r2 y (3r2+r1)%3=r1 
Por lo tanto ambos métodos son equivalentes.
Algoritmos en python2
Matemática y Programación
- 13 -
# Pasamos el número de aplausos a la posición de los estudiantes, con el algoritmo de la 
opción 1 
def posiciones1(número): 
 lista=[0,0,0] 
 if número>=9: 
 lista[2]= número // 9 # recordar, número // 9 es el cociente de dividir número 
entre 9 
 lista[1]= (número % 9) // 3 #recordar, número % 9 es el resto de dividir nú-
mero #entre 9
 lista[0]= (número % 9) % 3 
 else: 
 lista[1]=número // 3 
 lista[0]=número % 3
 
# Pasamos el número de aplausos a la posición de los estudiantes, con el algoritmo de la 
opción 2
def	posiciones2(número):		#ciertamente	esta	opción	es	mas	eficaz,	simple	y	general.	
 lista=[] 
 while número > 0: 
 lista=lista+[número % 3] 
 número=número // 3 
 return lista 
# Escribimos la posición y nos devuelve el número de aplausos 
def aplausos(l): 
 n=0 
 estudiante=0 
 while estudiante<3: 
 n=n+l[estudiante]*(3**estudiante) 
 estudiante = estudiante + 1 
 return n 
* Otros algoritmos para trabajar con cualquier base.
Incluimos la implementación en python de algoritmos para pasar un número en base 10 a 
otra base cualquiera y viceversa.
# Tomamos una base y un número en base 10, y devuelve una lista con las cifras del nú-
mero en la base dada. 
def diez_a_base(número_10,base): 
 lista=[] 
 while número_10 > 0: 
 lista=lista+[número_10 % base] 
Matemática y Programación
- 14 -
 número_10=número_10 // base 
 return lista 
# Tomamos una base y una lista que contiene las cifras en esa base, y devuelve un número 
en base 10 
def base_a_10(l,base): 
 n_10=0 
 recorre=0 
 while recorre<len(l): 
 n_10=n_10+l[recorre]*(base**recorre) 
 recorre = recorre + 1 
 return n_10
* Adición de números en base 3 
Para terminar con esta secuencia, se incluye un diseño de algoritmo de suma de números 
en base 3 y una implementación en python.
EspEcificación dEl prOblEma:
Entrada: Una dupla (sumando, sumando) escritos como listas de cifras. 
Salida: Suma de sumando1 y sumando2 escrito como una lista de cifras.
Primero,
Se generan 2 listas de igual tamaño que los sumandos de tal forma que las cifras faltantes 
se rellenan con ceros.
Luego, se calcula cada una de las cifras del resultado de la siguiente manera:
La primera cifra del resultado, la de las unidades, es el resto de dividir entre 3 (la base) a 
la suma de las primeras cifras de cada uno de los sumandos. El cociente de esta división es 
el acarreo (las decenas que me llevo), que se guarda.
La segunda cifra es el resto de dividir entre 3, a la suma de las cifras de la segundas cifras 
de	cada	sumando	y	el	acarreo.	Y	se	redefine	el	acarreo	como	el	cociente	de	esta	división
Las cifras desde la tercera en adelante se calculan igual que la segunda.
De	hecho	si	se	define	el	acarreo	como	0	al	comenzar	la	suma,	entonces,	la	i-esima	cifra	de	
la suma se calcula sumando la i-esima cifra de cada sumando más el acarreo.
Por	último	si	el	acarreo,	al	final,	no	es	0	se	agrega	una	cifra	al	resultado	colocando	en	ella	
el último acarreo.
Nota: Para python el primer elemento de una lista es el que está a la izquierda, sin embargo en 
la numeración posicional los números se escriben de izquierda a derecha. Por eso en la imple-
mentación python el primer paso es invertir las listas y al final antes de dar la respuesta se invierte 
nuevamente.
Matemática y Programación
- 15 -
Implementación python
# Tomamos una dupla (sumando, sumando), y devuelve la suma de la adición de sumando1 
y sumando2 escrito como una lista 
# Como 
def suma(l1,l2): 
 l1=l1[::-1] #Invertimos las listas
 l2=l2[::-1] # de los sumandos
 lnorm=[] #lnorm es la lista rellenada con ceros (normalizada)
 suma=[] 
#Escribimos ambas listas con igual número de elementos
# rellenamos los lugares faltantes con 0 a la izquierda
 i=1 
 while i <= max(len(l1),len(l2)): 
 lnorm=lnorm+[0] 
 suma=suma+[0] 
 i=i+1 
 if len(l1)<len(l2): 
 for cifra in range(0,len(l1)): 
 lnorm[cifra]=l1[cifra] 
 l1=lnorm 
 else: 
 for cifra in l2: 
 lnorm[cifra]=l2[cifra] 
 l2=lnorm 
# Adición con algoritmo escolar.
 acarreo=0 
 for cifra in range(0,len(l1)): 
 suma[cifra]=(l1[cifra]+l2[cifra]+acarreo)%3 
 acarreo=(l1[cifra]+l2[cifra]+acarreo)//3 
 if acarreo!=0: 
 suma=suma+[acarreo] 
	 return	suma[::-1]		#invertimos	el	resultado	final	al	devolverlo.
Matemática y Programación
- 16 -
Conclusiones: 
En esta secuencia se evitó explícitamente, una introducción básica en python y se en-
focó el trabajo en la parte matemática, por lo tanto no es recomendable usarla como 
primera actividad para el trabajo en python, de hecho se puede eliminar completamente la 
implementación en este lenguaje y la actividad no cambiaría en su esencia. Sin embargo 
trabajar con python resultaútil fundamentalmente en dos aspectos:
Como motivación, no sólo por trabajar con las máquinas si no como actividad creadora, ya 
que generar un programa que funciona es muy satisfactorio. La implementación en python 
puede ser el cierre para la resolución de un problema algorítmico. 
 Como un actor que obliga al estudiante a explicitar el algorítmo con rigurosidad, y 
validador	del	resultado.	Ya	que	el	estudiante	puede	probar	su	programa	y	verificar	por	si	
mismo si funciona bien o funciona mal generando autonomía en el estudiante [1]. Esto fo-
menta que el docente adopte un rol de guía para el estudiante, y que éste sea el principal 
agente de la construcción de su conocimiento.
Bibliografía
1. . Gilles Dowek, Quelle informatique enseigner au lycee?, https://who.rocq.inria.fr/Gilles.Dowek/lycee.html 
(2005)
Matemática y Programación
- 17 -
CÉDULA DE IDENTIDAD. DÍGITO DETRÁS DEL GUIÓN
Luis Langon (Liceo Solymar 2 , Canelones)
Todos conocemos nuestro número de cédula y sabemos algo del número de otra perso-
na... Es fácil suponer que se trata de un número de 7 cifras (tal vez 6 en una persona 
de mayor edad) seguido por un guión y otro número entre 0 y 9. 
No	es	frecuente	que	nos	preguntemos	¿para	qué	sirve	este	último	dígito?...	si	es	que	sirve	
para	algo...	Se	lo	conoce	con	el	nombre	de	“el	dígito	verificador”	está	claro	entonces	que	
sirve	para	verificar.	Para	verificar	que	los	números	anteriores	han	sido	bien	escritos.
¿Cómo	con	un	número	solo	se	puede	saber	que	los	7	anteriores	fueron	bien	o	mal	escritos?	
Bueno ahí es donde entra la matemática... Ya está todo pronto para empezar a trabajar e 
investigar sobre este tema.
* ¿Cómo se calcula ese dígito?
Veremos con un ejemplo cómo es este método 1. 
Se necesita una cédula, por ejemplo 3.416.652-_ y el número 2987634, que es una cons-
tante dada (a la cual se le quita el primer 2 en caso de que la cédula tenga 6 dígitos).
Primer paso: Se multiplica cada dígito de la cédula por cada dígito del número dado y 
 se anota la última cifra de cada resultado.
 3 4 1 6 6 5 2
 x 2 9 8 7 6 3 4
 6 6 8 2 6 5 8
Segundo paso: Se suman todos los números que se anotaron en el paso anterior y se 
 anota la última cifra de esa suma.
 6 + 6 + 8 + 2 + 6 + 5 + 8 = 41 1
Tercer paso: 
	 	 Si	es	cero,	entonces	el	dígito	verificador	es	0.
 Si no es cero debe calcularse la diferencia con 10.
	 	 	 10		–	 1			=	 9		el	dígito	verificador	es	9.
1 “Una introducción a los códigos detectores de errores y correctores de errores” Pablo Fernández Gallardo y Omar Gil 
Matemática y Programación
- 18 -
Objetivo
Trabajar con las operaciones básicas, suma, multiplicación y división entera (en este caso, 
entre 10), siendo utilizado tanto el resto como el cociente de la división entera, se descubri-
rán algunas propiedades de la división entera entre 10. 
Se pretende dar acá los “primeros pasos en programación” (entendiendo programación 
como la habilidad de escribir un programa que implemente una solución de un problema). 
Son los siguientes:
Saber	especificar	el	problema	que	se	tiene	como	un	problema	algorítmico	(puede	darse	
ejemplos de problemas no algorítmicos).
Encontrar una solución y saber diseñarla en forma de algoritmo, o sea una transformación 
de los datos de entrada en la salida deseada, escrita en forma de pasos.
Saber traducir dicha solución a un programa, para eso se deberán conocer los comandos 
básicos de entrada, salida, asignación, bucle y condicional y habrá que trabajar la sintaxis 
específica	del	lenguaje	python	que	es	el	que	se	usa	en	esta	pasantía	(ver	manual	adjunto).
nivEl: El bloque didáctico está pensado para primeros años de ciclo básico, pero es po-
sible llevarlo adelante en otros niveles ya que el objetivo es utilizarlo como ejemplo de 
algoritmo y dar los primeros pasos en programación e implementación.
Actividad1
Presentar el tema y el objetivo 
¿Por	qué	tenemos	tal	número	de	cédula?	¿Es	por	edad?		
¿Por	qué	hay	un	número	separado	por	un	guión?	¿Sirve	para	algo?
Hacemos 10 grupos, uno para cada dígito, juntando en cada grupo a los alumnos que tienen 
el mismo dígito en su cédula. Damos tiempo para que prueben algoritmos con los números 
de	sus	cédulas	y	que	el	resultado	sea	su	dígito	verificador...	Dejamos	que	prueben	diferen-
tes	estrategias	pero	al	final...	¡No	encontramos	nada!	Los	alumnos	buscarán	la	información	
acerca	del	significado	de	ese	número	y	de	cuál	es	el	algoritmo	correcto	para	calcularlo	(esta	
información está disponible en internet).
Actividad 2
Los alumnos deberán escribir las instrucciones que se siguen para calcular el dígito de con-
trol. Cada grupo debe redactar un procedimiento para que los otros sigan las instrucciones 
que	llevan	a	calcular	el	dígito	verificador.	Se	practica	esto	en	forma	de	juego	donde	cada	
equipo sigue las operaciones que el otro equipo dio. Formalizamos el concepto de algoritmo 
en base a lo estamos haciendo. 
“Entrada (ci) ---> algoritmo ---> salida(d)”
Actividad 3
Aquí se lleva a cabo el trabajo sobre la computadora, se busca que los alumnos implemen-
ten	y	especifiquen	este	algoritmo	en	lenguaje	python	utilizando	el	editor	gedit	y	ejecuten	el	
programa en un terminal.
Para que puedan hacerlo se deben aclarar ciertos puntos:
La carpeta en la que graban el archivo ejemplo: “/estudiante/Documentos”
Matemática y Programación
- 19 -
El nombre del archivo al guardar por ejemplo: “cédula.py”
Ejecutar el terminal en el menú: “Aplicaciones > Accesorios > Terminal”
Seleccionar la carpeta correcta escribiendo: “cd /estudiante/Documentos”
Ejecutar el intérprete python escribiendo: “python”
Ejecutar el programa escribiendo: “import python”
Listar y aclarar los comandos python que se necesitan, que se encuentran explicados en el 
manual adjunto:
Asignación ejemplo: “m = 2987634“
Repetición: “while”
Condicional: “if”
entrada: “input”
salida: “print”
* Especificación
Entrada:		 Número	entero	(cédula	sin	puntos,	ni	guión,	ni	dígito	verificador)	
 llamarlo ced.
algoritmo: Considerar el número entero 2987634, llamarlo m. 
 Sea suma = 0 una variable que utilizaremos para ir sumando. 
 Repetir estos pasos mientras queden cifras disponibles en ced
 multiplicar el último dígito de la cédula por el último de m.
 (esto sería ced mod1 10 * m mod 10)
 agregarlo a la suma. 
 quitar el último dígito de ced y de m.
 (esto sería ced = ced div2 10 y m = m div 10)
 Al terminar con todas las cifras de la cédula.
 Tomar en dig la última cifra de suma (suma mod 10).
 Si es “0” entonces 
 devuelva 0 en dig
 si no...
 devuelva (10 - suma) en dig
Salida: dig	número	entero	(dígito	verificador	de	la	cédula	ingresada)
* Implementación en Python
# funcion que calcula el digito despues del guion 
# entrada: Cédula número entero, (hasta 7 cifras) 
# salida: DIGITO número entero de un digito 
def digito(ci): 
 m = 2987634 # número magico 
 d = 0 # digito de la cédula 
 while m > 0: 
1 Mod: módulo, es el resto de la división entera.
2 Mod: módulo, es el resto de la división entera. 
Matemática y Programación
- 20 -
 n = ci % 10 # último digito de la cédula 
 ci = ci // 10 # quito el último digito 
 d = d + m%10 * n 
 m = m // 10 
 d = d % 10 
 d = 10 - d 
 if d == 10: 
 return 0 
 else: 
 return d 
# para probar la funcion 
print "Ingrese su número de cédula." 
print "Sin puntos, ni guion, ni digito de control" 
print "Escriba 0 para terminar" 
ci = input ("cédula: ") 
while ci != 0: 
 print digito (ci) 
 ci = input ("cédula: ") 
Conclusión
Ha sido un gran placer estudiar programación y conjugarlo con la enseñanza de la ma-
temática. Pensando en el potencial que estas estrategias puedan llegar a tener para 
enseñar matemáticas y para entusiasmar al alumnado -que vemos cada vez más alejado 
del estudio tradicional-, sentimos que se ha encontrado una nueva herramienta en la com-
putadora -que no estaba claro cómo aprovecharla- en “la programación en la enseñanza de 
la matemática”. La secuencia didáctica quese propuso pretende ser un estímulo positivo 
para que el estudiante trabaje, para que se enfrente a un reto con entusiasmo y vea que 
sus objetivos se van cumpliendo a medida que logra desarrollar algoritmos correctos que le 
permiten resolver los problemas y sienta una enorme satisfacción por haberlo conseguido. 
Nosotros mismos nos tropezamos con múltiples inconvenientes en el proyecto y cada obs-
táculo que se sorteaba nos daba tal satisfacción que se generaban las fuerzas para seguir 
hacia adelante. 
Matemática y Programación
- 21 -
PROPUESTA SOBRE CONJUNTOS
Santiago Martorell y Patricia Añón - CETP, CES
El ejercicio que se propone está pensado para trabajar con relaciones y operaciones 
básicas de conjuntos (unión, intersección, inclusión y diferencia). El abordaje intenta 
fusionar conceptos básicos de teoría de conjuntos que pueden ser trabajados en diversas 
asignaturas (matemática, lógica) del liceo y/o utu, y conceptos de programación básicos y 
necesarios en la enseñanza de la informática. De esta manera, la teoría (conceptos puntua-
les	a	trabajar)	y	la	práctica	(escritura	del	programa)	se	unifican	en	el	ejercicio,	intentando	
apartarnos de la idea de dicotomía entre uno y otro.
Se trata de diseñar un algoritmo para cada una de las operaciones e implementarlo como 
un programa en el lenguaje python. Si bien podemos encontrar funciones preestablecidas 
en python para cada una de las operaciones binarias con conjuntos, la idea central es que 
los estudiantes elaboren e implementen sus propios algoritmos como forma de reforzar la 
comprensión de los conceptos involucrados, útiles tanto para matemática como para pro-
gramación.
PROPUESTA DE TRABAJO
Se propondrá al estudiante el siguiente ejercicio:
 Dados dos conjuntos de números enteros, diseña algoritmos que devuelvan el 
 resultado de cada una de las siguientes relaciones y operaciones: 
•	Unión
•	Intersección
•	Inclusión
•	Diferencia
 Implementa en python cada uno de los algoritmos.
El programa principal, dónde se ingresan los elementos de los conjuntos y se elige la ope-
ración a realizar, es dado por el docente (lo encontrará en el apéndice). Los estudiantes 
deben elaborar un módulo con cada una las operaciones implementadas y usar el programa 
dado.
Para llegar a la solución, necesariamente habrá un proceso de pensamiento sobre el pro-
blema que se plantea, el algoritmo que nos lleva a la misma y los pasos a seguir para deter-
minar cada una de las operaciones que el programa debe realizar.
FUNDAMENTACIÓN
Matemática y Programación
- 22 -
Otro aspecto de fundamental importancia, es la interacción que se da entre el lenguaje for-
mal y el lenguaje natural, dado que se le pide al alumno que lo exprese en lenguaje natural 
y/o en pseudocódigo. De esta manera se le está dando la posibilidad de que se concentre en 
el contenido y no tanto en utilizar un determinado lenguaje de programación para expresar-
lo.	Una	vez	que	ha	pensado	suficientemente	los	pasos	para	resolver	el	problema	en	el	len-
guaje natural, podrá concentrarse en escribirlo en un lenguaje de programación, instancia 
que	presenta	la	dificultad	del	dominio	de	dicho	lenguaje,	pero	que	no	tiene	que	ver	con	las	
dificultades	en	la	solución	misma	del	problema.
DESCRIPCIÓN DEL ALGORITMO
Antes de intentar escribir en un lenguaje de programación la solución al problema plantea-
do,	es	conveniente	especificar	el	problema,	diseñar	la	solución	en	lenguaje	natural,	pensar	
qué	pasos	debemos	seguir	para	llegar	a	la	misma,	dejando	para	más	adelante	la	dificultad	
de	la	implementación.	Esto	es,	resolver	el	problema	en	sí,	sin	que	en	ello	influyan	dificulta-
des que puedan tener que ver con el dominio del lenguaje de programación.
El pseudocódigo utilizado es una mezcla de lenguaje natural (español) con lenguaje mate-
mático.	Constituye	una	guía	para	confeccionar	el	código	final,	por	ello	es	conveniente	tener	
presente	que	no	es	necesario	profundizar	en	la	definición	de	variables,	estructuras,	y	otros	
elementos, durante la construcción del mismo. Probablemente, al momento de confeccionar 
el	código	final,	se	modificarán	algunas	partes	del	pseudocódigo,	ya	que	hay	que	adaptarse	
a las limitaciones que tienen los lenguajes de programación, en cuanto a estructuras 
disponibles y sintaxis, entre otros.
* Operaciones a realizar:
•	Dados dos conjuntos A y B, determinar el conjunto C resultado de realizar la unión 
entre ambos:
 ° Si A es vacío 
 ▪C = B
 ° Si no, si B es vacío
 ▪C = A
 ° o Si no
 ▪C = A
 ▪Mientras tenga elementos en B, tomo elemento de B
•	Si elemento no pertenece a C
 ° C = C + elemento de B
 ° Devuelvo C
•	Dados dos conjuntos A y B, determinar el conjunto C resultado de realizar la intersec-
ción entre ambos:
Matemática y Programación
- 23 -
 ° Si A o B vacíos
 ▪ C = Ø 
 ° Si no
 ▪Mientras tenga elementos en A, tomo elemento de A
•	Si elemento de A pertenece a B
 ° C = C + elemento de B
 ° Devuelvo C
•	Dados dos conjuntos A y B, determinar el conjunto C resultado de realizar la diferencia 
entre ambos (A – B):
 ° Si A vacío
 ▪C = Ø
 ° Si no
 ▪C = A
 ▪Mientras tenga elementos en B, tomo elemento de B
•	Si elemento de B pertenece a C
 ° C = C – elemento de B
 ° Devuelvo C
•	Dados dos conjuntos A y B, determinar si A está incluido en B, devolviendo un booleano 
como resultado:
 ° Resultado = TRUE
 ° Si cantidad de elementos de B es mayor o igual a cantidad de elementos de A
 ▪Mientras tenga elementos en A, tomar elemento de A
•	Si elemento no pertenece a B 
 ° Resultado = FALSE
 ° Si no
 ▪ Resultado = FALSE
 ° Devolver Resultado
Matemática y Programación
- 24 -
Módulo con implementaciones en python de relaciones operaciones y con conjuntos
import copy
def intersec(c1, c2): 
 resultado = []
 for valor in c1:
 if pertenece(c2, valor):
 resultado.append(valor)
 return resultado
def inclusion(c1, c2):
 resultado = True
 contador = 0
 while resultado and contador < len(c1):
 resultado = pertenece(c2, c1[contador]) and resultado
 contador +=1
 return resultado
def union(c1, c2):
 if len(c1)== 0:
 resultado = c2
 elif len(c2)== 0:
 resultado = c1
 else:
 resultado = copiar(c1)
 for valor in c2:
 pertenecec1 = pertenece(c1, valor)
 if not pertenecec1 :
 resultado.append(valor)
 return resultado
 
def copiar(c1):
 resultado = []
 for valor in c1:
 resultado.append(valor)
 return resultado
def mostrarconjuntos(listaconjuntos):
 contador = 1
 for conjunto in listaconjuntos:
 print “c”,contador,”: “,conjunto
 contador +=1
 
def pertenece(c1, número):
 resultado = False
 contador = 0
Matemática y Programación
- 25 -
 while contador < len(c1) and not resultado:
 if c1[contador] == número:
 resultado = True
 contador +=1
 return resultado
def diferencia(c1, c2):
 resultado = []
 for valor in c1:
 if not pertenece(c2, valor):
 resultado.append(valor)
 return resultado
* Aclaraciones sobre la implementación
Es apropiado, para la implementación en python, introducir algunos elementos de este 
lenguaje. Se resumen a continuación:
•	For: repite un segmento de código, dado un dominio de n elementos, el segmento de 
código que se encuentra en el bloque se repetirá n veces.
•	Append: agrega un elemento a un conjunto de elementos.
•	And: operador “y” lógico. 
•	+=1: le suma uno al valor actual de la variable y se lo asigna a la misma.
•	==: operador de igualdad, compara dos valores, devuelve TRUE si son iguales, FALSE 
si no.
•	If: evalúa una expresión booleana, y ejecuta sentencias de acuerdo a su valor.
•	Return: devuelve el resultado de una función.
•	Not: dada una expresión, realiza la operación de negación de la misma. Si la expresión 
se evalúa TRUE, NOT expresión se evaluará FALSE.
Para ampliar esta información, ver el manual que complementa este trabajo.
En el apéndice se proporciona un programa principal para que el profesor entregue a los 
estudiantes, de forma tal que estos puedan probar sus funciones implementadas en python. 
Para ello se debe proceder de lasiguiente manera:
•	Crear módulo para programa principal (con extensión .py).
•	Ingresar el código brindado.
•	Tener en cuenta el nombre de las funciones en el programa dado (diferencia, intersec, 
union,	 inclusion);	 si	 se	utilizan	 otros	nombres	deben	 ser	modificados	 en	el	 programa	
principal.
EJERCICIOS
Se presentan a continuación algunos ejercicios, con los que se puede comenzar a probar 
el programa. A través de casos puntuales se guía al estudiante para llegar a enunciar pro-
piedades y/o generalizaciones, comenzando por expresar las mismas en el lenguaje natural, 
Matemática y Programación
- 26 -
para luego formalizarlas en lenguaje simbólico.
Además de continuar trabajando la temática, podrán utilizar el programa de cuya creación 
fueron	partícipes	para	seguir	reafirmando	conceptos	de	teoría	de	conjuntos.
1) Dados los siguientes conjuntos: 
 ▪A = {2,4,6,8,9} y B = {3,4,5,9}
 ▪M = {10,12,15,19} y N = {21,25,1}
 ▪W = {6,9,5,34,10,20} y R = {34,5,9}
Resuelva: 
•	C =A (A ∩ B)
•	P (M ∩ N) 
•	Z(W ∩ R) 
¿Se	cumple	lo	siguiente?	Justifique	(puede	utilizar	el	programa	para	sacar	sus	conclusio-
nes): 
•	C ⊆ A y C ⊆ B.
•	P ⊆ M y P ⊆ N.
•	Z ⊆ W y Z ⊆ R.
2) Dadas las siguientes igualdades: 
•	 (C1 ∩ C2) ∪ C1= C1 ∪ C2
•	 (C1 ∩ C2) ∪ C1= C1
•	(C1 ∩ C2) ∪ C1= C2
a.	Marque	la	opción	correcta	y	justifique	en	todos	los	casos.	(Puede	corroborar	que	la	op-
ción tomada es la correcta, utilizando el programa).
b	.De	acuerdo	a	lo	resuelto	en	el	punto	a),		¿podría	llegar	a	una	generalización?	En	caso	
afirmativo,	exprésela	en	lenguaje	natural.
c. Complete los espacios punteados:
∀A , ∀B, si …⊆ A entonces A ∪ B … A
CONCLUSIONES
Se espera que el estudiante pueda, en principio, lograr diseñar los algoritmos necesarios 
para cada relación y operación. Esta actividad, no solo permite ver si el concepto abordado 
(la operación en cuestión) fue comprendida, si no también enfocarse en donde se presentan 
las	dificultades	para	poder	superarlas.
Al mismo tiempo, al implementarlo en python, el educando puede aproximarse a la pro-
gramación partiendo de un conocimiento matemático, y vivenciar el “rigor” al enfrentar los 
Matemática y Programación
- 27 -
errores que se marcan en la compilación del programa, sin que sea el docente el encargado 
de marcarlo si no la objetividad de una máquina. 
Además, se espera que el programa, en parte creado por cada uno de los estudiantes, pue-
da ser puesto en uso para resolver problemas como los propuestos anteriormente, y conti-
nuar	reflexionando	sobre	la	teoría	de	conjuntos,	con	un	producto	creado	por	ellos	mismos.
Se espera que mediante esta actividad el estudiante contribuya a desarrollar una nueva 
forma de trabajo, basándose en el pensamiento algorítmico, y que sea capaz de aplicarlo 
en	cualquier	ámbito	en	el	que	resulte	eficaz.	Esto	refiere	a	generar,	a	propiciar,	mediante	el	
lugar que nos toque en el ámbito educativo, un modelo de pensamiento en el que se hace 
énfasis	en	la	importancia	de	la	reflexión	del	paso	a	paso	a	seguir	para	llegar	a	resolver	un	
problema, disminuyendo así las posibilidades que existen de cometer errores.
El	hecho	de	que	se	utilice	un	lenguaje	de	programación,	en	la	etapa	final,	permite	que	se	
alcance un grado de formalización importante, surgido de la necesidad de seguir la sintaxis 
y la semántica del mismo.
Por otra parte, la posibilidad de ejecutar el programa, y observar su comportamiento, ge-
nera una motivación extra, por lo que se vuelve un objeto didáctico ventajoso.
Finalmente, cabe destacar que el desarrollo de este tipo de actividades, contempla la inter-
disciplinariedad, ya que se trabajan aspectos matemáticos, lógicos, y del lenguaje. Esto es 
importante, ya que es una manera de enlazar distintas disciplinas desde un trabajo puntual, 
y evidenciar cuán enriquecedor resulta comprender que el conocimiento no se limita a un 
área en particular, si no que es, en el entramado de áreas que se vinculan entre sí.
APÉNDICE
Implementación en python del programa principal
Se	brinda	a	continuación,	un	posible	programa	principal,	comentado	(el	texto	que	figura	luego	del	#	
es el comentario de la línea en que se encuentra), de forma que puedan ser probadas las funciones 
diseñadas y programadas por los estudiantes. 
import opconj
contadorconj = 0 # variable para contar la cantidad de conjuntos que se han ingresado
contador = 0 # variable para contar de uso general
respuesta = 1 # variable para seleccion de menu principal
listaconjuntos = [] # arreglo para almacenar los conjuntos (en cada posición se almacena un con-
junto)
conjuntoA = 1 # variable que indica el número del primer conjunto con el que se trabaja
conjuntoB = 2 # variable que indica el número del segundo conjunto con el que se trabaja
#cargo conjuntos de prueba
listaconjuntos.append([1,2,3,4,5,6,7]) #primer conjunto
listaconjuntos.append([1,2,3,4,5,6,7,8,9]) #segundo conjunto 
Matemática y Programación
- 28 -
while respuesta > 0: #Comienzo del menu principal - con opción 0 termina el programa 
 print
 “###########################################################”
 print “Conjuntos”
 print “1-Ingresar conjuntos”
 print “2-Operaciones binarias”
 print “0-Salir”
 respuesta= int(raw_input(“Ingrese una opción: “))
 print 
“###########################################################”
 if respuesta == 1: #seleccion de opción 1 del menu principal - Ingresa conjuntos
 listaaux = []
 print “Ingresar conjuntos”
 salir = ‘n’ #inicializo la variable salir
 while salir != ‘s’: #pide elementos y los agrega al conjunto mientras no se ingrese la 
letra “s”
 salir = raw_input(“Ingrese un elemento (s para terminar): “)
 if (salir != ‘s’ and salir != ‘n’): #chequea que lo ingresado no sea ni “s” ni “n”
 número=int(salir) #se transforma el texto a número
 if opconj.pertenece(listaaux, número) == False: #se chequea que no 
pertenezca ya al conjunto
 listaaux.append(número) #se agrega el elemento al conjunto
 else:
 print “El elemento ya pertenece al conjunto”
 listaaux.sort() #se ordena el conjunto
 listaconjuntos.append(listaaux) #se agrega el nuevo conjunto a la lista de conjuntos
 print “El conjunto ingresado es: “, listaaux #se muestra el conjunto ingresado
 contadorconj +=1 #se aumenta la cantidad de conjuntos disponibles en 1
 opconj.mostrarconjuntos(listaconjuntos) #se muestran todos los conjuntos
 elif respuesta == 2: #seleccion de opción 2 del menu principal - Operaciones binarias
 respuesta2 = 1
 while respuesta2 != 0: # Comienzo del menu de operaciones binarias - con opción 0 
vuelve a menu principal
 print 
“#######################################################” 
 print “Operaciones binarias”
 print “1-Interseccion”
 print “2-Inclusion”
 print “3-Union”
 print “4-Diferencia”
 print “5-Ver Conjuntos”
 print “6-Seleccionar Conjuntos”
 print “0-Salir”
 respuesta2 = int(raw_input(“Ingrese una opción: “))
 print 
“#######################################################”
Matemática y Programación
- 29 -
 if respuesta2 == 1: #selecciona opción 1, se realiza la interseccion entre los 
conjuntos seleccionados
 #llamo a la funcion que realiza la interseccion y muestro el conjunto 
resultado 
 print “La interseccion es: “,opconj.intersec(listaconjuntos[conjunt
oA-1], listaconjuntos[conjuntoB-1])
 elif respuesta2 == 2: #selecciona opción 2, chequea la inclusion del conjun-
toA en el conjuntoB
 #llamo a la funcion que chequea la inclusion y muestro el resultado
 resultado = opconj.inclusion(listaconjuntos[conjuntoA-1], 
listaconjuntos[conjuntoB-1])
 if len(listaconjuntos[conjuntoA-1])==len(listaconjuntos[conjuntoB-1]) 
and resultado:
 print “c”,conjuntoA,”: “,listaconjuntos[conjuntoA-1], “ esta in-
cluido estrictamente en c”,conjuntoB,”:”, listaconjuntos[conjuntoB-1]
 elif resultado:
 print “c”,conjuntoA,”: “,listaconjuntos[conjuntoA-1], “ esta in-
cluido en c”,conjuntoB,”:”, listaconjuntos[conjuntoB-1]
 else:
 print “c”,conjuntoA,”: “,listaconjuntos[conjuntoA-1],“ NO esta 
incluido en c”,conjuntoB,”:”, listaconjuntos[conjuntoB-1]
elif respuesta2 == 3: #selecciona opción 3, se realiza la union entre los conjuntos seleccionados
#llamo a la funcion que realiza la union y muestro el conjunto resultado
 print “La union es: “, opconj.union(listaconjuntos[conjuntoA-1], 
listaconjuntos[conjuntoB-1])
 elif respuesta2 == 4: #selecciona opción 4, se realiza la diferencia entre los conjuntos selec-
cionados
 #llamo a la funcion que realiza la diferencia y muestro el conjunto resultado
 print “La diferencia es: “, opconj.diferencia(listaconjuntos[conjuntoA-1], 
listaconjuntos[conjuntoB-1])
 elif respuesta2 == 5: #selecciona opción 5, se muestran los conjuntos disponibles
 #llamo a la funcion que muestra la lista de conjuntos disponibles
 opconj.mostrarconjuntos(listaconjuntos)
 elif respuesta2 == 6: #selecciona opción 6, se seleccionan los conjuntos para trabajar
 print “Los conjuntos seleccionados actualmente son: c”,conjuntoA,” y c”,conjuntoB
 opconj.mostrarconjuntos(listaconjuntos) #muestro conjuntos disponibles
 #se piden los nuevos conjuntos (se deben ingresar solo números)
 conjuntoA = int(raw_input(“Ingrese el número correspondiente al primer conjunto: “))
 conjuntoB = int(raw_input(“Ingrese el número correspondiente al segundo conjunto: “))
 #cierre del bloque condicional del menu de operaciones binarias
 #cierre del while del menu de operaciones binarias
 #cierre de bloque condicional del menu principal
#cierre del while principal (termina el programa)
Matemática y Programación
- 30 -
DIVISIBILIDAD 
Teresa Pérez (Liceo Solymar 1, Canelones, CES)
El objetivo de la secuencia es en forma simultánea, estudiar algunos conceptos básicos 
relativos a divisibilidad e introducir nociones de programación utilizando como lenguaje 
phyton. 
Las nociones básicas de divisibilidad no son nuevas para los estudiantes liceales - ya sea 
de 1°CB, como de 2°BD - lo que lo hace especialmente adecuado para está introducción “en 
simultáneo” de las nociones de algoritmia, que sería el verdadero contenido nuevo. Creemos 
a su vez que ayudará a lograr una conceptualización más profunda de contenidos matemá-
ticos con los que los estudiantes ya están familiarizados desde un nivel fundamentalmente 
procedimental.
En	principio	las	actividades	están	pensadas	tanto	para	1°CB	como	para	2°BD	(específica),	
lo que sin duda será diferente son las producciones de los estudiantes y el nivel de profun-
dización y fundamentación que se llegue a lograr. 
Se detallarán tres actividades, y luego se agregan otras como continuación del trabajo que 
pretende integrar nociones de algoritmia, a través del estudio del tema divisibilidad en la 
clase de matemática.
Actividad 1:
Se hace correr un programa (acertijo1) 1 que pide a los estudiantes un número natural y les 
devuelve el conjunto de divisores del mismo. 
La actividad consiste en 2: 
• Experimenta varias veces con el programa.
• Explica para qué sirve el programa y cámbiale el nombre de acuerdo a ello. 
• Escribe qué datos se debe proporcionar y qué información devuelve el programa.
• Escribe los pasos de un procedimiento que te permita hacer lo mismo que el progra-
ma.
1 En caso de problemas al abrir el archivo, ver el manual.
2 Cada docente decidirá cómo dosifica la consigna de acuerdo a las características de sus grupos, si van todas juntas de a una, 
según el ritmo de cada uno 
Matemática y Programación
- 31 -
El propósito de está actividad es desde el punto de vista de los conceptos matemáticos, in-
troducir la noción de conjunto de divisores, que el estudiante conoce desde primaria. Desde 
el punto de vista de la programación, se busca en primer lugar generar curiosidad acerca 
de cómo la máquina resuelve el problema de hallar el conjunto de divisores de un número 
natural.
Luego de que el grupo reconozca de qué problema se trata, se formalizará la noción de 
conjunto	de	divisores,	para	la	cual	se	hace	necesaria	alguna	definición	de	divisor.	La	defini-
ción elegida, dependerá de los procedimientos que hayan surgido en el grupo para resolver 
el problema de encontrar el conjunto de divisores de un número. Inclusive es posible que 
surja más de una opción, y puede ser interesante aprovechar la instancia para trabajar las 
relaciones	entre	diferentes	definiciones	de	un	objeto	matemático.	
 
El tener que descubrir lo que hace el programa y luego elaborar una estrategia personal, 
le hace no solo poner en juego conceptos matemáticos, si no ordenar en forma de secuen-
cia temporal los procedimientos que utiliza para resolver el problema, o sea desarrollar un 
algoritmo.
Si nos centramos en la introducción a la algoritmia1, se busca en primer lugar que el alumno 
pueda	formular	el	problema	que	resuelve	la	máquina,	especificando	las	condiciones	de	en-
trada y de salida. Estos conceptos deben explicitarse en la puesta en común en la clase. Para 
el	trabajo	en	la	construcción	de	procesos	algorítmicos	es	clave,	ya	que	la	especificación	de	
las condiciones de entrada y salida son el primer paso para comprender un problema algorít-
mico [2]. Desde el punto de vista de los contenidos matemáticos, el determinar con claridad 
que para “Hallar los divisores de un número natural” para cada número natural (el objeto 
de entrada es un número) obtengo un conjunto de números naturales (el objeto de salida 
es un conjunto) mejora sin duda la conceptualización de la noción “conjunto de divisores”, 
pero además y en forma no explícita, ayuda a la construcción de la noción de función, que si 
bien no es un objetivo visible, resulta fundamental en los procedimientos de programación.
Lo que realiza el programa, es en principio una “caja negra”, por eso se pide al estudiante 
que explicite posibles algoritmos que devuelvan el mismo resultado que el programa. La 
discusión de los distintos procedimientos resulta fundamental para la construcción de un 
pensamiento algorítmico. Se sugiere como actividad de clase intercambiar los procedimien-
tos, y que los estudiantes deban “ejecutar” algún procedimiento pensado por otro compa-
ñero. 
El último paso, sería mostrar una posible implementacion en python, de modo de ir intro-
duciendo el mundo de los lenguajes de programación y algunos elementos de la implemen-
tación.
En	definitiva:	el	programa	no	es	otra	cosa	que	una	secuencia	ordenada	de	pasos,	escrita	en	
un determinado código, que debe ser preciso y correcto para poder ser entendido por la má-
quina. El programa lo escribo como un texto y luego necesito un “intérprete” que lo ejecute.
1 Es en este punto donde se conjugan el aspecto matemático del problema y su vinculación con la programación, que va más 
allá de las cuestiones de implementación.
Matemática y Programación
- 32 -
Además permite que el alumno se familiarice con algunos aspectos de la sintaxis de python.
Desarrollaremos la solución al problema de obtener el conjunto de los divisores de un nú-
mero natural dado y luego su implementación. Eventualmente se puede pedir que los estu-
diantes lo ejecuten manualmente.
Para ello primero debemos analizar si el mismo está realmente formulado como un proble-
ma	algorítmico.		¿Están	especificadas	las	condiciones	de	entrada?	¿Están	especificados	los	
elementos de salida deseados?
#	Especificación	de	la	entrada: un número natural 
# Especificación	de	elementos	de	salida: el conjunto de los divisores del número de la 
entrada
Pasaremos a desarrollar una solución del problema, o sea un algoritmo, en español y en 
python. (implementación en phyton) 1
Alogaritmo en español Implementación en phyton 
Escribir un número natural a.
Para cada natural entre 1 y a, que llamaremos x, calcular el 
resto de dividir a entre x.
Si el resto obtenido es 0, escriba x en la lista d 
Escriba la lista d.
a = input("escriba un número natural: ") 
for x in range(1, a+1) a%x
d = [x for x in range(1, a+1) if a%x= =0] 
print "d =", d
Si observamos el segundo y tercer pasos del procedimiento: 
•	Para cada natural entre 1 y a, quellamaremos x, calcular el resto de dividir a entre 
x. Se escribe en python: for x in range(1, a+1) a%x
•	Si el resto obtenido es 0, se escribe en python: if a%x == 02
•	Finalmente la lista d por comprensión es: d = [x for x in range(1, a+1) if a%x==0] 
Se	lee:	d	es	la	lista	de	los	elementos	x,		1		≤	x		≤	a,		tales	que	a%x	==	0
En	este	contexto,	la	definición	matemática	más	adecuada	para	divisor	de	un	número	es:		
a|b <=>bmod(a)=0 3 y para conjunto de divisores de a: {x tales que x|a }
1 En la versión que ejecutan los estudiantes se agregaron espacios para hacer más fácil la lectura en el intérprete, que no se 
muestran en está para simplificar una primera lectura del mismo. 
2 Un signo = significa asignación mientras que dos (==) significa igualdad, ver manual. 
3 en el curso de 1°CB, alcanza con que el resto de la división es 0, o sea división exacta) 
Matemática y Programación
- 33 -
Actividad 2:
El siguiente es un programa elaborado en python. 
a = input("escriba un número natural > 0 o 0 para finalizar ") 
while a > 0: 
 c= input ("escriba una cota ") 
 m = [a*x for x in range (c//a+1)] 
 print "los multiplos de ", a, "hasta ", c, "son ", m 
 a = input("escriba un número natural > 0 o 0 para finalizar ") 
print "Gracias por usar mi programa!" 
Responde las siguientes cuestiones:
a) Ejecuta el programa en forma manual (sin usar la computadora), para a= 5 y c=60, 
registrando todos los pasos. Realiza lo mismo para a=7 y c=60
b) Prueba con otros valores de a y c.
c)	¿Para	qué	sirve	el	programa?
d)	¿Cuál	es	la	especificación	de	entrada?	¿Qué		información	devuelve	el	programa?.
e) Escribe los pasos del programa en español. 
f)	Copia	el	programa	en	gedit	y	ejecútalo	en	phyton,	¿funciona	como	imaginabas?	
¡¡¡ ayuda !!!
Los comandos en los lenguajes de programación se escriben en inglés, te recordamos el 
significado	de	algunas	de	las	palabras	y	comandos	que	aparecen:	
input: introducir, ingresar, registrar.
While: mientras 
print: imprimir, escribir
for: para
in: en
división entera: el cociente de la división entera se obtiene con el operador // y el resto 
con el operador %. Por ejemplo: 10//4 es 2 y 10%4 es 2
La función range en python:
range(1,a+1), genera una lista de los naturales del 1 al a. Por ejemplo range(1,6) ge-
nera la lista de los naturales entre 1 y 5, [1,2,3,4,5].
range (n): devuelve la lista de los naturales entre 0 y n-1. Por ejemplo range (4) = 
[0,1,2,3]
Matemática y Programación
- 34 -
Los objetivos de está segunda actividad son: 
•	Desde el punto de vista de los conceptos matemáticos, trabajar la dualidad entre las 
nociones de divisor y múltiplo1.	Se	podrá	formalizar	alguna	definición	de	múltiplo		y	con-
junto de múltiplos. 
•	Desde el punto de vista de la programación seguir familiarizando al estudiante con 
el lenguaje python al realizar traducciones que permitan interpretar los comandos y la 
sintaxis del lenguaje. Se agrega el uso de algunos comandos y operadores, que están 
explicados en la ayuda.
•	Finalmente en la integración de las dos disciplinas, hacer evidente los diferentes nive-
les de abstracción entre un manejo puramente matemático de los conceptos y un manejo 
que implique un procedimiento algorítmico. 
En el primer caso puedo imaginar y representar el conjunto de múltiplos2 de a como 
m(a)={0,a,2a, ,ia, .....}, o m(a)={n.a/n∈N} donde representar e imaginar un conjunto 
infinito	no	parece	ser	un	problema.	
En el caso del procedimiento algorítmico, interviene el factor tiempo que inhabilita la posi-
bilidad	de	realizar	un	procedimiento	infinito	por	lo	cual	es	necesario	usar	una	cota.
* Un ejemplo de respuesta esperada para el item a) podría ser:
a = input("escriba un número natural > 0 o 
0	para	finalizar	")	
5
while a > 0: 
 c= input ("escriba una cota ") 
60
 m = [a*x for x in range (c//a+1)] 
podemos poner range (60//5 + 1) que como 
ya se explicó es [0, 1, 2, ..., 12]
m es la lista de los elementos a *x toman-
do los x de [0, 1, 2, ..., 12], o sea
m={5*0,5*1,5*2, 5*12}
print "los múltiplos de ", a, "hasta ", c, "son 
", m 
Se ve en la pantalla: los múltiplos de 5 has-
ta 60 son [0,5,15,20,25,30,35,40,45,50,55,
60]
a = input("escriba un número natural > 0 o 
0	para	finalizar	")
7 
como 7 es distinto de 0 pide una cota y 
vuelve a calcular
 c= input ("escriba una cota ") 60
m = [a*x for x in range (c//a+1)] range (60//7 + 1) es [0,1,2, ..., 8]
por lo tanto
m={7*0,7*1,7*2, 7*9}
1a*b=c implica que a y b (si son no nulos) son divisores de c y que c es múltiplo de a y de b.
 
Matemática y Programación
- 35 -
print "los multiplos de ", a, "hasta ", c, "son 
", m 
Se ve en la pantalla: Los múltiplos de 7 
hasta 60 son: [0,7,14,21,28,35,42,49,56]
a = input("escriba un número natural > 0 o 
0	para	finalizar	")		
0
print "Gracias por usar mi programa!" Se ve en la pantalla: Gracias por usar mi 
programa!
 Está implementación incluye varios comandos nuevos, sin embargo ofrece la oportu-
nidad de trabajar en otras competencias, como la lectura y la búsqueda de información en 
un texto: la parte Ayuda!!! del enunciado del problema. Seguramente la actividad resultará 
más enriquecedora si los estudiantes la resuelven en pequeños grupos. 
Por otro lado, en el momento de ejecutar el programa, se puede analizar, cuáles son los 
comandos que permiten interactuar y cuáles son “internos” del programa.
* Posible actividad de profundización: Escribe un algoritmo que dado un natural te permita hallar 
sus h primeros múltiplos.
Actividad 3:
Diseña un algoritmo que te permita hallar el máximo común divisor a dos naturales a y b 
dados.
• Se deben seguir las siguientes etapas:
• Indicar los datos a ingresar y la información que debe devolver el programa.
• Escribir el procedimiento en español, probarlo para valores concretos de a y b.
• Escribir el procedimiento en phyton, realizar las pruebas y ajustes necesarios.
Está es la primera actividad en la que los estudiantes deberán proponer una solución com-
pleta al problema. Los algoritmos propuestos dependerán de los conocimientos matemáticos 
de cada grupo de estudiantes (intersección de conjuntos, algoritmo de Euclides, etc). 
* La especificación del problema es: 
#	Especificación	de	entrada: Un par de números naturales, a y b
#	Especificación	de	elementos	de	salida: un número natural que es el máximo común 
divisor de a y b (MCD(a,b))
Desarrollaremos en primer lugar el algoritmo que utiliza intersección de conjuntos, que nos 
permitirá introducir el uso de la idea de función, y luego el del Algoritmo de Euclides, que 
nos	proporcionará	un	ejemplo	de	función	definida	recursivamente.
* Funciones
Matemática y Programación
- 36 -
La	sintaxis	general	de	la	definición	de	una	función	en	python	es1: 
def nombre (lista de variables):
 cuerpo
 return resultado
Para la función divisores2: 
def divisores(a): 
 d = [x for x in range(1, a+1) if a%x==0] 
 return d
1 - utilizandO intErsEcción dE cOnjuntOs:
Se cuenta con el programa que permite hallar los divisores de un número que puede utili-
zarse como una función. 
Siguiendo	la	definición	de	MDC(a,b)		que	dice	que	es	el	máximo	de	los	divisores	comunes	a	
a y a b, tenemos un posible algoritmo:
1. Ingrese un par de números naturales (a,b)
2. Hallar d(a) (conjunto de divisores de a)
3. Hallar d(b) (Conjunto de divisores de b)
4. Hallar d= d(a) ∩d(b) (d es el conjunto de los divisores comunes)
5. MCD(a,b)=D es el máximo de d. 
6. Escriba D.
Ya	tenemos	definida	arriba	la	función	para	hallar	el	conjunto	de	divisores	de	un	número	
(items 2 y 3). Para el item 4 es necesario hallar la intersección de dos listas y para el ítem 
5 necesitamos hallar el máximo de un conjunto ordenado (una lista). 
Crearemos	un	archivo	llamado	divis	donde	definiremos		las	funciones	necesarias	para	im-
plementar el algoritmo:
1. divisores: que dado un número nos da el conjunto de sus divisores. 
1 en python para definir funciones no es necesario determinar dominio y codominio, en otros lenguajes debemosexplicitar-
los. 
2 Ver archivo divis.py 
Nombre de la 
función
Matemática y Programación
- 37 -
2. intersección: que devuelve la intersección de dos conjuntos dados, representados por 
listas.
3. divisores comunes: que devuelve el conjunto de elementos comunes a dos conjuntos 
dados.
Luego iremos agregando las funciones que se vayan creando y necesitando en los siguien-
tes problemas.
Debemos tener en cuenta que las funciones no leen datos ni imprimen resultados, sólo 
calculan. Por lo tanto tomaremos del algoritmo que implementamos para calcular el conjun-
to de divisores, solo la parte en la que se hace el cálculo, dejando el ingreso de datos y la 
impresión del resultado en pantalla, para otro programa. 
Otra cosa que no se puede olvidar de la sintaxis es la indentación, el return tiene más 
sangría que el def. (ver errores frecuentes en manual).
Pasaremos	a	mostrar	 las	 funciones	que	corresponden	a	 los	siguientes	pasos,	 	definidas	
todas en un mismo archivo de texto: divis.py:
def divisores(a): 
 d = [x for x in range(1, a+1) if a%x==0] 
 return d
Ya fue comentado
def inter(l1,l2): 
 l = [] 
 for element in l1: 
 if element in l2: 
 l.append(element) 
 return l 
Está función tiene como variable (en programación se suele 
usar el término:parámetro o argumento de la función.) 
un par de listas (l1 y l2), y devuelve una lista l con los ele-
mentos que pertenecen a ambas (la intersección)
def divisorescom(a,b): 
 d1 = divisores(a) 
 d2 = divisores(b) 
 dc = inter(d1,d2) 
 return dc
Está función tiene como variable un par de naturales (a y 
b), halla los divisores de cada uno usando la función divi-
sores, y devuelve en dc la intersección de los dos conjuntos 
usando la función inter 
def MCD(a,b): 
 dc = divisorescom(a,b) 
 D = max(dc) 
 return D
Está función tiene como variable un par de naturales(a y 
b), halla el máximo del conjunto de divisores comunes a los 
números a y b y lo devuelve en la variable D.
La implementación en el intérprete de la función MCD se muestra en el archivo maxcdiv.py.
Explicaremos	ahora	cómo	usar	las	funciones	definidas	en	divis	en	el	intérprete.
Para usar la función en el intérprete, debemos importar el módulo (archivo) divis y luego 
aplicar la función escribiendo divis.divisores(a), siendo a un valor concreto, por ejemplo para 
halar los divisores de 12:
Matemática y Programación
- 38 -
>>> import divis 
>>> divis.divisores(12) 
[1, 2, 3, 4, 6, 12] 
>>> 
Otra opción es crear un módulo para que el intérprete aplique la función, aparecen enton-
ces los comandos que interaccionan con el usuario del programa.
A modo de ejemplo, la siguiente sería la implementación del módulo que permite hallar el 
conjunto	de	divisores	de	un	número	usando	la	función	divisores	definida	en	divis.	(Archivo	
divisores.py, es un archivo de texto)
import divis 
a	=	input("escriba	un	número	natural	mayor	que	0	o	0	para	finalizar:	")	
while a > 0: 
 d = divis.divisores(a) 
 print "los divisores de ", a, "son", d 
	 a	=	input("escriba	un	número	natural	mayor	que	0	o	0	para	finalizar:	")	
print "Gracias por usar mi programa!"
Para usar este módulo debemos escribir en el intérprete
>>> import divis 
>>> import divisores 
Mostramos ahora como se “ve” en el intérprete.
Matemática y Programación
- 39 -
 
2 - utilizandO El algOritmO dE EuclidEs:
En el curso de 2do de bachillerato, se introduce el algoritmo de Euclides como uno de los 
mecanismos para hallar el MCD de dos naturales.
La propuesta de diseñar un módulo que resuelva el problema usando el algoritmo de Eucli-
des,	permite	no	solo	 introducir	 la	noción	de	funciones	definidas	recursivamente,	si	no	de	
reflexionar	en	la	propiedad	sobre	la	que	se	construye	el	algoritmo.
Cuando	se	define	una	función	recursivamente	aplicamos	la	misma	función	en	cada	paso	
a variables que van disminuyendo (caso inductivo) hasta llegar a un caso conocido (caso 
base).	Tenemos	que	identificar	entonces	que	es	lo	que	hacemos	de	la	misma	manera	en	cada	
paso. 
* Algoritmo en español:
1. Dados dos números a y b
2. realiza la división de a entre b cuyo resto es r1
3. si r1 es 0 entonces MCD(a,b)=b 
4. si no se realiza la división de b entre r1 cuyo resto es r2
5. si r2 es 0 entonces MCD(a,b)=r1 
6. si no se repite el procedimiento hasta obtener resto 0.
7. MCD (a,b) =r(n-1) (el resto anterior al nulo)
Sin embargo en está descripción del algoritmo de Euclides, no se evidencia la recursión, se 
muestra	la	sucesión	de	pasos,	pero	no	está	claramente	identificada	la	propiedad	que	valida	
el procedimiento.
La clave está en la siguiente propiedad:
MCD(a,b)=MCD(b,r1)=MCD(r1,r2)=.........MCD(r(n-1),rn)
y	el	hecho	de	que	en	un	número	finito	de	pasos	se	alcanza	resto	0.
Una	mejor	descripción	del	algoritmo,	con	el	objetivo	de	definir	una	función	recursiva	es	el	
siguiente: 
Matemática y Programación
- 40 -
Sea MCD(a,b) El algoritmo se llama MCD y se aplica a (a,b)
Sea r es el resto de la división de a entre b . Defino r
si r es 0 entonces devuelvo b Si r es 0 finalizo, ya tengo el resultado
si no MCD(b,r) Si no, vuelvo a hacer lo mismo con b y r, es decir, aplico 
el algoritmo MCD al par (b,r)
* La función en matemática:
mcd : N x N →N
mcd (a , b)= { b si(a mod b)=0
mcd(b ,a mod b) si(a mod b)≠0}
Utilizando python la función se implementa:
def MCDr(a,b): 
 r=a%b 
 if r==0: 
 return b 
 else: 
 return MCDr(b,r)
La implementación en el intérprete, se ve en el archivo: euclides.py
Actividades de ampliación y consolidación:
1.	¿Cómo	saber	si	un	número	es	primo?
 1.1 Crea una función que te permita decidir si un número es primo o no.1
 1.2 Implementa en el intérprete de python dicha función.2
2.	¿Cuáles	son	los	números	menores	que	100	con	únicamente	un	divisor	impar?	¿Y	los	me-
nores de 500?
3.	Dado	un	número	n,	¿Cuáles	son	los	números	menores	o	iguales	a	n	que	al	dividirlos	entre	
5 dan resto 3?
3.	Clasifica	los	números	menores	que	un	n	dado	según	los	restos	de	dividirlos	entre	5.
1 ver solución en divis.py 
2 ver solución en esprimo.py 
Matemática y Programación
- 41 -
Conclusiones y reflexiones:
Con esta propuesta se busca integrar los principios y métodos de la algoritmia a la clase 
de matemática. Creemos que lejos de suponer un esfuerzo extra, brinda al profesor la 
posibilidad de renovar sus estrategias de trabajo en clase, favoreciendo un mayor involucra-
miento de los estudiantes que se enfrentan a desafíos novedosos. 
En	lo	que	refiere	a	los	contenidos	matemáticos,	mejora	su	comprensión,	permitiendo	una	
nueva	forma	de	trabajar	con	ellos,	por	ejemplo	en	lo	que	refiere	a	funciones.	También	permi-
te	trabajar	con	la	estructura	de	la	matemática	en	lo	que	refiere	a	las	definiciones	,	al	hacer	
evidente	la	necesidad	de	elegir	la	definición	adecuada	al	algoritmo	de	resolución	que	está	
condicionado a las herramientas que ofrece el lenguaje.
Sin	embargo,	creemos	que	el	mayor	aporte	de	esta	integración	refiere	al	desarrollo	de	al-
gunas competencias como: resolución de problemas, comunicación y representaciones [3]. 
En resolución de problemas permite reforzar la comprensión del problema al ser estricta-
mente	necesario	explicitar	cuáles	son	los	datos	y	qué	se	busca	(especificación	del	proble-
ma). 
Además ofrece oportunidades de analizar como un mismo problema puede ser resuelto 
por diferentes algoritmos o procedimientos. Por otro lado, se favorece el desarrollo de la 
abstracción, cuando se descompone un problema en sub-problemas que mejoran su com-
prensión	y	resolución.	Este	aspecto	fue	ejemplificado	en	la	última	actividad,	donde	se	hizo	
evidente la ventaja del trabajo con funciones. 
En	lo	que	refiere	a	 las	competencias	comunicativas	y	de	representación,	 las	actividades	
propuestas	ofrecen	 instancias	 tanto	de	codificación	como	de	decodificación,	así	 como	de	
experimentar la dualidad texto - acción de los programas de computación [1].
Finalmente creemos que se fortalece el desarrollo de la autonomía y construcción del rol de 
estudiante, ya que la falta de

Continuar navegando

Materiales relacionados

385 pag.
Estructura de Datos y Algoritmos - Aho Hopcroft Ullman

Colégio Dom Bosco

User badge image

Hamburguesa Queso

47 pag.
309 pag.
52 pag.