From a5b5c5732deaae3143e23bf6c3a3dcecbdd32449 Mon Sep 17 00:00:00 2001 From: jorenchik Date: Sat, 14 Jun 2025 14:43:06 +0300 Subject: [PATCH 1/6] many additions; some critical corrections --- assets/img/3_sat_indset.png | Bin 0 -> 27162 bytes assets/img/circuit_sat.png | Bin 0 -> 26746 bytes assets/img/graph_complement.png | Bin 0 -> 23210 bytes main.typ | 459 ++++++++++++++++++++++++++------ 4 files changed, 371 insertions(+), 88 deletions(-) create mode 100644 assets/img/3_sat_indset.png create mode 100644 assets/img/circuit_sat.png create mode 100644 assets/img/graph_complement.png diff --git a/assets/img/3_sat_indset.png b/assets/img/3_sat_indset.png new file mode 100644 index 0000000000000000000000000000000000000000..0e6023cc6f73ba2f8dd6db6688e2cbeb90792794 GIT binary patch literal 27162 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 literal 0 HcmV?d00001 diff --git a/assets/img/circuit_sat.png b/assets/img/circuit_sat.png new file mode 100644 index 0000000000000000000000000000000000000000..6d2c095c44981ce92c37000da0ac85918a285592 GIT binary patch literal 26746 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 literal 0 HcmV?d00001 diff --git a/assets/img/graph_complement.png b/assets/img/graph_complement.png new file mode 100644 index 0000000000000000000000000000000000000000..18e74218bf43d1a2092a34aa9035fc7f35a83347 GIT binary patch literal 23210 zcmeGEWmJ}3^gfE-pooBgpa>#e64D?YB1%Yihk!JQbR&%jh?Ib|grw4qih^`^Nq2Ye z$@|-Tf7oM>J^p8(FXzKy==k?b{hjhe*CY$_^(74;j+XJ`I4TVK5gwHm>d&B5Y)&nCxsaB246S(Tkm-a?{JOu zj*L{9b|o7%y}vKwRVzuu;b4du++5;CJ^$O)CE{_k)&Eu5)6>()$Y_KG9dURoi3qvx zE%l^6@smpt?r@?+Qn?*S-ew73p6#YR4HCX|Q&k<9ZH~Yt6Rb4tBCFDo6UPsk+aJ6oND;??L+Xpckc!Zbx)5MQyzR5 zMa&rC-jheCr<;>?+WYet=ck&FZXgaml8C3<@qAp;=g-mW{rxHdVn1z!kW>P3)FsUd zn~7-buPTi9LPwZyAf>+Wyi6=CYL7pE{=DUbD%u7wcz%@5l#-Hab$b1pt>zEnQ+^vG zRsKaBOTpK#ishyq34d(ZkyPe!f6Nm_Ev=IY=PA$q0rgha#>Pg8FycQpQt+lYsu?3c z|4CEWgEBo8`n#RMX49_)`ES;5oluoON)(ISHDR+f4)BqGSH9ZKfg;#f6{ zf8X3kd?u&uNtQ;6P1>^Lk`m(MTmG9z9a^6()N9u!CMH%rUOc*&otbH3VuBYbLpKH& z{`5nSAQzdeb9bH{yot!dFl0MYM7(EyhhSTMNJ(ih>q*!5It~cN#KgRTO&tBwHv{)UVxk*WG5<)@to$pAX1NWM*dSdu*fC(4zRL!MII#7do(R-c%^BupU#>)NHw$ zM?RRx`zc-IysuM>nPa3mIXH$3&=Ia6N#uNWys9Mkd~5pYJth>SfC69ia%X2p#oFH9 z{{MVIg>wo|@$_JQgy}j`>Ic*RLQ;~~Vd+Eh`uciUq5_K6ZMc2k`dCGC1UYL|OSFFH zCw9LHH$;@lMFpG7adogD>Y@DLv6`%`td`d3{_0RhMuw{Ezu8$%`vn>5docDtKUXTd zeI{z0C7wN7{+8kA*BH-f3KO@lhmR29@P~_D`uh5^=vMm+B4&0l`V&KI>-Dv@@fzpN z;NW0(qo&uqB;`z~NI}}{O#~r=SVxc>R4DMr;OhutK!J}SJ`m^sFJCmkAa$W*Vq#)u zUWe845S|(u8k(A#`uX$idOGsMqVM^$JussWMt%@KY#Y;QShW_KBD82?QKqZHwI!iJ;FuaB>GgUI6dApRhosa~kV=e+TmG8YvYq{Nr$ z87$DYw6Jg(i))*=87Y3&u#bpxz7402vWE}-`0*o)f9Wg!$~8^gsKgG`euo|)6vk#iTj15 zYCfSUeS;bBa;Q+(%gZZIt>ENjwdl^BI}nXbaczk%8tt|y-Hep@S|yyOolwM#MoZ0Y z>-N_zb#)VoFa*iEdU_P~pP|CjNSY;mjEaKPhvb@vFP>=d_HOw|tEQ&b zT5)!M{)|dd8E0d0F(~i4j~Yf~_o%U{seBSYH$A;14gN&Er~5>;V_{+8%7b9>^sTMe zWD(h8+W}(J!FberiVO&sK(PN{Ms2Of_RJq)Vd0jRmaFA|{m&;QML$VfF7dJKVu@sC z?|sf!OSJ+BmnmE=${16qT~YWn2*>?kZ3H3#YUc?g$&Uj=LqiCsp|o8IirX>?TrF*F zc^H3S2mulUTD8~EaXfZf9zJ{aEXDI+1j5N*ERD{6qRyR%jZL9SPLA17$XxAun1;rw zBU!}a+?>PeAoIhA*;#SeNXP9$e64Slm6gJtC-2EcF0N|1_vJ;tW(imOHL9Kc{d0Jw zYMkE-WvzfA=jl43t6*|`{7A^1hab?90wSukXVuP|dg9{Z5bvm{s2dYC6)*o_YHMp- z<8oN^=QIZ4YHMh4jr!5t#njc&=}Zxs`W?@Pq{cs`DP==LLxYvNb@OIUZf>>f?!rPx zqL7e~qp+5S#&Dhc;d3a*)2~-*f87od_Yl5>N-ZlTwG3Hz2NT`r9^xEVL8PjxYB`v% zS@k9}BBCqB`{KCw1?%$sw~dVr$SdtPZ+5a|6EDtoyP!7UO9lV^^^1y)jZIL{W2OJA z^=N5NTNOM>aLEVz zFFw6>lcHe3o>4nE@KlLuUe7bI;3E2Ut4YtW1~yz&p| z3w3KWTvRFrlM4k84N#F!$hcj_Z2-N*XIrnS3&D!10 z^V7p@xun)NWVi7oB*nkv7@bffW)rtD@~b>gonSp0F7}HcM2wA%AL-Q&|N7;-o(|R4 zR8EcZx1m5h-10WYBbS}I7QhqNu3hWs=ulQtg37SCw$|>XXwmLT&z0<=W;KL@GzChs zN7$H`cscTihc)II zd7x+lTKU9h|H{7W8r8=kg(lS8mRB`62-{a`IKf!Ur%qcJ)Tp*c|%86Hz_*0)OGijv$Jz~Xzz`#z+g$WRwq)#z$*BC|99mY~R{H8NR&E_i$a)Vm-~o>f z3H%B=ZXD%sEutwoup+#gA6kdKe}5yXVe4+|?9?kZZdn^CS=ISXgrpunZB~rZsd2LI zPJM!hhX-Y%30?sTu2%^Oz?iN-P}%Q{)9%NBi-*P@mFHw`xorSjU^!D@fV%_Tq(F3Zqa+qQWp3{?)tgI}(S{J*ide5xN)-X+h z{M;J`zHG5u?=>Dxelu(YSVclg`n?q!`9vX(iWe!CHe6vl<%@;|o1In@BTt}Ol&lUO z2FY;YHROG(i#+M2uMJ^Gg~D+1&ky$=i%zgAc5v{=z(^Ac zM~#-NrB``Q{6bPn>U&8^$z@_miM=_)Y2Wr#mHk5qDOe)iY6qzoFB%zn5QCZbcQFK< z))X#_v$9@YUYs}aIVKgCl$dsYzE4C%A1R4{=MIncX#X#@Dinkbp?)Uj;NVc8?zAy( z{#kiQNl&ld<9J6diC?$QZGWyM3gXNnGH)CpjSu?`MF8&r;wsqd!J z#7I|IjTAd9E7{xc4t{G5dlG;8AqRWx8RGN({w(8@x*;>TyfsjVb>O3J~0Fe0k`i}qiGwHG0F+4oXe|WX? zsHmu<2zx>ii%LkSwisZXLqSBZ-6F%t)uYA<;smTk_3r(9mAV?sp~B}8uP@GAMMN6@ z{{1U*c~%0o_`IODwiYrU_{rsfx_(D{yGos&g2L8x5IM|!Rch+L(K1U|H?x4eaUzwU zD6M0SS1I6t`IM2FSyh(w1oj&S{r0Y|#ch{X!fU9g#KOOLraT&_UlXsB&g>q?#>PIB z`<#=Xe+E#++S(e%5Kbm!(Y;y7{lZf{lH|{S2^Cm3y95;wHnY|PSlt+G*qeb6qzJlx z42Gw$hh+Nq?;pSO<;Cfy$l2D@fEyX4N6?xy`_43O$0a8M0I0j$;uHo_T$J@C%<0R?82EJRg6+9#V z^SzPZV0$rX92q%|QP=yrzfoy7tFpd$8t!$n{P3$v?wD(USlUW|Ds|15kc%gf6-;$;>~oR_+%fn4%$ z;vfbIw;W?qg+l^X^r#)3oSbrB1VLQ{Mw>S&EhS|xO?F%H`SU=HM>ef^2qN<#%|=Xh zAMN<$bu{;05^pw38VTifjJF~2j(Rb>GLgO3@&PyVxiej~Nk3{&uz z6RD`CYJi>mrf?zSqmR)c^Gfb-W1_mV60J`u5)V9BBGy+@%h)Apbf8FZ@0&Y0m0!Wa z#IN2TE@vY|7=d9tdUQ(>*GyLJId^=R?Ts5z`pU)A)7!GR@+K+^gH><&3%NU~xH@1};?VU{z51YkVd!zAF5Awb8n)~-!ZwPf?YWM=3upYEj)sKQX zw`jteaB+9f7|M~Vyhl@HTys;ICZ>(5FyDjKJj0Fbb#UL{_}6URY%d&?jaLU{P9t%i z%K;_3o6*y`ID4X(>KH4^DbK~l+duP_yba4#TFz0-h!&CrxbJ?l_Z0*LAjM{8OEFC9 z4ospn_~%oX=P5R)sNWeD zS&wp2jY3FAGblT(3eUXe1(=?zZSaKf4SP#oux*94h3)DdCenzlfzP&)5mIk!@H!WKoHbjJH?S`S_i zk=d3%NI$MGa^G{rV~=z2CZLIVk+-K${^^$Ib1@s6LW`9?s44-0ffkiUDk{;r1;SH3 z0B3;0wavfb))89-I1L!X{cuAU!0HRuIsi`8%njF$wExIf7cPsCbLsBQ?&cnFT-sq< z9SfqwH4Hnig@)_uIjr?|QBo8LYEKQkW$2lGBM1dvmDFjuH#1>VLsb=KC3BRAmiF2C z1aKQ4A4E7s-;^g>l;YoOUh3!XUCxfaTg2t(=R>_39v$5nDUq<9N|s^}F5)#BCO8y* z_9$wYgjl{IB5O+GkY6BW{mqXr%e#zEg7m0qIXO!dGoF8~&*x^hDAKF@`0*o9HBN^m zh5b1SDni0IpxipOF6?x4O?`dJ`_(}~%|Mo7A8B%!_kLke&NAD{Cpo(|0W;-H~-#Ln>an69lKO6 zzg(&C_@J!rw2GpfRUt8Oc6OHVkp<}4&}(Ph|9-G>$AEN!E)XGnl4Cnn-xkZP4G8E? zO6X$(L8jsdVkC_$9oW)*1AlVMQ)03j#*jdRoPGR+#800-RZP0IO-*@29_#7pS;bx3 zYX5yyCP1E|T%H$n$vA_tGRBcXb@)3R&Z=`;vS2kt;EdzT@#9L~Ka2XjHkJ&ID zUq3$}aHjih7zGu+T|Ck4w#=6@qFDJHX_6FFI6=DrL3OL%%)?#|ggrDg)TkzX zL0awEa>|Fwjrfx%4WIoV=Q=%+ed^pCzkMACHIM(2bN1zme)l!yWnLvh5|VrpdonhI zAHA6`2${9~*%wFezHB|it&*WhV;ajW^^&8qR29hJ7;3DY9Fb{u+aq1=spzb@_i*!! zW1Z)m5S^~6v=CpVy`#hXWH}p%miOU=Gi&|P3?Q!I!kaScgsV=u2UWj}CvcSLe>U=@ zqSFy$NJErLN=p})m*e2zgolT}sv%)h^cx@(S73gdTF|VD=EjIFlOQF5iU*L36tvco zF5yIe$Cck9ci0zhH7%M<&zNlFTcxzhx94=b-ISn;OJ=Rj*sT6>H{OlrHeS$`sMZN} z)@HmCkA#He!GkuZXC27UXa0hRk*2fSzQQs#ZTVc86n`p~gGwjPU)$7LNZ<0w5~X1S z^=)Q$7Bmxd9Fn6E)0E}%RPEKD1Rt9n@C^o@Q@a*5Dhw3lta5};(8~>Z=*Nqd&*4-H zJrTK$(e)`l{`_b*q5*(R1TeUnP}Wz*#@}@DK4B6@PB;{)M_Y%85fe0Ii7TZ|*V})5 zJjK!|xRpvC>^~Za{UA0v+Stu#LsWD$m)F@5 zaM&y4xH=TE{^mVXAt^App>3-nL#>ygO21f{Srs2JE#Ox~`00zFdpmQwKd689wvwxW z>eNN=S4OVK{Eb16-KTZ;c6rAy2=C!3>Z4zVUaNnZ?Phi?v%PH6fp+5t=u!Is1;}_` z|4V-s8q1>Fx;Xpr#*O}=pO19AIxz#Fj z?2GowUlvuv!GFY<{KGSz!_0eLo*%;grvpNb56ZRPzOqV!>!RpyAM5elD7auZt4_>G zBS?o#m~!xB^6Jht(6*(*e}g8pE^t5Zxmj7a-IuR`m7#zEK>&E{^-0i`V{D#?j6Zys zPW`V@s1lB`e!cPmZ(cRMzRnEAHz%Hw!?GQhj=DpNY!<;zk%fiUuU=Y@zJB``GOEd2 zqRLt75PY4P{_Z;R)XG8j}(EP=I!zkA2Xz%cUN zs2QGp7+MvgwrsJfWgrpgRK1}Ey0!K1=Zn}!?E8zKQBnzhs`_q(lL|aGX}!zJTC}vZ z1b->k4X=;UqfNt#H%ziX?)c_ip8y_1OH0cqAmF?@XbozmRa}Pcp~#n7-76mcJV4S6 z-_&#wlJsIx_ON5g^ z$KVC54q)zPxWs56tbLp7k&pQknxzq@qS}w2J}oUQfTmKxtX=+1SMH8W5yfG}fA}4f zCylsOUgVq$WYw*$EznLz$9T9jv9FZayz5UD!}+EfyhZ5gmq5&b>Wp;riu`&Z zhA9on-^DQydmUqNi?!kG&C8eR+1aL&l7B&L8)lKiKOa1;1;wJ3SM}WN(rFpH+zL)&c## z2!u7L!XP=qLOM%JV~!D^__Tm7!U~}zCnK|WaDan>q1oUiG&YZ1tuB`Ulz0%aPl4Vo zf@Eek%~3Py~09`@}}c#AFFX7$zLj4iQ}q%JW}n8yezy{MZR(x1#!! z6<~@W#KVq)Xz}ULmLi}wC-K_B#LR+>2-@t`6Io;g1kv?a4x?nQ?ko)EY>fp}g9gxA-@@MbF%jPq*PFG`97}uf)W}dG4wAuEg%WRmxzdwK)=r|ZPhkw__K}rokP)~)w02lQ*U9SiN>IQnt z%8JF6Tze0LRHC5ucy|%_xtWns2_R4?CS1!JAH`ZVBqy1q{-tKGK%W+L>c>zdt|Zc{ zNVXWr1-T2T6e+ICc`%E+Vo{Lspj;7}Fm+rTj5{hS3JY3vn3(PD?Q84n0uY{g>a6JK zbGH$!+ZY9XK!`yF832VH(zv>^a_LR*icIx*xSPobO?M$e2?tnzSm7Oz|3J)lv|%&r zPQ?{IGJxXfCc=$yAx3bMFH%te5R-*Hi9v(eTT;};`B_0p^)Yt2;u~mp6;obUVh4y8 zIjp$BR~ZjVAw+doTU(zk3et^;i{%YKFL!sbt6{fO0AR)^A@_1MqbnkT!E+~=e)^Rd zkkNW+MtXW8F0*b(>bW;nE6)Jgc6WC}hE!Eo4~|}JO*cX~H&KZpO&LCe8@~du0Qp@B zUNSOPE^Ppcfta(<(D*k_Z@F?gQH*HdUjdblWFY}s+DrzM{{DVguN<%KBae&EeD*ez zwO{LH&CSiNtk$$`>p+83(Z+!uGs7Yp(g95-F=*%leUPL%IT*8@e{;P102D~rI5agi zF|Paai}2sPjtX**-OTUwbgBsp7uf1lB~~H68;>2fXP!YjV&Fi#!e(Io%T*uQ7Xvnu zpt7=k$m4{lsEmth6?%4D^Z&yOz(~qt^Z5jQ_vB`Pn7n)!bfB%}JwfXlcme=24w@fJ zET@N?>gzL$i`nb$I-W)XYn$Rp$!13_Sd-hc?8A1 zP-vr~-y(W_dEr?gSLbp3MpXbLSkPF*Ht_NAwm~3b8vFY7D?~uw%6m|A#C^@pr|Qq4 z_P&Dc0g3_yo~pWfkxtdl(e|vPT=Ds9-19t%bwZ%gAf-}MQPJRs1U{^TwgD8|n04SG zd#gk8jigg-~wzd>(6ja<>JKa{l|woynF__3dD!tQW}M*lxW?mks5EubsCqJ#?D zl*E^4q#=2yy6*0$pFfkNDGV=#@H?%2N=}v&udlC%u~iRZAvd6z)<=8$Ccr1+;UAVH zqzzh|H9(kw1%@ThLmj!21m9jmx6q`%D!V@&AgI1hJMzD1mD0NWP@=;!WX!Swt@gZ8 zAvZxDE)=8#11^FTg@#9xb6kt@iucAUCw@W2S37wD(<`7+R-sE*VK38?!9}D ztHVwl?t=Cs%SVb35yOY=s>bOiby8c}$5y@@8X5IP_o4WtLDa?Ne52s@1whzPsPNtXn6K zA(MJx&gk2>Z?)F3kWuIdS3?9zJb!L6=}B|@CiFfIH>ZkPPB5=XiNfQ%n129{a}_aj za_&NNvb8)eE{;yw;+m*3jGHv5aReHp1!c^u)c7HQ7+Lgcm!KJO%m9TX%ZI5zn5Nx=rj=6<|JO^@Bb6Kxs)&VI<#!n;mLYv@W!1+yilFL zo(I{eE<0{*V&ZsyvJdhHcij!djED;5{bHQHSG=%i^-0m^#KbWup-`ol*4A`DasKzy z4|*bC4$vq=32KBU$$hxtgMHLbB;u$<1JFAJ-KVX!m1|^paL@^G0Ptom2UR51f7*mC z7s~l0)CuU2S|63GgKh(S*xcEuP7G$YDzWMZN_U<5E;WMyU&+`S9=t)ZvBTr=76>>7`y^2 zrngV84EeQGx5` zsy;5Jc-#C&MG=*_^2O~Q9!}M{SFE&wP*b9D3o*lqL~d;Fw6O~C@iAO&(3kh(K?q9E9m z_&+G%8MKs@GpxE2xI-siBBD<#F$nhZOH22llAHoLiPjGc3W^}+emC(E-VDCpt>xgb z2ei(jE=PerIwBWXWnpQl%JEC+%)?NtbadXMmfnKvM*nl835_njf-O?N*f<1l1qJc^ z+04ThZPFGi3$=)oGiqH75ml~~MhZY=sII9QI*!$NBnL8ZYbzC1yi7S<2+)oU{DJ_A zn+ov$vjrCXFWJ%lXA13|oF*&nGFGxOdV708=<>Z9#eee!CJ&&U^kY!K^78YIE65PD zyRgOqU5mKT{u_yv&V;>TZSWcrCPw3f;zKa1QvK)(B7$;wLmdX*4u6B>WDNBe42SvN=cxIoy5*U^i$#fDKw%P1`^H=O)Au z%)Oyi0}v9*;;KhpRu&yNx?nd0PM9mWwY?qBXPUIEx_r5rLxp1nU|y`xI~n;LK@Yh*od;9bij}pXF@|P|^X4S?>$lLQzk*!<8GKeO9?Fe8zf5`}LPF6XwKs$<>r99l0GlwIF8kp6->ozxj z`SN9{>=9ycpFdpYed(u-uFSk725)CMIh=@Q%hsQ*ZEgFiga{XU@O9;nB>^m_3O$M| z#7}h(u&$$)W1;#ippi;siBo1Cq(n74%xs0^z=9-*B&$6H?L$cQ2GW5_l~%?SM!lN+ zdm31jyt4O0uyxTzanBFKvzfJSAl>7svpM^@l38Ey95O^=20WENWMmjgN(OfZ!T10w z^t(DEW`V#!BYA_AvU|%YX12acP>t;6+BRO<&jizd%x;4;l5H7+bd!LCj#?8i90t%y`VY1_%g;09$I2jQs%pu$7jzsM3r^PA(Ee0*rSNr2TGc? z+{KhmloNAyql~FlzuhIhNDYG4WVNFuNCYG}*_|k+X$odGHuc6WACHb)aB(B(?tC2ZhFm(CPypgf7ba8DVlJs{ERt7BBhQHg^Zr^B%Leb(87Yn6g z%9hYqJYd}u)ncFP6me2a+9Cs_D+E(&CH;yoRtTjt;L{5>(s?9T;z2JCi6bLRxx z>)4)RU=TCO$jxo-UPSeIg&Nr{W^9|fht_X{;_8(;m7IQ(V?%E-BPfY<`%>U*-K=1M zPWN@WE2~t&{S97=!dwn|zIQubCiQa(_xW(a*;lNntZdZ2i;9GTt1RM+&xWU@`nlw1 z*?V4As)jb54)VYfOH{8RL=cY&_stn}w;$G%I!->7!?RMqb|pD>w{Ka~QzWe2z*GNg zLz#;{$X0vHfWO!wD>)Rh6Hw);BEM;4AVkbtI#(Av}# z7!0nUVV3L2`|G3`#~HDwFZ?L`l#w)Pk(KUb|NEEI(Lr-s;_eq+UzvAaXbj2}l>&=67F+Zgv3kpfyXhSVv z)pW`#-yJDz0t-rhG`3*D4Ff7zX9`#Bi6sfOiLVm)nofo_#748*pO`4y%~1@fZew82 zyrbv37%>9Hw1AjD{6dN{GvCqSJiwHRGVwK8&ONopvtfkJHz3dd<461f67bW?yJj1e zD7^N8DYGLhOOp53BuQp&c(3Y!$oPM!rUY(IK_R-IDMH>0S<{$823 zB5LqU*}K2v$ub>Q{UPu?Zm{M1-(sd+z4AY7sd>Zicaiy*Iz^9 z?p{6yD=y~E` zV^eo|df#71Cf;(X7?*&QHlRNzJ8(goG47d;=CNLHleA{o$}=3h(FB40($)Sh${!Q$ z^@A*@#jJI&oi37!WoFed4Md->^D1p}CxGh`=ytFqOWY-BM4;O|R>B*ISXy{NQ$(@J z+TzJ*_xgcN9fVzUSZ*#OJTq67nDF)qkN2F8VqNb@_4;R=Mv3Zu2ksK(It|*qDvju! zfeFuStdG$}#;SxkwOgBsenXXsd_*;7$ThY}RbO$cW3Yt9tb>#aEH^K!yC-c^GED)L zf~MwXFxzR@xQ>Wh=X9X=bA}0KQR5OrjgQ9ut}(t9%RI66MgPE9SE2lvWRgdBN}8nB zN$XU-f7d6t-8DTf$xnX&^vvUu-~e@@XT!s;<;#(6m@d1IArUM7l}#5gxrux47b)=a zfNrMZ`EyrEL8Je1=I*KExeBX~m{)N8KN>N7dhRpeL*04#^3$d14O}v4 zwMdDBBBI!l-e)$|16@BbCxK9Qbu=IkCG^irh(@ro1B4#0_e>04>QQ$Xh+tHvKjLx} zN^Q1n7SFK}gJUk{E^V=^|Mwn^5yr9qJQ~`^!C0SAsh|AB{r_8w1`1JPWRtpT-E+{Lis}v$R`$Vz2VcrK2Hx6RI5=KjQ$X4rK^r2LYq~!e zCHK26FE>{YPUign{rlCnjzcIYhS6bz{I!oFUqmd@(vQ`xc|Kj|w{Z7A6u9Nx(D>SO z2<->4kq+(L+}vk=N9hqbT~K=R<@wc@Sx_ZGBSyp1(-QlxUQGroaADovry; z$|djLgIUMV)z#JfbaV^gu^t-ZF?y-8N?ST;zWK%?Id>GtH;~S}E9Y;WMs)91kB)eG zQKdtlyb1D%-GwH{TTXq#@=IrD=LR_W_&ko-@CfeR0}?3+Ub$m6F)`GXt~lv<^I%MA zvpK2+_IF+v!N1&k{aJIqpGM@ot@(uPSV%`>Q^v8*U=R=Qyi{!cvO2}(QCg340q5D4 zZ%x{LS;2zi26`hF= zKd;|^jIVO7Oh&HB^IzBf}-8ZZVG*q=W#A1BN4*hQR%ULNkNXamZqla&3TBp z_#BPfW3La2@nfPi@AsDk1~Y7vY?j2WmVcX zGsE2aH|+>}Z{sijBsL~yZyKU7bLQDq6xfAP&a0cB!kpkx$fjB0cUPMDGWA-w644gp z6VH`CFzW+vdi?FX3L`1EMRYOxGPI;&vdStd4&l7P-d=latA#=HFZ_2JVz#&$wv!oY zb!KbXG{*wsu(g0^tsup=iRNqa`Jm0ocC67iWp&k4hbO&aQ|$aCb9Sn4FBnk`;!&ut ze8r$%=PtirxpVJc)@NdQ#+VD}*+6%dIvpOs>tMt*OfF}u&5++cO3!^;lk7H}fK!&M z!c=(3ibcq3zZj%?EbhQ4!k$4jG}fz{M=d$myBn}C(}L5DdOvp-5T6eB{@0+OAPaN< z8~w-aqi|A1MVX7|(K@?lL3v?`B#jHWYk*O372RLyTe9+F9-1p}e@KAFP%kU;Wql*a zepXfaB~pqS_|6{`o;kkarpP3w% zWV&b0^PRT;rDa?D*|?TKc<@pk&QsNj^ujh?rwomZ%+JwaKKUrn6K0Fv{f3AUzduDG zkwosT()Iq^ulc4Ts9W%mC^T zKOf&$y6vK8$0u;uNl8hm+Hv){_#C^RSm8&L+uM&E&(&lSR>Cs?Ap#(w$Er6|Uy@i5 zOxtM_n2)GQzA&)c>7=roaE?p<`(nx7=4ZkwyEx4ZW?;2hDceKQP=gNw;SNjON*tV= z4jm+k+q*-zZ9( zePaIo%P-%D7N*nfY8{B1;TCuUNh6kx52=KX<0}`e;!r#8#x<^Q4p%iay|As0AE}8S zc~DA&%(B&iOApI?$K06jE=8H@0I-CS0w7|IM3$^PmN5(t=V*-bFKfaVB+F*ZGnAvR ziLM&#L{jWg*y~qcpbA~!bn#vD3E@1J{5PiXLvCkG95+@$iC0Q{ms69Ujgym_YQCc$ z>0XKVprNmlOYKfHo_y=#$eLwV>@P-%_f>@8CQ|T83Ws&5WjvAp{4Y525vyOSV!FBH z-5uVF148Ai1}Vj}lH6T!*oBIh(f7dK2X5AAK6uSVcxL?Hcs$!0g+*e{YyMas9lY3tM zuDD~*zDe=LDkv*AI#D79w<@K(Kk)|H)XNZj+QJ9ZhPZDNFV)PLvIo71r!9XMAJb57 z;}(Zch$xMjjDfuFfl{_(bp3~qfgdX)=UuhYv9PdyX`uSFz}vtN0wyVvx$U080wAfT zM0$hC&mOK6$E{Pn7w5j8D^8{8M1>;C1X>Dli*ofHsY(4PN9Xbv>^BEKV#LJ60K^6W zw2#+D8^ghlXBTXR7Q12#9^WsRe0U+19`?yBapjl+>Ef;J?q(f4%KD0hDoP9w(eUE! z1E};$PJdG<|84yulakFm<=Z&@OnU$O^4#Y zX$!6Th4(9N=xMyEqe%*$++ylR4emwl3_2Bq|sh=&&tfOmtLQ8zNpI zQ>*+#wiG)R?|FhC!<4DEfT*u#!FEG0%*ZrS^gEaF&_ zK1LcsOh!4NbaZ|=`o`le4re*Cox1O>=I6ID%)4io5rkO$>fZ%8`FC(*WG~B|{C0NP zxnM#5r;%SwjEr!|0FIx_eDJ*+QyiEaoo}|K+pT7KdZ&pPO9Yd@2|}mhQ#Epb?jtd9OZ1`iB8-cEk*6zOZrx5YmLT9*Zj(14yDgjl1RcL>&%Ws`W zFl-;`=*_xYWXLEvW^JjxQhgFon&p?7R}>>bxLQu^rSEq9lUOSzf5F&mrm^+xjd@I7 zysmtWoUYaAz-X3=l4~vndr5Ap7TvPJ@`~yFeY4qtrN}&!8Fzw_L#8(y>T{S?XE?Ei zq>pq2G^_GN=+X&;uRrBDOiP`$BJ82bZSIqP@nWRl_wAR(MeUM0^5T9;)f+d@6$(FG z9!_prZj!ebFsMzns~R6FHb;^>l8pRF`OB!;(S>_)ws1i??|D*or0LqZ%yt&$D zA;Zc|(h`;u`z<{9h-9)+{ju4}`K9jhPJf+<$kFcCFFNOr5^4MBq=Bq!Tv=~DgLHHf zl#-u`r#QTG0j9EFFGjT+9_yksFkK=6h(*O1r`FL>XWf?(^|GpT@Uh4Z zS*-H?!jeEGsrk`U^r7(xhM2*N*CQ>xo~}QRE_au*n{~u#h(c=vf!;cW{$&haSMpJ0 z$a7WF6&F9|&YbVf?TJ%QW|Z{sDj83hk^fk6elj<+Eu6xCvmj;apP|WQaGO3|jBx&@ z_}6(&PW++G&g$22zyalu{IYL3^TxoFN-ZZek(_pSzJtC~0=}*WReBcfgyPlLHfI}T z_N!w;*;yK{lS)$S165eROkQ8(P6#tXyFP0*k=%*o_^d|u z_$Pj(28-&Ts5r+Tk&Or!CEYLY{oj~BU417)5SMr1xFS$_UtNKr;68E1nT{bT=c4|j z>fK)>$3y4^Gj^4JEElIX$5H$h%dR$FGpV*``9hX;jv2h3l55#zy;`&dRPN(t12yBF zmy?!;*QNsCUs-6PBD@nMKcr8wS(MWe#O&5ywXgW$rP5hNZo{9SkJmj51mT3u(2L%Z zym%9}+0e}flA1?OKh$56_BQ;F%4GRM#VI}4 zSB6>zmtL(-v`tpjRoQDjJD47K8HnkASW$uNu!jF~NYPWm^V|Si_6gVVNd;WG`fqCJ zXV*JZuR0nby2W>I{6LsFIx0is&V)B@#teOod`h|>f8YCgvBqnn7Bb&!&NGy>+8}oR z7cR*t%2%0xi#?Sd=b8O@A>5>QWv;k=u2^P%74)a$gNrm={)<^gS<~R_MvB6VYrLN~ z>R&vQ`0M>3gt&UFI$pu?>eS^o?T{x)43*4^k|FfNS?7Zv4r|UmF<90A9vbU2Ci)A&nVR(7>-(M+CdpN59`YkzKRZn=|DGlljOE(C=D2({H=x=|ZRO%}7V5L@ zsAs{Id1Iozw(3a?x^+j=AbOX==8q~kw6ouY3xMzYGX`0{Ho~v&eN6V&NB0DtijZs! zKHYZ<`SMchS9P8I%Mi)*4;QSvMOu-mMdbNuaOmol%EIUlbGd(e`0LFAxAUU2FW)M= zVm!qcv7$mGe-n5-I2sgK*H^W^qwjG!KP(?gOVDbKX(64|ZxegIbZ~D#q}wAU*!#4u z&`W=0yVifG(4$~2SQ~OT%XxTrNQ(alsYKH}N4OgezJzFTY!CNTe$&P+iQ@|1?xt0p zOM;31YKJNk8;-;-{s7T}y;geS4yIx1e~vCC3lz~ns}M$!Me zh=MnQ`KZDnWgU(WoN?6i)(wWAocttiP9|KqdK23T$D^T$eJ&PiEm$1Vr5md5IwFX((RWV%Vx`{p$GMd(N|*xweP=!?8YwN7 zcloN%=%9mV-*bcQvsLh+Lw!^z&%_)lZ|7Xu%u+RGdSJ*hv6`r{PMa;NS|d5$eTS@i zAk`1_Jk|B08kxdfjB7xb-XTId;kEPJbH@*Cga3ZC&1wx zOOvNSXC4Xg)U!WOu_q}zkr=2Racfv3(V40#sSPTW87r!dpR0KIo!ptYz-@K$pL3qc zODYS4Ni?joQ$ym)c=bi%(o6;Vmv0Ig$4HqcsDw@jD&{X;_h7w+N^(UP?eThEPJQ36 z%RE_Q%^r7@p@jwTkY)*mG$=x60#P{ zX3J_s^|}=atA2Uc)moUO&io65lm;U@?1fARWO53;#6r#WE-n7)YQLTT{kXm09Y*H; zmsR5XgB00?hJ}>yi}caN%Gi04FOA<|Y5`>H0BIQKXb|^nTY;1|_mYVh{3*e~p99LV z1?L{+H=Jrmh-f^;%3b`4ig!3djQ^zE(YA4R>u8++0w-}-eEniWRong2U~kr5mPMI5 z_`2HmqpxkkJI8N(7yAkfX$ntE5TYlI_IZ(`i<;kc610X2{L6rIqQ|(hkEk!uSQFdt zi{$q!q!^dk93rca!&FR0zMN9<=Xxp)Vv%}%3w*`;t+(xQS?%fJ4?h*k#M=#zxAxFe zGS{khxMUgQ%yrY7u3A@>4bRH2(eGpDN$k1UjksZ! zbe!C>I1`R*UTo$#qn~&1y_%{*j)s(>0pl*&j~%K_FybzIPWKWZo0*lkh8?HSNu{eZSUXdmmEs1!5+Q8qXRAK~U(k z__Q_Hc*NCIRK95h;tA%r+PYZl?f-AZocBMK{r|vEa(518bYx^4Gh}t_Jt8^BcES-A zNfgTFaLh7N#)-(xEi&R{Mz+lE$jlyxq|>oZ_U7}}_mB9VAJ2H4>+ybE*LBWyy`Il! zoehBB1NvC&=`IwMr zm`|g)1x1-A#7wyn?Wc%Uc2O!nUbtjZoDJSBcURVCczpO^@sLV<U<>B(KBVl z8Nqba#XB{-`@Ssna2R#g`o=*~Ja+H8*U|WoVJPD{5xum-j*@CUROw3e{8C=olF1gU z+|4&C>$`5`jQx+pk_jiHmu3J3WQ6SxzJHg^i%4AB``yP#mpo^zeYRPm-lh>}}mf zWGEB&-4Q4YquiUv{;%Y{N^d;E_Ed{gJSV@4jFHn3#Mv})ixkw6nMYHPZ_td^Pa&Km zeMRt5-}3s94q3Zk!TBJ+Cgtu~u-d|MOhGM8O+k;f#Hjt1+rv$7dtI}SQ&W66Dd)c= zk8L~?3?m?ezdz>Byp%JUhiW^gw&1OBpsc{QfeGRjZBpFBXbxpr9!l>2@o9%wsTp-o zMktmwVkby-vkQoc%`h&78XDaKzoPQk;cU^brTzU5Q!J_+s%f6thmrmC0s6;pGLNX0 zNI&7;BukQuoUO_-rnA@erj&xbumgX1xQBMhrEy13bQaG*rZoZ_kxITC{i(`mO!%fue?8Vg$NBAC*9ez z-8Xi-k4M4A+546di|GDxs^9n4V!cIfV`Gs*l(C0CZx(Yo*)q5uTQJLL zE4Xx8QOfvjcV9KU=UDO39Xl0WU-f+RIk{!>AUu%ll3CqYpow<#oZ%%OqMFC-5FsxieAj?JcItpwD-~JyJka)8j3ndkg#pGZ{m$IMQ*UJpmOT$`_qsf@4sB)M?YjsK7ob62@FE=^kq_u8ZQp){mTjC|780AeWTG z0v|1-C0e@F{=&WHX?*x-%vimjom6BW63^xNW3{4Hk>Lx4cSXa+W#&1P+kqC0vapCQ zIuZu+o>Ok#9`In+EniEWQ|iVx1+~8t_pM``{)8T4l(xeva3!U^zuq0q(pO05m)Gs~ zj%+g)%yoOIY;-l{j&LL933gx?8x3gpBFVFZv&Nt&~Ws%VR!tp^U= z;SXb8+pYgzu^_fLqQyIubu&b!;wZO2ZIQLNArG10m~?tliPP=Y0eaN`$L`yP{n-b@ zU+#InC1pw}XjFI&3uV>+-X7-Y;@AuB3vs2hk~ZI~x>Qam|I~D;i@n~Spk{2caedIt zedV-M)3!~3oc)WyXKW#}GMgJunArdO#Thg-T#U1a&aLl^&8EW}$Xr1dZR`$_^_#0X zQ?R9WBP7MadpvM^On9ODrC~24sZw=gd)WDvUhIFg8Fqyo=YFiJy&PSLw=6V21BJ3^ zpG@tFizT=|+Fv0lWZuL-6uF%j>=n*DFf_3~wfsX+l6?U&`G~r_#a06~Ub{`Uzhf3s+xDhB|lpItr`t>UxQ^%If_`3&mZC!bZ1T{sct>jc0Zho zTVq|^3X?S=wdP1((z7vebGBY_rs82j^w=>m(r@`j>BMswxru+sEC#U4E={{#gXt7c zgTUne`=R+3BTWxAymI!pjEss#(R}Rq4t&JX<2~)cuI=kAx@Niyi+VQtza_DC`-p(( z$%ESshr<4cU)Q7OHC_%+k?HyGs^#pVH@k9|nO99j))=a+$blf46QO+-b`#Wje5+Rd zFVBt4l*~nsLG|vVQK6^Y=N_odDZf;6P}`l3^Bn`q${Vm;aPud)5~x+ea?74hskD(Cr=ZI0*Qj?O}FShrI*K_ryHbo zN=9sfpq-x;{I^!3FTsY#;b>`TuU)@xoNC`nnH{{X_Imf)=*rIAJ0?cQ!tKG8C+NX8 zgzPN`^q|0@a4hk#yHlyy!2Q9i;Gg$;0yVPU0)oF_olI;}^#%%n9&gaA#6&OZn^o?1 zz++8<<_|C+0~PreLZ(4tj@rqwGogAKhnLK$Yb8W_*Pf-rqk0$p39^I6PDRfaZyt zr2E4BJ^u~z=};e2q(^12QD&;4MaPZt;q3RnH}_05cCU#gl`EScX9Sc49I9^^ZQ!%8kuRpqWu-j36 z6$;tcMnMLKhw}z0*FD3N+1Bxa;O2Yz{E0c6s|+bUA5P10DUu>OIW@IB$^zk_*QQ}k zH59%;ujd*5a4;{Gm}6NqRu0CyXfKGJAdF56$eHH`dl>-3TkhbhB@|GEPxsV-FX9QO<&#Nu1qx@fL!Io`-rg%RG6Sw3 zfj?7zzct$t!lB9x4`tQ{(oD~?_UExNWp(w;&bd?~g-Y#B1~`P$WF*i4Fo?@QAY7R^ z)eIlSUxe`s2?+dHt|pyeK2b@(0A$(G-d?6mF$7)!DCcarVj1zi2sIp1T>OO;li~;h zVg?kshV5~_dJNfshmRW%t@J6peOmSj#RH=9+DLJ`(9zZLMiw!3S z0j(V@qNToG?JSg)mgX~yiJF;}l~VCH_?^I2-C8ZPlfIZ_$cf12@2`9tjAfH^zn_6H zGQ(%2vDgt1l8uQuSHblNu+E#HGX}DBttv+V3?E~q1ALc{j}Kd;G}y*(y`R7&^sYQT zBw0t;9H~vTqym@&P{&|)dM_$-H!xUBOA7=DL7ifDaj|Rp3(yaZOic2-04D}0_Q*xn znD;~?105Y@WhIX{`St6lhzJiC9*Ch13UWh^)5yieMNcp4ngF0Z0L>f@b#-%NqNBSD z1?DH5kw@j{!h(u<&`0Y`0--r?$Ut9T1+;u&`w)oERa9udB?eP&_nF4mIT6(IHU>>V zBopdzZ)kB7D41ZB3F>?svY;Id)`*YKt`dI^d6!Qpl;GQU^vm;BJ6#2zHAk zeG6OL5MXNnM81k9z7x>WRzR&*-#d#m1D^^y06_=P%mHo9WOH9HFHr3|2H`c=De+J` zM%lP#jT6Ey4j_r1E5l1&CU4`kQf?}#Lb)nxirm_M^j$j^>>()0w-{l zzzG`YXke}A=;%CaCZ~gFQ$(5nmRq^>PD06l`>oob?27!qX9*`E~B-~|M9KIOg#!D4;Goy9k6*2w65{B588H5{s&foRcrtN literal 0 HcmV?d00001 diff --git a/main.typ b/main.typ index 9346aa1..1f301b6 100644 --- a/main.typ +++ b/main.typ @@ -14,11 +14,11 @@ #let qrej = $q_"rej"$ #let qacc = $q_"acc"$ #let halt = `HALTING` -#let halt2 = `HALTING2` +#let halt2 = `HALTING_2` #let NP = `NP` = 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,26 +28,40 @@ 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. +$(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). === 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 +Tas ir bieži sastopamais formāts, bet var gadīties arī cits. + +== Piemērs $(a^n b^n c^n", kur" n > 0)$ Vai ieejas virknē $a^n b^n c^n$, kur $n>0$ #context [ @@ -79,7 +93,7 @@ Vai ieejas virknē $a^n b^n c^n$, kur $n>0$ $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 [ @@ -105,36 +119,92 @@ Vai ieejas virkne $x \# x$, kur $x in {0,1}^*$ - 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 +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)$, 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. + + Jāievieto dotais robežā $lim_(x->oo)f(x)/g(x)$; + + Rezultāts ir 0, patiess, citādi -- nepatiess. + +== Piemērs (lielais-O) -== 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 +== 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)$. +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) $ -== Piemērs +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 @@ -143,7 +213,7 @@ Ievietojot vērtības $ lim_(n->oo) (n log^4 n)/n^1.5=0 $ Tātad vienādojums ir patiess. -== Piemērs +== 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 @@ -151,25 +221,15 @@ $ 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$. #teo[$A$ ir sanumurējama ar atkārtojumiem tad un tikai tad, ja $A$ ir sanumurējama.] -== Soļi +== Sanumerātības pierādījums - 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 @@ -199,7 +259,7 @@ 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 +== 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$? \ @@ -239,17 +299,35 @@ 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. +== 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, -izmantojot $H$ kā apakšprogrammu. +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$. @@ -259,56 +337,50 @@ Tjūringa mašīna $H 2$ darbojas sekojoši: - 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ē 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. +$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) = 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. + $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ā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. +Tādējādi #halt2 tiek reducēta uz #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. +== Definīcija -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. +// Jorens: Tas teksta blāķis, kas šeit bija var apjucināt cilvēkus, viss kas +// vajadzīgs ir sarakstāms īsāk. -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 +- $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( - title: "Raisa teorēma", -)[Ja $F$ nav triviāla (ir $M:F(M)=0$ un $M':F(M')=1$), tad $F$ -- neatrisināma.] +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. -$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. +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). + = Algoritmiskā sanumurējamība == Info - Kopa $A$ ir sanumurējama, ja $A={x_1, x_2, ...}$ @@ -319,7 +391,7 @@ $A$ -- daļēji atrisināma, ja ir Tjūringa mašīna $T$: 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) "ir sanum.?"$ Pamatot, ka kopa ${a^k b^k mid(|) k>=0}$ ir algoritmiski sanumurējama. + Uzraksta uz izejas lentes tukšu vārdu. @@ -331,7 +403,7 @@ 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$. @@ -398,7 +470,7 @@ Pamatot, ka kopa ${x \# x mid(|) x in {a, b}^* }$ ir algoritmiski sanumurējama. + 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 +== Piemērs ($|a| = |b|"?"$) Vai ieejas virknē ir vienāds skaits $a$ un $b$? + Virzās no kreisās puses uz labo, aizstājot vienu $a$ un vienu $b$ ar $x$; @@ -410,7 +482,7 @@ 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)$. -= #NP (neatrisināmas problēmas) += Neatrisināmas prob. (non-decidable) #let acc = `ACCEPTING` #let eqans = `EQUAL_ANSWERS` @@ -423,7 +495,21 @@ Kopējais soļu skaits: #let M2 = $M 2$ #let SAT = `SAT` -== Info +== Definīcija + +Neatrisināma problēma ir problēma ir problēma, kurai neeksistē TM, kas +atrisinātu šo problēmu. + +== 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 var +parādīt kā redukciju no HALTING. + +== 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. @@ -437,13 +523,13 @@ Kopējais soļu skaits: #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,7 +548,7 @@ Kopējais soļu skaits: Šeit jārodas pretrunai. #context [ #set par(justify: false) - == Piemēri + == 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)$. @@ -570,7 +656,20 @@ 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). += 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$. + = Sarežģītības klases + #let time = `TIME` == Info $n, n log n, n^2, n^3, 2^n$ @@ -597,7 +696,164 @@ $ lim (log^17 n)/n = lim (m^17)/c^m = lim (m/c^(m slash 17))^17 -> 0 $ - $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$. +== 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. + +_Source; Mathematics for Computer Science, 2018, Eric Lehman, Google Inc._ + += NP-pilnas probēmas un to redukcijas + +== 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ļ. + +== 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 + +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 +883,30 @@ $ 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)'$. +] + + From e7abda0d1acc733d1b06169b2ceeb0b626efbdd3 Mon Sep 17 00:00:00 2001 From: jorenchik Date: Sat, 14 Jun 2025 16:00:35 +0300 Subject: [PATCH 2/6] some reordering / corrections --- main.typ | 553 ++++++++++++++++++++++++++++--------------------------- 1 file changed, 285 insertions(+), 268 deletions(-) diff --git a/main.typ b/main.typ index 1f301b6..8b9eb4f 100644 --- a/main.typ +++ b/main.typ @@ -32,12 +32,14 @@ Var būt 3 veida uzdevumi: stāvokļu, tekstuāls, vairāklenšu. $(q, a) -> (q', a', d)$ -- stāvoklī $q$ redzot $a$, ieraksta $a'$ un iet virzienā $d space (<- "vai" ->)$. -=== Divas lentes +=== 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', ->)$ @@ -118,109 +120,6 @@ Vai ieejas virkne $x \# x$, kur $x in {0,1}^*$ - 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$ - -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. - = Sanumurējamība == Definīcija - Bezgalīgas kopas $A$, $B$ ir vienāda izmēra, ja ir bijekcija ($1:1$ attiecība) @@ -230,17 +129,16 @@ vienādojums būs patiess. #teo[$A$ ir sanumurējama ar atkārtojumiem tad un tikai tad, ja $A$ ir sanumurējama.] == Sanumerātības pierādījums -- 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. +- 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, @@ -248,16 +146,50 @@ vienādojums būs patiess. - 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. +- 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` +Divu lenšu #TM, kur viena ir klasiska darba lente (#DL) un otra ir izvada +lente (#IL) (tikai rakstīšanai). + +==== Piemērs $(a^k b^k mid(|) k>=0) "ir sanum.?"$ +Pamatot, ka kopa ${a^k b^k mid(|) k>=0}$ ir algoritmiski sanumurējama. + ++ Uzraksta uz izejas lentes tukšu vārdu. ++ Uzraksta vienu $a$ uz darba lentes. ++ Atkārto: + + Uz ieejas lentes uzrakstām tikpat $a$, cik bija uz #DL; + + Uz izejas lentes uzrakstām tikpat $b$, cik $a$ bija uz #DL; + + Uz izejas lentes uzrakstām $\_$; + + 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 (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$. ++ Katram $x$ uz izejas lentes uzraksta $x \# x$. ++ Uz izejas lentes uzraksta $\#\_$. ++ Uz darba lentes uzraksta $a$. ++ Atkārto: + + Pārraksta darba lentes saturu $x$ uz izejas lenti; + + Uzraksta $\#$ uz #IL, vēlreiz pārraksta $x$ uz #IL, uzrakstām $\_$ uz #IL. + + Uz #DL nomaina $x$ pret nākošo vārdu. + +=== Diagonālinācija (pret sanumurējāmību) +Paņēmienu -- 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). + +=== 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. == Piemērs $(ZZ "sanumurētība")$ Vai visu veselo skaitļu kopa $ZZ={..., -1, 0, 1, ...}$ ir sanumurējama? \ @@ -283,7 +215,9 @@ 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. +skaitļu pāru kopu un naturālo skaitļu kopu. + +$"Injektivitāte" + "Surjektivitāte" = "Bijektivitāte"$ === 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)$ @@ -359,130 +293,7 @@ Redukcijas analīze: Tādējādi #halt2 tiek reducēta uz #halt. -= Daļēja atrisināmība -== Definīcija - -// 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). - -= 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` -Divu lenšu #TM, kur viena ir klasiska darba lente (#DL) un otra ir izvada -lente (#IL) (tikai rakstīšanai). - -== Piemērs $(a^k b^k mid(|) k>=0) "ir sanum.?"$ -Pamatot, ka kopa ${a^k b^k mid(|) k>=0}$ ir algoritmiski sanumurējama. - -+ Uzraksta uz izejas lentes tukšu vārdu. -+ Uzraksta vienu $a$ uz darba lentes. -+ Atkārto: - + Uz ieejas lentes uzrakstām tikpat $a$, cik bija uz #DL; - + Uz izejas lentes uzrakstām tikpat $b$, cik $a$ bija uz #DL; - + Uz izejas lentes uzrakstām $\_$; - + 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 (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$. -+ Katram $x$ uz izejas lentes uzraksta $x \# x$. -+ Uz izejas lentes uzraksta $\#\_$. -+ Uz darba lentes uzraksta $a$. -+ Atkārto: - + Pārraksta darba lentes saturu $x$ uz izejas lenti; - + 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,...$ - -== 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. - -+ 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 ($|a| = |b|"?"$) -Vai ieejas virknē ir vienāds skaits $a$ un $b$? - -+ 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)$. - -= Neatrisināmas prob. (non-decidable) += Neatrisināmas (non-decidable) problēmas #let acc = `ACCEPTING` #let eqans = `EQUAL_ANSWERS` @@ -500,6 +311,10 @@ Kopējais soļu skaits: Neatrisināma problēma ir problēma ir problēma, kurai neeksistē TM, kas atrisinātu šo problēmu. +== Funkcionālas un nefunkcionālas īpašības + +TODO. + == Raisa teorēma #teo( @@ -516,9 +331,16 @@ parādīt kā redukciju no HALTING. - $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$ (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.] @@ -656,7 +478,31 @@ parādīt kā redukciju no HALTING. 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). -= Nekustīgā punkta teorēma + +== 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). + += 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 @@ -668,19 +514,128 @@ Tad: $"eksistē"(x): phi_{F(x)} = phi_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$. -= Sarežģītības klases +== NPT pielietošanas piemērs + +TODO. + += 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` -== Info -$n, n log n, n^2, n^3, 2^n$ + +=== 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$.] +/* random piemērs -> relocate? */ +/* $ lim n/2^n=lim (n)'/(2^n)'=lim 1/(2^n ln 2) $ Augot $n$, $2^n->oo$, tātad $1/n^2->0$. @@ -695,8 +650,62 @@ $ lim (log^17 n)/n = lim (m^17)/c^m = lim (m/c^(m slash 17))^17 -> 0 $ - $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$. +*/ -== Asimptotiskas augšanas hierarhija +==== #TM darbības laiks + +/* +- 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,...$ +*/ + ++ 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 ($|a| = |b|"?"$) +Vai ieejas virknē ir vienāds skaits $a$ un $b$? + ++ 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)$. + +=== Vieta (SPACE) + +TODO. + +=== Laika-Vietas sakarības + +TODO. + +=== Asimptotiskas augšanas hierarhija Sekojošas funkcijas pieaugums pie $x -> infinity$: @@ -709,9 +718,15 @@ $log(x) << x << x \cdot log(x) << x^k << a^x << x! << x^x$ Š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._ -= NP-pilnas probēmas un to redukcijas += Klase P (TODO) + +. + += Klase NP == NP problēmas @@ -726,25 +741,27 @@ ir problēmas (2 ekvivalentas definīcijas): Ekvivalence ir pierādīta ar abpusēju pārveidojumu no pārbaudītāja uz nedet. TM un atpakaļ. -== Polinomiāla redukcija $(<=_("poly"))$ +== 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 +=== NP-pilnīgums - A – NP-pilna, ja: - $A in "NP"$; - Ja $B in NP$, tad $B <=_("poly") A$. -== 3-SAT problēma +=== 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 +=== CIRCUIT-SAT problēma Dota funkcija $F(x_1, ..., x_n)$, kas sastāv no vārtiem (AND, OR, NOT). @@ -755,14 +772,14 @@ Dota funkcija $F(x_1, ..., x_n)$, kas sastāv no vārtiem (AND, OR, NOT). Vai var atrast mainīgo vērtības tā lai gala izvade būtu 1 (patiess). -== CLIQUE problēma +=== 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 +=== IND-SET problēma $exists S subset.eq V: (|S| = k) and (forall (u, v in S): (u, v) in.not E)$ @@ -770,11 +787,11 @@ 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 +=== 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 +=== 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$. @@ -818,7 +835,7 @@ $ Analoģiski iekavām ar vienu elementu. Rezultātā ir 3-CNF formula, ko var izmantot ar 3-SAT algoritmu. -== 3-SAT ≤ₚ IND-SET +=== 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 @@ -835,7 +852,7 @@ Piemērs formulai $(x or y or not z) and (not x or y or z)$: Tagad varam pielietot $"IND-SET"\(G, m\)$ ar izveidoto grafu un $m$ kā iekavu skaitu originālajā formulā. -== IND-SET ≤ₚ CLIQUE +=== IND-SET ≤ₚ CLIQUE - Veido grafa papildinājumu (komplementu) $G' = (V, E')$: From a6dfc6d8797d53fcc3761e054f6d3dc33de401a6 Mon Sep 17 00:00:00 2001 From: jorenchik Date: Sat, 14 Jun 2025 20:07:47 +0300 Subject: [PATCH 3/6] first version before review?? --- main.typ | 276 ++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 192 insertions(+), 84 deletions(-) diff --git a/main.typ b/main.typ index 8b9eb4f..97f7eab 100644 --- a/main.typ +++ b/main.typ @@ -10,12 +10,13 @@ #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 = `HALTING_2` -#let NP = `NP` +#let halt = $"HALTING"$ +#let halt2 = $"HALTING"_2$ +#let NP = $"NP"$ +#let hline = $\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_$ = Tjūringa Mašīnas == Variācijas @@ -63,8 +64,11 @@ Nosimulēt stāvēšanu uz vietas jeb $d=0$ var šādi: Tas ir bieži sastopamais formāts, bet var gadīties arī cits. -== Piemērs $(a^n b^n c^n", kur" n > 0)$ -Vai ieejas virknē $a^n b^n c^n$, kur $n>0$ +// 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, *, ->)$ \ @@ -72,53 +76,53 @@ 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 (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. +] = Sanumurējamība == Definīcija @@ -151,8 +155,8 @@ Vai ieejas virkne $x \# x$, kur $x in {0,1}^*$ - 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). @@ -181,7 +185,7 @@ Pamatot, ka kopa ${x \# x mid(|) x in {a, b}^* }$ ir algoritmiski sanumurējama. + Uz #DL nomaina $x$ pret nākošo vārdu. === Diagonālinācija (pret sanumurējāmību) -Paņēmienu -- ir saraksts (pieņem, ka ir iegūts saraksts) vai uzskaitījums ar +Paņēmiens -- 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). @@ -199,7 +203,7 @@ 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. +par Kantora 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, ...}$ @@ -213,20 +217,18 @@ 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. +Pamatojam bijekciju, balsototies uz faktu, ka $"bijekcija" = "injekcija" and +"surjekcija"$. -$"Injektivitāte" + "Surjektivitāte" = "Bijektivitāte"$ +=== Injektivitāte -=== 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 +=== 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)$. @@ -295,25 +297,41 @@ 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` +#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ālas un nefunkcionālas īpašības +== Funkcionālās īpašības -TODO. +- $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 @@ -321,8 +339,8 @@ TODO. 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 var -parādīt kā redukciju no HALTING. +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$. @@ -331,13 +349,12 @@ parādīt kā redukciju no HALTING. - $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)$ -- $linineq(S)=1$, ja sistēmai ir atrisinājums $x_1, x_2, ..., x_n in {0,1}$ -- $"pcp"(S)=1$ (Post-correspondance problem), ja divām galībām kopām $A = [a_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 +- $"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$, ...? @@ -498,7 +515,16 @@ 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). +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 @@ -516,7 +542,33 @@ Tad: $"eksistē"(x): phi_{F(x)} = phi_x$ == NPT pielietošanas piemērs -TODO. +"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 @@ -626,40 +678,15 @@ vienādojums būs patiess. == Sarežģītības klases -#let time = `TIME` +#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. -/* random piemērs -> relocate? */ - -/* -$ lim n/2^n=lim (n)'/(2^n)'=lim 1/(2^n ln 2) $ - -Augot $n$, $2^n->oo$, tātad $1/n^2->0$. - -$ n^2/2^n=(n/2^(n slash 2))^2 $ -Mēs zinām, ka $n/2^(n slash 2)->0$. - -$ lim (log n)/n = lim (log n)'/(n)' = lim (1 slash n)/1 = lim 1/n $ - -$ lim (log^17 n)/n = lim (m^17)/c^m = lim (m/c^(m slash 17))^17 -> 0 $ - -- $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$. -*/ - ==== #TM darbības laiks -/* -- 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,...$ -*/ - + 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ē, @@ -685,6 +712,20 @@ $ lim (log^17 n)/n = lim (m^17)/c^m = lim (m/c^(m slash 17))^17 -> 0 $ + 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. +==== Programmas darbības laiks + +Ī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. + +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. + ===== Piemērs ($|a| = |b|"?"$) Vai ieejas virknē ir vienāds skaits $a$ un $b$? @@ -697,13 +738,57 @@ 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)$. -=== Vieta (SPACE) +=== Telpa/Vieta (SPACE) -TODO. +==== SPACE Definīcija (Precīzs modelis) -=== Laika-Vietas sakarības +- 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)$. -TODO. +$ +"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 @@ -926,4 +1011,27 @@ Ir spēkā sakarība $"INDSET"(G, k) = "CLIQUE"(G, k)$. 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 \ +approx n log n - n + O(log n) \ + +// Useful approximation for factorial (Stirling) +"Stirling's approximation": \ +n! approx sqrt(2 pi n) ( (n)/(e) )^n \ + +// Exponential sum (appears in brute-force algorithms) +sum_(i=0)^(n) 2^i = 2^(n+1) - 1 \ +$ From 26a502099db7136bde5fe312c02d0e3144337e92 Mon Sep 17 00:00:00 2001 From: jorenchik Date: Sat, 14 Jun 2025 20:08:33 +0300 Subject: [PATCH 4/6] added me to authors --- main.typ | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.typ b/main.typ index 97f7eab..100ff82 100644 --- a/main.typ +++ b/main.typ @@ -5,7 +5,7 @@ #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) From 7eda2fb26e532d538870bc5fe7d88700b30985b5 Mon Sep 17 00:00:00 2001 From: jorenchik Date: Sat, 14 Jun 2025 20:44:14 +0300 Subject: [PATCH 5/6] 0.2.0 version --- main.typ | 68 ++++++++++++++++++-------------------------------------- 1 file changed, 22 insertions(+), 46 deletions(-) diff --git a/main.typ b/main.typ index 100ff82..bee6fa7 100644 --- a/main.typ +++ b/main.typ @@ -129,7 +129,7 @@ Vai ieejas virkne $x \# x$, kur $x in {0,1}^*$ - 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.] == Sanumerātības pierādījums @@ -160,7 +160,7 @@ Vai ieejas virkne $x \# x$, kur $x in {0,1}^*$ Divu lenšu #TM, kur viena ir klasiska darba lente (#DL) un otra ir izvada lente (#IL) (tikai rakstīšanai). -==== Piemērs $(a^k b^k mid(|) k>=0) "ir sanum.?"$ +==== 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. @@ -175,7 +175,8 @@ Pamatot, ka kopa ${a^k b^k mid(|) k>=0}$ ir algoritmiski sanumurējama. ==== 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$. @@ -185,10 +186,10 @@ Pamatot, ka kopa ${x \# x mid(|) x in {a, b}^* }$ ir algoritmiski sanumurējama. + Uz #DL nomaina $x$ pret nākošo vārdu. === Diagonālinācija (pret sanumurējāmību) -Paņēmiens -- 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). +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). === Pretruna (pret sanumurējāmību) Pieņem, ka kopa ir saskaitāma un tad rodas pretruna. To var izdarīt, parādot, @@ -196,43 +197,23 @@ ka kaut kādas kopas īpašības vai kardinalitāte ir pretrunā ar sanumurējam pieņēmumu. == 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$? \ +Vai visu veselo skaitļu kopa $ZZ={..., -1, 0, 1, ...}$ ir sanumurējama? +Vai ir $F:{F(1), F(2), ..., F(n), ...}=ZZ$? +$F(n) = n/2 ", ja pāra un" -(n-1)/2 "ja nepāra"$. -$ F(1)=0, F(2)=-1, F(3)=1, F(4)=-2, ... $ +Sākumā tiek iegūta nulle. -Viens no veidiem, kā izveidot bijekciju pāra kopai, ir izmantot metodi, ko sauc -par Kantora 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, ...}$ +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; -#figure( - image("assets/img/cantors-pairing-function.png", width: 50%), - caption: "Cantor's pairing function", -) +$F(1)=0, F(2)=1, F(3)=-1, F(4)=2, F(5)=-2...$ -Šī 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. +Injekcija: ja $F(n_1) = F(n_2)$ no formulas seko, ka $n_1 = n_2$. -Pamatojam bijekciju, balsototies uz faktu, ka $"bijekcija" = "injekcija" and -"surjekcija"$. - -=== 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. +Surjekcija: katram $z in ZZ$ eksistē $n in NN$, ka $F(n) = z$. = Redukcijas @@ -388,7 +369,7 @@ nevar atrisināt. #context [ #set par(justify: false) == Piemēri (prob. ir neatr) - === #halt / #acc + === #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: @@ -397,7 +378,7 @@ nevar atrisināt. - 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. @@ -1025,12 +1006,7 @@ 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 \ -approx n log n - n + O(log n) \ - -// Useful approximation for factorial (Stirling) -"Stirling's approximation": \ -n! approx sqrt(2 pi n) ( (n)/(e) )^n \ +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 \ From 56718280ef7b894199d2f4288521bf859a8b8c1b Mon Sep 17 00:00:00 2001 From: jorenchik Date: Sat, 14 Jun 2025 20:46:36 +0300 Subject: [PATCH 6/6] better reduction notation in some headings --- main.typ | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/main.typ b/main.typ index bee6fa7..8f463e3 100644 --- a/main.typ +++ b/main.typ @@ -389,21 +389,21 @@ nevar atrisināt. - $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)$.