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

# LaTeX är kraftfullare än du tror – att beräkna Fibonaccitalen och Turing-fullständighet

**Författare: Robert Murrish (april 2012 (redigerad av Overleaf i april 2023))**

LaTeX är ett kraftfullt verktyg. Så kraftfullt, faktiskt, att det kan användas till mycket mer än dokumentmarkup. LaTeX är [Turingkomplett](https://en.wikipedia.org/wiki/Turing_completeness); det vill säga, det kan programmeras att beräkna nästan vad som helst.

För att demonstrera LaTeX:s allmänna programmeringsförmåga ska vi titta på ett exempel som beräknar de första Fibonacci-talen. Även om detta inte är ett bevis på Turingkompletthet är det ett bra exempel på en fullständig algoritm implementerad i LaTeX.

### Fibonacci-talen

Varje tal i Fibonacci-sekvensen är summan av de två föregående termerna i sekvensen, där de två första termerna definieras som 1 för att ge en utgångspunkt.

Vi kan skriva ett nytt kommando för att beräkna dessa tal. Låt oss börja med att bestämma hur ett anrop till vårt ännu inte skrivna kommando kan se ut:

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

När detta kommando anropas från vårt LaTeX-dokument bör det skapa en lista över `n` Fibonacci-tal (där `n=10` i exempelanropet här). Här är koden för `\fibonacci` kommandot (dvs. LaTeX-makrot). Låt oss titta på hur det fungerar.

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

[Öppna detta exempel i 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)

Först ställer vi in några variabler som vi kommer att använda senare.  `\newcount` kommandot ger oss en variabel som vi kan använda för att hålla ett heltal; här skapar vi fyra: `\fcnt`, `\fone`, `\ftwo` och `\temp`. Det är värt att nämna att dessa inte är nya variabler; de är snarare alias för befintliga räknare. [LaTeX-räknare](/latex/sv/formatering/10-counters.md) kan användas direkt som i `\count0`, `\count1`, osv., men att tilldela dem namn hindrar oss från att skriva till en räknare som redan används. Om du är nyfiken, ersätt en av variablerna i den här koden med `\count0`, och sidnumren kommer att bli fel för resten av dokumentet.

Sedan har vi `\fibonacci` kommandot. Vi skapar det med `\\newcommand`, som vi förser med namnet, antalet argument och TeX-kod som ska behandlas som argument. För detta kommando accepterar vi ett enda argument, antalet Fibonacci-tal som ska skrivas ut. Innehållet i detta kommando är enkelt: vi sätter initialvärden för våra variabler, skriver ut de två första Fibonacci-talen (eftersom de inte behöver beräknas) och anropar sedan `\fibloop`, vilket kommer att göra det tunga arbetet för våra beräkningar.

Kommandot `\fibloop` deklareras på samma sätt, men en viktig del av detta kommando är hur det loopar. Vi använder ett kommando som kallas `\next`, initierat till `\fibloop` inom `\fibonacci`, och används i `\fibloop` för att styra loopen. `\fibloop` kommer att upprepas tills `\next` ändras av kod i `\fibloop` kommandot självt. Vi vill bara loopa `n` gånger, så vi använder en `\ifnum` sats som kontrollerar värdet på vår räknare (`\fcnt`) och sedan, om den inte har nått tröskelvärdet 0, `\fcnt` minskas varje gång loopen upprepas. Om villkoret är uppfyllt sätter vi `\next` till `\relax`, vilket förhindrar `\fibloop` att upprepas – det sista `\next` kommandot gör ingenting, och loopen avslutas.

De andra kommandona i detta block beräknar nästa Fibonacci-tal i sekvensen och uppdaterar variablernas värden så att de är redo för nästa varv. Kommandot `\the\ftwo` skriver ut värdet på det aktuella Fibonacci-talet i dokumentet, och du kommer också att märka ett kommatecken och ett mellanslag högst upp i `\fibloop` kommandot som används för att separera varje värde.

#### Resultatet

Det enklaste sättet att se denna kod i praktiken är att köra den i Overleaf med **Öppna detta exempel i Overleaf** länken längst ned i kodvisningen. Fibonacci-sekvensen växer snabbt, så varje `n>44` kommer att leda till ett heltalsöverskridande i just denna implementation.

### Vad händer härnäst?

Som ett informellt bevis på att LaTeX är Turingkomplett presenterar jag följande kod, som är en snabb och grov implementation av en [NAND-grind](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
}
```

NAND- (och även NOR-)logikgrindar har den intressanta egenskapen att vilken annan logikgrind som helst kan byggas med just denna enda typ av grind. Från de grundläggande logikgrindarna kan du konstruera latchar, vippor och minne. Det är ingredienserna för en allmän dator. Du kan testa denna NAND-grind för vart och ett av dess fyra möjliga ingångar med följande exempel som du kan öppna i 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}
```

[Öppna detta exempel i 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)

Att veta att LaTeX är Turingkomplett öppnar upp en värld av möjligheter. Kod som denna är vanlig i LaTeX:s bakändan för saker som att hålla reda på sid- och figurnummer och avgöra var flytande objekt ska placeras. Det är ett verktyg som du kan använda till din fördel för att förenkla komplexa dokumentlayouter.

För att avsluta det här inlägget lämnar jag dig med vidare läsning om exempel på programmering i LaTeX och Turingmaskiner.

#### Exempel på programmering i LaTeX

* [Mandelbrotmängden i LaTeX](http://warp.povusers.org/MandScripts/latex.html) . Särskilt tack till detta; den här koden var ett hjälpsamt exempel när jag skrev mitt Fibonacci-kommando.
* [En Turingmaskin i LaTeX: uppföljaren](http://pbelmans.ncag.info/blog/2010/12/12/a-turing-machine-in-latex-follow-u/) OBS: När vi porterade den här artikeln till ett annat innehållshanteringssystem märkte vi att webbplatsen som hänvisades till i originalartikeln (<http://en.literateprograms.org/Turing_machine_simulator_(LaTeX))> inte längre var tillgänglig, så vi ersatte den länken med en uppföljande artikel av en annan författare.
* [Wikibok om TeX-kommandon](http://en.wikibooks.org/wiki/Category:TeX)
* [LaTeX i en programmeringstävling](http://sdh33b.blogspot.com/2008/07/icfp-contest-2008.html). En styrenhet för en Mars-rover i LaTeX slog ut bidrag i flera vanligare programmeringsspråk.

### Turingmaskiner på oväntade platser

* [Conways Game of Life är Turingkomplett](http://rendell-attic.org/gol/utm/index.htm). Här är en implementering av en Turingmaskin.
* [Regel 110](http://en.wikipedia.org/wiki/Rule_110) är en 1D-cellautomat som är Turingkomplett.
* Minecraft (dataspelet) är Turingkomplett. Flera exempel har byggts, så följande länk leder helt enkelt till en [sida med relevanta sökresultat på 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/sv/fordjupade-artiklar/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.
