> For the complete documentation index, see [llms.txt](https://overleaf-pro.ayaka.space/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://overleaf-pro.ayaka.space/latex/es/articulos-en-profundidad/31-latex-is-more-powerful-than-you-think-computing-the-fibonacci-numbers-and-turing-completeness.md).

# LaTeX es más poderoso de lo que crees: cálculo de los números de Fibonacci y completitud de Turing

**Autor: Robert Murrish (abril de 2012 (editado por Overleaf en abril de 2023))**

LaTeX es una herramienta poderosa. Tan poderosa, de hecho, que puede usarse para mucho más que el marcado de documentos. LaTeX es [Turing completo](https://en.wikipedia.org/wiki/Turing_completeness); es decir, puede programarse para calcular prácticamente cualquier cosa.

Para demostrar las capacidades de programación de propósito general de LaTeX, veremos un ejemplo que calcula los primeros números de Fibonacci. Aunque esto no es una prueba de completitud de Turing, es un buen ejemplo de un algoritmo completo implementado en LaTeX.

### Los números de Fibonacci

Cada número en la secuencia de Fibonacci es la suma de los dos términos anteriores de la secuencia, y los dos primeros términos se definen como 1 para proporcionar un punto de partida.

Podemos escribir un nuevo comando para calcular estos números. Comencemos decidiendo cómo podría verse una llamada a nuestro comando aún por escribir:

```latex
\fibonacci{10}
```

Cuando se llama a este comando desde nuestro documento LaTeX, debe producir una lista de `n` números de Fibonacci (donde `n=10` en la llamada de ejemplo aquí). Aquí está el código del `\fibonacci` comando (es decir, una macro de LaTeX). Veamos cómo funciona.

```latex
\documentclass{article}
\begin{document}

\newcount\temp
\newcount\fone
\newcount\ftwo
\newcount\fcnt

\newcommand{\fibonacci}[1]{%
	\fcnt=#1
	\fone=1
	\ftwo=1
	\temp=0
	\the\fone, \the\ftwo
	\let\next=\fibloop
	\fibloop
}

\def\fibloop{, %
	\temp=\fone
	\fone=\ftwo
	\advance\ftwo by \temp
	\ifnum\fcnt=0
            \let\next=\relax
        \else
            \advance\fcnt by -1
        \fi
	\the\ftwo
	\next
}

(\fibonacci{10})
\end{document}
```

[Abre este ejemplo en Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Fibonacci+sequence+in+LaTeX\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cbegin%7Bdocument%7D%0A%0A%5Cnewcount%5Ctemp%0A%5Cnewcount%5Cfone%0A%5Cnewcount%5Cftwo%0A%5Cnewcount%5Cfcnt%0A%0A%5Cnewcommand%7B%5Cfibonacci%7D%5B1%5D%7B%25%0A%09%5Cfcnt%3D%231%0A%09%5Cfone%3D1%0A%09%5Cftwo%3D1%0A%09%5Ctemp%3D0%0A%09%5Cthe%5Cfone%2C+%5Cthe%5Cftwo%0A%09%5Clet%5Cnext%3D%5Cfibloop%0A%09%5Cfibloop%0A%7D%0A%0A%5Cdef%5Cfibloop%7B%2C+%25%0A%09%5Ctemp%3D%5Cfone%0A%09%5Cfone%3D%5Cftwo%0A%09%5Cadvance%5Cftwo+by+%5Ctemp%0A%09%5Cifnum%5Cfcnt%3D0%0A++++++++++++%5Clet%5Cnext%3D%5Crelax%0A++++++++%5Celse%0A++++++++++++%5Cadvance%5Cfcnt+by+-1%0A++++++++%5Cfi%0A%09%5Cthe%5Cftwo%0A%09%5Cnext%0A%7D%0A%0A%28%5Cfibonacci%7B10%7D%29%0A%5Cend%7Bdocument%7D)

Primero, configuramos algunas variables que usaremos más adelante. El `\newcount` comando nos da una variable que podemos usar para almacenar un entero; aquí, creamos cuatro: `\fcnt`, `\fone`, `\ftwo` y `\temp`. Cabe mencionar que estas no son variables nuevas; son más bien alias de contadores existentes. [Contadores de LaTeX](/latex/es/formato/10-counters.md) pueden usarse directamente como en `\count0`, `\count1`, etc., pero asignarles nombres nos evita escribir en un contador ya en uso. Si tienes curiosidad, reemplaza una de las variables de este código por `\count0`, y los números de página estarán mal durante el resto del documento.

A continuación tenemos el `\fibonacci` comando. Lo creamos con `\newcommand`, al que le proporcionamos el nombre, el número de argumentos y el código TeX que se procesará como argumentos. Para este comando, aceptamos un único argumento, la cantidad de números de Fibonacci que se van a mostrar. El contenido de este comando es simple: establecemos los valores iniciales de nuestras variables, imprimimos los dos primeros números de Fibonacci (ya que no necesitan calcularse) y luego llamamos a `\fibloop`, que hará el trabajo pesado de nuestros cálculos.

El comando `\fibloop` se declara de la misma manera, pero una parte clave de este comando es cómo itera. Usamos un comando llamado `\next`\fcnt `\fibloop` dentro `\fibonacci`, inicializado en `\fibloop` y usado dentro de `\fibloop` se repetirá hasta que `\next` sea modificado por el código dentro del `\fibloop` comando mismo. Solo queremos repetir el bucle `n` veces, así que usamos una `\ifnum` instrucción que comprueba el valor de nuestro contador (`\fcnt`) y luego, si no ha alcanzado el valor umbral de 0, `\fcnt` se decrementa cada vez que se repite el bucle. Si se cumple la condición, establecemos `\next` a `\relax`, lo que impedirá que `\fibloop` se repita: el comando final `\next` no hace nada y el bucle termina.

Los demás comandos de este bloque calculan el siguiente número de Fibonacci de la secuencia y actualizan los valores de las variables para que estén listos para la siguiente iteración. El comando `\the\ftwo` imprime el valor del número de Fibonacci actual en el documento, y también notarás una coma y un espacio en la parte superior del `\fibloop` comando usado para separar cada valor.

#### El resultado

La forma más sencilla de ver este código en acción es ejecutarlo en Overleaf usando el **Abre este ejemplo en Overleaf** enlace en la parte inferior de la visualización del código. La secuencia de Fibonacci crece rápidamente, así que cualquier `n>44` provocará un desbordamiento de entero en esta implementación particular.

### ¿Adónde ir a partir de aquí?

Como prueba informal de que LaTeX es Turing completo, presento el siguiente código, que es una implementación improvisada de una [puerta NAND](https://en.wikipedia.org/wiki/NAND_gate):

```latex
\newcount\nanone
\newcount\nantwo

\newcommand{\nand}[2]{%
\nanone=#1
\nantwo=#2
  \ifnum\nanone=\nantwo
    \ifnum\nanone=0\relax 1
      \else 0
    \fi
   \else 1
\fi
}
```

Las puertas lógicas NAND (y también NOR) tienen la interesante propiedad de que cualquier otra puerta lógica puede formarse con este único tipo de puerta. A partir de las puertas lógicas básicas, puedes construir cerrojos, biestables y memoria. Esos son los ingredientes de una computadora de propósito general. Puedes probar esta puerta NAND para cada una de sus cuatro entradas posibles con el siguiente ejemplo, que puedes abrir en Overleaf.

```latex
\documentclass{article}
\begin{document}

\newcount\nanone
\newcount\nantwo

\newcommand{\nand}[2]{%
\nanone=#1
\nantwo=#2
  \ifnum\nanone=\nantwo
    \ifnum\nanone=0\relax 1
      \else 0
    \fi
   \else 1
\fi
}

\nand{0}{0}
\nand{0}{1}
\nand{1}{0}
\nand{1}{1}
\end{document}
```

[Abre este ejemplo en Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=NAND+gate+in+LaTeX\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cbegin%7Bdocument%7D%0A%0A%5Cnewcount%5Cnanone%0A%5Cnewcount%5Cnantwo%0A%0A%5Cnewcommand%7B%5Cnand%7D%5B2%5D%7B%25%0A%5Cnanone%3D%231%0A%5Cnantwo%3D%232%0A++%5Cifnum%5Cnanone%3D%5Cnantwo%0A++++%5Cifnum%5Cnanone%3D0%5Crelax+1%0A++++++%5Celse+0%0A++++%5Cfi%0A+++%5Celse+1%0A%5Cfi%0A%7D%0A%0A%5Cnand%7B0%7D%7B0%7D%0A%5Cnand%7B0%7D%7B1%7D%0A%5Cnand%7B1%7D%7B0%7D%0A%5Cnand%7B1%7D%7B1%7D%0A%5Cend%7Bdocument%7D)

Saber que LaTeX es Turing completo abre un mundo de posibilidades. Código como este es común en el backend de LaTeX para cosas como llevar el control de los números de página y de las figuras y decidir dónde colocar los elementos flotantes. Es una herramienta que puedes aprovechar para simplificar diseños de documentos complejos.

Para terminar esta publicación, te dejo lecturas adicionales sobre ejemplos de programación en LaTeX y máquinas de Turing.

#### Ejemplos de programación en LaTeX

* [El conjunto de Mandlebrot en LaTeX](http://warp.povusers.org/MandScripts/latex.html) . Un agradecimiento especial por este; este código fue un ejemplo útil mientras escribía mi comando de Fibonacci.
* [Una máquina de Turing en LaTeX: la continuación](http://pbelmans.ncag.info/blog/2010/12/12/a-turing-machine-in-latex-follow-u/) N. B.: Al portar este artículo a otro sistema de alojamiento de contenido, notamos que el sitio mencionado en el artículo original (<http://en.literateprograms.org/Turing_machine_simulator_(LaTeX))> ya no era accesible, así que reemplazamos ese enlace con un artículo de seguimiento de otro autor.
* [Wikibook sobre comandos de TeX](http://en.wikibooks.org/wiki/Category:TeX)
* [LaTeX en un concurso de programación](http://sdh33b.blogspot.com/2008/07/icfp-contest-2008.html). Un controlador de rover marciano en LaTeX superó a entregas en varios lenguajes de programación más comunes.

### Máquinas de Turing en lugares inesperados

* [El Juego de la Vida de Conway es Turing completo](http://rendell-attic.org/gol/utm/index.htm). Aquí hay una implementación de una máquina de Turing.
* [Regla 110](http://en.wikipedia.org/wiki/Rule_110) es un autómata celular unidimensional que es Turing completo.
* Minecraft (el videojuego) es Turing completo. Se han construido varios ejemplos, así que el siguiente enlace es simplemente a una [página de resultados relevantes de búsqueda en YouTube](http://www.youtube.com/results?search_query=minecraft+turing+machine)


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://overleaf-pro.ayaka.space/latex/es/articulos-en-profundidad/31-latex-is-more-powerful-than-you-think-computing-the-fibonacci-numbers-and-turing-completeness.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
