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

# LaTeX on tehokkaampi kuin luuletkaan – Fibonacci-lukujen laskeminen ja Turing-täydellisyys

**Tekijä: Robert Murrish (huhtikuu 2012 (Overleaf muokkasi huhtikuussa 2023))**

LaTeX on tehokas työkalu. Niin tehokas itse asiassa, että sitä voidaan käyttää paljon muuhunkin kuin asiakirjan merkintään. LaTeX on [Turing-täydellinen](https://en.wikipedia.org/wiki/Turing_completeness); toisin sanoen sitä voidaan ohjelmoida laskemaan lähes mitä tahansa.

Havainnollistaaksemme LaTeXin yleiskäyttöisiä ohjelmointikykyjä tarkastelemme esimerkkiä, joka laskee ensimmäiset Fibonacci-luvut. Vaikka tämä ei ole todiste Turing-täydellisyydestä, se on hyvä esimerkki LaTeXilla toteutetusta täydestä algoritmista.

### Fibonacci-luvut

Jokainen Fibonacci-jakson luku on jakson kahden edellisen termin summa, ja kaksi ensimmäistä termiä on määritelty arvoon 1 lähtökohdan tarjoamiseksi.

Voimme kirjoittaa uuden komennon näiden lukujen laskemiseksi. Aloitetaan päättämällä, miltä kutsu vielä kirjoittamattomalle komennollemme voisi näyttää:

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

Kun tätä komentoa kutsutaan LaTeX-asiakirjastamme, sen pitäisi tuottaa lista `n` Fibonacci-luvuista (jossa `n=10` tässä esimerkkikutsussa). Tässä on koodi `\fibonacci` komennolle (eli LaTeX-makrolle). Katsotaan, miten se toimii.

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

[Avaa tämä esimerkki Overleafissa](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)

Ensiksi asetamme muutaman muuttujan, joita käytämme myöhemmin. Komento `\newcount` antaa meille muuttujan, jota voimme käyttää kokonaisluvun tallentamiseen; tässä luomme neljä: `\fcnt`, `\fone`, `\ftwo` ja `\temp`. On syytä mainita, etteivät nämä ole uusia muuttujia; ne ovat pikemminkin olemassa olevien laskureiden aliaksia. [LaTeXin laskurit](/latex/fi/muotoilu/10-counters.md) voidaan käyttää suoraan kuten `\count0`, `\count1`, jne., mutta nimien antaminen niille estää meitä kirjoittamasta jo käytössä olevaan laskuriin. Jos olet utelias, korvaa jokin tämän koodin muuttujista `\count0`, ja sivunumerot ovat väärin loppuasiakirjan ajan.

Seuraavaksi meillä on `\fibonacci` -komento. Luomme sen komennolla `\newcommand`, jolle annamme nimen, argumenttien määrän ja TeX-koodin argumenttien käsittelemiseksi. Tässä komennossa hyväksymme yhden argumentin, eli Fibonacci-lukujen määrän, joka tulostetaan. Tämän komennon sisältö on yksinkertainen: asetamme muuttujille alkuarvot, tulostamme kaksi ensimmäistä Fibonacci-lukua (koska niitä ei tarvitse laskea) ja sitten kutsumme `\fibloop`, joka hoitaa laskentamme varsinaisen työn.

Komento `\fibloop` ilmoitetaan samalla tavalla, mutta tämän komennon olennainen osa on se, miten se silmukoi. Käytämme komentoa nimeltä `\next`, joka alustetaan arvoon `\fibloop` sisällä `\fibonacci`, ja jota käytetään komennossa `\fibloop` silmukan hallintaan. `\fibloop` toistuu, kunnes `\next` muuttuu koodin toimesta `\fibloop` -komennon sisällä. Haluamme silmukoida vain `n` kertaa, joten käytämme `\ifnum` lausetta, joka tarkistaa laskurimme arvon (`\fcnt`) ja sitten, jos se ei ole saavuttanut kynnysarvoa 0, `\fcnt` pienennetään joka kerta, kun silmukka toistuu. Jos ehto täyttyy, asetamme `\next` kohteeseen `\relax`, mikä estää `\fibloop` toistumisen—lopullinen `\next` -komento ei tee mitään, ja silmukka päättyy.

Muut tämän lohkon komennot laskevat seuraavan Fibonacci-luvun jaksossa ja päivittävät muuttujien arvot, jotta ne ovat valmiina seuraavaa kierrosta varten. Komento `\the\ftwo` tulostaa nykyisen Fibonacci-luvun arvon asiakirjaan, ja huomaat myös pilkun ja välilyönnin `\fibloop` komennon alussa, joita käytetään erottamaan kukin arvo.

#### Tulos

Yksinkertaisin tapa nähdä tämä koodi toiminnassa on ajaa se Overleafissä käyttäen **Avaa tämä esimerkki Overleafissa** linkkiä koodinäytön alareunassa. Fibonacci-jono kasvaa nopeasti, joten mikä tahansa `n>44` johtaa kokonaislukuylivuotoon tässä nimenomaisessa toteutuksessa.

### Mihin tästä eteenpäin?

Epävirallisena todisteena siitä, että LaTeX on Turing-täydellinen, esitän seuraavan koodin, joka on nopea ja raju toteutus [NAND-portista](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- (ja myös NOR-) logiikkaporteilla on mielenkiintoinen ominaisuus, että minkä tahansa muun logiikkaportin voi muodostaa tämän yhden porttityypin avulla. Peruslogiikkaporteista voi rakentaa lukituksia, flip-floppeja ja muistia. Nämä ovat yleiskäyttöisen tietokoneen rakennuspalikat. Voit testata tämän NAND-portin sen jokaiselle neljälle mahdolliselle syötteelle seuraavalla esimerkillä, jonka voit avata Overleafissä.

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

[Avaa tämä esimerkki Overleafissa](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)

Tieto siitä, että LaTeX on Turing-täydellinen, avaa mahdollisuuksien maailman. Tällainen koodi on yleistä LaTeXin taustajärjestelmässä esimerkiksi sivu- ja kuvionumeroiden seuraamiseen sekä sen päättämiseen, mihin kelluvat elementit sijoitetaan. Se on työkalu, jota voit käyttää hyödyksesi monimutkaisten asiakirjaneliasujen yksinkertaistamiseen.

Lopuksi jätän sinulle lisälukemista LaTeXin ohjelmointiesimerkeistä ja Turingin koneista.

#### LaTeX-ohjelmointiesimerkkejä

* [Mandelbrot-joukko LaTeXissa](http://warp.povusers.org/MandScripts/latex.html) . Erityiskiitos tästä; tämä koodi oli hyödyllinen esimerkki Fibonacci-komentoa kirjoittaessani.
* [Turingin kone LaTeXissa: jatko-osa](http://pbelmans.ncag.info/blog/2010/12/12/a-turing-machine-in-latex-follow-u/) Huom.: Kun siirsimme tämän artikkelin toiseen sisällönhallintajärjestelmään, huomasimme, että alkuperäisessä artikkelissa viitattu sivusto (<http://en.literateprograms.org/Turing_machine_simulator_(LaTeX))> ei ollut enää käytettävissä, joten korvasimme tuon linkin toisen kirjoittajan jatko-artikkelilla.
* [Wikikirja TeX-komennoista](http://en.wikibooks.org/wiki/Category:TeX)
* [LaTeX ohjelmointikilpailussa](http://sdh33b.blogspot.com/2008/07/icfp-contest-2008.html). Mars-kulkijan ohjain LaTeXilla päihitti osallistujat useilla yleisemmillä ohjelmointikielillä.

### Turingin koneita odottamattomissa paikoissa

* [Conwayn Game of Life on Turing-täydellinen](http://rendell-attic.org/gol/utm/index.htm). Tässä on toteutus Turingin koneesta.
* [Sääntö 110](http://en.wikipedia.org/wiki/Rule_110) on 1-ulotteinen soluautomaatti, joka on Turing-täydellinen.
* Minecraft (videopeli) on Turing-täydellinen. Useita esimerkkejä on rakennettu, joten seuraava linkki on vain [sivu aiheeseen liittyviä YouTube-hakutuloksia](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/fi/syvalliset-artikkelit/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.
