Documente Academic
Documente Profesional
Documente Cultură
231-235, 241-244
MN 2015 2016, FMI UNIBUC
Acest document a fost creat pentru grupele i anul colar care apar n
antet, cu scopul de a ajuta studenii la studiul individual sau
recapitularea pentru test sau examen.
V rog s nu folosii acest document n moduri lipsite de etic.
Nu avei permisiunea de a posta acest document (sau fiierele .jff
asociate) pe site-uri sau grupuri cu acces public.
~ Seminar 6 ~ .................................................................................................................... 67
(Programe standard) ...................................................................................................... 67
Problema 1 : Y X .................................................................................................... 67
Problema 2 : Y X 1 + X 2 .......................................................................................... 68
Problema 3 : Y X 1 * X 2 ........................................................................................... 69
1, dac X 1 = X 2
Problema 4 : Y f = ( X 1 , X 2 ) =
................................................... 70
0, dac X 1 X 2
1, dac X par
Problema 5 : Y f2 ( X ) =
......................................................... 71
0, dac X impar
1, dac X 1 < X 2
Problema 6 : Y f < ( X 1 , X 2 ) =
.................................................... 72
0, dac X 1 X 2
1, dac X 1 X 2
Problema 7 : Y f ( X 1 , X 2 ) =
.................................................... 73
0, dac X 1 > X 2
Problema 8 : Y X 1 X 2 .......................................................................................... 74
~ Seminar 7 ~ .................................................................................................................... 76
X
Problema 9 : Y X 1 2 ................................................................................................ 76
Problema 10 : Y1 X 1 / X 2 , Y2 = X 1 % X 2 ............................................................ 77
Problema 11 : Y X ! ( factorial ) ............................................................................ 78
1, daca X = p. p.
Problema 12 : Y patrat _ perfect ( X ) =
.................................... 79
0, daca X p. p.
1, daca x = par
(12) par ( x ) =
................................................................................. 92
0, daca x = impar
1, daca x = impar
(13) impar ( x ) =
............................................................................. 92
0, daca x = par
Predicate........................................................................................................................ 92
0, daca x > 0
= 1 x .................................................................................. 92
(x ) =
1, daca x = 0
1, daca x1 = x2
(14) f = ( x1 , x2 ) =
.................................................................................. 92
0, daca x1 x2
1, daca x1 x2
(15) f ( x1 , x2 ) =
.................................................................................. 92
0, daca x1 > x2
1, daca x1 x2
(16) P ( x1 , x2 ) =
este divizibil ........................................................... 94
0, daca x1 / x2
1, daca x1 | x2
(17) P| ( x1 , x2 ) =
divide ..................................................................... 94
0, daca x1 /| x2
1, daca x = nr. prim
(18) prim( x ) =
............................................................................ 94
0, daca x nr. prim
1, daca x = patrat perfect
(19) patrat _ perfect ( x ) =
............................................... 94
0, daca x patrat perfect
1, daca x = numar perfect
(20) numar _ perfect ( x ) =
.............................................. 94
0, daca x numar perfect
x
(21) f / ( x1 , x2 ) = 1 .................................................................................................... 94
x2
(22) f % ( x1 , x2 ) = x1 % x2 ................................................................................................. 94
~ Seminar 10 ~ .................................................................................................................. 95
(Recapitulare C&C) ...................................................................................................... 95
(23) f ( x) = 2 * x + 4 ..................................................................................................... 95
(24) f ( x) = (3 * k 2 ) ............................................................................................... 95
k =0
2 * x1 x2 , daca x1 x2
(25) f ( x1 , x2 ) =
.................................................................. 95
x2 + 3
>
,
x
daca
x
x
2
1
1
~ Seminar 1 ~
(recapitulare LFA)
~ Seminar 2 ~
(Maini Turing)
MT = (Q, , , B, q0 , F , )
Q mulimea de stri
alfabetul de intrare
alfabetul benzii
( \ {B})
B ( \ ) " blank "
q0 Q starea iniial
F Q mulimea strilor finale
: (Q \ F ) Q ( \ {B}) {, , } funcia de tranziie (delta)
Problema 1
Se d un numr natural x (n baza 1). S se deplaseze cu patru poziii spre
dreapta.
Fie x = 5 (reprezentat prin 6 de 1). Iniial banda mainii Turing arat aa:
... B 1 1 1 1 1 1 B ...
La final, banda va arta astfel:
... B 0 0 0 0 1 1 1 1 1 1 B ...
Ideea de rezolvare:
Pas 1. Parcurgem tot numrul deplasndu-ne dreapta pn la B (blank).
(Adic ct timp citim 1 pe band, scriem 1 n loc i facem pas dreapta.)
(q 0 ,1) = (q 0 ,1, ) // pstrm aceeai stare pentru c vrem ca maina s poat aplica
aceast tranziie de oricte ori (pentru toi 1 din numr).
Pas 2. Cnd ajungem la B, scriem 4 de 1, fcnd de trei ori cte un pas dreapta, iar la
final unul spre stnga.
(Avem nevoie de cte o stare diferit pentru fiecare din cei 4 de 1 pe care trebuie s-i
scriem. De fiecare dat cnd ne deplasm spre dreapta vom citi de pe band B pentru c
suntem la finalul datelor de intrare i vom scrie 1 n loc.)
(q 0 , B) = (q1 ,1, )
(q1 , B) = (q 2 ,1, )
(q 2 , B) = (q3 ,1, )
(q3 , B) = (q 4 ,1, )
Pas 3. Parcurgem tot numrul (cei 4 de 1 adugai i apoi numrul iniial) deplasndu-ne
stnga pn la B.
(La fel ca la primul pas, trebuie s pstrm aceeai stare pentru a putea parcurge toi de
1 de pe band.)
(q 4 ,1) = (q 4 ,1, )
Pas 4. Cnd ajungem la B, facem un pas dreapta (pentru a ne poziiona pe primul 1), apoi
transformm primii 4 de 1 n 0 fcnd de fiecare dat cte un pas dreapta.
(Vom folosi cte o stare nou pentru fiecare din cele 4 transformri de 1 n 0.)
(q 4 , B) = (q5 , B, )
(q5 ,1) = (q6 ,0, )
(q6 ,1) = (q7 ,0, )
(q7 ,1) = (q8 ,0, )
(q8 ,1) = (q9 ,0,)
Pas 5. Opional, mergem stnga pn la B, apoi facem un pas dreapta i ne oprim n
starea final (astfel nct capul de citire s rmn poziionat pe primul caracter diferit de
B de pe band, unde era iniial).
Problema 2
Se dau dou numere naturale x i y. S se calculeze suma lor.
Fie x = 2, y = 3 (reprezentate prin 3, respectiv 4 de 1). Iniial banda arat aa:
... B 1 1 1 0 1 1 1 1 B ...
La final, banda va arta astfel:
... B 1 1 1 0 1 1 1 1 2 1 1 1 1 1 1 B ...
Ideea de rezolvare:
Pas 1. Marcm primul 1 din x, ne deplasm dreapta pn la 0 (unde schimbm starea ca
s tim c am ajuns pe y), marcm primul 1 din y, ne deplasm dreapta pn la B, scriem
2, pas dreapta, scriem 1, pas stnga.
11
Obs.: Strile q9 i q10 fac exact ce fac i q5 respectiv q6, deci mai eficient ar fi fost ca
tranziia din q8 s o ducem spre q5 i s nu avem strile q9 i q10. E posibil ca la unele
grupe s fi fcut varianta mai eficient i la altele pe aceasta, nu mai tiu exact. Oricum,
putei s le testai pe amndou.
1
1
1 1 B
B B B
12
q0 , = q1 , , // pas 1
B B
q1 , = q1 , ,
1
B
0 0
q1 , = q2 , , // pas 2
B 1
1 1
q2 , = q3 , , // pas 3
B B
q3 , = q3 , ,
1
B
q3 , = q4 , , // pas 4
B
B
1 1
q4 , = q4 , ,
1 1
0 0
q4 , = q4 , ,
1 1
q4 , = q4 , ,
B
B
B B
q4 , = q5 , , , F = {q5 }
B B
Complexitatea spaiu:
Avem datele iniiale x i y pe prima band,
plus rezultatul pe care l-am scris pe banda a
doua, adic x+y. Rezult C.S. = 2(x+y)
Complexitatea timp:
(pas1) x + (pas2) 1 + (pas3) y + (pas4)
(1+y+1+x+1) = 2*x + 2*y + 4.
Rezult. C.T. = O(x+y).
Aceeai soluie, sub form de graf:
13
Problema 3
Se dau dou numere naturale x i y. S se calculeze modulul diferenei lor.
Fie x = 5, y = 2 (reprezentate prin 6, respectiv 3 de 1). Iniial banda arat aa:
... B 1 1 1 1 1 1 0 1 1 1 B ...
La final, banda va arta astfel:
... B 1 1 1 1 1 1 0 1 1 1 2 1 1 1 1 B ...
Ideea de rezolvare:
Pas 1. Marcm primul 1 din x, ne deplasm dreapta pn la 0 (unde schimbm starea ca
s tim c am ajuns pe y), marcm primul 1 din y, ne deplasm dreapta pn la B, scriem
2, pas dreapta, scriem 1, pas stnga.
Pas 2. Ne deplasm stnga pn la 1 din x, apoi pas dreapta.
(Iniial parcurgem n aceeai stare 2-ul i toi de 1 din y i 1 din y, apoi pentru 0
schimbm starea ca s tim c am ajuns pe x, apoi parcurgem toi 1 din x cu aceeai
stare, iar pentru 1 din x schimbm starea i facem pas dreapta.)
// pas 1
// pas 2
(q0 ,1) = (q1 ,1' , ) // marcam din x
(q5 ,2) = (q5 ,2, )
(q1 ,1) = (q1 ,1, ) // parcurgem tot x
(q5 ,1) = (q5 ,1, ) // parcurgem y
(q1 ,0) = (q2 ,0, )
(q5 ,1' ) = (q5 ,1' , )
(q2 ,1) = (q3 ,1' , ) // marcam din y
(q5 ,0) = (q6 ,0, )
(q3 ,1) = (q3 ,1, ) // parcurgem tot y
(q6 ,1) = (q6 ,1, ) // parcurgem x
(q3 , B) = (q4 ,2, )
(q6 ,1' ) = (q7 ,1' , )
(q4 , B) = (q5 ,1, )
Pas 3. Marcm alternativ cte un 1 din x i un 1 din y ct timp este posibil.
Dac ntlnim 0 (adic toi de 1 din x sunt marcai), nseamn c avem xy, deci mergem
la pasul 4a.
Dac ntlnim 2 (adic toi de 1 din y sunt marcai), nseamn c avem y<x, deci mergem
la pasul 4b.
(q7 ,1) = (q8 ,1' , ) // marcam din x
15
16
q 0 , B = q1 , B ,
// Pas 2
B 1
1 1
1 1
q 2 , B = q3 , B ,
q1 , B = q1 , B , // copiem x
1 1
B 1
1 1
0
0
1 1
B B
Pas 3. (a) Dac x > y, pe prima band citim B i stm pe loc, pe a treia band citim 1 i
facem un pas stnga, iar pe banda a doua nlocuim un B cu 1 i facem un pas stnga.
Apoi ct timp citim 1 pe banda a treia, scriem 1 pe banda a doua i facem un pas stnga
pe aceste dou benzi. Cnd ajungem la B pe a treia band stm pe loc, iar pe banda a
doua adugm un ultim 1 (pentru scrierea special n unar) i facem un pas stnga.
17
// Pas 3 (c)
B B
q3 , B = q 4 , 1 ,
1
1
// copiem rezultatul
1
1
q3 , B = q6 , 1 ,
B B
// copiem rezultatul
B B
q4 , B = q4 , 1 ,
1
1
// scriem 1 ul in plus
B B
q 4 , B = q5 , 1 ,
B B
// Pas 3 (b)
// scriem 1 ul in plus
B B
q3 , B = q5 , 1 ,
B B
1
1
q6 , B = q6 , 1 ,
B B
// scriem 1 ul in plus
B B
q6 , B = q5 , 1 ,
B B
Pas 4. Parcurgem spre stnga prima band pn ajungem la B (pe a doua i a treia band
deja eram pe B-ul de la nceput). Apoi facem un pas dreapta pe toate cele trei benzi
pentru a ne poziiona pe primele caractere i mergem n stare final.
// Pas 4
1 1
q5 , B = q5 , B ,
B B
0 0
q5 , B = q5 , B ,
B B
B B
q5 , B = q7 , B , , F = {q7 }
B B
18
19
~ Seminar 3 ~
(*) Problema 4
S se accepte cuvintele din limbajul L = {a 2 n b n | n 1} .
Fie n = 2. Iniial banda mainii Turing arat aa:
... B a a a a b b B ...
La final, banda va arta astfel:
... B a a a a b b B ...
Ideea de rezolvare:
Pas 1. Marcm doi de a, ne deplasm dreapta (srind a-urile nemarcate i b-urile marcate)
pn la b, marcm un b, ne deplasm stnga (srind b-urile marcate i a-urile nemarcate)
pn la a, pas dreapta i relum acest pas.
20
21
q0 , = q1 , , // pas 1
B B
q1 , = q0 , ,
B
a
q0 , = q2 , , // pas 2
B
B
q2 , = q2 , ,
a
a
q2 , = q3 , , // cuvant corect
B B
q3 , = q3 , , // pas 3
B B
q3 , = q3 , ,
B B
q3 , = q4 , , , F = {q4 }
B
B
Complexitatea spaiu:
Avem cuvntul iniial i scriem n plus |w| a :2. Rezult C.S. = |w| + |w| a :2.
Complexitatea timp:
Pas 1: Parcurgem toi de a din cuvnt, adic |w| a pai.
Pas 2. Parcurgem simultan |w| b i |w| a :2 pan ajungem la B, adic min{|w| b , |w| a :2} pai.
Pas 3. Parcurgem tot cuvntul, adic |w| pai.
Total: |w| a + min{|w| b , |w| a :2} + |w|. Rezult C.T. = O(|w|).
Aceeai soluie, sub form de graf:
Problema 5
S se accepte cuvintele din limbajul L = {a n b m c 2 n | n > m 1} .
Fie n = 3, m = 2. Iniial banda mainii Turing arat aa:
... B a a a b b c c c c c c B ...
La final, banda va arta astfel:
... B a a a b b c c c c c c B ...
22
23
25
q0 , = q1 , , // pas 1
a
B
a a
q1 , = q1 , ,
B a
b b
q1 , = q2 , ,
B B
q2 , = q2 , , // pas 2
a
a
c c
q2 , = q3 , ,
a a
c c
q3 , = q3 , ,
a a
q3 , = q4 , ,
B
B
q4 , = q5 , , // pas 3
a a
q5 , = q4 , ,
a
a
B B
q4 , = q6 , ,
B B
q6 , = q6 , , // pas 4
B B
q6 , = q6 , ,
B B
q6 , = q6 , ,
B B
q6 , = q7 , , , F = {q7 }
B
B
Complexitatea spaiu:
Avem cuvntul iniial i scriem n plus |w| a . Rezult C.S. = |w| + |w| a .
Complexitatea timp:
(Pas 1) |w| a + (Pas 2) |w| a + (Pas 3) |w| c + (Pas 4) |w|. Rezult C.T. = O(|w|).
Aceeai soluie, sub form de graf:
26
Problema 6
Se dau dou numere naturale x i y. S se calculeze produsul lor (x*y).
Fie x = 2, y = 3 (reprezentate prin 3, respectiv 4 de 1). Iniial banda arat aa:
... B 1 1 1 0 1 1 1 1 B ...
La final, banda va arta astfel:
... B 1 1 1 0 1 1 1 1 2 1 1 1 1 1 1 1 B ...
Ideea de rezolvare:
Pas 1. Marcm primul 1 din x cu 1, ne deplasm dreapta (srind toi de 1 nemarcai din x
i delimitatorul 0), marcm primul 1 din y cu 1, ne deplasm dreapta (srind toi de 1
nemarcai din y) pan la B, scriem 2, facem un pas dreapta, scriem 1 (cel n plus pentru
rezultat), facem un pas stnga.
Ne deplasm stnga (srind 1-urile din rezultat, delimitatorul 2, 1-urile nemarcate din y,
1 din y, iar pentru 0 schimbm starea ca s tim c am ajuns pe x, apoi srim i 1-urile
nemarcate din x) pn la 1 din x, facem un pas dreapta.
27
29
q0 , B = q1 , B , // pas 1
B B
1 1
q1 , B = q1 , B , // pas 1 (a )
B 1
0
0
q1 , B = q2 , B ,
B B
1 1
q2 , B = q3 ,1, // pas 2
1 1
1
1
q3 , B = q4 , B , // pas 2 (i )
1
1
1 1
q4 , B = q4 , 1 , // pas 2 (a )
1 1
1 1
q4 , B = q5 , B , // pas 2 (b)
B B
1 1
q5 , B = q5 , B ,
1 1
1 1
q5 , B = q3 , B , // reluam 2 (i )
B B
30
q3 , B = q6 , B , // pas 2 (ii )
1 1
1 1
q6 , B = q6 , B ,
1 1
1 1
q2 , B = q8 , 1 , // pas 1 (b)
B B
1 1
q8 , 1 = q8 , 1 ,
B B
0
0
q6 , B = q6 , B ,
1 1
0 0
q8 , 1 = q8 , 1 ,
B B
B B
q6 , B = q7 , B , , F = {q7 }
1
1
B B
q8 , 1 = q7 , 1 ,
B B
Complexitatea spaiu:
Avem numerele iniiale, copia lui x i rezultatul. Rezult C.S. = x+y + x*y + x.
Complexitatea timp:
x + y*(
x +
x ) + ( y + x) => C.T. = O(x*y).
pas 1
a
b
pas 2 ii
pas
2
pas
2
pas 2 i
31
Problema 7
Se dau dou numere naturale x i y. S se calculeze ctul (x/y) i restul (x%y).
Fie x = 5, y = 2 (reprezentate prin 6, respectiv 3 de 1). Iniial banda arat aa:
... B 1 1 1 1 1 1 0 1 1 1 B ...
La final, banda va arta astfel:
... B 1 1 1 1 1 1 0 1 1 1 2 1 1 1 3 1 1 B ...
Ideea de rezolvare:
Pas 1. Marcm primul 1 din x cu 1, ne deplasm dreapta (srind toi de 1 nemarcai din x
i delimitatorul 0), marcm primul 1 din y cu 1, ne deplasm dreapta (srind toi de 1
nemarcai din y) pan la B, scriem 2, facem un pas dreapta, scriem 1 (cel n plus pentru
ctul x/y), stm pe loc.
Ne deplasm stnga (srind 1-urile din ct, delimitatorul 2, 1-urile nemarcate din y, apoi
ajungem la 1 din y i facem un pas dreapta.
Pas 2. (a) Ct timp e posibil, marcm cu 1 alternativ cte un 1 din y apoi din x (marcm
un 1 din y, mergem stnga srind toi 1 din y i pe 1, pentru 0 schimbm starea ca s
tim c am ajuns pe x, apoi srim toi 1 din x pn la 1, pas dreapta i marcm un 1 din
x, mergem dreapta srind toi 1 din x, schimbm iar starea pentru 0, srim 1 i toi 1
din y i relum).
(b) Dac y este complet marcat (y s-a cuprins nc o dat integral n x), suntem pe 2 i
mergem dreapta srind 2 i toi de 1 din ct pn la finalul benzii i adugm un 1 la ct.
Apoi mergem stnga (srind toi de 1 din ct) pn la 2, apoi demarcm toi de 1 din y,
pas dreapta i relum pasul 2(a).
(c) Dac x este complet marcat (y nu a putut fi cuprins integral n x, deci y e posibil s fie
marcat parial, iar aceast parte marcat a lui y, care a fost marcat simultan cu ultima
parte din x, reprezint restul x%y inclusiv cu 1-ul n plus de la scrierea special n unar,
deoarece marcarea s-a fcut nti n y i abia apoi nu s-a gsit 1-ul corespunztor din x),
suntem pe 0, mergem dreapta pn la finalul benzii i scriem 3 apoi mergem la pasul 3(a).
Pas 3. (a) De la finalul benzii mergem stnga pn la 1 din y, l demarcm, mergem
dreapta pn la finalul benzii i adugm 1 la rest, apoi relum pasul 3(a).
(b) Cnd ajungem la 1 din y (am terminat de copiat restul), l demarcm i mergem
stnga demarcnd tot x pn la B, apoi pas dreapta.
// Pas 1
(q0 ,1) = (q1 ,1' , ) // din x
32
// Pas 2 (c)
(q9 ,0) = (q14 ,0, ) // x complet marcat
// Pas 2 (b)
(q11 ,2) = (q12 ,2, ) // y complet marcat
// Pas 3 (a )
(q15 ,3) = (q15 ,3, )
33
x
x
x
x
x
x + 2 * y + * y * 2 * x + 2 * + y + 2 * y + + ( x% y ) * 2 * y + + x% y +
y
y
y
3 (b )
pas
2
(
)
pas 1
pas
a
pas 2 ( b )
pas 3 ( a )
pas 2 ( c )
pas 3
pas 2
34
q0 , B = q1 , B , // Pas 1, x 0
B B
1 1
q1 , B = q1 , B ,
B B
0 0
q1 , B = q2 , B ,
B B
1 1
q2 , B = q3 , B , // y 0
B B
1 1
q3 , B = q3 , B , // copiem y
B 1
B B
q3 , B = q4 , B ,
B B
1 1
q4 , B = q4 , B , // verificam y 1
1 1
0 0
q4 , B = q5 , B ,
1 1
1 1
1 1
q6 , B = q6 , B , // Pas 2
1 1
35
B
B
q9 , B = q10 , B ,
B
B
B
B
1 1
1 1
q7 , B = q7 , B ,
1 1
1 1
q7 , B = q6 , B , // reluam pas 2
B B
B
B
q11 , B = q12 , 3 ,
B
B
B B
q6 , B = q8 , 3 , // Pas 3 (b)
1 1
B B
q8 , B = q8 , 1 , // 1 pt. rest
1 1
B B
q8 , B = q9 , 1 , // 1 in plus la rest
B B
B
B
B
B
B
B
B
B
B
B
q10 , 3 = q10 , 3 ,
B
B
B B
q9 , B = q9 , B ,
1 1
B
B
B
B
Complexitatea spaiu:
Avem numerele iniiale, cele dou rezultate i copia lui y.
Rezult C.S. = x+2*y + x/y + x%y.
Complexitatea timp:
x
x
Total: x + 2 * y + *
y +
y + x% y + y +
3 + x% y +
y
pas 3( c )
pas 1
pas 3( b )
pas 2 pas 3( a )
pas 4
Ctul i restul sunt numere mai mici sau egale dect x, rezult C.T. = O(x+y).
Obs: Pentru y = 0, maina se blocheaz n starea q 4 pentru c gsete B n loc de 1 pe
banda a treia.
Pentru x < y, maina funcioneaz corect i calculeaz ctul x/y = 0 i restul x%y = x
(inclusiv pentru x = 0).
36
37
~ Seminar 4 ~
Problema 8
S se accepte cuvintele din limbajul L = {w {a, b, c}* , | w |a =| w |b =| w |c > 0} .
Rezolvarea (A)
De exemplu iniial banda mainii Turing arat aa:
... B a c b c c a b a b B ...
La final, banda va arta astfel:
... B a c b c c a b a b B ...
Ideea de rezolvare:
Ct timp este posibil, cutm n aceast ordine un a, un b i un c pe care s-i marcm, iar
dac atunci cnd toi de a sunt marcai i toi de b i toi de c sunt marcai, acceptm
intrarea.
Pas 1. Ne deplasm dreapta (srind a, b, b, c i c) pn la primul a, l marcm cu a, ne
deplasm stnga (srind a, b, c i c) pn la b sau B, pas dreapta.
38
39
Rezolvarea (B)
Enun: S se accepte cuvintele din limbajul L = {w {a, b, c}* , | w |a =| w |b =| w |c > 0} .
Ideea de rezolvare:
Pas 1. Ct timp este posibil, ncercm s formm perechi de cte un a, un b i un c,
indiferent de ordinea n care i gsim nemarcai pe band. Folosim la stri indici formai
din literele din pereche care nu au fost gsite i marcate nc. Deci starea iniial va fi
q abc , iar pe msur ce gsim cte o liter, aceasta va disprea de la indice. Dac n q abc nu
mai gsim nicio liter nemarcat (dm de B-ul) din dreapta benzii, mergem la pasul 3.
Pas 2. Cnd am gsit i marcat toate 3 literele dintr-o pereche, trecem n starea q st i
parcurgem toat banda spre stnga pn la B, apoi pas dreapta i revenim la pasul 1 i n
q abc pentru a forma o nou pereche.
Pas 3. Parcurgem toat banda spre stnga demarcnd-o i de asemenea verificm ca ea s
nu fie vid (pentru a nu accepta cuvntul vid).
(qabc , d ) = (qabc , d , ), d {a' , b' , c'}// Pas 1
(qab , g ) = (qab , g , ), g {a' , b' , c' , c}
(qabc , a ) = (qbc , a' , )
(qab , a ) = (qb , a' , )
(qabc , b ) = (qac , b' , )
(qab , b ) = (qa , b' , )
(qabc , c ) = (qab , c' , )
(qc , h ) = (qc , h, ), h {a' , b' , c' , a, b}
(qbc , e ) = (qbc , e, ), e {a' , b' , c' , a}
(qc , c ) = (qst , c' ,)
(qbc , b ) = (qc , b' , )
(qb , i ) = (qb , i, ), i {a' , b' , c' , a, c}
(qbc , c ) = (qb , c' , )
(qb , b ) = (qst , b' ,)
(qac , f ) = (qac , f , ), f {a' , b' , c' , b}
(qa , j ) = (qa , j , ), j {a' , b' , c' , b, c}
(qac , a ) = (qc , a' , )
(qa , a ) = (qst , a' ,)
(qac , c ) = (qa , c' , )
40
Complexitatea spaiu:
Avem cuvntul iniial i nu scriem nimic n plus. Rezult C.S. = |w| a +|w| b +|w| c = |w|.
Complexitatea timp:
Pas1 + Pas2: Se revine la pasul 1 de min{|w| a , |w| b , |w| c } ori, iar pentru a marca un a, un
b i un c ne deplasm maxim lungimea benzii dus-ntors: min{|w| a , |w| b , |w| c } * 2 * |w|.
Pas 3: Parcurgem maxim ntreaga band de la dreapta spre stnga. Rezult maxim |w|.
Total: min{|w| a , |w| b , |w| c } * 2 * |w| + |w| => C.T. = O(|w|2).
Aceeai soluie, sub form de graf:
(pentru marcarea a-urilor am folosit x, pentru marcarea b-urilor am folosit y, iar pentru
marcarea c-urilor am folosit z)
41
B a
B B
B B
q0 , = q1 , , , q0 , = q1 , , , q0 , = q1 , ,
B
B
B
b
B
B
B B
B B
B c
a a
b b
c c
B a
B B
B B
q1 , = q1 , , , q1 , = q1 , , , q1 , = q1 , ,
B
B
B
b
B
B
B B
B B
B c
B B
B B
B B
a
a
B B
B B
q1 , = q2 , , , q2 , = q2 , , , q2 , = q3 , ,
B
b
b
B
B
B
B B
c
c
B B
c c
b b
a a
B B
B B
B B
q3 , = q3 , , , q3 , = q3 , , , q3 , = q3 , ,
B
B
B
B
B
B
B B
B B
B B
B B
B B
q3 , = q4 , , , F = {q4 }
B
B
B B
// Pas 1
// Pas 2
// Pas 3
Complexitatea spaiu:
Avem cuvntul iniial i copia lui. Rezult C.S. = |w| + |w| a +|w| b +|w| c = 2*|w|.
Complexitatea timp:
(Pas1) |w| + (Pas2) min{|w| a , |w| b , |w| c } + (Pas3) |w| => C.T. = O(|w|).
42
Problema 9
S se accepte numerele x de forma 2k, k numr natural.
Rezolvarea (A) (cu mpriri)
Fie x = 8 (reprezentat prin 9 de 1). Iniial banda mainii Turing arat aa:
... B 1 1 1 1 1 1 1 1 1 B ...
La final, banda va arta astfel:
... B 1 1 1 1 1 1 1 1 1 B ...
Ideea de rezolvare:
Exceptnd 1-ul n plus, la fiecare pas vom marca jumtate din numr, deci practic vom
face mprire repetat la 2, partea nemarcat rmas fiind ctul mpririi. Dac la fiecare
pas avem un numr par (deci putem s continum mprirea exact la 2), iar la final
avem ctul 1, atunci numrul este acceptat.
Pas 1. Marcm primul 1 din numr (cel n plus) i facem un pas dreapta.
(q0 ,1) = (11 ,1' , )
Pas 2. Parcurgem toat banda de la stnga la dreapta (srind 1-urile deja marcate), iar
pentru fiecare doi de 1 nemarcai, pe primul l marcm pe al doilea l srim.
(q1 ,1' ) = (q1 ,1' , ) // sarim ce era marcat
43
44
Complexitatea spaiu:
Avem numrul iniial i nu scriem nimic n plus. Rezult C.S. = x.
Complexitatea timp:
Pas 1(b): Facem 5 pai (2 dreapta, 2 stnga, 1 dreapta).
Pas 2, 3(a): Revenim la pasul 2 de cte ori putem dubla numrul curent fr s-l depim
pe x, adic de log 2 x ori. Pentru a dubla un numr curent k, pentru fiecare unitate din k ne
deplasm dus-ntors k csue pe band; rezult complexitatea dublrii lui k este 2*k2, iar
n cel mai ru caz k = x/2, adic ultima dublare are 2*(x/2)2 pai.
Pas 3(b): Parcurgem spre dreapta tot numrul dublat anterior, adic n cel mai ru caz
aproximativ x pai.
Pas 4(b): Parcurgem spre stnga tot numrul dublat anterior, adic tot x pai.
45
x +
x +
x => C.T. = O(x2 * log x).
5 + log 2 x * 2 * +
Total:
pas 1
pas 2, 3( a )
46
q0 , = q1 , , // Pas 1
B B
q5 , = q6 , ,
B
B
1'
1'
1' 1'
q6 , = q6 , , // Pas 3 (a)
1 1
1 1'
q6 , = q6 , , // Pas 3 (b)
1 1
q6 , = q7 , , // Pas 4 (a)
B
B
q1 , = q 2 , ,
B B
q 2 , = q3 , , // Pas 1 (a)
B B
q3 , = q3 , ,
B B
q3 , = q 4 , , , F = {q 4 }
B
B
1 1
q 2 , = q5 , , // Pas 1 (b)
B B
1' 1'
q5 , = q5 , , // Pas 2 (a)
1 1
1'
1'
q5 , = q5 , , // Pas 2 (b)
B
1
B B
q7 , = q7 , ,
1 1
q7 , = q3 , ,
B B
q6 , = q5 , , // Pas 4 (b), reluam pas 2
B
B
Complexitatea spaiu:
Avem numrul iniial i scriem n plus 2k care este maxim x-1. Rezult C.S. = 2*x.
Complexitatea timp:
Pas 1(b): Facem 3 pai (2 dreapta, 1 stnga).
47
x 1
x 1
Total:
+ 4*
+
3 + log 2 x * 2 *
1 + ( x 1) + x => C.T. = O(x*log x).
2
2
pas 4 (b )
pas 1
pas 4 ( a )
pas 3
pas 2
Problema 10
Se d un numr n baza 1. S se transforme n baza 2.
Rezolvarea (A) (cu resturi)
Fie x = 10 (10) = 1010 (2) . Iniial banda mainii Turing conine numrul x n baza 1 (10
reprezentat prin 11 de 1), apoi vom aduga la dreapta delimitatorul 2 i scrierea
numrului x n binar.
... B 1 1 1 1 1 1 1 1 1 1 1 B ...
nainte de pasul 4, banda va arta astfel:
... B 1 1 1 1 1 1 1 1 1 1 1 2 z u z u B ...
La final, banda va arta astfel:
... B 1 1 1 1 1 1 1 1 1 1 1 2 1 0 1 0 B ...
Pas 1. (a) Marcm primul 1 din x cu 1.
(b) Srind toi 1, parcurgem integral spre dreapta x-ul, iar pentru fiecare doi de 1, pe
primul l marcm cu 1, iar pe al doilea l srim, folosind dou stri. Dac avem deja 2-ul
pe band, l srim (iar dac dm de B, scriem 2).
Pas 2. (a) Dac am ajuns la 2 (sau B-ul unde am scris apoi 2) n starea n care trebuia s
marcm primul 1 din pereche (nseamn c numrul curent este par, deci restul mpririi
la 2 este 0), mergem dreapta pn la B (srind toi de z i u), scriem pe band z
(reprezentnd restul 0), apoi mergem la pasul 3.
48
49
Complexitatea spaiu:
Avem numrul iniial i pentru scrierea lui n baza 2 avem nevoie de maxim log 2 x csue.
Rezult C.S. = x + log x.
Complexitatea timp:
Revenim la pasul 1(b) pentru fiecare rest care trebuie calculat (adic de maxim log 2 x ori),
iar la fiecare aplicare a lui parcurgem integral numrul x.
La o aplicare a pasului 2(a) sau 2(b) parcurgem maxim log 2 x csue pe band.
50
log ( x )
log 2 ( x )
2
+ x
x + log 2 ( x ) + (log 2 ( x ) + x ) +
log 2 ( x ) *
* 2 * log 2 ( x ) +
2
2
pas 1(b ) pas 2 ( a ) sau (b )
pas 4 ( a ) sau (b )
pas 3
si pas 5 ( a ) sau (b )
pas 4 ( c ) sau 5 ( c )
Rezult C.T. = O(x * log x).
Aceeai soluie, sub form de graf:
(pentru marcare cu 1 am folosit x, iar pentru 1 am folosit y)
51
1'
1'
1'
q1 , = q 2 , , // marcam primul 1
B B
q 2 , = q 2 , , // sarim 1 urile marcate anterior
B B
q 2 , = q1 , , // sarim al doilea 1 si reluam
B B
Pas 3(a). Dac pe prima band citim B n starea n care trebuia s marcm primul 1,
nseamn c am obinut restul 0, deci pe a doua band scriem 0 i facem un pas stnga
(pentru a scrie urmtorul rest pe care l vom obine), iar pe prima band facem un pas
stnga pentru a ne poziiona pe ultima cifr din numr (1 marcat sau nemarcat). Mergem
la pas 4.
B B
q1 , = q3 , ,
B 0
Pas 3(b). Dac pe prima band citim B n starea n care trebuia s srim al doilea 1,
nseamn c am obinut restul 1, deci pe a doua band scriem 1 i facem un pas stnga
(pentru a scrie urmtorul rest pe care l vom obine), iar pe prima band facem un pas
stnga pentru a ne poziiona pe ultima cifr din numr (1 marcat sau nemarcat). Mergem
la pas 4.
B B
q 2 , = q3 , ,
B 1
Pas 4. Pe a doua band staionm (citim B, scriem B n loc), iar pe prima band vrem s
ne ntoarcem stnga pn la nceputul numrului (pn la 1) apoi s facem un pas
dreapta. Ct timp parcurgem 1-uri marcate pstrm starea, iar la primul 1 nemarcat
ntlnit schimbm starea (pentru a ti c nu s-a terminat calculul), apoi n noua stare
parcurgem n continuare spre stnga toate 1-urile marcate i nemarcate, apoi relum pasul
2. Dac tot numrul este marcat (ajungem la 1 fr s fi gsit vreun 1 nemarcat),
nseamn c s-a terminat calculul i mergem n starea final.
52
1'
1'
1' '
1' '
1' '
q3 , = q3 , ,
B B
q3 , = q4 , , // am gasit 1 nemarcat
B B
1'
1'
q4 , = q4 , , ; q4 , = q4 , ,
B B
B B
q4 , = q1 , , // reluam pasul 2
B B
q5 , = q6 , ,
B B
q6 , = q6 , ,
B B
q6 , = q7 , , , F = {q7 }
B
B
Complexitatea spaiu:
Avem numrul iniial x i scriem rezultatul care ocup maxim log 2 x.
Rezult C.S. = x + log 2 x.
Complexitatea timp:
Pas 1: Se execut o singur dat i ne deplasm o poziie. Rezult 1.
Pas 2: Se repet pentru fiecare caracter scris pe a doua band, deci de maxim log 2 x ori.
De fiecare dat parcurgem de la stnga la dreapta tot numrul x. Rezult x * log 2 x.
Pas 3: Se repet tot de log 2 x ori, dar ne deplasm cu o singur poziie. Rezult log 2 x.
Pas 4: Se repet de log 2 x ori i de fiecare dat parcurgem de la dreapta spre stnga tot
numrul x. Rezult x * log 2 x.
Pas 5: Parcurgem dus-ntors x-ul. Rezult 2*x pai.
Total:
1 +
* x Rezult C.T. = O(x * log x).
1 + log 2 ( x) *
x +
x + 2
5
pas
pas 1
pas 2 pas 3 pas 4
53
54
)
)
(
(
)
)
(
(
Total:
x + x + x * x + log 2 x + log 2 x +
x
1 + log 2 x + log 2 x + x +
pasii 1+ 2
pas
b
pas
4
(
)
3( b )
pas
a
pas
a
pas
c
pas
3
(
)
4
(
)
4
(
)
2
55
1'
q4 , = q4 , ,
B B
1' '
q4 , = q5 , ,
B
B
q5 , = q5 , ,
1
1
B B
q5 , = q6 , , , F = {q6 }
B B
Complexitatea spaiu:
Avem numrul iniial x i scriem rezultatul care ocup maxim log 2 x.
Rezult C.S. = x + log 2 x.
Complexitatea timp:
Pas 1: Se execut o singur dat i ne deplasm o poziie. Rezult 1.
Pas 2. Se repet de x ori i ne deplasm cte o poziie. Rezult x.
Pas 3. Se repet de x ori i parcurgem de la dreapta la stnga maxim tot rezultatul.
Rezult x * log 2 x.
Pas 4. Se repet de x ori i parcurgem de la stnga la dreapta maxim tot rezultatul.
Rezult x * log 2 x.
Total: C.T. = O(x * log x).
56
(*) Problema 11
Se dau dou numere naturale x i y. S se calculeze ridicarea la putere (y^x).
Fie x = 3, y = 2 (reprezentate prin 4, respectiv 3 de 1). Iniial banda arat aa:
... B 1 1 1 1 0 1 1 1 B ...
La final, banda va arta astfel:
... B 1 1 1 1 0 1 1 1 2 1 1 1 1 1 1 1 1 1
B ...
Ideea de rezolvare:
Dup delimitatorul 2, vom calcula pe rnd, pe msur ce marcm cte un 1 din x,
produsul dintre y i rezultatul parial calculat anterior (y la o putere mai mic). Nu vrem
s concatenm rezultatele intermediare, ci vrem s scriem noul rezultat parial astfel nct
s folosim i 1-urile scrise deja pentru rezultatul parial calculat la pasul anterior i s
adugm doar attea cte sunt necesare pn la rezultatul curent.
Deci la un pas oarecare vrem s calculm yk, dar avem deja scris yk-1, deci trebuie s
adugm doar diferena dintre ele, adic yk yk-1 = yk-1 * (y-1). Deci practic trebuie s
nmulim fostul rezultat parial (yk-1) aflat dup delimitatorul 2 cu numrul y-1 pe care l
gsim ntre delimitatorii 0 i 2 (dar la nmulire eliminm un 1 pentru scrierea special n
baza 1 i nc un 1 pentru c trebuie s nmulim doar cu y-1, nu cu tot y, deci vom marca
cu 1 primii doi de 1 din y).
Pas 1. Marcm doi de 1 din x cu 1 (unul pentru scrierea special n baza 1 i cellalt
pentru c la finalul pasului vom fi calculat deja y1), ne deplasm la dreapta (srim x-ul
nemarcat, schimbm starea pentru 0), copiem tot y-ul dintre 0 i 2 la finalul benzii (deci
am calculat y1) dup ce scriem delimitatorul 2. Pas dreapta i marcm cu 1 primul 1 din
rezultatul parial (copia lui y din dreapta lui 2), acesta fiind 1-ul n plus pentru rezultatul
final i nu trebuie folosit la nmuliri. Ne deplasm stnga i demarcm tot y-ul dintre 0 i
2 (care era marcat n urma copierii) i marcm cu 1 primii doi de 1 din y din dreapta lui
57
58
59
60
pas1
x 1
x
x 1
x 1
x
+ x * x + y * y + y * y y
+ y + y + 2* y + y + x + 2* x + y + yx
pas 4 ( b )
pas 3 ( b )
pas 2 ( b )
4 (a)
pas
3 (a)
pas
) (
) (
pas 2 ( a )
Funcia dominant este x*y*y *yx (pentru c paranteza de la pasul 4(a) < yx)
=> Rezult C. T. = O(x * y2x).
x-1
61
~ Seminar 5 ~
Problema 12
Se d un numr natural x. S se calculeze
x .
B 1
B B B B B B B B
y 0,1,2,3,..., x
Ideea de rezolvare:
Pas 1. Pe prima band transformm primul 1 n 1 i facem un pas dreapta, iar pe a doua
band adugm un 1 i stm pe loc.
Pas 2(a). Dac dm de 1 pe prima band, atunci vom calcula ptratul numrului de pe B2
prin parcurgerea unitilor din B1 (pentru a testa dac y2 a ajuns la valoarea lui x).
Pas (*). Pentru fiecare 1 nemarcat din B2, l marcm cu 1, mergem pe B2 n stnga pn
la B (srind toi 1), un pas dreapta, apoi parcurgem simultan B1 i B2.
(*a) Dac ntlnim B doar pe B2, mergem la pasul 3.
(*b) Dac ntlnim B doar pe B1, mergem la pasul 4.
(*c) Dac ntlnim B simultan pe B1 i pe B2, facem un pas stnga pe B2 pentru a
verifica dac acea band este complet marcat. (*i) Dac da (avem fix y2 = x), adugm
un 1 n plus pe B2 (cel n plus de la scrierea n unar), apoi mergem la pasul 5. (*ii) Dac
nu, mergem la pasul 4.
Pas 3. Pe B2 mergem stnga (srim toi de 1) pn la 1, un pas dreapta, relum pasul (*).
Pas 4. Pe B2 mergem dreapta pn la B, apoi mergem la pasul 5. (Ptratul numrului
curent de pe B2 este strict mai mare dect x, deci ar trebui s scdem o unitate pentru a
avea partea ntreag inferioar a radicalului, dar pstrm acel 1 ca fiind cel n plus la
scrierea special n unar.)
Pas 5. Mergem stnga pn la nceputul ambelor benzi demarcnd tot i trecem n stare
final.
Pas (**). Cnd B2 este complet marcat (adic s-a terminat for-ul de la pasul (*)),
adugm un 1 pe B2, demarcm spre stnga tot B2. Pe B1 mergem stnga pn la 1, pas
dreapta pe ambele benzi i relum pasul 2(a).
Pas 2(b). Dac dm de B pe prima band (am avut x=0), atunci demarcm 1 de pe
prima band i mergem n starea final (rspunsul de pe a doua band este tot 0,
reprezentat printr-un 1).
62
1 1' '
q 0 , = q1 , , // Pas 1
B 1
1 1
q1 , = q 2 , , // Pas 2(a), (*)
1 1'
1 1
q 2 , = q 2 , ,
1' 1'
1 1
q 2 , = q3 , ,
B B
1
1
q3 , = q3 , , , m {1' ,1}
m m
q3 , = q8 , , // Pas (*c)
B
B
1 1
q6 , = q6 , ,
B B
1
1' '
q6 , = q7 , , , F = {q7 }
B B
B B
q8 , = q9 , , // Pas (*i )
1' 1'
B B
q9 , = q6 , ,
B 1
B B
q8 , = q5 , , // Pas (*ii )
1 1
q3 , = q 4 , , // Pas (*a)
B
B
q 4 , = q 4 , , // Pas 3
1
1
1 1
q 4 , = q1 , , // reluam (*)
1' 1'
1
1
q10 , = q10 , ,
1'
1
1
1
q10 , = q10 , ,
B
B
B B
q5 , = q5 , , , m {1' ,1}// Pas 4
m m
B B
q5 , = q 6 , ,
B B
1' '
1' '
B B
q1 , = q6 , , // Pas 2 (b)
1 1
Complexitatea spaiu:
Avem numrul iniial i rezultatul calculat. Rezult C.S. = x + x .
Complexitatea timp:
Pentru a nmuli numrul y de pe B2 cu el nsui (fr a-l avea copiat i altundeva) i a
pune rezultatul pe o alt band (aici parcurgere pe B1, n loc de scriere) complexitatea
este y2 (pentru c de y ori parcurgem dus-ntors tot y-ul) .
Cea mai mare valoare pe care o ia y este aproximativ x , deci pentru a-l ridica la ptrat
o singur dat avem complexitatea ( x )2 = x. Dar avem aproximativ x ncercri pn
y ajunge la valoarea final.
Rezult n total C.T. = x x .
63
B 1
[1 + 2 * (k 1)]
k =1
B 1
B B B B B B B B
y 1,2,3,...,
x}
Ideea de rezolvare: Orice numr ptrat perfect k2 poate fi scris ca suma primelor k
numere impare: k 2 = 1 + 3 + 5 + ... + (2 * k 1) .
numere
Deci ct timp este posibil, vom scdea din X primele numere impare i de fiecare dat
vom incrementa rezultatul de pe B2. Acest numr de pe B2 va ajunge chiar x .
Pas 1. Pe B1 srim spre dreapta peste primul 1 din x (cel n plus de la scrierea n unar) i
scriem un 1 pe B2 (primul numr impar).
Pas 2. (Parcurgem n x numrul impar curent: 2*k1) Pentru primul 1 de pe B2, dac
avem 1 pe B1 facem un pas dreapta pe ambele benzi. Apoi ct timp citim 1 pe ambele
benzi, avem circuit ntre dou stri, n una facem pas dreapta doar pe B1, iar n cealalt
facem pas dreapta pe ambele benzi.
64
q0 , = q1 , , // Pas 1
B 1
1 // Pas 2; adunam
1 + 2 * ( y 1)
q1 , = q 2 , ,
1
1
1 1
q 2 , = q3 , ,
1 1
1 1
q3 , = q 2 , ,
1 1
1 // Pas 3; < x,
incrementam y
q 2 , = q 4 , ,
1
B
1 1
q 4 , = q 4 , ,
1 1
1 1
q 4 , = q1 , , // reluam pas 2
B B
B // Pas 4(a );
>x
B // Pas 4(b);
= x ( p. p.)
B // Pas 4(c);
x=0
q 2 , = q5 , ,
1 1
q3 , = q5 , ,
1 1
q 2 , = q5 , ,
B 1
q1 , = q6 , ,
1 1
1
q5 , = q5 , , // Pas 5
1
1
1 1
q5 , = q5 , ,
B B
B B
q5 , = q6 , , , F = {q6 }
B B
Complexitatea spaiu:
Avem numrul iniial i rezultatul calculat. Rezult C.S. = x + x .
Complexitatea timp:
Pe B1 o parcurgem o singur dat integral de la stnga la dreapta pe msur ce cuprindem
n x numerele impare (pasul 2), iar n acest timp pe B2 o parcurgem dus-ntors pentru
fiecare dintre numerele impare, deci n total pe B2 facem aproximativ 2*x pai.
Iar apoi la pasul 5 le parcurgem integral spre stnga, deci facem aproximativ x + x pai.
Rezult C.T. = O(X).
65
Problema 13
Se dau x i y nr. nat. S se calculeze cmmdc(x,y).
Rezolvarea (A) (cu alg. Euclid cu resturi) [pe 3 benzi]
// TO DO
Problema 14
Se d x nr. nat. S se accepte dac este numr prim.
Rezolvarea (A) (cu divizori de la 2 la x/2) [pe 2 benzi]
// TO DO
// TO DO
66
~ Seminar 6 ~
(Programe standard)
Instruciuni posibile :
V V
V V +1
V 1 , dac V 1
=
0 , dac V = 0
IF V 0 GOTO L
V V 1
Problema 1 : Y X
1
2
3
4
5
6
7
8
9
10
IF X 0 GOTO L1
Z0 Z0 + 1
IF Z 0 0 GOTO E
[L1 ]: Y Y + 1
GOTO E
(macroinstructiune)
X X 1
Z1 Z1 + 1
IF X 0 GOTO L1
[L2 ]: X X + 1
Z1 Z1 1
IF Z1 0 GOTO L2
Fiecare unitate din numrul X o mutm n Y (ct timp X este nenul, l decrementm pe X
i l incrementm pe Y). Vrem ca la ieirea din program variabilele de intrare s nu i
67
Problema 2 : Y X 1 + X 2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
IF X 1 0 GOTO L1
GOTO L2
[L1 ]: Y Y + 1
X 1 X 1 1
Z1 Z1 + 1
IF X 1 0 GOTO L1
[L3 ]: X 1 X 1 + 1
Z1 Z1 1
IF Z1 0 GOTO L3
[L2 ]: IF X 2 0 GOTO L4
GOTO E
[L4 ]: Y Y + 1
X 2 X 2 1
Z2 Z2 +1
IF X 2 0 GOTO L4
[L5 ]: X 2 X 2 + 1
Z 2 Z 2 1
IF Z 2 0 GOTO L5
68
Problema 3 : Y X 1 * X 2
1
IF X 1 0 GOTO L1
GOTO E
[L1 ]: IF X 2 0 GOTO L2
3
5
GOTO E
[L2 ]: X 1 X 1 1
Z1 Z1 + 1
[L3 ]: Y Y + 1
X 2 X 2 1
Z2 Z2 +1
10
IF X 2 0 GOTO L3
11
[L4 ]: X 2 X 2 + 1
12
Z 2 Z 2 1
13
IF Z 2 0 GOTO L4
14
IF X 1 0 GOTO L2
15
[L5 ]: X 1 X 1 + 1
16
Z1 Z1 1
17
IF Z1 0 GOTO L5
Problema 4 : Y f = ( X 1 , X 2 ) =
1
2
3
4
[L0 ]: IF X 1 0 GOTO L1
IF X 2 0 GOTO L2
// X 1 = 0, X 2 0
Y Y +1
GOTO L2 // X 1 = 0, X 2 = 0
[L1 ]: IF X 2 0 GOTO L3
GOTO L2
7
8
9
10
11
12
13
14
15
16
// X 1 0, X 2 0
// X 1 0, X 2 = 0
[L3 ]: X 1 X 1 1
X 2 X 2 1
Z Z +1
GOTO L0
[L2 ]: IF Z 0 GOTO L4
GOTO E
[L4 ]: X 1 X 1 + 1
X 2 X 2 +1
Z Z 1
IF Z 0 GOTO L4
70
Problema 5 : Y f2 ( X ) =
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[L0 ] : IF
X 0 GOTO L1
Y Y +1
GOTO L2
// X par
[L1 ] : X X 1
Z Z +1
IF X 0 GOTO L3
GOTO L2
[L3 ] : X X 1
// X impar
Z Z +1
GOTO L0
[L2 ] : IF Z 0 GOTO L4
GOTO E
[L4 ] : X X + 1
Z Z 1
IF Z 0 GOTO L4
71
Problema 6 : Y f < ( X 1 , X 2 ) =
[L0 ] : IF
X 2 0 GOTO L1
GOTO L2
[L1 ] : IF
// X 1 X 2
X 1 0 GOTO L3
// X 1 0, X 2 0
Y Y +1
GOTO L2 // X 1 < X 2
[L3 ] : X 1 X 1 1
X 2 X 2 1
Z Z +1
GOTO L0
7
8
9
10
11
12
13
[L2 ] : IF Z 0 GOTO L4
14
15
Z Z 1
IF Z 0 GOTO L4
GOTO E
[L4 ] : X 1 X 1 + 1
X2 X2 +1
72
Problema 7 : Y f ( X 1 , X 2 ) =
[L0 ] : IF X 1 0 GOTO L1
2
3
4
5
6
Y Y +1
GOTO L2 // X 1 X 2
7
8
9
10
11
12
13
14
15
X 2 X 2 1
Z Z +1
GOTO L0
[L1 ] : IF X 2 0 GOTO L3
GOTO L2
// X 1 0, X 2 0
// X 1 > X 2
[L3 ] : X 1 X 1 1
[L2 ] : IF Z 0 GOTO L4
GOTO E
[L4 ] : X 1 X 1 + 1
X 2 X 2 +1
Z Z 1
IF Z 0 GOTO L4
73
Problema 8 : Y X 1 X 2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[L0 ] : IF
X 1 0 GOTO L1
IF X 2 0 GOTO L2
// X 1 = 0, X 2 0, Y X 2 X 1
GOTO L3
// X 1 = 0, X 2 = 0, Y 0
[L1 ] : IF
X 2 0 GOTO L4
GOTO L5
[L4 ] : X 1 X 1 1
// X 1 0, X 2 0
// X 1 0, X 2 = 0, Y X 1 X 2
X 2 X 2 1
Z0 Z0 + 1
GOTO L0
[L2 ] : Y Y + 1
X 2 X 2 1
Z2 Z2 + 1
IF X 2 0 GOTO L2
[L6 ] : X 2 X 2 + 1
Z 2 Z 2 1
IF Z 2 0 GOTO L6
GOTO L3
[L5 ] : Y Y + 1
X 1 X 1 1
Z1 Z1 + 1
IF X 1 0 GOTO L5
74
[L7 ] : X 1 X 1 + 1
Z1 Z1 1
IF Z1 0 GOTO L7
[L3 ] : IF Z 0 0 GOTO L8
GOTO E
[L8 ] : X 1 X 1 + 1
X2 X2 +1
Z 0 Z 0 1
IF Z 0 0 GOTO L8
75
~ Seminar 7 ~
Problema 9 : Y X 1 X
[ L ] : IF X 1 0 GOTO L2
1 1
IF X 2 0 GOTO E
2
GOTO L1
3
4 [ L2 ] : IF X 2 0 GOTO L3
Y Y +1
5
GOTO E
6
7 [ L3 ] : Z 0 Z 0 + 1
// 0 X 2 = 0
// pentru 0 0 cicleaza
// X 1 0, X 2 0
// X 1 = 1
0
// puterea anterioara
// De X 2 ori ...
8 [ L4 ] : X 2 X 2 1
Z2 Z2 + 1
9
10
[ L5 ] : X 1 X 1 1
// ... Y devine Z 0 * X 1 ...
11
Z1 Z1 + 1
12
[ L6 ] : Y Y + 1
// (de X 1 ori adaugam Z 0 la Y )
13
Z 0 Z 0 1
14
Z3 Z3 + 1
15
IF Z 0 0 GOTO L6
16
17
18
19
20
21
22
23
24
25
26
IF X 1 0 GOTO L7
Z3 0
[ L0 ] : Z 3 Z 3 1
IF Z 3 0 GOTO L0
GOTO L8
[ L7 ] : Z 0 Z 0 + 1
// " reparam" L6
Z 3 Z 3 1
IF Z 3 0 GOTO L7
IF X 1 0 GOTO L5
[ L8 ] : X 1 X 1 + 1
// " reparam" L5
Z1 Z1 1
IF Z1 0 GOTO L8
76
27
28
29
GOTO L10
[ L9 ] : Z 0 Z 0 + 1
Y Y 1
IF Y 0 GOTO L9
30
31
32
IF X 2 0 GOTO L4
[ L10 ] : X 2 X 2 + 1
33
34
35
// " reparam" L4
Z 2 Z 2 1
IF Z 2 0 GOTO L10
prima
inmultire
a 2 a
inmultire
a 3 a
inmultire
a X 2 a
inmultire
Obs: Dac n loc s scriem explicit pentru fiecare nmulire complexitatea obinut i apoi
s pstrm funcia cea mai mare, am fi aproximat toate nmulirile cu cazul cel mai ru i
am fi nmulit acea funcie cu numrul de reveniri la eticheta L 4 , atunci am fi obinut
X
C.T . = O X 2 * X 1 2 . Funcia de mai sus reprezint ns o aproximare mai exact (fa de
cea de aici, de la observaie) a numrului propriu-zis de pai fcui de program.
Problema 10 : Y1 X 1 / X 2 , Y2 = X 1 % X 2
1
2
3
4
5
[L0 ]: IF X 2 0 GOTO L1
GOTO L0
// ciclam
[L1 ]: IF X 1 0 GOTO L2
GOTO E
[L2 ]: Y2 X 1
// Y1 = Y2 = 0
7
8
9
Y1 Y1 + 1
10
GOTO L3
Y2 Y2 X 2
77
Problema 11 : Y X ! ( factorial )
1
2
3
4
5
6
7
8
Y Y +1
IF X 0 GOTO L1
GOTO E // 0! = 1
[L1 ] : Z1 X
[L2 ] : Z 2 Y * Z1
Y Z2
Z1 Z1 1
IF Z1 0 GOTO L2
Rezult
X + 2*
X + X * ( X 1) + X * ( X 1) * ( X 2 ) + ... + X * ( X 1) * ... * 2 * 1 .
L1
prima
inmultire
a inmultire
a 2 a inmultire
a 3 a inmultire
aX
L2
78
OBS: Orice ptrat perfect k2 poate fi scris ca suma primelor k numere impare.
k 2 = 1 + 3 + 5 + ... + (2 * k 1)
1
2
3
4
5
6
7
8
9
10
11
12
13
numere
Y Y +1
IF X 0 GOTO L1
GOTO E // 0 = p. p.
[L1 ] : Z1 X
Z0 Z0 + 1
// nr. impar
Y Y
1
[L2 ] : Z 2 f < (Z1 , Z 0 )
IF Z 2 0 GOTO E
// X p. p.
Z1 Z1
Z0
// pb.16 din SE 8
Z0 Z0 + 1
Z0 Z0 + 1
IF Z1 0 GOTO L2
Y Y +1
// X = p. p.
79
(*) Problema 13 : Y X
Folosim tot observaia de la problema anterioar, care zicea c suma primelor k numere
impare este egal cu k2.
1
2
3
4
5
6
7
8
9
10
11
IF X 0 GOTO L1
GOTO E // 0 = 0
[L1 ] : Z1 X
Z 0 Z 0 + 1 // nr. impar
IF Z 2 0 GOTO E
Z1 Z1 Z 0
Z0 Z0 + 1
Z0 Z0 + 1
Y Y +1
IF Z1 0 GOTO L2
La fel ca la programul anterior, i facem o copie lui X (eticheta L 1 ), apoi ct timp este
posibil (eticheta L 2 ) scdem din acea copie primele numere impare, dar la fiecare scdere
fcut incrementm Y (rndul 10) pentru a numra cte numere impare am sczut.
Suma acelor numere impare reprezint de fapt cel mai mare ptrat perfect mai mic sau
egal cu X. Deci Y va fi chiar X .
Complexitatea timp:
Analog cu problema anterioar, complexitatea pentru copierea lui X este X, cea pentru
toate comparrile este X, iar cea pentru toate scderile este tot X. Rezult C.T. = O(X).
80
0
0
1
1
2
1
3
2
4
3
5
5
6
8
7
13
Z0 X
IF Z 0 0 GOTO L1
GOTO E
[L1 ] : Z 2 Z 2 + 1 // Z1 = 0, Z 2 = 1
4
5
6
Z 0 Z 0 1
[L2 ] : Z 0 Z 0 1
7
8
Y Z1 + Z 2
GOTO E
10
11
12
IF Z 0 0 GOTO L3
[L3 ] : Z1 Z 2
Z2 Y
GOTO L2
81
Problema 15 : Y palindrom ( X ) =
1
2
3
4
5
6
7
8
9
10
11
Z 0 10
Z1 X
[L1 ] : IF Z1 0 GOTO L2
GOTO L3
[L2 ] : Z 2 Z1 % Z 0
// ultima cifra
Z3 Z 4 * Z0
Z 4 Z3 + Z 2
// Z 4 = X R
Z 5 Z1 / Z 0
Z1 Z 5
GOTO L1
[L3 ] : Y f = ( X , Z 4 )
82
~ Seminar 8 ~
Y X , daca Y X
0, daca Y < X
Problema 16 : Y Y X =
1
2
3
4
5
6
7
8
9
IF X 0 GOTO L1
GOTO E
[L1 ]: Y Y 1
X X 1
Z Z +1
IF X 0 GOTO L1
[L2 ]: X X + 1
Z Z 1
IF Z 0 GOTO L2
(*) Problema 17 : Y Y + X
1
2
3
4
5
6
7
8
9
IF X 0 GOTO L1
GOTO E
[L1 ] : Y Y + 1
X X 1
Z Z +1
IF X 0 GOTO L1
[L2 ] : X X + 1
Z Z 1
IF Z 0 GOTO L2
Problema 18 : Y f ( X 1 , X 2 ) =
1
2
3
4
5
6
[L0 ]: IF X 2 0 GOTO L1
GOTO L0
// ciclam
[L1 ]: IF X 1 0 GOTO L2
Y Y +1
GOTO E // 0 X 2
[L2 ]: Z1 X 1
7
8
9
IF Z 2 0 GOTO E
// X 1 / X 2
Z1 Z1 X 2
IF Z1 0 GOTO L3
10
11
Y Y + 1 // X 1 X 2
Problema 19 : Y nr _ prim ( X ) =
1
2
3
4
5
6
7
8
9
Z 0 2 // divizorul posibil
Z1 X / Z 0
// jumatatea lui X
IF X 0 GOTO L1
GOTO E // 0 nr. prim
[L1 ]: X X 1
IF X 0 GOTO L2
X X +1
GOTO E // 1 nr. prim
[L2 ]: X X + 1
10
11
12
13
14
15
[L3 ]: Y Y + 1
Z 2 f < (Z1 , Z 0 )
IF Z 2 0 GOTO E
// X = nr. prim
Y Y 1
Z 3 f ( X , Z 0 )
IF Z 3 0 GOTO E
Z0 Z0 +1
16
17
GOTO L3
84
// X nr. prim
Problema 20 : Y nr _ perfect ( X ) =
Un numr este perfect dac este egal cu suma divizorilor si diferii de el nsui.
X = 6 => (div X) = 1 + 2 + 3 = 6 = X (este nr. perfect)
X = 10 => (div X) = 1 + 2 + 5 = 8 < X (nu este nr. perfect)
X = 28 => (div X) = 1 + 2 + 4 + 7 + 14 = 28 = X (este nr. perfect)
X = 36 => (div X) = 1 + 2 + 3 + 4 + 6 + 9 + 12 + 18 = 55 > X (nu este nr. perfect)
1
2
3
4
5
6
7
8
9
Z0 2
Z1 X / Z 0
// divizorul posibil
// X (div )
Z2 X
IF Z 2 0 GOTO L1
// 0 nr. perfect
GOTO E
[L1 ] : IF Z1 0 GOTO L2
GOTO L3
// divizorul = 0
[L2 ] : Z3 f ( X , Z1 )
IF Z 3 0 GOTO L4
10
11
12
13
14
15
16
17
[L5 ]: Z1 Z1 1
GOTO L1
[L4 ]: Z 4 f < (Z 2 , Z1 )
IF Z 4 0 GOTO E
// X < (div )
Z 2 Z 2 Z1
GOTO L5
[L3 ]: IF Z 2 0 GOTO E
Y Y +1
85
// X > (div )
// X = (div )
X X
X
X + 2 * X * + => C.T. = O(X2).
Rezult 2 * X + *
2 f
2
2
f
<
L2
L4
Problema 21 : Y log 2 ( X )
Rezolvarea (A) (cu nmuliri cu 2)
1
2
3
4
5
6
7
8
9
10
[L0 ] : IF X 0 GOTO L1
GOTO L0
[L1 ] : Z 0 2
// ciclam
Z1 Z1 + 1 // Z1 = 2Y
[L2 ] : Z3 Z1 * Z 0
Z1 Z 3
Y Y +1
Z 2 f (Z1 , X )
IF Z 2 0 GOTO L2
Y Y 1
86
[L0 ] : IF X 0 GOTO L1
GOTO L0
[L1 ] : Z 0 2
Z1 X
// ciclam
// Z1 = X / 2Y
[L2 ] : Z 2 Z1 / Z 0
Z1 Z 2
Y Y +1
IF Z1 0 GOTO L2
Y Y 1
87
Problema 22 : Y cmmmc( X 1 , X 2 )
1
2
3
4
5
6
7
8
IF X 1 0 GOTO L1
GOTO E
[L1 ] : IF X 2 0 GOTO L2
GOTO E
[L2 ] : Z 0 f < ( X 1 , X 2 )
IF Z 0 0 GOTO L3
Z1 X 2
Z2 X1
// Z1 Z 2
9
10
11
12
13
14
15
GOTO L4
[L3 ] : Z1 X 1
Z2 X 2
// Z1 < Z 2
[L4 ] : Y Y + Z 2 // Y = M Z
Z 3 f (Y , Z1 )
IF Z 3 0 GOTO E
GOTO L4
88
~ Seminar 9 ~
(Funcii recursive)
Funcii elementare
succesor: s ( x) = x + 1
constant: C k( n ) (x1 , ... , xn ) = k
proiecie: (kn ) (x1 , ... , xn ) = xk
Obs: - La funciile constant i proiecie, indicele de sus reprezint numrul de parametri
asupra crora va fi aplicat acea funcie.
- La funcia constant, indicele de jos reprezint constanta numeric pe care o va ntoarce
funcia ca rezultat (deci k poate fi orict, inclusiv mai mare dect n).
- La funcia proiecie, indicele de jos reprezint al ctelea parametru (x k ) va fi ntors ca
rezultat de ctre funcie (deci k n la funcia proiecie).
Operaii
Compunere
(a) f ( x) = h( g ( x))
(b) f ( x1 ,..., xn ) = h( g1 ( x1 ,..., xn ),..., g k ( x1 ,..., xn ))
Obs: - Toate funciile aflate cel mai n interiorul compunerilor (aici notate cu g, respectiv
g 1 , , g k ) trebuie s aib exact aceeai parametri (inclusiv n aceeai ordine) ca funcia f.
- Numrul de parametri al funciei h (notat aici cu k) poate s fie diferit de cel al funciei f
(notat aici cu n).
Recursivitate
f ( 0) = k
(a)
f (t + 1) = g (t , f (t ))
f ( x1 ,..., xn ,0) = h( x1 ,..., xn )
(b)
f ( x1 ,..., xn , t + 1) = g ( x1 ,..., xn , t , f ( x1 ,..., xn , t ))
Obs: - Recursivitatea se face dup un singur parametru pe care l nlocuim cu 0 la pasul
de oprire i cu t+1 la pasul recursiv (restul parametrilor nu se modific).
89
Minimizare nemrginit
Minimizare mrginit
EXERCIII
(1) f + ( x1 , x2 ) = x1 + x2
f + ( x1 ,0) = x1 = 1(1) ( x1 )
f + ( x1 , t + 1) = ( x1 + t ) + 1 = s 3(3) ( x1 , t , f + ( x1 , t ))
(2) f * ( x1 , x2 ) = x1 * x2
f* ( x1 ,0) = 0 = C0(1) ( x1 )
(3) f ^ ( x1 , x2 ) = x1x
f ^ ( x1 ,0) = 1 = C1(1) ( x1 )
t +1
f ^ ( x1 , t + 1) = x1
(4) f ( x) = a x , a const.
f (0) = 1
90
))
(6) f ( x) = 1 + 2 + 3 + ... + x
f (0) = 0
))
f (t + 1) = f (t ) + (t + 1) = f + (22 ) (t , f (t )), s 1( 2 ) (t , f (t ))
x 1, x > 0
= x 1
x=0
0,
(7) pred ( x) =
pred (0) = 0
pred (t + 1) = t = 1( 2 ) (t , pred (t ) )
x1 x2 , x1 x2
x1 < x2
0,
(8) f ( x1 , x2 ) =
= x1 x2
f ( x1 ,0) = x1 = 1(1) ( x1 )
f ( x1 , t + 1) = x1 (t + 1) = ( x1 t ) 1 = pred 3(3) ( x1 , t , f ( x1 , t ))
(9) f ( x1 , x2 ) = x1 x2
))
f ( x1 , x2 ) = ( x1 x2 ) + ( x2 x1 ) = f + f ( x1 , x2 ), f (22 ) ( x1 , x2 ), 1( 2 ) ( x1 , x2 )
x1 , daca x1 x2
x2 , altfel
f max ( x1 , x2 ) = x2 + ( x1 x2 ) = f + (22 ) ( x1 , x2 ), f ( x1 , x2 )
x1 , daca x1 x2
x2 , altfel
f min ( x1 , x2 ) = x1 ( x1 x2 ) = f 1( 2 ) ( x1 , x2 ), f ( x1 , x2 )
91
(12) par (x ) =
par (0) = 1
// sau :
1, daca x = impar
0, daca x = par
(13) impar (x ) =
impar (0) = 0
Predicate
0, daca x > 0
= 1 x
1, daca x = 0
(x ) =
(0) = 1
(t + 1) = 0 = C0( 2) (t , (t ))
1, daca x1 = x2
0, daca x1 x2
(14) f = (x1 , x2 ) =
f = ( x1 , x2 ) = 1 | x1 x2 |= ( f | | ( x1 , x2 ))
1, daca x1 x2
0, daca x1 > x2
(15) f (x1 , x2 ) =
f ( x1 , x2 ) = 1 ( x1 x2 ) = ( f ( x1 , x2 ))
92
// sau : P Q = min( P, Q)
P Q = (P Q ) = ( f * ( (P ), (Q )))
// sau : P Q = max( P, Q)
Prop.2: Dac g i h sunt funcii calculabile, iar P un predicat calculabil, atunci f este
funcie calculabil.
g ( x ,..., xn ), daca P( x1 ,..., xn ) = 1
f ( x1 ,..., xn ) = 1
h( x1 ,..., xn ), daca P( x1 ,..., xn ) = 0
Dem:
f = g * P + h * ( P)
Prop.3: Dac f este funcie calculabil, atunci g i h sunt funcii calculabile.
xn+1
g ( x1 ,..., xn , xn +1 ) = f ( x1 ,..., xn , t )
t =0
xn+1
h( x1 ,..., xn , xn +1 ) = f ( x1 ,..., xn , t )
t =0
Dem:
g ( x1 ,..., xn ,0 ) = f ( x1 ,..., xn ,0 )
h( x1 ,..., xn ,0 ) = f ( x1 ,..., xn ,0 )
(t ) x
(t )< x
(t )< x
n +1
n +1
n +1
P( x1 ,..., xn , t )
P( x1 ,..., xn , t )
P( x1 ,..., xn , t )
(t ) x
Dem:
(t ) x
n +1
(t )< x
(t )< x
xn +1
P( x1 ,..., xn , t ) = 1
t =0
xn +1
P( x1 ,..., xn , t ) 0
t =0
P( x1 ,..., xn , t )
n +1
n +1
n +1
P( x1 ,..., xn , t )
P( x1 ,..., xn , t )
P( x1 ,..., xn , t )
Prop.5: Dac P este predicat calculabil, atunci funcia min P( x1 ,..., xn , t ) este calculabil.
t xn+1
93
(16) P (x1 , x2 ) =
P ( x1 , x2 )
(t ) x [x1 = x2 * t ]
1
1, daca x1 | x2
divide
0, daca x1 /| x2
(17) P| (x1 , x2 ) =
P| ( x1 , x2 )
(t ) x [x1 * t = x2 ]
2
(18) prim(x ) =
(t ) x [x = t * t ]
x = (t * [(t 0 ) (t x ) P ( x, t )])
t =0
(21) f / (x1 , x2 ) = 1
x
f / ( x1 , x2 ) = min[(t + 1) * x2 > x1 ]
t x1
(22) f % (x1 , x2 ) = x1 % x2
))
f % ( x1 , x2 ) = x1 x2 * f / ( x1 , x2 ) = f 1( 2 ) ( x1 , x2 ), f* (22 ) ( x1 , x2 ), f / ( x1 , x2 )
sau f % ( x1 , x2 ) = min[P ( x1 t , x2 )]
t < x2
94
~ Seminar 10 ~
(Recapitulare C&C)
(23) f ( x) = 2 * x + 4
- rezolvare doar cu compunere
f ( x) = f + f * C 2(1) ( x ), 1(1) ( x ) , C 4(1) ( x )
( (
f (t + 1) = 2 * (t + 1) + 4 = (2 * t + 4) + 2 = f (t ) + 2 = f + (22 ) (t , f (t )), C 2( 2 ) (t , f (t ))
x
(24) f ( x) = (3 * k 2)
k =0
f (0) = 3 * 0 2 = 0
f (t + 1) = f (t ) + [3 * (t + 1) 2] = f (t ) + (3 * t + 1)
( (
)))
(25) f (x1 , x2 ) =
( (
f ( x1 , x2 ) = f f* C2( 2 ) ( x1 , x2 ), 1( 2 ) ( x1 , x2 ) , (22 ) ( x1 , x2 ) * f ( x1 , x2 ) +
+ f^
( 2)
1
( 2)
3
95