> 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/pl/artykuly-szczegolowe/31-latex-is-more-powerful-than-you-think-computing-the-fibonacci-numbers-and-turing-completeness.md).

# LaTeX jest potężniejszy, niż myślisz — obliczanie liczb Fibonacciego i zupełność Turinga

**Autor: Robert Murrish (kwiecień 2012 (zredagowane przez Overleaf w kwietniu 2023))**

LaTeX jest potężnym narzędziem. W rzeczy samej tak potężnym, że można go używać do znacznie więcej niż składu dokumentów. LaTeX jest [Turing-zupełny](https://en.wikipedia.org/wiki/Turing_completeness); to znaczy, można go zaprogramować tak, by obliczał właściwie wszystko.

Aby pokazać ogólne możliwości programistyczne LaTeX-a, przyjrzymy się przykładowi, który oblicza pierwsze liczby Fibonacciego. Choć nie jest to dowód Turing-zupełności, jest to dobry przykład kompletnego algorytmu zaimplementowanego w LaTeX-u.

### Liczby Fibonacciego

Każda liczba w ciągu Fibonacciego jest sumą dwóch poprzednich wyrazów ciągu, przy czym pierwsze dwa wyrazy są zdefiniowane jako 1, aby zapewnić punkt startowy.

Możemy napisać nowe polecenie, aby obliczać te liczby. Zacznijmy od ustalenia, jak mogłoby wyglądać wywołanie naszego jeszcze nienapisanego polecenia:

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

Gdy to polecenie zostanie wywołane z naszego dokumentu LaTeX, powinno wygenerować listę `n` liczb Fibonacciego (gdzie `n=10` w przykładowym wywołaniu tutaj). Oto kod dla `\fibonacci` polecenia (tj. makra LaTeX). Przyjrzyjmy się, jak to działa.

```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}
```

[Otwórz ten przykład w 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)

Najpierw ustawiamy kilka zmiennych, których użyjemy później. Polecenie `\newcount` daje nam zmienną, której możemy użyć do przechowywania liczby całkowitej; tutaj tworzymy cztery: `\fcnt`, `\fone`, `\ftwo` i `\temp`. Warto wspomnieć, że nie są to nowe zmienne; są raczej czymś w rodzaju aliasów dla istniejących liczników. [Liczniki LaTeX-a](/latex/pl/formatowanie/10-counters.md) mogą być używane bezpośrednio, jak w `\count0`, `\count1`, itd., ale nadanie im nazw zapobiega zapisowi do licznika, który jest już używany. Jeśli jesteś ciekaw, zastąp jedną ze zmiennych w tym kodzie `\count0`, a numery stron będą nieprawidłowe do końca dokumentu.

Następnie mamy `\fibonacci` polecenie. Tworzymy je za pomocą `\newcommand`, któremu podajemy nazwę, liczbę argumentów i kod TeX do przetworzenia jako argumenty. W przypadku tego polecenia przyjmujemy jeden argument — liczbę liczb Fibonacciego do wypisania. Treść tego polecenia jest prosta: ustawiamy początkowe wartości naszych zmiennych, wypisujemy pierwsze dwie liczby Fibonacciego (ponieważ nie trzeba ich obliczać), a następnie wywołujemy `\fibloop`, które wykona za nas ciężką pracę związaną z obliczeniami.

Polecenie `\fibloop` jest zadeklarowane w ten sam sposób, ale kluczową częścią tego polecenia jest sposób, w jaki wykonuje pętlę. Używamy polecenia zwanego `\next`, zainicjalizowanego na `\fibloop` w obrębie `\fibonacci`\fibloop `\fibloop` i używanego w `\fibloop` będzie się powtarzać, aż `\next` zostanie zmienione przez kod wewnątrz samego polecenia `\fibloop` . Chcemy wykonać pętlę tylko `n` razy, więc używamy `\ifnum` instrukcji, która sprawdza wartość naszego licznika (`\fcnt`) i jeśli nie osiągnęła wartości progowej 0, `\fcnt` jest zmniejszane przy każdym powtórzeniu pętli. Jeśli warunek jest spełniony, ustawiamy `\next` na `\\relax`, co uniemożliwi `\fibloop` powtarzanie się — końcowe `\next` polecenie nic nie robi, a pętla się kończy.

Pozostałe polecenia w tym bloku obliczają następną liczbę Fibonacciego w ciągu i aktualizują wartości zmiennych, aby były gotowe na następne przejście. Polecenie `\the\ftwo` wypisuje wartość bieżącej liczby Fibonacciego do dokumentu, a zauważysz też przecinek i spację u góry `\fibloop` polecenia używanego do oddzielania każdej wartości.

#### Wynik

Najprostszym sposobem, aby zobaczyć ten kod w działaniu, jest uruchomienie go w Overleaf za pomocą **Otwórz ten przykład w Overleaf** linku na dole widoku kodu. Ciąg Fibonacciego rośnie szybko, więc każda `n>44` spowoduje przepełnienie liczb całkowitych w tej konkretnej implementacji.

### Dokąd dalej?

Jako nieformalny dowód, że LaTeX jest Turing-zupełny, przedstawiam poniższy kod, który jest szybką i zgrubną implementacją [bramki 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
}
```

Bramki logiczne NAND (a także NOR) mają interesującą właściwość, że każdą inną bramkę logiczną można zbudować z tego jednego typu bramki. Z podstawowych bramek logicznych można zbudować zatrzaski, przerzutniki i pamięć. To są składniki komputera ogólnego przeznaczenia. Możesz przetestować tę bramkę NAND dla każdego z jej czterech możliwych wejść, korzystając z poniższego przykładu, który możesz otworzyć w 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}
```

[Otwórz ten przykład w 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)

Świadomość, że LaTeX jest Turing-zupełny, otwiera świat możliwości. Taki kod jest powszechny w zapleczu LaTeX-a do takich rzeczy jak śledzenie numerów stron i rysunków oraz decydowanie, gdzie umieścić obiekty pływające. To narzędzie, z którego możesz skorzystać, aby uprościć złożone układy dokumentów.

Na zakończenie tego wpisu zostawię ci dalszą lekturę dotyczącą przykładów programowania w LaTeX-u i maszyn Turinga.

#### Przykłady programowania w LaTeX-u

* [Zbiór Mandelbrota w LaTeX-u](http://warp.povusers.org/MandScripts/latex.html) . Szczególne podziękowania za ten przykład; ten kod był pomocnym wzorem podczas pisania mojego polecenia Fibonacciego.
* [Maszyna Turinga w LaTeX-u: kontynuacja](http://pbelmans.ncag.info/blog/2010/12/12/a-turing-machine-in-latex-follow-u/) Uwaga: Podczas przenoszenia tego artykułu do innego systemu hostującego treści zauważyliśmy, że witryna, do której odwoływał się oryginalny artykuł (<http://en.literateprograms.org/Turing_machine_simulator_(LaTeX))> nie była już dostępna, więc zastąpiliśmy ten link artykułem uzupełniającym innego autora.
* [Wikibook o poleceniach TeX-a](http://en.wikibooks.org/wiki/Category:TeX)
* [LaTeX w konkursie programistycznym](http://sdh33b.blogspot.com/2008/07/icfp-contest-2008.html). Kontroler łazika marsjańskiego w LaTeX-u pokonał zgłoszenia w kilku bardziej popularnych językach programowania.

### Maszyny Turinga w nieoczekiwanych miejscach

* [Gra w życie Conwaya jest Turing-zupełna](http://rendell-attic.org/gol/utm/index.htm). Oto implementacja maszyny Turinga.
* [Reguła 110](http://en.wikipedia.org/wiki/Rule_110) to jednowymiarowy automat komórkowy, który jest Turing-zupełny.
* Minecraft (gra wideo) jest Turing-zupełny. Zbudowano kilka przykładów, więc poniższy link prowadzi po prostu do [strony z odpowiednimi wynikami wyszukiwania na 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/pl/artykuly-szczegolowe/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.
