diff --git a/assets/img/3_sat_indset.png b/assets/img/3_sat_indset.png new file mode 100644 index 0000000..0e6023c Binary files /dev/null and b/assets/img/3_sat_indset.png differ diff --git a/assets/img/circuit_sat.png b/assets/img/circuit_sat.png new file mode 100644 index 0000000..6d2c095 Binary files /dev/null and b/assets/img/circuit_sat.png differ diff --git a/assets/img/graph_complement.png b/assets/img/graph_complement.png new file mode 100644 index 0000000..18e7421 Binary files /dev/null and b/assets/img/graph_complement.png differ diff --git a/main.typ b/main.typ index 9346aa1..8f463e3 100644 --- a/main.typ +++ b/main.typ @@ -5,20 +5,21 @@ #import "layout.typ": indent-par, project #show: project.with(title: [Theory of Algorithms Cheatsheet], authors: ( - "Kristofers Solo", + "Kristofers Solo", "jorenchik" )) #let teo(title: "Teorēma", ..args) = memo(title: title, ..args) -#let TM = `TM` +#let TM = $"TM"$ #let qrej = $q_"rej"$ #let qacc = $q_"acc"$ -#let halt = `HALTING` -#let halt2 = `HALTING2` -#let NP = `NP` +#let halt = $"HALTING"$ +#let halt2 = $"HALTING"_2$ +#let NP = $"NP"$ +#let hline = $\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_$ = Tjūringa Mašīnas -== Info +== Variācijas Var būt 3 veida uzdevumi: stāvokļu, tekstuāls, vairāklenšu. #info(title: "Čērča-Tjūringa tēze")[ @@ -28,27 +29,46 @@ Var būt 3 veida uzdevumi: stāvokļu, tekstuāls, vairāklenšu. šim nav atrasts pretpiemērs. ] -=== Viena lente +=== Viena lente $(q, a) -> (q', a', d)$ -- stāvoklī $q$ redzot $a$, ieraksta $a'$ un iet virzienā $d space (<- "vai" ->)$. -=== Divas lentes -$(q, a_1, a_2) -> (q', b_1, b_2, d_1, d_2)$ -- $a_1$, $b_1$, $d_1$ pirmai lentei -un $a_2$, $b_2$, $d_2$ otrai lentei. +=== Divas (vai vairākas fiksētas) lentes +$(q, a_1, a_2) -> (q', b_1, b_2, d_1, d_2)$ -- $a_1$, $b_1$, $d_1$ pirmai +lentei un $a_2$, $b_2$, $d_2$ otrai lentei. Svarīga atšķirība ir ka +vairlāklenšu TM papildus $<-$ un $->$ virzieniem ir $arrow.b$ (stāvēšana uz +vietas). + +\* Derīgs ar uzdevumiem, kur palīdz kopēšana/salīdzināšana. === Stāvēšana uz vietas Nosimulēt stāvēšanu uz vietas jeb $d=0$ var šādi: - $(q, a) -> (q_"new", a', ->)$ - $(q_"new", a slash b slash c slash * ) -> (q_"new", a slash b slash c slash *, <-)$ -== Soļi +=== Modelis, ko pamatā izmanto šajā kursā! + +Šajā kursā fokusējas uz TM, kas ir: + + Vienas lentes (skat. @one_tape); + + Bezgalīga vienā virzienā -- pa labi; + + Pirmais simbols ir tukšais simbols (`_`); + + Pēc pirmā simbola ir ievade; + + Pēc ievades ir bezgalīgs tukšu simbolu skaits; + + Sāk uz pirmā ievades simbola (viens pēc pirmā tukšuma). + +== Risinājuma shēma + Izdomāt, kā aizstājot simbolus ar $*$ var pārbaudīt virknes derību. + Atcerēties par secību -- aiz $a$ var sekot tikai $b slash c$, aiz $b$ var sekot tikai $c$, utt. + Doties katrā no virzieniem var doties arī līdz galam jeb tukšumam $\_$. + Vairāklenšu #TM pārraksta pirmo daļu līdz $\#$ uz otras lentes un salīdzina. -== Piemērs -Vai ieejas virknē $a^n b^n c^n$, kur $n>0$ +Tas ir bieži sastopamais formāts, bet var gadīties arī cits. + +// Shit, the original wrong here too. It should be "n>=0" + +== Piemērs $(a^n b^n c^n", kur" n >= 0)$ + +Vai ieejas virknē $a^n b^n c^n$, kur $n>=0$ #context [ $(q_1, a) -> (q_2, *, ->)$ \ @@ -56,131 +76,73 @@ Vai ieejas virknē $a^n b^n c^n$, kur $n>0$ $(q_1, *) -> (q_1, *, ->)$ \ $(q_1, \_) -> qacc$ \ + $hline$ + $(q_2, a) -> (q_2, a, ->)$ \ $(q_2, b) -> (q_3, *, ->)$ \ $(q_2, c) -> qrej$ \ $(q_2, *) -> (q_2, *, ->)$ \ + $(q_2, \_) -> qrej$ \ + + $hline$ $(q_3, a) -> qrej$ \ $(q_3, b) -> (q_3, b, ->)$ \ - $(q_3, c) -> (q_4, *, ->)$ \ + $(q_3, c) -> (q_4, *, <-)$ \ $(q_3, *) -> (q_3, *, ->)$ \ + $(q_3, \_) -> qrej$ \ - $(q_4, a slash b) -> qrej$ \ - $(q_4, c) -> (q_4, c, ->)$ \ - $(q_4, \_) -> (q_5, \_, <-)$ \ + $hline$ - $(q_5, a slash b slash c slash *) -> (q_5, a slash b slash c slash *, <-)$ \ - $(q_5, \_) -> (q_1, \_, ->)$ \ + $(q_4, a slash b slash c slash *) -> (q_4, a slash b slash c slash *, <-)$ \ + $(q_4, \_) -> (q_1, \_, ->)$ \ ] -- Aizstāj $a$ ar $*$, $b$ ar $*$, $c$ ar $*$. -- Kontrolē secību (pēc $a$ jāseko $a$ vai $b$, pēc $b$ jāseko $b$ vai $c$, pēc - $c$ var sekot tikai $c$). -- Ja kādu simbolu nevar atrast, noraida. - -== Piemērs +== Piemērs (vai virkne atkārt. pēc `#`) Vai ieejas virkne $x \# x$, kur $x in {0,1}^*$ #context [ $(q_1, 0, \_) -> (q_1, 0, 0, ->, ->)$ \ $(q_1, 1, \_) -> (q_1, 1, 1, ->, ->)$ \ - $(q_1, \#, \_) -> (q_2, \#, \_, 0, <-)$ \ + $(q_1, \#, \_) -> (q_2, \#, \_, arrow.b, <-)$ \ - $(q_2, 0, 0) -> (q_2, 0, 0, <-)$ \ - $(q_2, 1, 1) -> (q_2, 1, 0, <-)$ \ + $hline$ + + $(q_2, \#, 1) -> (q_2, \#, 1, arrow.b, <-)$ \ + $(q_2, \#, 0) -> (q_2, \#, 0, arrow.b, <-)$ \ $(q_2, \#, \_) -> (q_3, \#, \_, ->, ->)$ \ + $hline$ + $(q_3, 0, 0) -> (q_3, 0, 0, ->, ->)$ \ + $(q_3, 1, 1) -> (q_3, 1, 1 ->, ->)$ \ $(q_3, 0, 1) -> qrej$ \ $(q_3, 1, 0) -> qrej$ \ - $(q_3, 1, 1) -> (q_3, 1, 1 ->, ->)$ \ $(q_3, 0 slash 1, \_) -> qrej$ \ $(q_3, \_, 0 slash 1) -> qrej$ \ $(q_3, \_, \_) -> qacc$ \ + ] -- Nokopē simbolus līdz $\#$ uz otras lentes. -- Sasniedzot $\#$, uz otras lentes iet atpakaļ līdz pirmajam simbolam. -- Salīdzina pirmās lentes simbolus pēc $\#$ ar otro lenti. - -= Lielais $O$ un mazais $o$ -== Info -- Tiek dota funkcija un jānosaka vai tā atrisināma dotajā lielā $O$ vai mazā $o$ - laikā. -- Ja funkcija aug straujāk par lielo $O$, tad apgalvotā vienādība būs patiesa. -- Ja funkcija aug straujāk par mazo $o$, tad apgalvotā vienādība būs nepatiesa. - -== Soļi -- Ja funkcija pielīdzināta lielajam $O$: - + Salīdzina funkcijas augstāko pakāpi ar doto $O$ pakāpi. - + Ja funkcijas pakāpe ir lielāka, tad vienādojums būs patiess, jo funkcija aug - straujāk. -- Ja funkcija pielīdzināta mazajam $o$: - + Jāievieto dotais robežā $lim_(x->oo)f(x)/g(x)$, kur $f(x)$ ir funkcija un - $g(x)$ ir $o$. - + Ja rezultāts sanāk tuvu $0$, tad vienādojums būs patiess, jo funkcija aug - lēnāk. - -== Piemērs -$ 2n^4 + 6n^2 + 17 =^? O(n^4) $ - -Izteiksme ir patiesa, tā kā kreisās puses izteiksmes augstākā pakāpe jeb kārta -ir $4$ un iekš $O$ tā arī ir $4$. - -== Piemērs -$ 2n^4 + 6n^2 + 17 =^? O(n^3) $ - -Izteiksme ir aplama, jo kreisajā pusē augstākā pakāpe ir $4$, kamēr labajā ir norādīta $3$, un $4$ pakāpes izteiksmi nevar izpildīt $O(n^3)$. - - -== Piemērs -$ n log^4 n =^? o(n^1.5) $ - -Ir zināms, ka mazajā $O$ notācijai, ja $lim_(x->oo)f(x)/g(x)$, kur $f(x)$ ir -funkcija un $g(x)$ ir $o$, tad vienādība izpildās. -Ievietojot vērtības $ lim_(n->oo) (n log^4 n)/n^1.5=0 $ -Tātad vienādojums ir -patiess. - -== Piemērs -$ 2^n n^2 =^? o(n^3) $ - -Pēc tās pašas aprakstītās īpašības, kā @small-o-example-3, sanāktu -$ lim_(n->oo) (2^n n^2)/3^n $ -un tā kā $3^n$ aug ātrāk kā $2^n$, šī robeža būs $0$ un sākotnējais -vienādojums būs patiess. - -== Piemērs -$ n^3 + 17n + 4 in^? O(n^3) $ - -Jā, $n^3 + 17n + 4 <= n^3 + 17n^3 + 4n^3 = 22n^3$. - -== Piemērs -$ n^4 + 17n + 4 in^? O(n^3) $ - -Nē $n^4 + 17n + 4 > n^4 = n dot n^3$ - = Sanumurējamība -== Info +== Definīcija - Bezgalīgas kopas $A$, $B$ ir vienāda izmēra, ja ir bijekcija ($1:1$ attiecība) $F: A->B$. - $A$ ir sanumurējama ar atkārtojumiem, ja ir attēlojums $F:N->A$, kas par katru - $a$ $E$ $A$ attēlo vismaz vienu $x$ $E$ $N$. + $a in A$ attēlo vismaz vienu $x in NN$. #teo[$A$ ir sanumurējama ar atkārtojumiem tad un tikai tad, ja $A$ ir sanumurējama.] -== Soļi -- Kopa ir sanumurējama, ja tajā eksistē viennozīmīga atbilstība (bijekcija) - starp kopas elementiem un naturāliem skaitļiem. - Citos vārdos sakot, katram kopas elementam var piešķirt unikālu naturālu - skaitli. +== Sanumerātības pierādījums +- Kopa ir sanumurējama, ja tajā eksistē bijekcija starp kopas elementiem un + naturāliem skaitļiem. Citos vārdos sakot, katram kopas elementam var piešķirt + unikālu naturālu skaitli. - Ja kopa ir galīga, tā ir triviāli sanumurējama, jo katram elementam var piešķirt unikālu naturālu skaitli. -- Ja kopa ir bezgalīga, jāņem vērā divi varianti: - - Ja var izveidot bijekciju starp kopu un naturāliem skaitļiem, tad jāpierāda, - ka bijekcija nepastāv. - Var skaidri definēt funkciju, kas katram kopas elementam piešķir unikālu - naturālu skaitli un parādīt, ka tā apvieno visus elementus bez dublēšanās. +- Ja kopa ir bezgalīga (ar ko bieži vien darbojamies), jāņem vērā divi varianti: + - Ja var izveidot bijekciju starp kopu un naturāliem skaitļiem, tad + jāpierāda, ka bijekcija pastāv -- Var skaidri definēt funkciju, kas katram + kopas elementam piešķir unikālu naturālu skaitli un parādīt, ka tā apvieno + visus elementus bez dublēšanās. - Ja nevar atrast bijekciju starp kopu un naturāliem skaitļiem, tad jāpierāda, ka bijekcija nepastāv. Parasti tas tiek darīts, izmantojot pierādīšanas tehnikas, piemēram, @@ -188,138 +150,17 @@ Nē $n^4 + 17n + 4 > n^4 = n dot n^3$ - Ja izdodas pierādīt, ka start kopu un naturāliem skaitļiem nav bijekcijas, tad kopa ir nesaskaitāma. -=== Diagonālinācija -Ietver paņēmienu, ka ir saraksts vai uzskaitījums ar visiem kopas elementiem un -tiek konstruēts jauns elementu, kas neatrodas šajā sarakstā. -Tas demonstrē, ka kopa ir nesaskaitāma, jo vienmēr var izveidot jaunu elementu, -kas nav iekļauts uzskaitē. +=== Algoritmiska sanumurētība (par sanumerātību) -=== Pretruna -Pieņem, ka kopa ir saskaitāma un tad rodas pretruna. -To var izdarīt, parādot, ka kaut kādas kopas īpašības vai kardinalitāte ir -pretrunā ar sanumurējamības pieņēmumu. - -== Piemērs -Vai visu veselo skaitļu kopa $ZZ={..., -1, 0, 1, ...}$ ir sanumurējama? \ -Vai ir $F:{F(1), F(2), ..., F(n), ...}=ZZ$? \ - - -$ F(1)=0, F(2)=-1, F(3)=1, F(4)=-2, ... $ - -Viens no veidiem, kā izveidot bijekciju pāra kopai, ir izmantot metodi, ko sauc -par Kantoro pārošanas funkciju. -Kantora pārošanas funkcija ir definēta sekojoši: -$f(k_1, k_2) := 1/2(k_1 + k_2)(k_1 + k_2 + 1) + k_2$, kur $k_1,k_2 in NN = {0, 1, 2, ...}$ - -#figure( - image("assets/img/cantors-pairing-function.png", width: 50%), - caption: "Cantor's pairing function", -) - -Šī funkcija kā ievadi pieņem naturālo skaitļu pāri $(k_1, k_2)$ un to attēlo -kā unikālu naturālo skaitli. -Tā nodrošina, ka katram pārim tiek piešķirts unikāls skaitlis un tiek aptverti -visi iespējamie pāri bez atkārtojumiem. - -Lai pierādītu, ka naturālo skaitļu pāru $(k_1, k_2)$ kopa ir saskaitāma, mēs -varam parādīt, ka funkcija $f(k_1, k_2)$ nodrošina bijekciju starp naturālo -skaitļu pāru kopu un naturālo skaitļu kopu. - -=== Injektivitāte -Pieņemsim, ka $f(k_1, k_2) = f(k_3, k_4)$, kur $(k_1, k_2)$ un $(k_3, k_4)$ -ir atšķirīgi pāri no naturālo skaitļu kopas. -Vienkāršojot un nolīdzinot izteiksmes, varam parādīt, ka -$k_1 = k_3$ un $k_2 = k_4$. -Tātad funkcija $f$ ir injektīva. - -=== Surjektivitāte -Jebkuram naturālam skaitlim $n$ varam atrast pāri $(k_1, k_2)$, kas tiek -attēlots uz $n$, izmantojot Kantora pārošanas funkcijas apgriezto funkciju. -Pielietojot apgriezto funkciju uz $n$, varam atgūt sākotnējo pāri $(k_1, k_2)$. -Tādējādi funkcija $f$ ir surjektīva. - -= Redukcijas -Dota problēma $halt2(M, x, y) = 1$, kur Tjūringa mašīna $M$ apstājas vismaz uz -vienas no ievadēm $x$ vai $y$. -Pierādīt, ka to var vai nevar reducēt uz $halt(halt <= halt 2)$. - -Lai pierādītu, ka problēmu $halt2(M, x, y)$ var reducēt uz #halt, mums jāparāda, -ka varam konstruēt Tjūringa mašīnu, kas atrisina #halt2, izmantojot #halt -atrisināšanas apakšprogrammu. - -Pieņemsim, ka mums ir Tjūringa mašīna $H$, kas atrisina #halt problēmu. -Konstruēsim jaunu Tjūringa mašīnu $H 2$, kas atrisina #halt2 problēmu, -izmantojot $H$ kā apakšprogrammu. - -Tjūringa mašīna $H 2$ darbojas sekojoši: -- Doti ievades dati $M$, $x$ un $y$. -- Palaiž $H$ ar ievaddatiem $(M, x)$. -- Ja $H$ akceptē $(M, x)$, apstājas un akceptē. -- Ja $H$ noraida $(M, x)$, palaiž $H$ ar ievaddatiem $(M, y)$. -- Ja $H$ akceptē $(M, y)$, apstājas un akceptē. -- Ja $H$ noraida $(M, y)$, apstājas un noraida. - -Konstruējot $H 2$ šādā veidā, mēs simulējam $H$ darbību uz abām ievadēm $x$ un -$y$. -Ja $H$ akceptē vai nu $(M, x)$ vai $(M, y)$, arī $H 2$ akceptēs un apstāsies. -Ja $H$ noraida gan $(M, x)$, gan $(M, y)$, arī $H 2$ noraidīs un apstāsies. - -Redukcijas analīze: -- Ja $halt2(M, x, y) = 1$, tas nozīmē, ka Tjūringa mašīna $M$ apstājas vismaz uz - vienas no ievadēm $x$ vai $y$. - Šajā gadījumā $H 2$ arī apstāsies un akceptēs, jo tā veiksmīgi simulē $H$ uz - abām ievadēm un akceptē, ja $H$ akceptē kādu no tām. - Tādējādi #halt2 tiek reducēta uz #halt. -- Ja $halt2(M, x, y) = 0$, tas nozīmē, ka Tjūringa mašīna $M$ neapstājas ne uz - $x$, ne uz $y$. - Šajā gadījumā #halt2 arī neapstāsies un noraidīs, jo tā simulē $H$ uz abām - ievadēm un noraida, ja $H$ norada abas. - Tādējādi #halt2 tiek reducēta uz #halt. - -Tātad esam pierādījuši, ka problēmu #halt2 var reducēt uz #halt, konstruējot -Tjūringa mašīnu $H 2$, kas izmanto $H$ kā apakšprogrammu. -Šī redukcija parāda, ka #halt2 skaitļošanas ziņā nav sarežģītāka par #halt, kas -nozīmē, ka #halt2 ir vismaz tikpat neizsķirama kā #halt. - -= Daļēja atrisināmība -== Info -Problēma tiek uzskatīta par daļēji atrisināmu (vai algoritmiski sanumurējamu), -ja tā nav izšķirama, kas nozīmē, ka nav algoritma, kas varētu pareizi noteikt -"jā" vai "nē" atbildi katram problēmas ievades gadījumam. - -Tjūringa mašīnu un algoritmu teorijas kontekstā, problēma ir daļēji atrisināma, -ja eksistē Tjūringa mašīna, kas apstājas un dod "jā" atbildi katram gadījumam, -kas pieder problēmai, bet var vai nu darboties bezgalīgi, vai noraidīt -gadījumus, kas nepieder problēmai. -Citiem vārdiem sakot, ir algoritms, kas var atpazīt gadījumus, kas atbilst -problēmas kritērijiem, bet var neapstāties uz gadījumiem, kas neatbilst. - -Tas, ka problēma ir daļēji atrisināma, nozīmē, ka nav konkrēta algoritma, kas -vienmēr varētu sniegt pareizu "nē" atbildi gadījumiem ārpus problēmas. -Var būt iespējams konstruēt Tjūringa mašīnu, kas apstājas un sniedz "nē" atbildi -noteiktiem gadījumiem ārpus problēmas, bet tas nav garantēts visiem gadījumiem - -#teo( - title: "Raisa teorēma", -)[Ja $F$ nav triviāla (ir $M:F(M)=0$ un $M':F(M')=1$), tad $F$ -- neatrisināma.] - -$A$ -- daļēji atrisināma, ja ir Tjūringa mašīna $T$: -- Ja $A(x)=1$, tad $T(x)=1$. -- Ja $A(x)=0$, tad $T(x)=0$ vai $T(x)$ neapstājas. - -#teo[$A$ -- daļēji atrisināma tad un tikai tad, ja $A$ -- algoritmiski sanumurējama.] - -= Algoritmiskā sanumurējamība -== Info - Kopa $A$ ir sanumurējama, ja $A={x_1, x_2, ...}$ - Kopa $A$ ir algoritmiski sanumurējama, ja ir Tjūringa mašīna, kas izdod virkni $x_1, x_2, ...$, kurai $A={x_1, x_2, ...}$ -#let DL = `DL` -#let IL = `IL` +#let DL = $"DL"$ +#let IL = $"IL"$ Divu lenšu #TM, kur viena ir klasiska darba lente (#DL) un otra ir izvada lente (#IL) (tikai rakstīšanai). -== Piemērs +==== Piemērs $(a^k b^k mid(|) k>=0)$ alg. sanum. Pamatot, ka kopa ${a^k b^k mid(|) k>=0}$ ir algoritmiski sanumurējama. + Uzraksta uz izejas lentes tukšu vārdu. @@ -331,10 +172,11 @@ Pamatot, ka kopa ${a^k b^k mid(|) k>=0}$ ir algoritmiski sanumurējama. + Uz darba lentes pierakstām klāt vienu $a$. + Izejas lente $=epsilon, a b, a a b b, a a a b b b,...$ -== Piemērs +==== Piemērs (atkārt. pēc \# ir sanum\.?) Pamatot, ka kopa ${x \# x mid(|) x in {a, b}^* }$ ir algoritmiski sanumurējama. -+ Uz darba lentes iet cauri visiem $x$. ++ Uz darba lentes iet cauri visiem $x$ (šeit būtu jāparāda/jāpaskaidro, kā to + izdara). + Katram $x$ uz izejas lentes uzraksta $x \# x$. + Uz izejas lentes uzraksta $\#\_$. + Uz darba lentes uzraksta $a$. @@ -343,107 +185,171 @@ Pamatot, ka kopa ${x \# x mid(|) x in {a, b}^* }$ ir algoritmiski sanumurējama. + Uzraksta $\#$ uz #IL, vēlreiz pārraksta $x$ uz #IL, uzrakstām $\_$ uz #IL. + Uz #DL nomaina $x$ pret nākošo vārdu. -= #TM darbības laiks -== Info -- Laiks ir soļu skaits un ir atkarīgs no ieejas virknes $x_1, x_2, ..., x_n$. -- Ja ir algoritms ar sarežģītību $n^2$, tad bieži ir arī algoritms ar - sarežģītību $n^2/2, n^2/3,...$ +=== Diagonālinācija (pret sanumurējāmību) +Ir saraksts (pieņem, ka ir iegūts saraksts) vai uzskaitījums ar visiem kopas +elementiem un tiek konstruēts jauns elements, kas neatrodas šajā sarakstā. Tas +demonstrē, ka kopa ir nesanumurējama, jo vienmēr var izveidot jaunu elementu, +kas nav iekļauts uzskaitē (piemēram, reālos skaitļos). -== Soļi -+ Identify the key operations or steps performed by the Turing machine for each - input. - + This could include reading symbols from the tape, writing symbols to the - tape, moving the tape head, performing computations, or making decisions - based on the current state and input symbol. -+ Determine the worst-case scenario. - + Analyze the input or sequence of inputs that would require the maximum - number of steps for the Turing machine to complete its computation. - + Consider inputs that maximize the number of iterations or force the machine - to explore all possible branches of computation. -+ Express the runtime in terms of the input size. - + Define a function that represents the number of steps or transitions taken - by the Turing machine as a function of the input size. - + For example, if the input size is $n$, the runtime function could be denoted - as $f(n)$. -+ Simplify the runtime function and express it using Big $O$ notation. - + Big $O$ notation provides an upper bound on the growth rate of the runtime - function as the input size increases. - + Remove constant factors and lower-order terms from the runtime function to - focus on the dominant term that represents the growth rate. - + Express the simplified runtime function using the appropriate Big $O$ notation, - such as $O(n)$, $O(n log n)$, $O(n^2)$, $O(2^n)$, etc. +=== Pretruna (pret sanumurējāmību) +Pieņem, ka kopa ir saskaitāma un tad rodas pretruna. To var izdarīt, parādot, +ka kaut kādas kopas īpašības vai kardinalitāte ir pretrunā ar sanumurējamības +pieņēmumu. -+ Identificēt galvenās operācijas vai soļus, ko Tjūringa mašīna veic katrai - ievadei. - + Tas varētu ietvert simbolu lasīšanu no lentes, simbolu rakstīšanu lentē, - lentes galviņas pārvietošanu, aprēķinu veikšanu vai lēmumu pieņemšanu, - pamatojoties uz pašreizējo stāvokli un ievades simbolu. -+ Noteikt sliktākā gadījuma scenāriju. - + Analizēt ievadi vai ievades secību, kas prasītu maksimālo soļu skaitu, - lai Tjūringa mašīna pabeigtu savu aprēķinu. - + Apsvērt ievades, kas maksimizē iterāciju skaitu vai liek mašīnai izpētīt - visas iespējamās aprēķinu zaru versijas. -+ Izteikt darbības laiku atkarībā no ievades izmēra. - + Definēt funkciju, kas attēlo Tjūringa mašīnas veikto soļu vai pāreju - skaitu kā funkciju no ievad izmēra. - + Piemēram, ja ievades izmērs ir $n$, darbības laika funkciju varētu apzīmēt - kā $f(n)$. -+ Vienkāršot darbības laika funkciju un izsakot to, izmantojot lielā $O$ - notāciju. - + Lielā $O$ notācija nodrošina augšējo robežu darbības laika funkcijas - pieauguma ātrumam, palielinoties ievaddatu izmēram. - + Noņemt konstantes faktorus un zemākas kārtas locekļus no darbības laika - funkcijas, lai koncentrētos uz dominējošo locekli, kas atspoguļo pieauguma - ātrumu. -+ Izteikt vienkāršoto darbības laika funkciju, izmantojot atbilstošo lielā $O$ - notāciju, piemēram, $O(n)$, $O(n log n)$, $O(n^2)$, $O(2^n)$ utt. +== Piemērs $(ZZ "sanumurētība")$ +Vai visu veselo skaitļu kopa $ZZ={..., -1, 0, 1, ...}$ ir sanumurējama? +Vai ir $F:{F(1), F(2), ..., F(n), ...}=ZZ$? -== Piemērs -Vai ieejas virknē ir vienāds skaits $a$ un $b$? +$F(n) = n/2 ", ja pāra un" -(n-1)/2 "ja nepāra"$. -+ Virzās no kreisās puses uz labo, aizstājot vienu $a$ un vienu $b$ ar $x$; -+ Ja neatrod nedz $a$, nedz $b$, akceptē; -+ Ja neatrod vienu no $a$ vai $b$, noraida; -+ Ja atrod gan $a$, gan $b$, virzās atpakaļ uz pirmo simbolu un atkārto. +Sākumā tiek iegūta nulle. -Kopējais soļu skaits: -- Ne vairāk kā $(n/2+1) 2n = n^2 + 2n$ soļi. -- Ja $n$ nav ļoti mazs, $n^2$ būs vairāk nekā $2n$ un soļu skaits $O(n^2)$. +Iterējot par $n$: ++ Funkcijas vērtības skaitļa modulis palielinās par 1, tiek iegūts pozitīvais + skaitlis; ++ Tiek iegūts negatīvais skaitlis; -= #NP (neatrisināmas problēmas) +$F(1)=0, F(2)=1, F(3)=-1, F(4)=2, F(5)=-2...$ -#let acc = `ACCEPTING` -#let eqans = `EQUAL_ANSWERS` -#let one = `ONE` -#let infinite = `INFINITE` -#let equiv = `EQUIV` -#let hamcycle = `HAMCYCLE` -#let linineq = `LIN-INEQ` -#let M1 = $M 1$ -#let M2 = $M 2$ -#let SAT = `SAT` +Injekcija: ja $F(n_1) = F(n_2)$ no formulas seko, ka $n_1 = n_2$. -== Info +Surjekcija: katram $z in ZZ$ eksistē $n in NN$, ka $F(n) = z$. + += Redukcijas + +== Definīcija + +- $A <= B$, ja ir ar Tjūringa mašīnu izrēķināms pārveidojums + - $R$: (ieejas dati $A$) -> (ieejas dati $B$), + - $B(R(x)) = A(x)$. + +Ja $A <= B$ -- ja var atrisināt $B$, tad var atrisināt $A$. $A$ ir reducējuma +par $B$. + +Ja $A <= B and A >= B$, tad $A$ un $B$ ir ekvivalentas. + +== Piemērs (var vai nevar reducēt) + +// Jorens: Originally šeit bija sajaukta secība, bet uzdevums ir kinda valīds +// abās pusēs, kopumā risinājums ir nedaudz problemātisks. + +#quote[ + Dota problēma $halt2(M, x, y) = 1$, kur Tjūringa mašīna $M$ apstājas vismaz uz + vienas no ievadēm $x$ vai $y$. Pierādīt, ka to var vai nevar reducēt uz + $halt$, tas ir parādīt $(halt 2 <= halt)$. +] + +Lai pierādītu, ka problēmu $halt2(M, x, y)$ var noreducēt uz #halt, mums +jāparāda, ka varam konstruēt Tjūringa mašīnu, kas atrisina #halt2, izmantojot +#halt kā atrisinātu problēmu (jeb kā apakšprogrammu). + +Pieņemsim, ka mums ir Tjūringa mašīna $H$, kas atrisina #halt problēmu. +Konstruēsim jaunu Tjūringa mašīnu $H 2$, kas atrisina #halt2 problēmu: + +Tjūringa mašīna $H 2$ darbojas sekojoši: +- Doti ievades dati $M$, $x$ un $y$. +- Palaiž $H$ ar ievaddatiem $(M, x)$. +- Ja $H$ akceptē $(M, x)$, apstājas un akceptē. +- Ja $H$ noraida $(M, x)$, palaiž $H$ ar ievaddatiem $(M, y)$. +- Ja $H$ akceptē $(M, y)$, apstājas un akceptē. +- Ja $H$ noraida $(M, y)$, apstājas un noraida. + +// Jorens:Nav "vai nu", bet "vai". Citādi paliek abi pozitīvi, kas nav +// apskatīti. +Konstruējot $H 2$ šādā veidā, mēs simulējam $H$ darbību uz abām ievadēm $x$ un +$y$: +- Ja $H$ akceptē $(M, x)$ vai $(M, y)$, $H 2$ akceptēs un apstāsies. +- Ja $H$ noraida gan $(M, x)$, gan $(M, y)$, $H 2$ noraidīs un apstāsies. + +// Jorens: Tas jau ir nedaudz liekvārdīgi, izņēmu dažas lietas. + +_Tālākais teksts nav obligāts risinājumā._ + +Redukcijas analīze: +- Ja $halt2(M, x, y) = 1$, tas nozīmē, ka Tjūringa mašīna $M$ apstājas vismaz + uz vienas no ievadēm $x$ vai $y$. Šajā gadījumā $H 2$ arī apstāsies un + akceptēs, jo tā veiksmīgi simulē $H$ uz abām ievadēm un akceptē, ja $H$ + akceptē kādu no tām. Tādējādi #halt2 tiek reducēta uz #halt. +- Ja $halt2(M, x, y) = 0$, tas nozīmē, ka Tjūringa mašīna $M$ neapstājas ne uz + $x$, ne uz $y$. Šajā gadījumā #halt2 arī neapstāsies un noraidīs, jo tā + simulē $H$ uz abām ievadēm un noraida, ja $H$ norada abas. + +Tādējādi #halt2 tiek reducēta uz #halt. + += Neatrisināmas (non-decidable) problēmas + +#let acc = $"ACCEPTING"$ +#let eqans = $"EQUAL-ANSWERS"$ +#let one = $"ONE"$ +#let infinite = $"INFINITE"$ +#let equiv = $"EQUIV"$ +#let hamcycle = $"HAMCYCLE"$ +#let linineq = $"LIN-INEQ"$ +#let M1 = $M_1$ +#let M2 = $M_2$ +#let SAT = $"SAT"$ + +== Definīcija + +Neatrisināma problēma ir problēma ir problēma, kurai neeksistē TM, kas +atrisinātu šo problēmu. + +== Funkcionālās īpašības + +- $F(M)$, $M$ – Tjūringa mašīnas programma; +- $F$ var definēt caur $M$ atbildēm uz dažādām ieejas virknēm $x$. + +Piemēram: +- $"ONE"(M) = 1$, ja $exists x: M(x) = 1$ +- $"INFINITE"(M) = 1$, ja $exists^infinity x: M(x) = 1$ + +Citiem vārdiem, ja $forall x: M_1(x) = M_2(x)$, tad $F(M_1) = F(M_2)$. + +== Nefunkcionālās īpašības + +- $A(M) = 1$, ja $exists x: M$ apstājas pēc $<= 17$ soļiem. +- $B(M) = 1$, ja Tjūringa mašīnā $M$ ir stāvoklis $q$, kurš netiek sasniegts + nevienai ieejas virknei $x$. + +Papildus Tjūringa mašīnas funkcionālam aprakstam, mums ir papildus informācija +par mašīnu, par tās struktūru etc. + +== Raisa teorēma + +#teo( + title: "Raisa teorēma", +)[Ja $F$ nav triviāla (ir $M:F(M)=0$ un $M':F(M')=1$), tad $F$ -- neatrisināma.] + +Teorēma "pasaka" mums priekšā, ka jebkuru netriviālu *funkcionālu* īpašību +nevar atrisināt. + +== Uzskaitījums - $halt(M\# x)=1$, ja $M$ apstājas, ja ieejas virkne $=x$. - $acc(M\# x)=1$, ja $M$ uz ieejas virknes izdod atbildi $1$. - $eqans(M\# x \# y)=1$, ja $M$ uz ieejas virknēm $x$ un $y$ izdod vienādas atbildes. - $one(M)=1$, ja eksistē ieejas virkne $x$, uz kuras $M$ izdod atbildi $1$. - $infinite(M)=1$, ja eksistē bezgalīgi daudzas ieejas virknes $x$, uz kurām $M$ izdod atbildi $1$. - $equiv(M 1, M 2)=1$, ja $M1(x)=M2(x)$ -- $hamcycle(G)=1$, ja grafā $G$ ir cikls (šķautņu virkne - $v_1 v_2,v_2 v_3, ..., v_n v_1$), kurā katra virsotne ir tieši $1$ reizi. -- $linineq(S)=1$, ja sistēmai ir atrisinājums $x_1, x_2, ..., x_n in {0,1}$ +- $"PCP"(S_1, S_2)=1$ (Post-correspondance problem), ja divām galībām kopām $A = [a_1, + a_2, ..., a_n]$ un $B = [b_1, b_2, dots, b_n]$ var izvēlēties indeksu secības + $a_("i1") a_("i2") ... a_("ik")$ = $b_("i1") b_("i2") ... b_("ik")$ (tā lai + konkatenācijas būtu vienādas); domino kauliņi ar augšu un apakšu, ko saliekot + kopā, globālai augšai un apakšai jāsakrīt. +- $"MORTAL-MATRIX"(S)=1$, vai no matricām $M_1, M_2, ..., M_n$ var izveidot + secību (ar atkārtojumiem), ka matricu reizinājums būtu 0. +// LININEQ, HAMCYCLE are DECIDABLE! +// - $"hilbert's-10th"(S)=1$, ...? #info[Ja var atrisināt #acc, tad var atrisināt arī #halt.] #info[Ja var atrisināt #eqans / #one / #infinite / #equiv, tad var atrisināt arī #acc.] -== Soļi +== Pierādījums no redukcijas (Soļi) + Skaidri definē problēmu, kuru vēlas pierādīt kā #NP -- norādot, kas ir derīga ievade un kādus rezultātus programmai paredzēts izvadīt. + Pieņem, ka eksistē algoritms vai #TM, kas spēj atrisināt problēmu visiem iespējamiem ievaddatiem. Šī pieņēmuma mērķis ir rādīt pretrunu. -+ Definē citu problēmu, kas var tikt samazināta līdz sākotnējai problēmai. ++ Definē citu problēmu, kas var tikt noreducēta līdz sākotnējai problēmai. Tas nozīmē, ka, ja var atrisināt sākotnējo problēmu, var atrisināt arī saistīto problēmu. + Izveido transformācijas vai redukcijas algoritmu, kas ņem saistītās problēmas @@ -462,8 +368,8 @@ Kopējais soļu skaits: Šeit jārodas pretrunai. #context [ #set par(justify: false) - == Piemēri - === #halt / #acc + == Piemēri (prob. ir neatr) + === #halt <= #acc - #underline("Teorēma"): Ja var atrisināt #acc, tad var atrisināt arī #halt - #underline("Pierādījums"): Attēlojums $R:M->M'$ ar īpašību $halt(M\#x) = acc(M'\#x)$. - Tad $halt(M\#x)$ var atrisināt sekojoši: @@ -472,7 +378,7 @@ Kopējais soļu skaits: - Ja $M$ akceptē/noraida, tad $M'$ akceptē (izdos $1$). - Ja $M$ neapstājas, $M'$ arī neapstājas. - === #eqans/ #acc + === #acc <= #eqans - #underline("Zinām"): #acc nav atrisināma - #underline("Pierādām"): Ja var atrisināt #eqans, tad var atrisināt arī #acc. - #underline("Secinām"): #eqans nevar atrisināt. @@ -483,21 +389,21 @@ Kopējais soļu skaits: - $M'(quote.angle.l.double s quote.angle.r.double)=1$, $M'(x)=M(x)$, ja $x$ nesatur $s$. - $eqans(M'\# x \# quote.angle.l.double s quote.angle.r.double)=acc(M\#x)$. - === #one/ #acc + === #acc <= #one - #underline("Pierādām"): Ja var atrisināt #one, tad var atrisināt arī #acc. - Dots: $M, x$ - Jādefinē: $M': one(M') = acc(M\# x)$. - $M'$: nodzēš no lentes ieejas virkni $y$, uzraksta $x$, palaiž $M$ programmu. - Jebkurai $y, M'(y)=M(x)$. - === #infinite/ #acc + === #acc <= #infinite - #underline("Pierādām"): Ja var atrisināt #infinite, tad var atrisināt arī #acc. - Dots: $M, x$ - Jādefinē: $M': infinite(M') = acc(M\# x)$. - Jebkurai $y, M'(y)=M(x)$. - Ja $M(x)=1$, tad $M'(y)=1$ jebkurai $y$. - === #equiv / #acc + === #acc <= #equiv - #underline("Pierādām"): Ja var atrisināt #equiv, tad var atrisināt arī #acc. - Dots: $M, x$ - Jādefinē: $M_1, M_2: equiv(M_1, M_2) = acc(M\# x)$. @@ -570,34 +476,467 @@ Kopējais soļu skaits: Pēc tās, lai pierādītu, ka cita problēma $L$ ir NP-pilna, pietiek parādīt, ka $L in NP$ un ka $SAT <_p L$ (vai jebkura cita zināma NP-pilna problēma). -= Sarežģītības klases -#let time = `TIME` -== Info -$n, n log n, n^2, n^3, 2^n$ + +== Daļēja atrisināmība + +// Jorens: Tas teksta blāķis, kas šeit bija var apjucināt cilvēkus, viss kas +// vajadzīgs ir sarakstāms īsāk. + +- $A$ –- daļēji atrisināma, ja ir Tjūringa mašīna $T$: + - Ja $A(x) = 1$, tad $T(x) = 1$. + - Ja $A(x) = 0$, tad $T(x) = 0$ vai $T(x)$ neapstājas. + +Tas, ka problēma ir daļēji atrisināma, nozīmē, ka nav konkrēta un *vispārīga* +algoritma, kas vienmēr varētu sniegt pareizu "nē" atbildi gadījumiem ārpus +problēmas. + +Var būt iespējams konstruēt Tjūringa mašīnu, kas apstājas un sniedz +"nē" atbildi noteiktiem gadījumiem ārpus problēmas, bet tas nav garantēts +visiem gadījumiem (_un īsti nav apskatīts šajā kursā_). + +#teo[$A$ -- daļēji atrisināma tad un tikai tad, ja $A$ -- algoritmiski sanumurējama.] + +Cits nosaukums daļējai atrisināmībai ir atpazīstamība (angl. +recognizability/recognizable). + +=== Piemērs (daļēji neatrisināma) + +Problēma $A$, kurai neviena no $A$, $overline(A)$ nav daļēji atrisināma? + +- $"EQUIV"(M_1, M_2) = 1$, ja $forall x: M_1(x) = M_2(x)$. +- $overline("EQUIV")(M_1, M_2) = 1$, ja $exists x: M_1(x) != M_2(x)$. + + += Nekustīgo punktu teorija + +== Nekustīgā punkta teorēma + +Lai $phi_x$ ir daļēji definēta funkcija, ko aprēķina Tjūringa mašīna ar +programmu $x$. Lai $F: Sigma^* -> Sigma^*$ ir jebkurš visur definēts +aprēķināms pārveidojums uz programmām. + +Tad: $"eksistē"(x): phi_{F(x)} = phi_x$ + +- $phi_x$: funkcija, ko aprēķina programma $x$. +- $F$: jebkura visur definēta aprēķināma funkcija virknēm (programmām). +- $Sigma^*$: visu galīgo virkņu kopa pār alfabētu $Sigma$. + +== NPT pielietošanas piemērs + +"Pierādīt, ka eksistē programma, kas pieņem tikai savu aprakstu." + +Definējam skaitļojamu $F(x)$ ar ievadi -- aprakstu $x$, kas +pārveido to uz programmu, kas darbojas sekojoši: + ++ Iegūst mašīnas ievadi $y$; ++ Programmai ir pieejams programmas apraksts $x$; ++ Iet cauri simboliem no $x$ un $y$ līdz nonāk līdz tukšumam: + + Ja simboli sakrīt un simboli nav tukšumi, iet tālāk. + + Ja abi simboli ir tukšumi, akceptē. + + Ja simboli nesakrīt, apstājas un neakceptē. + +$F(x)$ ir vienmēr izskaitļojama, jo ja mums ir pieejama $x$ programmas +apraksts, ir iespējams uzbūvēt programmu, kas salīdzina ar brīvi izvēlamu +ievadi $y$. + +Pēc nekustīgā punkta teorēmas eksistē $x$, ka + +$ +phi_(F(x)) = phi_x. +$ + ++ Tātad eksistē tāds $x$, ka $x$ ir funkcionāli ekvivalenta $F(x)$. ++ Tā kā funkcijas $F(x)$ rezultāts ir iepriekš aprakstītā programma, $x$ sakrīt + ar uzdevumā prasīto uzvedību. + +QED. + += Sarežģītības teorija + +== Lielais $O$ un mazais $o$ + +Notācija, kas tiek izmantota, lai raksturotu *funkciju* sarežģītību +asimptotiski. + +=== Lielais-O (formālā definīcija) + +$f(n) in O(g(n))$, ja: + +$exists C > 0, exists n_0 > 0:$ $(forall n >= n_0: f(n) <= c * g(n))$ + +Tas nozīmē, ka funkcija $f(n)$ asimptotiski nepārsniedz konstanti $c$ reizinātu +$g(n)$. + +/* +=== Piemērs + +$f(n) = 17n^2 + 23n + 4$ +$g(n) = n^2$ + +Tad $f(n) in O(n^2)$, jo: + +$17n^2 + 23n + 4 \leq 17n^2 + 23n^2 + 4n^2 = 44n^2$ +tātad $C = 44$. +*/ + +=== Mazais-o (formālā definīcija) + +$f(n) in o(g(n))$, ja: + +$ +lim_(i -> infinity) f(n) / g(n) = 0 +$ + +Tas nozīmē, ka funkcija $f(n)$ kļūst nenozīmīga attiecībā pret $g(n)$, $n$ +tiecoties uz bezgalību. + +/* +=== Piemērs + +$log(n) \in o(n)$ +jo jebkuram $epsilon > 0$ pietiekami lieliem $n$: +$log(n) <= epsilon * n$. +*/ + +=== $f(n) in O(g(n))$ pamatojuma triks + +Ja ir pierādījums, ka $f(n) in o(g(n))$, tad automātiski var secināt, ka $f(n) +in O(g(n))$. *Tikai pozitīvajā gadījumā!* Jo mazais $o$ ir stingrāka prasība +par lielo $O$. + +=== Pamatojuma soļi + +- Ja funkcija pielīdzināta lielajam $O$: + + Salīdzina funkcijas augstāko pakāpi ar doto $O$ pakāpi. + + Ja funkcijas pakāpe ir lielāka, tad vienādojums būs patiess, jo funkcija aug + straujāk. + + Korektam risinājumam jāpamato kāpēc definīcijas nevienādība ir patiesa + visiem $n >= n_0$ un iespējams jāparāda piemēra $c$. +- Ja funkcija pielīdzināta mazajam $o$: + + Jāievieto dotais robežā $lim_(x->oo)f(x)/g(x)$; + + Rezultāts ir 0, patiess, citādi -- nepatiess. + +=== Piemērs (lielais-O) + +$ 2n^4 + 6n^2 + 17 =^? O(n^4) $ + +Izteiksme ir patiesa, tā kā kreisās puses izteiksmes augstākā pakāpe jeb kārta +ir $4$ un iekš $O$ tā arī ir $4$. + +=== Piemērs (lielais-O) +$ 2n^4 + 6n^2 + 17 =^? O(n^3) $ + +Izteiksme ir aplama, jo kreisajā pusē augstākā pakāpe ir $4$, kamēr labajā ir +norādīta $3$, un $4$ pakāpes izteiksmi nevar izpildīt $O(n^3)$. + +=== Piemērs (lielais-O) +$ n^3 + 17n + 4 in^? O(n^3) $ + +Jā, $n^3 + 17n + 4 <= n^3 + 17n^3 + 4n^3 = 22n^3$. + +=== Piemērs (lielais-O) +$ n^4 + 17n + 4 in^? O(n^3) $ + +Nē $n^4 + 17n + 4 > n^4 = n dot n^3$ + +=== Piemērs (mazais-O) +$ n log^4 n =^? o(n^1.5) $ + +Ir zināms, ka mazajā $O$ notācijai, ja $lim_(x->oo)f(x)/g(x)$, kur $f(x)$ ir +funkcija un $g(x)$ ir $o$, tad vienādība izpildās. +Ievietojot vērtības $ lim_(n->oo) (n log^4 n)/n^1.5=0 $ +Tātad vienādojums ir +patiess. + +=== Piemērs (mazais-O) +$ 2^n n^2 =^? o(n^3) $ + +Pēc tās pašas aprakstītās īpašības, kā @small-o-example-3, sanāktu +$ lim_(n->oo) (2^n n^2)/3^n $ +un tā kā $3^n$ aug ātrāk kā $2^n$, šī robeža būs $0$ un sākotnējais +vienādojums būs patiess. + + +== Sarežģītības klases + +#let time = $"TIME"$ + +=== Laiks (TIME) $time(f(n))$ -- problēmas $L$, kurām eksistē Tjūringa mašīna $M$, kas pareizi risina $L$ un izmanto $O(f(n))$ soļus. -#info( - title: "Vispārīgāk", -)[Ja $a0$.] +==== #TM darbības laiks -$ lim n/2^n=lim (n)'/(2^n)'=lim 1/(2^n ln 2) $ ++ Identificēt galvenās operācijas vai soļus, ko Tjūringa mašīna veic katrai + ievadei. + + Tas varētu ietvert simbolu lasīšanu no lentes, simbolu rakstīšanu lentē, + lentes galviņas pārvietošanu, aprēķinu veikšanu vai lēmumu pieņemšanu, + pamatojoties uz pašreizējo stāvokli un ievades simbolu. ++ Noteikt sliktākā gadījuma scenāriju. + + Analizēt ievadi vai ievades secību, kas prasītu maksimālo soļu skaitu, + lai Tjūringa mašīna pabeigtu savu aprēķinu. + + Apsvērt ievades, kas maksimizē iterāciju skaitu vai liek mašīnai izpētīt + visas iespējamās aprēķinu zaru versijas. ++ Izteikt darbības laiku atkarībā no ievades izmēra. + + Definēt funkciju, kas attēlo Tjūringa mašīnas veikto soļu vai pāreju + skaitu kā funkciju no ievad izmēra. + + Piemēram, ja ievades izmērs ir $n$, darbības laika funkciju varētu apzīmēt + kā $f(n)$. ++ Vienkāršot darbības laika funkciju un izsakot to, izmantojot lielā $O$ + notāciju. + + Lielā $O$ notācija nodrošina augšējo robežu darbības laika funkcijas + pieauguma ātrumam, palielinoties ievaddatu izmēram. + + Noņemt konstantes faktorus un zemākas kārtas locekļus no darbības laika + funkcijas, lai koncentrētos uz dominējošo locekli, kas atspoguļo pieauguma + ātrumu. ++ Izteikt vienkāršoto darbības laika funkciju, izmantojot atbilstošo lielā $O$ + notāciju, piemēram, $O(n)$, $O(n log n)$, $O(n^2)$, $O(2^n)$ utt. -Augot $n$, $2^n->oo$, tātad $1/n^2->0$. +==== Programmas darbības laiks -$ n^2/2^n=(n/2^(n slash 2))^2 $ -Mēs zinām, ka $n/2^(n slash 2)->0$. +Īstām programmām rindiņas var izpildīties atšķirīgā laikā -- tas ir atkarīgs +apakšprogrammu izsaukumi, procesora operācijām. Taču šajā tas tiek abstrahēts un +katra koda rindiņa tiek uzskatīta par vienu soli. -$ lim (log n)/n = lim (log n)'/(n)' = lim (1 slash n)/1 = lim 1/n $ +Lai atrastu koda izpildes laiku: ++ Novērtē katras rindiņas "globālo laiku" -- cik tā izpildās ņemot vērā visus + ciklus, izmantojot summu funkcijas. ++ Novērtē kādos gadījumos tā izpildās, ja vispār izpildās. ++ Izvērtē to kāds gadījums (ievade) būtu vissliktākā un aprēķina tam funkciju + no $n$ (skat. @time_analysis_expressions). ++ Novērtē šīs funkcijas klasi izmantojot lielā-O notāciju. -$ lim (log^17 n)/n = lim (m^17)/c^m = lim (m/c^(m slash 17))^17 -> 0 $ +===== Piemērs ($|a| = |b|"?"$) +Vai ieejas virknē ir vienāds skaits $a$ un $b$? -- $time(n)$ -- `2x` lielākā laikā var atrisināt problēmu `2x` lielākam $n$. -- $time(n^2)$ -- `4x` lielākā laikā var atrisināt problēmu `2x` lielākam $n$. -- $time(n^3)$ -- `8x` lielākā laikā var atrisināt problēmu `2x` lielākam $n$. ++ Virzās no kreisās puses uz labo, aizstājot vienu $a$ un vienu $b$ ar $x$; ++ Ja neatrod nedz $a$, nedz $b$, akceptē; ++ Ja neatrod vienu no $a$ vai $b$, noraida; ++ Ja atrod gan $a$, gan $b$, virzās atpakaļ uz pirmo simbolu un atkārto. + +Kopējais soļu skaits: +- Ne vairāk kā $(n/2+1) 2n = n^2 + 2n$ soļi. +- Ja $n$ nav ļoti mazs, $n^2$ būs vairāk nekā $2n$ un soļu skaits $O(n^2)$. + +=== Telpa/Vieta (SPACE) + +==== SPACE Definīcija (Precīzs modelis) + +- Ieejas lente - $x_1 ,..., x_n$, var tikai lasīt. +- Darba lente – sākumā tukša, var arī rakstīt. +- $S(x_1, ..., x_N)$ – šūnu skaits, kas tiek apmeklētas uz darba lentes. +- $S(N) = max S(x_1, ..., x_N)$. + +$ +"SPACE"(f(N)) = \ += {L | L "var atrisināt ar Tjūringa" \ + "mašīnu, kurai" S(N) <= C f(N)}. \ +$ + +==== NSPACE Definīcija + +$ +"NSPACE"(f(N)) = \ += {L | L "ir determinēta" M, "visiem" x, L(x)=M(x), \ + "un" M "izmanto " <= c f(N) "šūnas uz darba lentes"}. \ +$ + +#teo( + title: "Savča teorēma", + [$"NSPACE"(f(N)) subset.eq "SPACE" (f^2(N))$] +) + +==== LOGSPACE Definīcija + +$ +"LOGSPACE" = "SPACE" (log N). +$ + +$ +"LOGSPACE" subset.eq U_c "TIME"(c^(log N)) = \ +U_c "TIME" (N^c) = P +$ + + +=== Laika-Telpas sakarības + +#teo[ + Ja $f(n) >= log N$, tad + $ + "TIME"(f(N)) subset.eq "SPACE"(f(N)) subset.eq \ + subset.eq U_c "TIME" (c^(f(N))) + $ +] + +Laiks $O(f(N)) ->$ atmiņa $O(f(N))$. + +=== Asimptotiskas augšanas hierarhija + +Sekojošas funkcijas pieaugums pie $x -> infinity$: + +$log(x) << x << x \cdot log(x) << x^k << a^x << x! << x^x$ + +- $x$: mainīgais (parasti $n$). +- $k$: jebkurš vesles pozitīvs skaitlis ($k in NN$). +- $a$: reāla konstante lielāka par $1$ ($a > 1$). + +Šo hierarhiju var izmantot intuīcijai par to vai funkcija pieder klasei +sarežģītības klasei, bet kā pamatojums tas nederētu. + +_$x^epsilon$ ir izņemts laukā, lai nejauktu galvu_ + +_Source; Mathematics for Computer Science, 2018, Eric Lehman, Google Inc._ + += Klase P (TODO) + +. + += Klase NP + +== NP problēmas + +NP (nederminēti-polinomiālas) problēmas +ir problēmas (2 ekvivalentas definīcijas): + ++ $L in NP$, ja eksistē pārbaudes algoritms - $O(n^c)$ laika Tjūringa mašīna $M$: + + Ja $L(x) = 1$, tad eksistē y: $M(x, y) = 1$. + + Ja $L(x) = 0$, tad visiem y: $M(x, y) = 0$. ++ NP = problēmas $L$, ko var atrisināt ar nedeterminētu mašīnu $O(n^c)$ laikā. + +Ekvivalence ir pierādīta ar abpusēju pārveidojumu no pārbaudītāja uz nedet. TM +un atpakaļ. + +== NP-pilnas probēmas un to redukcijas + +=== Polinomiāla redukcija $(<=_("poly"))$ + +- $A <= B$ – A var atrisināt, noreducējot to uz B. +- $A <=_("poly") B$, ja ir $O(n^c)$ laika algoritms (Tjūringa mašīna) $P$: + - $M$ pārveido $A$ ieejas datus par $B$ ieejas datiem; + - $A(x) = B(M(x))$. + +=== NP-pilnīgums + +- A – NP-pilna, ja: + - $A in "NP"$; + - Ja $B in NP$, tad $B <=_("poly") A$. + +=== 3-SAT problēma + +Vai formulai 3-CNF formā var piemeklēt katra mainīgā vērtības tā, lai formula +būtu 1 (patiess). + +=== CIRCUIT-SAT problēma + +Dota funkcija $F(x_1, ..., x_n)$, kas sastāv no vārtiem (AND, OR, NOT). + +#figure( + image("assets/img/circuit_sat.png", width: 50%), + caption: "CIRCUIT-SAT visual", +) + +Vai var atrast mainīgo vērtības tā lai gala izvade būtu 1 (patiess). + +=== CLIQUE problēma + +$exists C subset.eq V: (|C| = k) and (forall (u, v in C): (u, v) in E)$ + +Vārdiski. Vai eksistē virsotņu kopa $S$ lielumā $k$, kurā katra virsotne ir +savienota ar katru otro no kopas $S$. + +=== IND-SET problēma + +$exists S subset.eq V: (|S| = k) and (forall (u, v in S): (u, v) in.not E)$ + +Vārdiski. Vai grafā $G=(V, E)$ eksistē virsotņu kopa $S$ lielumā $k$, kurā +katra no virsotnēm nav savienota ar nevienu citu virsotni no šīs +kopas. + +=== LIN-INEQ problēma + +Vai dotā lineāru nevienādību sistēma ar bināriem mainīgajiem ir atrisināma. + +=== CIRCUIT-SAT ≤ₚ 3-SAT + +- Katram starprezultātam (kas nav pirmajā ievadē, i.e., $x_1$, $x_2$, $dots$, + $x_n$) ievieš jaunus mainīgos $y_i$. +- Katriem vārtiem formulē atbilstošas izteiksmes. + +Piemērs AND vārtiem. Nosaucam ievades kā x, y un izvadi kā z: $z = x and y$ + +#table( + columns: 4, + [*$x$*],[*$y$*],[*$z$*],[*$z = x and z$?*], + [$0$],[$0$],[$0$],[jā], + [$0$],[$0$],[$1$],[nē], + [$0$],[$1$],[$0$],[jā], + [$0$],[$1$],[$1$],[nē], + [$1$],[$0$],[$0$],[jā], + [$1$],[$0$],[$1$],[nē], + [$1$],[$1$],[$0$],[nē], + [$1$],[$1$],[$1$],[jā], +) + +Izveidojam pretrunas katrai rindai. Tas ir, konjunkciju katrai rindai ar "nē". + +Piemēram, 2\. rindai (0, 0, 1): $x or y or not z$. + +Tad uzbūvējam konjunkciju vārtiem: + +$ +(x or y or not z) and (x or not y or not z) and \ + and (not x or y or not z) and (not x or not y or z) +$ + +Veido konjunkciju no visiem vārtiem shēmā. Tā kā 3-SAT sagaida 3 mainīgos katrā +iekavā. Tiem, kas satur 1 vai 2 (identitātes vārti un not vārti attiecīgi), +pārveido tos par 3-CNF konjunkciju pievienojot jaunu mainīgo, kas vienā +formulā ir pozitīvs un otrā -- negācija. + +$ +(x or not b) = (x or not b or a) and (x or not b or not a) +$ + +Analoģiski iekavām ar vienu elementu. Rezultātā ir 3-CNF formula, ko var +izmantot ar 3-SAT algoritmu. + +=== 3-SAT ≤ₚ IND-SET + +Katrai iekavai no formulas veido $3$ virsotnes (grafa komponenti), kas apzīmē +mainīgo (ar NOT, ja ir negācija). Katra virsotne (literālis) no komponentes ir +savā starpā savienota ar pārējām. Starp pretrunīgiem literāliem starp +komponentēm pievieno šķautni. + +Piemērs formulai $(x or y or not z) and (not x or y or z)$: + +#figure( + image("assets/img/3_sat_indset.png", width: 50%), + caption: "3-SAT -> INDSET visual", +) + +Tagad varam pielietot $"IND-SET"\(G, m\)$ ar izveidoto grafu un $m$ kā iekavu +skaitu originālajā formulā. + +=== IND-SET ≤ₚ CLIQUE + +- Veido grafa papildinājumu (komplementu) $G' = (V, E')$: + +$E' := {(u, v) in V times V | (u, v) in.not E}$ + +Vārdiski. Jauns grafs $G$, kurā ir visas virsotnes no $V$, bet +visas šķautnes, kas ir $G$ nav $G'$ un pretēji -- visas šķautnes +kā nav $G$ ir $G'$. + +#figure( + image("assets/img/graph_complement.png", width: 50%), + caption: "Papildgrafa piemērs", +) + +Ir spēkā sakarība $"INDSET"(G, k) = "CLIQUE"(G, k)$. = Extras + == Logaritmu īpašības #context [ @@ -627,3 +966,48 @@ $ lim (log^17 n)/n = lim (m^17)/c^m = lim (m/c^(m slash 17))^17 -> 0 $ $, )) ] + +== Atvasinājumu tabula + +#context [ + #set text(size: 11pt) + #show math.equation: set text(weight: 400, size: 11pt) + + #table( + columns: 3, + inset: (top: .8em, bottom: .9em), // vert. padding + [*Funkcija*], [*Atvasinājums*], [*Piezīmes*], + + [$x^n$], [$n x^(n-1)$], [], + [$e^x$], [$e^x$], [], + [$a^x$], [$a^x ln(a)$], [$a > 0$], + [$ln(x)$], [$1 / x$], [], + [$1 / x$], [$-1 / x^2$], [], + [$1 / x^n$], [$-n / x^(n+1)$], [], + [$sqrt(x)$], [$1 / (2 sqrt(x))$], [], + [$1 / sqrt(x)$], [$-1 / (2 x^(3/2))$], [], + ) + + \* Ja $x = g(x)$ (kompleksa funkcija), tad pie atvasinājuma + piereizina $g(x)'$. +] + +== Noderīgas izteiksmes laika analīzē + +$ +sum_(i=1)^(n) i = (n(n+1))/(2) \ + +sum_(i=1)^(n) i^2 = (n(n+1)(2n+1))/(6)\ + +sum_(i=1)^(n) i^3 = ( (n(n+1))/(2))^2 \ + +// Geometric series (ratio r \neq 1) +r > 1: sum_(i=0)^(n) a*r^i = a * (r^(n+1)-1)/(r-1) quad \ +r < 1: sum_(i=0)^(infinity) a*r^i = (a)/(1-r) \ + +// Logarithmic sum +sum_(i=1)^(n) log i = log(n!) approx n log n - n + O(log n) \ + +// Exponential sum (appears in brute-force algorithms) +sum_(i=0)^(n) 2^i = 2^(n+1) - 1 \ +$