UNIVERSIDAD DE PANAMÁ FACULTAD DE CIENCIAS NATURALES, EXACTAS Y TECNOLOGÍA ESCUELA DE MATEMÁTICA TEOREMA DE ZECKENDORF POR: DEMETRIO WENHAM V. MONOGRAFÍA PRESENTADA COMO UN REQUISITO PARA OPTAR POR EL TÍTULO DE LICENCIATURA EN MATEMÁTICA CIUDAD UNIVERSITARIA, OCTAVIO MENDÉZ PEREIRA PANAMÁ, 2009 Teorema de Zeckendorf Índice Introducción 1. Reseña histórica 2. Teorema de Zeckendorf 2.1 Sucesión de Fibonacci 2.2 Enunciado del teorema 3. Implementación computacional 3.1 Mathematica 3.2 Comandos y funciones a utilizarse 3.3 Desarrollo de la lógica del programa a. Inicio b. Cuerpo del programa c. Decisión de impresión Conclusión Bibliografía Algebra computacional Teorema de Zeckendorf Introducción Este trabajo de Algebra Computacional trata sobre los números de Fibonacci, más precisamente sobre el teorema de Zeckendorf el cual me dice que puedo representar cualquier número natural en números de Fibonacci. Se definirán conceptos importantes para tener en cuenta antes de abordar el tema mediante el uso tecnológico. El punto importante a destacar de este trabajo es la implementación del teorema al campo de desarrollos algorítmicos para su muestra, el software a utilizar para desarrollar la lógica y para el desarrollo del teorema, es Mathematica del cual mostraremos algunos comandos y funciones que utilizaremos para el desarrollo del algoritmo. Algebra computacional Teorema de Zeckendorf 1. Reseña Histórica Leonardo de Pisa (c. 1170 - 1250) A finales del siglo XII, la república de Pisa es una gran potencia comercial, con delegaciones en todo el norte de África. En una de estas delegaciones, en la ciudad argelina de Bugía, uno de los hijos de Bonaccio, el responsable de la oficina de aduanas en la ciudad, Leonardo, es educado por un tutor árabe en los secretos del cálculo posicional hindú y tiene su primer contacto con lo que acabaría convirtiéndose, gracias a él, en uno de los más magníficos regalos del mundo árabe a la cultura occidental: nuestro actual sistema de numeración posicional. Leonardo de Pisa, Fibonacci, nombre con el que pasará a la Historia, aprovechó sus viajes comerciales por todo el mediterráneo, Egipto, Siria, Sicilia, Grecia..., para entablar contacto y discutir con los matemáticos más notables de la época y para descubrir y estudiar a fondo los Elementos de Euclides, que tomará como modelo de estilo y de rigor. Liber Abaci. Escrito en 1202, revisado y considerablemente aumentado en 1228, se divide en quince capítulos. Un capítulo importante está dedicado a las fracciones graduales, de las que expone las propiedades. En ellas basa una teoría de los números fraccionarios y, después de haberlas introducido en los cálculos de números abstractos, las vuelve un instrumento práctico para la obtención de números concretos. Todas las fracciones se presentan a la manera egipcia, es decir, como suma de fracciones con numeradores 2 unitarios y denominadores no repetidos. La única excepción es la fracción 3, que no se Algebra computacional Teorema de Zeckendorf descompone. Incluye una tabla para descomposición en fracciones unitarias que se lee derecha a izquierda, como en las lenguas semíticas. Antes de que Fibonacci escribiera su trabajo, la sucesión de los números de Fibonacci había sido descubierta por matemáticos indios tales como Gopala (antes de 1135) y Hemachandra (c. 1150), quienes habían investigado los patrones rítmicos que se formaban con sílabas o notas de uno o dos pulsos. El número de tales ritmos (teniendo juntos una cantidad n de pulsos) era fn + 1, que produce explícitamente los números 1, 2, 3, 5, 8, 13, 21, etc. La sucesión fue descrita por Fibonacci como la solución a un problema de la cría de conejos: "Cierto hombre tenía una pareja de conejos juntos en un lugar cerrado y uno desea saber cuántos son creados a partir de este par en un año cuando es su naturaleza parir otro par en un simple mes, y en el segundo mes los nacidos parir también". De esta manera Fibonacci presentó la sucesión en su libro Liber Abaci, publicado en 1202. Muchas propiedades de la sucesión de Fibonacci fueron descubiertas por Édouard Lucas, responsable de haberla denominado como se la conoce en la actualidad. También Kepler describió los números de Fibonacci, y el matemático escocés Robert Simson descubrió en 1753 que la relación entre dos números de Fibonacci sucesivos fn + 1 / fn se acerca a la relación áurea fi ( ) cuanto más se acerque a infinito; es más: el cociente de dos términos sucesivos de toda sucesión recurrente de orden dos tiende al mismo límite. Esta serie ha tenido popularidad en el siglo XX especialmente en el ámbito musical, en el que compositores con tanto renombre como Béla Bartók u Olivier Messiaen la han utilizado para la creación de acordes y de nuevas estructuras de frases musicales. Algebra computacional Teorema de Zeckendorf Edouard Zeckendorf (1901-1983) Nació en Lieja, Bélgica, el 2 de mayo de 1901, en 1925 se graduó de medico en la universidad de Lieja, luego se incorporo en el ejercito belga como oficial medico. Cuando el ejército Alemán invade Bélgica fue hecho prisionero de guerra y permaneció en prisión hasta 1945. Durante este periodo brindo servicios a los prisioneros aliados. Zeckendorf se despidió del ejército con el rango de coronel en 1957. Pero se preguntaran que tiene que ver Zeckendorf con matemáticas. En el campo de las matemáticas, mas precisamente en teoría elemental de números en conocido por sus trabajos sobre los números de Fibonacci y por enunciar un teorema y demostrarlo posteriormente el cual lleva su nombre, el cual habla sobre una representación de los números naturales en términos de números de Fibonacci. Algebra computacional Teorema de Zeckendorf 2. Teorema de Zeckendorf El teorema de Zeckendorf habla sobre una representación de los números naturales en términos de números de Fibonacci. Para tocar más el teorema antes debemos tener en claro algunos conocimientos sobre los números de Fibonacci. 2.1 La sucesión de Fibonacci La sucesión de Fibonacci es una secuencia de números enteros. Los números que conforman esta sucesión de les llama números de Fibonacci los cuales son 𝑓0 , 𝑓1 , 𝑓2 , … y se definen como: 1 𝑠𝑖 𝑖=0 1 𝑠𝑖 𝑖=1 𝑓𝑖 = { 𝑓𝑖−1 + 𝑓𝑖−2 𝑝𝑎𝑟𝑎 𝑖 > 1 2.2 Teorema de Zeckendorf Indica que cada número entero positivo puede ser representado de una manera única como la suma de uno o más números de Fibonacci no consecutivos, una cantidad que cumple estas condiciones se llama una representación Zeckendorf. Por ejemplo: 9=8+1, ya que 8 es el sexto número de Fibonacci y se toma el 1 como el segundo se ve claramente que no son consecutivos y es única su representación. Usted puede definir la operación de la siguiente manera 𝑎 ∗ 𝑏 los números naturales a, b: teniendo en cuenta las representaciones Zeckendorf 𝑎 = ∑𝑛𝑖=0 𝐹𝑐𝑖 , (𝑐𝑖 ≥ 2) 𝑦 𝑏= Algebra computacional Teorema de Zeckendorf ∑𝑛𝑖=0 𝐹𝑑𝑖 , 𝑑𝑖 ≥ 2 a este producto se llama Producto de Fibonacci 𝑎 ∗ 𝑏 = ∑𝑛𝑖=0 ∑𝑖𝑗=0 𝐹𝑐𝑖 +𝑑𝑗 . Por ejemplo, la representación Zeckendorf de 1 es 1 = F 2 (porque no se les permite la representación de F 1). Algebra computacional Teorema de Zeckendorf 3. Implementación computacional Esta es la parte fundamental del trabajo, ya que nuestro problema esta en diseñar un algoritmo que represente el teorema enunciado en la sección anterior. En otras palabras mostrar mediante un programa de computadora la descomposición de un número dado en números de Fibonacci. Para esto utilizaremos un software el cual nos facilitara la muestra del teorema. 3.1 Mathematica Es un programa utilizado en áreas científicas, de ingeniería, matemáticas y áreas computacionales. Originalmente fue concebido por Stephen Wólfram, quien continúa siendo el líder del grupo de matemáticos y programadores que desarrollan el producto en Wolfram Research, compañía ubicada en Champaign, Illinois. Comúnmente considerado como un sistema de álgebra computacional, Mathematica es también un poderoso lenguaje de programación de propósito general. La versión que utilizaremos para la implementación del teorema de Zeckendorf será la 7. 3.2 Comandos y funciones de Mathematica a utilizarse: 𝐈𝐧𝐩𝐮𝐭[ ]: Este comando se utiliza para ingresar los dates al programa, tales pueden ser números, listas, símbolos, etc. 𝐖𝐡𝐢𝐥𝐞[𝐜𝐨𝐧𝐝𝐢𝐜𝐢ó𝐧, 𝐜𝐮𝐞𝐫𝐩𝐨 ]: Este comando se utiliza para tomar una decisión a hacer, esto me dice que mientras la condición se cumpla entonces el lo hará hasta que la condición falle. Algebra computacional Teorema de Zeckendorf 𝐅𝐢𝐛𝐨𝐧𝐚𝐜𝐜𝐢[ 𝐢𝐧𝐝𝐢𝐜𝐞 𝐝𝐞𝐥 𝐧𝐮𝐦𝐞𝐫𝐨]: Esta es una función que me dice los números de Fibonacci según su ubicación en la sucesión de Fibonacci. 𝐈𝐧𝐬𝐞𝐫𝐭[ 𝐥𝐢𝐬𝐭𝐚, 𝐞𝐥𝐞𝐦𝐞𝐧𝐭𝐨, 𝐩𝐨𝐬𝐢𝐜𝐢ó𝐧]: Inserta en una lista los elementos que uno quiera según la posición adecuada en la lista. 𝐈𝐟[𝐜𝐨𝐧𝐝𝐢𝐜𝐢ó𝐧, 𝐜𝐢𝐞𝐫𝐭𝐨, 𝐟𝐚𝐥𝐬𝐨]: Este comando se utiliza para toma decisiones si se cumple hace sino ejecuta otra acción si lo desea. 𝐆𝐫𝐢𝐝[ ]: Extrae los elementos de una lista 𝐏𝐫𝐢𝐧𝐭[ ]: Se utiliza para imprimir en pantalla lo que desee. 3.3 Desarrollo de la Lógica del programa En esta sección explicare la lógica utilizada para resolver el problema de crear un algoritmo en matemática para el teorema de Zeckendorf. a. Inicio n=Input["Ingrese un número natural cualquiera"]; natural=n; i=2; z=0; ind={}; Empezamos con Input para ingresar el dato, en este caso es cualquier número natural y se guardara en la variable n. En natural otra variable guardaremos el valor de n. Las variables Algebra computacional Teorema de Zeckendorf i e z las iniciamos en 2 y en 0 respectivamente. La variable ind vendría siendo una lista vacía en la cual voy almacenado valores. b. Cuerpo del programa While[n0, {While[Fibonacci[i] n,{i=i+1, t=i}], t=t-1, z=z+1, ind=Insert[ind,t,z], n=n-Fibonacci[t],i=2}]; y=Fibonacci[ind]; Este viene siendo el cuerpo del programa el cual realiza la tarea de buscar la representación de Zeckendorf para n. El primer ciclo While inicia con la condición de que n tiene que ser distinto de 0, esta razón se explicara posteriormente en el desarrollo de la lógica del programa. El segundo While en este la condición es que busque el número de Fibonacci más cercano a n, o sea menor o igual a él, después de haber terminado guarda en t el valor de i que excede al numero de Fibonacci más cercano, por ese hecho en el siguiente paso resto 1 a t y vuelvo a guardar en t el valor obtenido, luego z va a ser un contador el cual me va a indicar la posición en la lista ind que es en la cual voy a ir almacenando los valores que se generan en t. Algebra computacional Teorema de Zeckendorf Este paso me va a indicar si el número de Fibonacci que yo encontré es menor o igual, si es menor la diferencia seria distinta de cero y se inicializa i en 2 y vuelve y entra en el primer ciclo While, sino, eso quiere decir que el numero n es de Fibonacci y no entra al ciclo otra vez. El algoritmo se detiene cuando ya el ultimo número más cercano al almacenado en n generado de la diferencia anterior son iguales lo cual haciendo la diferencia me da cero y no entra al primer ciclo While. El último paso del cuerpo sería guardar en una variable y una lista que se genera calculando para los índices almacenados en ind los números de Fibonacci mediante la función Fibonacci de Mathematica. c. Decisión de las impresiones If[{natural}==y,Print["El sucesión de Fibonacci y número ",natural," su posición esta en la en la sucesión es ",Grid[{ind}]]] If[{natural}y,Print["La descomposición números de Fibonacci es ", y , " y de " ,natural," en sus posiciones en la sucesión son ", ind] ]. Estas dos decisiones me indican en caso de las dos posibilidades como enviar el resultado: Algebra computacional Teorema de Zeckendorf En el primer If se verifica si la lista almacenada en y es igual al numero almacenado en la variable natural si esto se cumple, entonces se imprimirá el número que este almacenado en natural diciendo que es de Fibonacci y la posición que ocupa. El segundo If me verifica si en efecto son diferentes me dice que la descomposición del numero almacenado en natural en términos de números de fibonacci esta en la variable y, y además sus respectivas posiciones en la sucesión almacenadas en la variable ind. Algoritmo completo Luego de haber visto la lógica el algoritmo competo seria: n=Input["Ingrese un número natural cualquiera"]; natural=n; i=2; z=0; ind={}; While[n0, {While[Fibonacci[i] n,{i=i+1, t=i}], t=t-1, z=z+1, ind=Insert[ind,t,z], n=n-Fibonacci[t],i=2}]; y=Fibonacci[ind]; Algebra computacional Teorema de Zeckendorf If[{natural}==y,Print["El sucesión de Fibonacci y número ",natural," su posición esta en la en la sucesión es ",Grid[{ind}]]] If[{natural}y,Print["La descomposición números de fibonacci es ", y , " y de " ,natural," en sus posiciones en la sucesión son ", ind] ] Por ejemplo: Si el numero ingresado en n=8 entonces el resultado seria. El numero 8 esta en la sucesión de Fibonacci y su posición en la sucesión es 6. Algebra computacional Teorema de Zeckendorf Conclusiones Pudimos observar que con los números de Fibonacci se puede representar cualquier número natural. Mediante el uso del software Mathematica 7 pudimos hacer muestra de la representación de Zeckendorf, creando un algoritmo y aprovechando la potencia del software. El desarrollo de la lógica es importante ya que proporciona al usuario la ayuda para entender en que consiste el algoritmo, y permite a este proporcionarse preguntas y criticas para el mejoramiento del programa. Algebra computacional Teorema de Zeckendorf Bibliografía www.worldlingo.com/ma/enwiki/es/Zeckendorf it.wikipedia.org/wiki/Teorema_di_Zeckendorf www.learnmath.info/mathematicians/.../historyDetail.htm?id=Zeckendorf es.wikipedia.org/wiki/Sucesión_de_Fibonacci www.ite.educacion.es/formacion/.../fibonacci/fibonacci Algebra computacional