Professional Documents
Culture Documents
p3 Kombinatorika 225 294
p3 Kombinatorika 225 294
Kombinatorika
3.1. Įvadas
Ne taip paprasta pateikti išsamų kombinatorikos apibrėžimą. Kažkuria
prasme žodį “kombinatorika” galima suprasti kaip “diskrečiosios matematikos”
sinonimą, t.y. mokslą, tyrinėjantį diskrečiasias baigtines matematines
struktūras. Šia prasme žodis “kombinatorika” atsispindi žymaus lenkų
matematiko Vytoldo Lipskio knygos “Witold Lipski. Kombinatorika dla
programistow. Wydawnictva Naukowo – Techniczne. Warszava, 1982” (yra
vertimas į rusų kalbą žr. [Lip88]) pavadinime.
Paprastai kombinatorika suprantama kaip matematikos sritis, kurioje
tiriami klausimai, kiek skirtingų kombinacijų, tenkinančių vienokias ar kitokias
sąlygas, galima sudaryti iš turimų objektų.
Kombinatorika atsirado 16 amžiuje ir buvo susijusi su azartiniais
lošimais. Buvo tiriama, keliais būdais galima išmesti kokį nors akių skaičių,
lošiant dviem ar trim kauliukais, arba keliais būdais galima gauti, pavyzdžiui,
du karalius, lošiant kortomis. 17 amžiuje prancūzų matematikai Paskalis ir
Ferma nagrinėjo statytos sumos padalijimo uždavinį. Problema buvo tokia:
lošimas turėjo vykti iki t išloštų partijų, bet buvo nutrauktas, kai vienam
žaidėjui iki išlošimo lieka r partijų, o antrajam – s partijų. Kaip žaidėjai turi
pasidalyti statytąją sumą?
Tolesnė kombinatorikos raida susijusi su Jakobo Bernulio, Leibnico ir
Oilerio vardais.
Pastaraisiais metai kombinatorikos vystymasis glaudžiai siejasi su
optimizavimo uždavinų sprendimu, šifravimo ir dekodavimo uždavinias bei
kitomis informacijos teorijos problemomis.
Sumavimo dėsnis
Jei kokiam nors objektui A pasirinkti yra m būdų, o kitam objektui B
pasirinkti yra n būdų, tai pasirinkti “arba A, arba B” yra m + n būdų.
Pastaba. Taikant taip suformuluotą sumavimo dėsnį, reikia žiūrėti, kad
nei vienas objekto A pasirinkimo būdas nesutaptų su kuriuo nors objekto B
pasirinkimo būdu. Jei tokių sutapimų yra k, tai susidaro m + n – k pasirinkimo
būdų.
225
Pavyzdys. Pintinėje yra 12 obuolių ir 10 apelsinų. Jonukas pasirenka
arba obuolį, arba apelsiną, o paskui Onutė ima ir obuolį, ir apelsiną. Keliais
būdais Jonukas gali paimti vaisių ir kada Onutei didesnė pasirinkimo laisvė: ar
kai Jonukas paima obuolį, ar kai apelsiną?
Aišku, kad Jonukas obuolį gali pasirinkti 12 skirtingų būdų, o apelsiną –
10 skirtingų būdų. Vadinasi, pasirinkti arba obuolį, arba apelsiną galima 12 +
10 = 22 būdais.
Į antrą klausimo dalį atsakysime po sandaugos dėsnio.
Sandaugos dėsnis
Jei objektui A pasirinkti yra m būdų, o po kiekvieno tokio pasirinkimo
objektą B galima pasirinkti n būdais, tai porą (A, B) pasirinkti nurodytąja
tvarka galima m n būdais.
Pavyzdys. Panagrinėkime aukščiau pateiktą pavyzdį. Tarkime, Jonukas
pasirinko obuolį. Tada Onutei galimų pasirinkimo būdų yra 11 10. Jei Jonukas
būtų pasirinkęs apelsiną, tai Onutei paimti ir obuolį, ir apelsiną būtų galima
12 9 būdais. Kadangi 11 10 > 12 9, tai Onutei didesnė pasirinkimo laisvė
bus tada, jei Jonukas pasirinks obuolį.
226
N (1 , 2 ,..., n 1 ) N N (1 ) N ( 2 ) ... N ( n1 )
N (1 , 2 ) ... N ( n2 , n1 ) N (1 , 2 , 3 ) ...
N ( n3 , n2 , n1 ) ... (1) n1 N (1 , 2 ,..., n1 ).
(3.2.2)
Įrodysime, kad dėsnis teisingas, kai savybių skaičius yra n.
(3.2.2) formulę taikykime daiktų N ( n ) aibei. Gausime:
N (1 , 2 ,..., n 1 , n ) N ( n ) N (1 , n ) N ( n1 , n )
N (1 , 2 , n ) ... N ( n2 , n1 , n ) N (1 , 2 , 3 , n ) ...
N ( n3 , n2 , n1 , n ) ... ( 1) n1 N (1 , 2 ,..., n ).
(3.2.3)
Iš (3.2.2) lygybės atėmę (3.2.3), gausime
N ( 1 , 2 ,..., n 1 ) N ( 1 , 2 ,..., n 1 , n )
N N ( 1 ) N ( 2 ) ... N ( n ) N ( 1 , 2 )
N ( 1 , 3 ) ... N ( n 1 , n ) N ( 1 , 2 , 3 )
N ( 1 , 2 , 4 ) ... N ( n 2 , n 1 , n ) ...
(1) n 1 N ( 1 , 2 ,..., n ).
(3.2.4)
(3.2.4) formulės kairiosios pusės skirtumas
N (1 , 2 ,..., n 1 ) N (1 , 2 ,..., n 1 , n ) yra lygus
N (1 , 2 ,..., n 1 , n ) , nes iš skaičiaus daiktų, kurie neturi savybių
1 , 2 ,..., n 1 atimame skaičių daiktų, neturinčių tų pačių savybių ir
turinčių savybę n . Vadinasi, atėmus liks skaičus daiktų, neturinčių savybių
1 , 2 ,..., n .
Pavyzdys. Pasinaudodami priskirties ir išskirties formule,
apskaičuokime, kiek tarp natūraliųjų skaičių nuo vieneto iki 100 yra skaičių,
kurie nesidalo nei iš 2-jų, nei iš 3-jų, nei iš penkių.
Tarkime, 1 – tai skaičiaus savybė dalintis iš 2-jų, 2 – tai skaičiaus
savybė dalintis iš 3-jų, o 3 – tai skaičiaus savybė dalintis iš 5-ių. Tada
N (1 , 2 , 3 ) N N (1 ) N ( 2 ) N ( 3 )
N (1 , 2 ) N (1 , 3 ) N ( 2 , 3 ) N (1 , 2 , 3 ).
227
Norint sužinoti, kiek skaičių nuo 1 iki N dalijasi iš n, reikia N padalinti
iš n ir imti gautojo dalmens sveikąją dalį į mažesniąją pusę. Todėl
100 100 100
N (1 ) 50 , N ( 2 ) 3 33 , N ( 3 ) 5 20 ,
2
100 100
N (1 , 2 ) 16 , N (1 , 3 ) 10 ,
6 10
100 100
N ( 2 , 3 ) 6 , N (1 , 2 , 3 ) 3.
15 30
Vadinasi,
N (1, 2 , 3 ) 100 50 33 20 16 10 6 3 26 .
3.3. Junginiai
Šiame paragrafe aptarsime pagrindinius junginius ir jų savybes.
228
3.3.2. Gretiniai su pasikartojimais
Turime n skirtingų rūšių daiktų. Kiek iš jų galima sudaryti k-elemenčių
junginių, sudarytų iš skirtingų elementų, kai junginys nuo junginio skiriasi
arba bent vienu elementu, arba jų tvarka ir elementai junginyje gali kartotis?
Tokie junginiai vadinami gretiniais su pasikartojančiais elementais ir
žymimi Ank .
Sudarant tokį junginį, bet kuri i-toji, 1 i k , junginio pozicija gali
būti užpildyta n skirtingais būdais. Vadinasi, Ank n k .
Pavyzdys. Kiek skirtingų triženklių skaičių galima parašyti dešimtainėje
skaičiavimo sistemoje?
Kadangi šiuo atveju n 10 , o k 3 , tai A10 3
10 3 1000 . Iš
tikro, tai skaičiai 000, 001, …, 998, 999.
229
3.3.4. Kėliniai su pasikartojančiais elementais
Turime k skirtingų tipų daiktus. Kiek kėlinų galima sudaryti iš n 1
pirmojo tipo elementų, iš n2 antrojo tipo elementų, …,nk k-tojo tipo elementų?
Kiekvieną kėlinį turi sudaryti n n1 n2 ... nk elementų. Jei visi
elementai būtų skirtingi, tai kėlinių skaičius būtų n! Kadangi kai kurie
elementai sutampa, gauname mažiau kėlinų. Kad taip yra iš tikrųjų,
įsitikinsime, išnagrinėję, pavyzdžiui, kėlinį
aa
...
a bb
...
b ... xx...
x ,
n1 n2 nk
kuriame iš pradžių surašyti visi pirmojo tipo elementai, paskui – visi antrojo
tipo elementai, …, pagaliau – visi k-tojo tipo elementai.
Pirmojo tipo elementus sukeitinėti vietomis galima n1! būdų. Kadangi
tie elementai yra vienodi, tai tokie perstatinėjimai kėlinio nepakeičia. Taip pat
nieko nepakeičia ir n2 ! antrojo tipo elementų perstatinėjimų, …, nk ! k-tojo
tipo elementų perstatinėjimų.
Bet kurio tipo elementus galima sukeitinėti vieną su kitu nepriklausomai
nuo visų kitų tipų elementų perstatinėjimo. Todėl kėlinio su pasikartojimais
elementus sukeitinėti vieną su kitu vietomis taip, kad kėlinys nepasikeistų, yra
n1!n2 !... nk ! būdų (taikome sandaugos dėsnį). Vadinasi, skirtingų kėlinių
su pasikartojimais skaičius lygus
n!
P ( n1 , n2 ,..., nk ) .
n1! n2 !...nk !
Pavyzdys. Kiek kėlinių galima sudaryti iš žodžio “sakalas” raidžių?
Šiuo atveju turime dvi raides “s”, tris raides “a”, vieną raidę “k” ir vieną
raidę “l”; iš viso septynias raides. Todėl
7!
P ( 2,3,1,1) 420 .
2!3!1!1!
230
k!C nk Ank .
Tada
Ank n! n(n 1)...( n k 1)
C nk .
k! k!(n k )! k!
Pavyzdys. Iš 52 kortų komplekto ištraukta 10 kortų. Keliais atvejais
ištrauktųjų kortų grupėje bus bent vienas tūzas? Keliais atvejais – tik vienas
tūzas? Keliais atvejais – nemažiau kaip du tūzai? Lygiai du tūzai?
10
Ištraukti 10 kortų yra C52 būdų. Skaičius atvejų, kai nėra nė vieno
tūzo, lygus C48 10
. Todėl yra C52 10
C4810
atvejų, kai ištraukiamas bent vienas
tūzas.
Tik vieną kartą ištraukti tūzą yra C 41 C 48
9
būdų.
10
Ištraukti ne mažiau kaip du tūzus yra C52 C48
10
4C48
9
būdų.
Tiksliai du tūzus galima ištraukti C42 C48
8
būdais (du tūzus galima
pasirinkti C 42 būdais, kitas aštuonias kortas – C48
8
būdais).
231
Aišku, kad kiekvienas junginys turės vienintelį kodą ir kiekvienas kodas
atitiks skirtingą junginį. Vadinasi,
( n k 1)!
Cnk P (k , n 1) Cnk k 1 .
k! (n 1)!
Antrasis būdas. Tarkime, turime aibę A {1,2,3,..., n} ir k-
elementį derinį su pasikartojimais C ( m1 , m2 ,..., mk ) , sudarytą iš aibės
A elementų; be to, m1 m2 ... mk .
Deriniui C priskirkime k-elementį derinį be pasikartojančių elementų,
sudarytą iš aibės A {1,2,3,..., n k 1} tokiu būdu:
C ( m1 , m2 1,..., mk k 1) .
Šis priskyrimas yra abipus vienareikšmis:
1) jei C1 C 2 , tai ir C1 C2 , t.y jei
( m1 , m2 ,..., mk ) ( m , m ,..., m ) ,
*
1
*
2
*
k tai ir
(m1 , m2 1,..., mk k 1) (m , m 1,..., m k 1) ;
*
1
*
2
*
k
1. Simetriškumo savybė
Cnk Cnnk .
Ši savybė įrodoma remiantis formule:
232
n!
Cnk
k!( n k )!
Pritaikius šią formulę skaičiui C nn k , gausime:
n! n!
Cnnk .
(n k )!( n n k )! ( n k )!k!
2. Sudėties savybė
C nk C nk11 C nk1 .
Šią savybę galima įrodyti dvejopai.
Pirmasis būdas. Taikykime derinių skaičiaus formulę lygybės kairiajai
n!
ir dešiniajai pusėms. Tada Cn
k
,o
k!( n k )!
(n 1)! (n 1)!
C nk11 Cnk1
(k 1)!( n k )! k!(n 1 k )!
( n 1)! (k n k ) n (n 1)! n!
.
k!(n k )! k!(n k )! k!(n k )!
Iš čia išplaukia, kad lygybė yra teisinga.
Antrasis būdas. Visus k-elemenčius derinius iš n elementų
a1 , a 2 ,..., a n1 , a n suskirstykime į dvi klases. Pirmajai klasei priklausys
deriniai, kuriuose yra elementas an , o antrajai – deriniai, kuriuose to elemento
nėra. Jei iš bet kurio pirmosios klasės derinio išmesime elementą an , tai liks
( k 1) -elementis derinys, sudarytas iš elementų a1 , a2 ,..., an1 . Tokių
derinių skaičius lygus Cnk11 . Antrosios klasės deriniai yra k-elemenčiai
deriniai, sudaryti iš ( n 1) elementų a1 , a2 ,..., an1 . Todėl jų skaičius
lygus Cnk1 .
Kadangi kiekvienas k-elementis derinys iš elementų a1 , a2 ,..., an
priklauso vienai ir tik vienai iš tų dviejų klasių, o visų derinių skaičius yra C nk
, tai sumavimo savybė yra teisinga.
Sumavimo savybė yra tampriai susijusi su Paskalio trikampiu
233
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
Jei iš eilės einančias šio trikampio eilutes sunumeruosime skaičiais
0,1,2,..., n , tai n-oji eilutė bus sudaryta iš skaičių C n0 , C n1 ,..., C nn , o šios
eilutės k-asis elementas C nk , k 0 , k n , bus lygus C nk11 C nk1 , t.y.
( n 1) -osios eilutės narių, esančių nario C nk kairėje ir dešinėje, sumai.
234
if l mod t = 0 then begin temp:=l div t; C:=C*temp;
e nd
else begin temp:=C div t; C:=l*temp; e
nd;
t := t+1;
l := l+1;
end;
end;
4. Sumavimo savybės
Aptarsime dvi sumavimo savybes, kurių teisingumą galima įrodyti
remiantis sudėties savybe:
n
a) Cmk k Cm0 Cm1 1 ... Cmn n C mn n1 ,
k 0
n
b) Ckm C0m C1m ... Cnm Cnm11 ,
k 0
čia n ir m – natūralieji skaičiai.
Pavyzdžiui, savybės a) teisingumą parodo žemiau pateikta schema,
gauta nuosekliai taikant sumavimo savybę.
C mn n 1
C mn 1n C mn n
C mn 2n 1 C mn 1n 1
C m1 2 C m2 2
C m0 1 C m0 C m1 1
Savybė b) naudojama natūraliųjų skaičių laipsnių sumoms apskaičiuoti.
Pavyzdžiui, kai m 1 , tai
235
n(n 1)
C01 C11 C21 ... Cn1 0 1 2 ... n Cn21 .
2
Kai m 2 , galima apskaičiuoti natūraliųjų skaičių kvadratų sumą:
1 2 ... n 2 .
2 2
n ( n 1) 2
2
6Cn41 6Cn31 Cn21 .
4
Gautas rezultatas rodo, kad
2
n
n
k k .
3
k 0 k 0
236
Aišku, kad kiekvienas skaičius priklauso tik vienai klasei, o k-osios klasės
elementų skaičius yra P ( k , n k ) C nk .Kadangi skaičių yra 2 n , tai
2 n Cn0 Cn1 Cn2 ... Cnn .
237
for l := 0 to k do c [l] := l;
Kaip generuoti patį mažiausią leksikografiškai didesnį derinį nei
turimas?
Tarkime, c1 c2 ... cl ... ck – turimas derinys. Leksikografine tvarka
pats didžiausias derinys yra: n k 1,..., n 1, n . Vadinasi,
cl n k l , l 1, k . todėl, norint apskaičiuoti patį mažiausią
leksikografiškai didesnį derinį nei nagrinėjamas derinys, elgsimės taip:
1) masyve c[0..k ] rasime pirmą iš dešinės elementą cl, 1 l k ,
tenkinantį sąlygą cl n k l ;
2) šį elementą padidinsime vienetu, t.y. cl : cl 1 ;
3) likusius elementus užpildysime iš eilės einančiais natūraliaisiais
skaičiais, t.y.
for i := l + 1 to k do ci: = ci-1 + 1;
Generavimo pabaigos sąlyga. Jei pirmasis iš dešinės elementas,
tenkinantis sąlygą cl n k l , yra c0 , tai reiškia, kad nagrinėjame derinį:
0, n k 1,..., n . Vadinasi, jau visi deriniai sugeneruoti.
Tuo būdu, derinių C nk generavimo leksikografine tvarka algoritmas
yra.
238
for i := l + 1 to k do c [i] := c [i – 1] + 1;
end;
end; { while p }
end;
239
Skaičiuojant pagal šį algoritmą, steko turinys (viršutinis elementas yra
1
steko viršūnėje) kis taip: 2 2 1 1 , o i reikšmės
3 3 3 3 2 2 1 0
sudarys T3 seką 1, 2, 1 , 3, 1, 2, 1 .
Pateiktą algoritmą galima patobulinti. Kiekvieną kartą, kai į steką
patalpinamas elementas j 0 , mes apriori žinome, kad virš jo bus patalpinti
elementai j 1,..,1 . Protingas šios informacijos panaudojimas įgalina
vietoj steko naudoti masyvą ( n , n 1 ,..., 1 , 0 ) tokiu būdu.
Elementas 0 yra viršutinis steko elementas ir kiekvienam j 0 j yra
elementas, steke esantis tuoj po elemento j (žemiau elemento j), jei j yra steke.
Jei elemento j steke nėra, tai elemento j reikšmė negali turėti jokios įtakos
skaičiavimams ir todėl j priskiriame reikšmę j 1 , kadangi mes žinome,
kad kai kitą kartą elementas j 1 bus patalpintas į steką, elementu, esančiu
virš jo, bus elementas j. Dar daugiau, kadangi elementai i 1, i 2,...,1
bus talpinami į steką pašalinus elementą i, mums reikia tiktai priskirti
i 1 : i , laikant, kad visiems j, 1 j i 2 , reikšmė j buvo priskirta,
kai j buvo pašalintas iš steko (primename, tada j j 1 ). Pagaliau, kai
i 1 , elementai į steką patalpinami operacijos 0: 1 dėka.
Dabar gausime tokį algoritmą.
begin
for j := 0 to n + 1 do begin
g [j] := 0;
[j] := j + 1;
end;
i := 0;
while i < n + 1 do
begin
spausdinti ( g n , g n 1 ,..., g1 ) ;
i := [0];
g [i] := 1 – g [i];
[i – 1] := [i];
[i] := i + 1;
240
if i 1 then [0] := 1;
end; { while }
end;
Kai n 3 , masyvo turinys skaičiavimo eigoje kis taip:
4 5 5 5 5 5 5 5 5
3 4 4 4 4 4 4 4 4
2 3 3 3 3 4 4 4 4
.
1 2 2 3 2 2 2 4 2
0 1 2 1 3 1 2 1 4
seka T3
Pateiktąjį algoritmą galima truputį patobulinti. Pastebėsim, jei operatorių
0 : 1 patalpintume po operatoriaus g [i] := 1 – g [i], tai operatorių if i 1
then [0]:=1 galima išmesti. Iš tikro, jei i 1 , tai operatorius
[i – 1] := [i] tuoj pat ištaisys neteisingą [0] reikšmę. Tuo būdu galutinis
Grėjaus kodų generavimo algoritmas bus toks.
begin
for j := 0 to n + 1 do begin
g [j] := 0;
[j] := j + 1;
end;
i := 0;
while i < n + 1 do
begin
spausdinti ( g n , g n 1 ,..., g1 ) ;
i := [0];
g [i] := 1 – g [i];
[0] := 1; [i – 1] := [i]; [i] := i + 1;
end; { while }
end;
241
Pavyzdys. Panagrinėkime C53 . Deriniai, surašyti minimalaus pokyčio
tvarka, bus tokie:
123, 134, 234, 124, 145, 245, 345, 135, 235, 125.
Nesunku pastebėti, kad bet koks šios sekos derinys, išskyrus pirmąjį, yra
gaunamas iš prieš jį stovinčio derinio, pakeitus vieną elementą kitu.
Jei pirmajame derinyje elementą 2 pakeisime elementu 4, tai gausime
antrąjį derinį. Jei jame elementą 1 pakeisime elementu 2, tai gausime trečiąjį
derinį ir t.t.
Reikia pastebėti, kad ši derinių seka yra užciklinta, t.y. jei paskutiniame
derinyje elementą 5 pakeisime elementu 3, tai gausime pirmąjį šios sekos
derinį.
Kiekvieną derinį galima užkoduoti n-skilčiu dvejetainiu skaičiumi
g1 g 2 ... g i ... g n : jei g i 1 , tai elementas i priklauso deriniui; jei
g i 0 , tai elementas i nepriklauso deriniui. Tuo būdu deriniai C nk bus
užkoduoti n-skilčiais dvejetainiais skaičiais, kiekvienas iš kurių turi k vienetukų
ir (n k ) nulių.
Aišku, kad minimalaus pokyčio derinių sekos kodai bus dvejetainiai
skaičiai, turintys k vienetukų, ir bet kokie du gretimi skaičiai skirsis dviem
skiltimis: vienoje nulis keičiamas vienetu, o kitoje vienetas keičiamas nuliu.
Pavyzdys. Aukščiau pateikto minimalaus pokyčio derinių C53 sekos
kodai bus:
5 4 3 2 1 5 4 3 2 1
0 0 1 1 1 {1,2,3}, 1 1 0 1 0 {2,4,5},
0 1 1 0 1 {1,3,4}, 1 1 1 0 0 {3,4,5},
0 1 1 1 0 {2,3,4}, 1 0 1 0 1 {1,3,5},
0 1 0 1 1 {1,2,4}, 1 0 1 1 0 {2,3,5},
1 1 0 0 1 {1,4,5}, 1 0 0 1 1 {1,2,5}.
Tokių kodų generavimas yra glaudžiai susijęs su 1.3 paragrafe
išnagrinėtu Grėjaus kodų generavimu.
Tarkime, G (n) – Grėjaus kodai, o G ( n, k ) , 0 k n – seka
Grėjaus kodų, turinčių lygiai k vienetukų. Tada, kaip parodyta literatūroje
[RND80], G ( n, k ) seka sutampa su minimalaus pokyčio derinių seka.
Pavyzdys. Panagrinėkime Grėjaus kodus, kai n 5 . Remiantis 1.3
paragrafe išnagrinėtu algoritmu, gausime tokią G (5) seką:
242
5 4 3 2 1 5 4 3 2 1 5 4 3 2 1
0 0 0 0 0 0 11 0 1 1 1 0 22 1 1 1 0 1
1 0 0 0 0 1 12 0 1 0 1 0 23 1 1 1 0 0
2 0 0 0 1 1 13 0 1 0 1 1 24 1 0 1 0 0
3 0 0 0 1 0 14 0 1 0 0 1 25 1 0 1 0 1
4 0 0 1 1 0 15 0 1 0 0 0 26 1 0 1 1 1
5 0 0 1 1 1 16 1 1 0 0 0 27 1 0 1 1 0
6 0 0 1 0 1 17 1 1 0 0 1 28 1 0 0 1 0
7 0 0 1 0 0 18 1 1 0 1 1 29 1 0 0 1 1
8 0 1 1 0 0 19 1 1 0 1 0 30 1 0 0 0 1
9 0 1 1 0 1 20 1 1 1 1 0 31 1 0 0 0 0
10 0 1 1 1 1 21 1 1 1 1 1
Kodai, turintys 3 vienetukus, – pabraukti. Išrašę šiuos kodus, gausime
minimalaus pokyčio derinio C53 sekos kodus.
Norėdami efektyviai generuoti G ( n, k ) , 0 k n , kodus,
pasinaudokime G ( n, k ) rekursyviniu apibrėžimu:
0 G ( n 1, k )
G (n, k )
R , (3.4.1)
1 G ( n 1, k 1)
ir
G ( n,0) 0 n ,
G ( n, n) 1n ,
243
čia G ( n 1, k 1) R žymi kodus, surašytus atvirkščia tvarka, o 0 n reiškia,
kad n skilčių užpildome nuliais, o 1n – kad n skilčių užpildome vienetais.
Pastaroji rekurentinė formulė generuoja C nk pradedant (1,2,..., k )
ir baigiant (1,2,..., k 1, n) .
Pavyzdys. Remdamiesi (3.4.1) formule, pavaizduokime C53 G (5,3)
generavimo medį (žr. 3.4.1 pav.).
viršutinis
sūnus viršutinis
sūnus
0 G(3, 3) 0 G(1, 1)
0 G(4, 3) 1 G(2, 1)
1 G(3, 2)R 1 G(1, 0)R
apatinis 0 G(2, 2)R
apatinis 0 G(1, 1)
G(5, 3) sūnus sūnus
0 G(2, 1)
1 G(3, 1) 1 G(1, 0)R
R
1 G(2, 0)
1 G(4, 2)R 0 G(1, 1)
1 G(2, 1)
0 G(3, 2)R 1 G(1, 0)R
0 G(2, 2)R
244
Norint pereiti nuo vienos kabančios viršūnės į gretimą kabančią viršūnę,
nagrinėjame kelią iš pirmos kabančios viršūnės medžio šaknies link. Tuo keliu
link šaknies keliaujame viršūnėmis, kurios yra apatiniai sūnūs (žr. 3.4.1 pav.).
Pasiekę pirmąją viršūnę, kuri yra viršutinis sūnus, pereiname pas jo brolį
(apatinį sūnų) ir iš jo, eidami viršutiniais sūnumis, einame į kabančią viršūnę.
Pavyzdžiui (žr. 3.4.1 pav.), išnagrinėję kabančią viršūnę 1 G ( 2,0) R ,
pirmiausia pasieksime viršutinį sūnų 1 G (3,1) ir pereisime pas jo brolį
(apatinį sūnų) 0 G (3,2) R . Ir iš jo viršutiniais sūnumis 1 G ( 2,1) ,
0 G (1,1) pasieksime viršūnei 1 G ( 2,0) R gretimą kabančią viršūnę
0 G (1,1) . (3.4.1 pav. šis kelias paryškintas).
Nagrinėdami kabančią binarinio medžio viršūnę ( g n , g n 1 ,..., g1 ) ,
mes tuo pačiu žinome kelią iš šaknies į kabančią viršūnę. Norėdami pereiti prie
gretimos kabančios viršūnės, turime saugoti informaciją apie viršūnę
g i G (i 1, t ) , į kurią turime sugrįžti (viršūnės g i G (i 1, t ) R visada yra
apatiniai sūnūs). Šios viršūnės bus saugomos steke. Toliau pateiktame C nk
generavimo algoritme stekas bus organizuojamas taip pat, kaip jis buvo
organizuotas generuojant Grėjaus kodus (žr. trečiąjį Grėjaus kodų generavimo
algoritmą). Parametras t rodo skaičių vienetukų tarp skilčių
( g i 1 , g i 2 ,..., g1 ) ir gali būti nesunkiai apskaičiuojamas. Todėl steke
saugoma tik i reikšmė.
Atidžiai ištyrinėjus binarinį medį, galima pastebėti, kad nagrinėjamo
kodo, kai iš jo grįžtama į viršūnę g i G (i 1, t ) , perskaičiavimas į gretimą
kodą reiklauja nagrinėti žemiau pateiktus keturis atvejus, priklausomai nuo gi ir
t reikšmės:
245
gi = 0, t > 1 gi = 1, t > 0
gi gi
i t 1 t 2
010 11 110 i t 211t 1
110 i t 1
01 t 2
010i t 211t 1
gi = 0, t = 1 gi = 1, t = 0
gi gi
i 2
010 110 i 2
i2
100 010i 2
246
Parametro t reikšmė turi būti perskaičiuojama. Kadangi tarp
g i 1 , g i 2 ,..., g t 1 vienetukų gali būti tik g i 1 , tai t : t g i 1 . Be to,
jei šiuo atveju t tampa lygus 0, tai g i 2 ... g1 0 .
Žemiau pateiktas derinių C nk generavimo minimalaus pokyčio tvarka
algoritmas. Šiame algoritme stekas organizuojamas masyvu , o jo viršutinis
elementas yra 1 (žr. trečiąjį Grėjaus kodų generavimo algoritmą). Kadangi
i 1 : 1 , tai 1 : t 1 ekvivalentu, kad į steką įtraukiame
i 1, i 2,..., i 1 .
const nn = 20;
type mas = array [0..nn] of integer;
var n, i, k : integer;
g, tau : mas;
procedure der (n, k : integer);
var i, j, t : integer;
g, tau : mas;
begin
for j := 1 to k do
begin
g [j] := 1;
tau [j] := j + 1;
end;
for j := k + 1 to n + 1 do
begin
g [j] := 0;
tau [j] := j + 1;
end;
t := k;
tau [1] := k + 1;
i := 0;
while i <> n + 1 do
begin
writeln;
for j := n downto 1 do write (g [j] : 3);
writeln;
i := tau [1];
tau [1] := tau [i];
tau [i] := i + 1;
if g [i] = 1 then
247
begin
if t <> 0 then g[t]:=1-g[t]
else g[i-1]:=1-g[i-1];
t:=t+1;
end
else
begin
if t <> 1 then g [t – 1] := 1 – g [t – 1]
else g [i – 1] := 1 – g [i – 1];
t := t – 1;
end;
g [i] :=1 – g [i];
if (t = i – 1) or (t = 0) then t := t + 1
else
begin
t := t – g [i – 1];
tau [i – 1] := tau [1];
if t = 0 then tau [1] := i – 1
else tau [1]:=t+1;
end;
end;
end;
begin
writeln ('įveskite n');
readln (n);
writeln ('įveskite k');
readln (k);
der (n, k);
end.
248
Tada šios procedūros eigoje k-elemenčio poaibio ( ai1 , ai2 ,..., aik )
išsirinkimo tikimybė yra tokių tikimybių sandauga:
P (pirmasis išsirinktas elementas – vienas iš k elementų ai1 , ai2 ,..., aik )
k
,
n
k 1
P (antrasis išsirinktas elementas – vienas iš k – 1 likusių elementų) ,
n 1
_ _ _ __ _ _ __ _ _ __ _ _ __ _ _ __ _ _ _
1
P (k-asis išsirinktas elementas – paskutinysis iš likusių elementų)
n k 1
.
Ši sandauga bus lygi:
k k 1 1 k!(n k )! 1
... k .
n n 1 n k 1 n! Cn
Aptarsime atsitiktinio derinio generavimo algoritmą.
Algoritmo realizavimui panaudosime papildomą masyvą p, kuriame
saugosime dar neišrinktų elementų numerius. Po to, kai pirmieji j 1 k
elementai išsirinkti, tai p j , p j 1 ,..., pn bus sąrašas n j 1 elementų,
kurie dar neišsirinkti. Kadangi nebūtina išsaugoti elementų tvarką, tai,
išsirinkus elementą pr , r [ j , n] , įjo vietą įrašome neišsirinktą elementą
pj .
Žemiau pateikiamas atsitiktinio derinio generavimo algoritmas.
begin
for j := 1 to n do p [j] := j;
R := ;
for j := 1 to k do
begin
r := rand (j, n);
{ rand (j, n) – tolygiai pasiskirsčiusių atsitiktinių skaičių iš intervalo
[j, n] generavimo procedūra }
R := R {a [p [r]]};
p [r] := p [j];
end;
end;
249
3.4.2. Kėlinių generavimo algoritmai
250
t := true;
while t do
begin
spausdinti ( p1 , p2 ,.., pn ) ;
{ Leksikografiškai didesnio kėlinio apskaičiavimas }
i := n – 1;
while p [i] > p [i+ 1] do i := i – 1;
if i = 0 then t := false
else
begin
{ Rasti p j i min
1l n
( pl | pl pi ) }
j := n;
while p [j] < p [i] do j := j – 1;
{ Elementus pi ir pj sukeisti vietomis }
pp := p [i]; p [i] := p [j]; p [j] := pp;
{ Elementų pi 1 , pi 2 ,..., p n 1 , pn surašymas
atvirkščia tvarka }
k := i + 1; l := n;
while k < l do
begin
pp := p [k]; p [k] := p [l]; p [l] := pp;
k := k + 1; l := l – 1;
end;
end; { else }
end; { while }
end;
251
antileksikografinė tvarka apibrėžia žodžių tvarką, kai tiek pozicijų eiliškumas
sekoje, tie ir aibės elementų išsidėstymas žodyje yra atvirkščias.
Pavyzdžiui, užrašykime aibės X {1,2,3} kėlinius leksikografine ir
antileksikografine tvarka.
Leksikografine tvarka:
1, 2, 3; 1, 3, 2; 2, 1, 3; 2, 3, 1; 3, 1, 2; 3, 2, 1.
Antileksikografine tvarka:
1, 2, 3; 2, 1, 3; 1, 3, 2; 3, 1, 2; 2, 3, 1; 3, 2, 1.
Iš leksikografinės tvarkos kėlinio 1, 3, 2 gausime antileksikografinės
tvarkos kėlinį, jei 1-tą keisime 3-tu, 3-tą keisime 1-tu (imame aibės X
elementus atvirkščia tvarka) ir kėlinio pozicijas surašome atvirkščia tvarka.
Gausime 3, 1, 2, o po to 2, 1, 3.
Kėlinių generavimas antileksikografine didėjimo tvarka yra labai
panašus į kėlinių generavimo leksikografine didėjimo tvarka algoritmą. Kėlinių
Pn generavimui įveskime masyvą p[1..n 1] , kurio elementai
pi 1 , pi 2 ,..., pn apibrėžia nagrinėjamąjį kėlinį.
Pradinio kėlinio generavimas. for i := 1 to n + 1 do p [i] := i;
Paties mažiausio antileksikografiškai didesnio kėlinio apskaičiavimas.
Tam tikslui reikia:
1) rasti pirmą iš kairės porą ( pi 1 , pi ) , tokią, kad pi 1 pi ,
2) rasti p j max ( pl | pl pi ) , t.y tarp elementų
1l i 1
252
spausdinti ( p1 , p2 ,.., pn ) ;
{ Antileksikografiškai didesnio kėlinio apskaičiavimas }
i := 2;
while p [i-1] > p [i] do i := i + 1;
if i = n + 1 then t := false
else
begin
{ Rasti p j 1max
l i 1
( pl | pl pi ) }
j := 1;
while p [j] > p [i] do j := j + 1;
{ Elementus pi ir pj sukeisti vietomis }
pp := p [i]; p [i] := p [j]; p [j] := pp;
{ Elementus p1 , p2 ,..., pi 1 surašyti atvirkščia
tvarka }
k := 1; l := i - 1;
while k < l do
begin
pp := p [k]; p [k] := p [l]; p [l] := pp;
k := k + 1; l := l – 1;
end;
end; { else }
end; { while }
end;
Kai n 4 , tai pateiktas algoritmas apskaičiuos kėlinius:
1234 1243 1342 2341
2134 2143 3142 3241
1324 1423 1432 2431
3124 4123 4132 4231
2314 2413 3412 3421
3214 4213 4312 4321
253
Kai n 1 , tai egzistuoja vienintelis kėlinys: 1. Tarkime, kad turime
Pn 1 kėlinius, tenkinančius minimalaus pokyčio tvarką. Tada kėlinį Pn
generuosime taip.
Sunumeruokime visus Pn 1 kėlinius numeriais nuo 1 iki ( n 1)! .
Tada, jei kėlinio iš n 1 elemento numeris yra nelyginis skaičius, tai prie šio
kėlinio prirašykime elementą n iš dešinės ir nuosekliai atlikime visus galimus to
elemento postūmius į kairę. Jei kėlinio iš n 1 elemento numeris yra lyginis,
tai prie jo prirašykime elementą n iš kairės ir nuosekliai atlikime visus galimus
to elemento postūmius į dešinę.
Atlikę šiuos veiksmus, gausime kėlinių Pn minimalaus pokyčio seką
(žr. 3.4.2 pav.).
1234
1243
1432
123 4132 4132
132 1432
12
1342
312 3124
1324
3142
3412
4312
1 ir t.t.
4321
3421
3241
3214 2314
321 2341
21 231 2431
213 4213
4321
2413
2143
2134
254
Masyvo p elementai p1 , p2 ,..., pn apibrėš nagrinėjamą kėlinį.
Elementai p0 ir pn+1 yra pagalbiniai elementai.
Masyvo a elementai nusako atvirkštinį kėlinį: ak nurodo vietą (adresą),
kurioje masyve p yra elementas k. Kitaip tariant, pak k . Masyvo d
elementai apibrėžiami taip:
1, jei elementas i kėlinyje yra " stumiamas" į kairę
(keičiamas su kaimynu iš kairės),
1, jei elementas i kėlinyje yra " stumiamas" į dešinę
d i
(keičiamas su kaimynu iš dešinės),
0, jei elementas i kėlinyje nejuda.
Kėlinyje elementas i “stumiamas” iki jis pasiekia elementą, didesnį už jį
patį. Tada yra keičiama šio elemento judėjimo kryptis ir bandoma “stumti” (jei
galima) elementą i – 1. Kadangi turime masyvą a, tai šis elementas lengvai
randamas masyve p.
Tam, kad nutrauktume elemento n judėjimą, į masyvą p įvesti du
papildomi elementai p0 ir pn 1 , kurių reikšmės yra lygios n 1 .
Elemento d1 reikšmė yra lygi 0, nes p elemento, lygaus vienetui,
judinti nereikia. Tai sekos generavimo pabaigos sąlyga.
begin
{ Pradinio kėlinio generavimas }
for i := 1 to n do begin
p [i] := i;
a [i] := i;
d [i] := –1;
end;
d [1] := 0; p [0] := n + 1; p [n + 1] := n + 1; t := true;
while t do
begin
Spausdinti ( p1 , p2 ,..., pn );
{ “Gretimo” kėlinio apskaičiavimas }
m := n; { Judinsime (jei galima) patį didžiausią elementą }
while p [a [m] + d [m]] > m do begin
d [m] := – d [m];
m := m – 1;
255
end;
if m = 1 then t := false
else
begin
{ Sukeisti p [a [m]] su p [a [m] + d [m]] }
pp := p [a [m]];
p [a [m]] := p [a [m] + d [m]];
p [a [m] + d [m]] : =pp;
{ Sukeisti elementų m ir p [a [m] + d [m]] adresus. Po
sukeitimo elementas p [a [m] + d [m]] yra p [a [m]] vietoje.
Vadinasi, keisime a [m] ir a [p [a [m]]] }
pp := a [m]; k := p [a [m]];
a [m] := a [k];
a [k] : =pp;
end;
end; { while }
end;
Kai n 4 , pateiktas algoritmas apskaičiuoja:
1234 1342 4321 2431
1243 1324 3421 4231
1423 3124 3241 4213
4123 3142 3214 2413
4132 3412 2314 2143
1432 4312 2341 2134
256
Kai n 1 – akivaizdu.
Tarkime, kad algoritmas generuoja atsitiktinį kėlinį, kai elementų
skaičius yra n 1 . Tegu ( s1 , s 2 ,.., sn ) yra bet kuris aibės
{1,2,..., n} kėlinys. Tada tikimybė, kad p yra:
P ( p ) P ( pn s n ) P (( p1 , p2 ,..., pn1 ) ( s1 , s2 ,..., sn1 ),
1 1 1
prie sąlygos, kad pn s n ) .
n (n 1)! n!
257
Akivaizdu, kad S ( n, k ) 0 , kai k n . Be to, S (0,0) 1 ,
kadangi tuščia blokų aibė sutinkamai su apibrėžimu yra tuščiosios aibės
išskaidymas.
Su antrosios rūšies Stirlingo skaičiais, kaip ir su binominiais
koeficientais, yra susiję daug tapatybių.
Pirmiausia įrodysime tapatybę, primenančią derinių sudėties savybę,
kuri yra susijusi su Paskalio trikampiu:
a) S (n, k ) S ( n 1, k 1) k S (n 1, k ) , 0 k n ,
b) S ( n, n) 1 , n 0 , (3.4.2)
c) S ( n , 0) 0 , n 0.
Formulių S ( n, n) 1 ir S ( n,0) 0 teisingumas akivaizdus. 3.4.1
a) formulės teisingumą įrodysime taip. Visus n-elementės aibės išskaidymus į k
blokų suskirstykime į dvi klases. Pirmajai klasei priskirkime visus išskaidymus,
kuriuse yra vienelementinis blokas {n} , o antrajai klasei priskirkime visus
išskaidymus, kai elementas n yra didesnio bloko (mažiausiai dviejų elementų
aibės) elementas.
Aišku, kad pirmosios klasės galia yra S ( n 1, k 1) , t.y. tokia,
kokia yra aibės {1,2,..., n 1} išskaidymo į ( k 1) blokus galia.
Antrosios klasės galia yra k S ( n 1, k ) , kadangi prie kiekvieno
S ( n 1, k ) išskaidymo į k blokus k skirtingais būdais galima prijungti
elementą n: elementas n paeiliui jungiamas prie kiekvieno bloko.
(1.3.4) formulė įgalina lengvai apskaičiuoti S ( n, k ) . Žemiau pateikta
S ( n, k ) reikšmių lentelė, primenanti Paskalio trikampį.
Šią lentelę galima traktuoti kaip “Stirlingo trikampį”. i-osios eilutės
elementas yra lygus (i 1) -osios eilutės elemento iš kairės ir (i 1) -osios
eilutės elemento iš viršaus, padauginto iš k, sumai.
258
6 lentelė. Antrosios rūšies Stirlingo skaičiai
n\ k 0 1 2 3 4 5 6 7 8 9 10
0 1 0 0 0 0 0 0 0 0 0 0
1 0 1 0 0 0 0 0 0 0 0 0
2 0 1 1 0 0 0 0 0 0 0 0
3 0 1 3 1 0 0 0 0 0 0 0
4 0 1 7 6 1 0 0 0 0 0 0
5 0 1 15 25 10 1 0 0 0 0 0
6 0 1 31 90 65 15 1 0 0 0 0
7 0 1 63 301 350 140 21 1 0 0 0
8 0 1 127 966 1701 1050 266 28 1 0 0
9 0 1 255 3025 7770 6951 2646 462 36 1 0
10 0 1 511 9330 34105 42525 22827 5880 750 45 1
Iš tikro,
x 3 S (3,0)[ x ]0 S (3,1)[ x ]1 S (3,2)[ x ]2 S (3,3)[ x ]3
0 1 1 x 3 x ( x 1) 1 x ( x 1)( x 2)
x 3 x 2 3x x 3 3 x 2 2 x x 3 .
Pirmosios rūšies Stirlingo skaičiai. Šie skaičiai žymimi s ( n, k ) ir jie
yra koeficientai prie x laipsnių daugianaryje [ x]n , t.y.
n
[ x]n s (n, k ) x k .
k 0
259
Kitaip tariant, skaičiai s ( n, k ) vaidina atvirkščią vaidmenį atžvilgiu
S ( n, k ) , t.y. leidžia polinomą, užrašytą bazėje 1, [ x ]1 , [ x ]2 ,..., pervesti į
polinomo užrašą bazėje 1, x, x 2 ,... .
Nesunku parodyti (palyginant koeficientus prie x k laipsnių lygybėje
[ x ]n [ x ]n1 ( x n 1) ), kad s ( n, k ) tenkina sąryšius:
s ( n, k ) s ( n 1, k 1) ( n 1) s ( n 1, k ) , 0 k n ,
s ( n, n ) 1 , n 0 , (3.4.3)
s (n,0) 0 , n 0 .
S ( n, k ) .
Žemiau pateikta pirmosios rūšies Stirlingo skaičių lentelė.
7 lentelė. Pirmosios rūšies Stirlingo skaičiai
n\ 0 1 2 3 4 5 6 7 8 9 10
k
0 1 0 0 0 0 0 0 0 0 0 0
1 0 1 0 0 0 0 0 0 0 0 0
2 0 -1 1 0 0 0 0 0 0 0 0
3 0 2 -3 1 0 0 0 0 0 0 0
4 0 -6 11 -6 1 0 0 0 0 0 0
5 0 24 -50 35 -10 1 0 0 0 0 0
6 0 -120 274 -225 85 -15 1 0 0 0 0
7 0 720 -1764 1624 -735 175 -21 1 0 0 0
8 0 -5040 13068 -13132 6769 -1960 322 -28 1 0 0
9 0 40320 -109584 118124 -67284 22449 -4536 546 -36 1 0
10 0 -362880 1026576 -1172700 723680 -269325 63273 -9450 870 -45 1
Belo skaičius Bn. Belo skaičius – tai visų galimų n-elementės aibės X
išskaidymo į blokus skaičius:
Bn | ( x ) | , čia | X | n .
Kitaip tariant,
n
Bn S (n, k ) .
k 0
Įrodysime Belo skaičius siejantį rekurentinį sąryšį:
n
Bn1 Cni Bi , B0 1 . (3.4.4)
i 0
Aibės X {1,2,..., n 1} visų galimų išskaidymų aibę galima
išskaidyti į klases, priklausomai nuo bloko B, turinčio savyje elementą n 1 ,
arba, kas ekvivalentu, priklausomai nuo aibės X \ B . Kiekvienai aibei
260
X \ B {1,2,..., n} egzistuoja tiksliai | ( X \ B ) | B| X \ B| aibės X
išskaidymų, turinčių savyje bloką B. Grupuodami klases priklausomai nuo
aibės X \ B galios, gauname (3.4.3) formulę.
Žemiau pateikta Belo skaičių lentelė.
8 lentelė. Belo skaičiai
n Bn
0 1
1 1
2 2
3 5
4 15
5 52
6 203
7 877
8 4 140
9 21 147
10 115 975
11 678 570
12 4 213 597
13 27 644 437
14 190 899 322
15 1 382 958 545
261
B1 {n}, B2 ,..., Bk ,
B1 , B2 {n},..., Bk ,
(3.4.5)
B1 , B2 ,..., Bk {n},
B1 , B2 ,..., Bk , {n}.
Ši savybė įgalina sudaryti paprastą rekurentinį metodą, generuojantį
visus galimus aibės X {1,2,..., n} išskaidymus: jei mes žinome aibės
{1,2,..., n 1} visų galimų išskaidymų sąrašą Ln-1, tai visų galimų aibės
{1,2,..., n} išskaidymų sąrašas Ln gaunamas pakeičiant kiekvieną sąrašo Ln-1
išskaidymą (3.4.5) seka. Be to, nesunku pastebėti, jei kas antram sąrašo
sąrašo Ln-1 išskaidymui invertuosime (rašysime atvirkščia tvarka) (3.4.5)
seką, tai sąrašo Ln gretimi išskaidymai mažai skirsis vienas nuo kito. Tiksliau
kalbant, kiekvienas gretimas sąrašo Ln išskaidymas bus gautas iš prieš jį esančio
išskaidymo pašalinant kažkokį elementą iš kažkurio bloko ir patalpinant šį
elementą į kitą bloką, arba sukuriant iš jo vienelementinį bloką. Pavyzdžiui, jei
n 3 , tai gausime tokius sąrašus:
L1 : {1}
L2 : {1,2}, {1}{2}
L3 : {1,2,3}, {1,2}{3}, {1}{2}{3}, {1}{2,3}, {1,3}{2} .
Toliau aptarsime nerekurentinę šio metodo realizaciją.
Aibės {1,2,..., n} išskaidymo blokus surašysime jų mažiausio
elemento didėjimo tvarka. Bloko mažiausią elementą mes vadinsime bloko
numeriu. Reikia pažymėti, kad gretimų blokų numeriai bendru atveju nėra iš
eilės einą natūralieji skaičiai.
Šiame algoritme naudosime kintamuosius prec[i ] ir sek[i ] ,
1 i n , atitinkamai reiškiančius prieš ir po bloko, kurio numeris i, stovinčių
blokų numerius. Jei blokas, kurio numeris i, yra paskutinysis išskaidymo
blokas, tai sek [i ] 0 .
Naudosime kintamąjį blok [i ] , i 1, n . Jei blok[i ] k , tai
reiškia, kad i-tasis aibės {1,2,..., n} elementas priklauso blokui, kurio
numeris k.
Elemento judėjimo kryptį nusakys kintamasis pirmyn[i ] , i 1, n .
Jei pirmyn[i ] true , tai elementas i “juda” pirmyn.
Žemiau pateiktas algoritmas generuoja visus galimus aibės
{1,2,..., n} išskaidymo būdus, kai duotas aibės elementų skaičius n.
262
Algoritmo rezultatas: visų galimų aibės {1,2,..., n} išskaidymų seka,
kurioje kiekvienas išskaidymas gaunamas iš prieš tai buvusio, perkeliant
vienintelį elementą į kitą bloką.
begin
for i := 1 to n do { Elementą i patalpinti į pirmąjį bloką }
begin
blok [i] := 1; pirmyn [i] := true;
end;
sek [1] := 0;
Atspausdinti išskaidymą:
elementai, masyve blok pažymėti tuo pačiu numeriu k,
priklauso k-ajam blokui.
j := n; { j = aktyvusis elementas }
while j > 1 do
begin
k := blok [j];
if pirmyn [j] then { j “juda” į priekį }
begin
if sek [k] := 0 then { k yra paskutinysis blokas }
begin
sek [k] := j; prec [j] := k; sek [j] := 0;
end;
if sek [k] > j {j sudaro naują bloką }
begin
prec [j] := k;
sek [j] := sek [k];
prec [sek [j]] := j; sek [k] := j;
end;
blok [j] := sek [k]
end
else {j “juda” atgal }
begin
blok [j] := prec [k];
if k = j then { j sudaro vienelementį bloką }
if sek [k] = 0 then sek [prec [k]] := 0;
else
begin
sek [prec [k]] := sek [k];
prec [sek [k]] := prec [k];
end;
263
end;
Atspausdinti išskaidymą.
j := n;
while ((j > 1) and ((pirmyn [j]) and (blok [j] = j))
or ((not pirmyn [j]) and (blok [j] := 1))) do
begin
pirmyn [j] := not pirmyn [j];
j := j – 1;
end;
end;
end;
Pateiktas algoritmas pradžioje generuoja išskaidymą {1,2,3,..., n} ,
t.y. pirmąjį aibės išskaidymą sąraše Ln, kuris gaunamas aukščiau aprašytu
rekurentiniu metodu.
Pagrindinio ciklo “while j > 1 do” paskirtis yra “aktyvaus” elemento j
radimas ir jo perkėlimas į kaimyninį bloką, t.y. į bloką iš dešinės, jei pirmyn [j]
turi reikšmę true (šiuo atveju gali būti sukuriamas blokas {j}), ir į bloką iš
kairės, jei pirmyn [j] = false.
Iš aukščiau pateikto rekurentinio metodo išplaukia, kad elementas j gali
būti “judinamas”, kai visi didesni už jį elementai pasiekia savo ribinę kairiąją
arba dešiniąją padėtį. Kitaip tariant, “aktyvusis elementas” j* yra toks
elementas, kai visi didesni už jį elementai j (j > j*) tenkina vieną iš dviejų
sąlygų:
a) pirmyn [j] and (blok [j] = j), t.y. elementas juda pirmyn (į dešinę) ir
pasiekia savo dešiniąją ribinę padėtį (aišku, kad j negali būti
elementu bloko, kurio mažiausias elementas yra didesnis už j);
b) not pirmyn [j] and (blok [j] = 1), t.y. elementas juda atgal (į kairę) ir
pasiekia savo kairiąją ribinę padėtį.
Aišku, kad, jei elementas j tenkina vieną iš minėtų sąlygų, tai keičiama
jo judėjimo kryptis.
Paanalizuokime “aktyvaus” elemento perkėlimo į kitą bloką procesą.
Pirmiausia randamas numeris bloko, kuriame yra aktyvusis elementas.
Tarkime, kad tokio bloko numeris yra k.
Jei “aktyvusis” elementas “juda” į dešinę, tai pakanka perkelti jį į bloką,
kurio numeris yra sek[k ] , jei sek[ k ] 0 ir sek[k ] j .
Jei sek[ k ] 0 arba sek[k ] j , tai pirmiausia reikia modifikuoti
sek[k ] reikšmę.
Tarkime, sek [k] = 0. Vadinasi, “aktyviojo” elemento blokas yra
paskutinysis išskaidymo blokas. Šiuo atveju bus sudaromas naujas blokas {j}.
264
Tam tikslui pakanka priimti: sek[k ] : j ir atitinkamai pakeisti sek [ j ] ir
prec[ j ] reikšmes (žr. algoritmo tekstą).
Tarkime, sek [k] > j. Tai reiškia, kad visi blokai, esantys dešiniau bloko
k, sudaryti iš elementų, didesnių nei j (visi tie elementai užima ribinę dešinę
padėtį). Vadinasi, (žr. rekurentinį metodą), šiuo atveju reikia sukurti
vienelementį bloką {j}. Tai ir įvykdoma (žr. algoritmo tekstą).
Situacijoje, kai “aktyvusis” elementas juda atgal (į kairę), pakanka
patalpinti šį elementą į prieš bloką k stovintį bloką ir atlikti atitinkamus masyvų
sek ir prec elementų pakeitimus.
Žemiau surašyti visi galimi aibės {1,2,3,4} išskaidymo būdai,
apskaičiuoti pagal aukščiau pateiktą algoritmą.
{1,2,3,4} ,
{1,2,3}{4} ,
{1,2}{3}{4} ,
{1,2}{3,4} ,
{1,2,4}{3} ,
{1,4}{2}{3} ,
{1}, {2,4}{3} ,
{1}{2}{3}{4} ,
{1}{2,3}{4} ,
{1}{2,3,4} ,
{1,4}{2,3} ,
{1,3,4}{2},
{1,3}{2,4} ,
{1,3}{2}{4} .
Aišku, kad išskaidymų skaičius yra B4 15 .
265
Jei skaičių pi tvarka nesvarbi ir pi 0 , tai { p1 , p2 ,..., pk } yra
multiaibė (aibė su pasikartojančiais elementais) ir vadinama skaičiaus n
išskaidymu.
Pavyzdžiui, jei n 3 , tai (3), (1, 2), (2, 1), (1, 1, 1) yra skaičiaus 3
kompozicija, o (3), (1, 2), (1, 1, 1) – išskaidymas.
Kompozicija
Nagrinėjant kompoziciją, į skaičių n patogu žiūrėti kaip į atkarpą,
sudarytą iš vienetinio ilgio atkarpėlių, ir atkarpėlių susijungimo vietos
pažymėtos taškais.
Pavyzdžiui, kai n 8 , turėsime (žr. 3.4.2 pav.).
2 1 2 2 1
Išskaidymas
Išskaidymas skiriasi nuo kompozicijos tuo, kad komponentų tvarka
nesvarbi. Pavyzdžiui, išskaidymo atveju nedarome skirtumo tarp tokių
skaičiaus 4 išskaidymų: 1 1 2 , 1 2 1 , 2 1 1 . Nagrinėjant
skaičiaus n išskaidymą, patogu komponentes { p1 , p2 ,..., pk } išdėstyti
didėjimo tvarka, t.y. p1 p2 ... pk .
Skaičiaus n išskaidymą į l komponentes patogu generuoti leksikografine
tvarka, pradedant išskaidymu p1 p2 ... pl 1 1 , pl n l 1 , ir
266
tęsiant procesą tokiu būdu: norėdami gauti leksikografiškai didesnį išskaidymą
nei nagrinėjamas, nagrinėjame elementus iš dešinės į kairę iki rasime pirmąjį
elementą pi , tenkinantį sąlygą pl pi 2 ; po to p j keičiame pi 1
visiems j i, i 1,..., l 1 , ir elementui pl suteikiame reikšmę
l 1
n pj .
j 1
begin
l := 1;
p [1] := n;
p [0] := –1;
while l n do
begin
spausdinti ( p1 , p 2 ,..., pl ) ;
i := l – 1;
while p [l] – p [i] < 2 do i := i – 1;
if i 0 then for j := i to l – 1 do p [j] := p [i] + 1
else
begin
for j := 1 to l do p [j] := 1;
l := l + 1:
end;
l 1
p[l ] : n p j ;
j 1
end;
end;
Skaičiaus n išskaidymo algoritmą galima iš esmės pagerinti. Skaičiaus n
išskaidymą galima užrašyti taip:
267
m1 p1 , m2 p2 ,..., ml pl ,
čia mi rodo, kad komponentė pi į išskaidymą įeina mi kartų, t.y.
l
n mi pi .
i 1
Pasinaudojant tokiu išskaidymo užrašymu ir generuojant išskaidymus
taip, kad p1 p2 ... pl , galima gauti efektyvesnį išskaidymų generavimo
algoritmą nei aukščiau pateiktas.
Pavyzdžiui, kai n 7 , generuodami išskaidymus nurodyta tvarka,
gausime tokią išskaidymų seką:
{7 1} {1,1,1,1,1,1,1} ,
{1 2, 5 1} {2,1,1,1,1,1} ,
{2 2, 3 1} {2,2,1,1,1} ,
{3 2, 1 1} {2,2,2,1} ,
{1 3, 4 1} {3,1,1,1,1} ,
{1 3, 1 2, 2 1} {3,2,1,1} ,
{1 3, 2 2} {3,2,2} ,
{2 3, 1 1} {3,3,1} ,
{1 4, 3 1} {4,1,1,1} ,
{1 4, 1 2, 1 1} {4,2,1} ,
{1 4, 1 3} {4,3} ,
{1 5, 2 1} {5,1,1} ,
{1 5, 1 2} {5,2} ,
{1 6, 1 1} {6,1} ,
{1 7} {7} .
Žemiau pateiktame algoritme skaičiaus n išskaidymą pradėsime nuo
išskaidymo {n 1} . Norėdami gauti nagrinėjamam išskaidymui
{m1 p1 , m2 p2 ,..., ml pl } gretimą išskaidymą, nagrinėsime patį dešinįjį
išskaidymo elementą ml pl .
Jei ml 1 , tai galime pašalinti du elementus pl ir įvesti dar vieną
elementą pl 1 (arba įvesti vieną elementą pl 1 , jei tokio elemento
nagrinėjamu momentu nebuvo).
268
Jei ml 1 , tai suma ml 1 pl 1 ml pl pakankamai didelė, kad
galėtume įvesti dar vieną pl 1 1 . Bet kuriuo atveju tas, kas lieka,
paverčiama į atitinkamą vienetukų skaičių.
269
Aišku, kad pateiktas algoritmas yra tiesinis, kadangi skaičius operacijų,
reikalingų pereinant nuo vieno išskaidymo prie kito, yra apribotas konstanta,
nepriklausančia nei nuo n, nei nuo l.
1
Kitur literatūroje rekurentiniai sąryšiai vadinami skirtuminėmis lygtimis
(difference equations).
270
operacijų simboliais (n – 1)-oje pozicijoje ir 10 skaitinių simbolių n-tojoje
pozicijoje. Vadinasi,
an 10 an1 40 an2 . (3.5.1)
Tam, kad galėtume pasinaudoti šia išraiška, reikia žinoti a0 ir a1. Aišku,
kad a0 0 , o a1 10 , nes ilgio 1 išraiška gali būti tik skaitmuo.
Tuo būdu,
a2 10a1 40a0 10 10 40 0 100 ,
a3 10a2 40a1 10 100 40 10 1400 ,
a4 10a3 40a2 10 1400 40 100 18000 ,
ir t.t.
271
Su Fibonačio skaičiais susiduriama įvairiuose kombinatorikos
uždaviniuose. Jie turi įdomių savybių. Dargi yra leidžiamas žurnalas “Fibonacci
Quarterly” [MKB86].
Pavyzdžiui, Fibonačio skaičių seką generuoja ir tokio uždavinio
sprendinys.
Reikia sužinoti, kiek yra n-narių ( n 1) sekų, sudarytų iš nulių ir
vienetukų, kuriose nėra dviejų greta parašytų vienetų.
Imkime bet kurią n-narę nulių ir vienetukų seką, tenkinančią sąlygą: du
vienetai niekur joje nestovi drauge. Tokio sekos paskutinysis skaitmuo gali būti
0 arba 1. Suskirstykime nagrinėjamas n-nares sekas į dvi klases. Į pirmąją klasę
talpinkime sekas, kurios baigiasi nuliu, o į antrąją – sekas, kurios baigiasi
vienetu. Simboliu T (n) pažymėkime n-narių sekų, tenkinančių uždavinio
sąlygą, skaičių. Aišku, kad pirmosios klasės narių skaičius bus lygus
T ( n 1) , nes n-narė seka, atmetus n-ojoje pozicijoje stovintį nulį, duos
( n 1) ilgio seką, tenkinančią uždavinio sąlygą.
Antrojoje klasėje yra sekos, kurių n-ojoje pozicijoje yra 1. Tada,
remiantis uždavinio sąlyga, teigiame, kad kiekvienos sekos ( n 1) -ojoje
pozicijoje yra 0. Vadinasi, jei tokioje sekoje atmestume du paskutiniuosius
elementus: 0 ir 1, tai gautume ( n 2) ilgio seką, tenkinančią uždavinio
sąlygą. Vadinasi, antrosios klasės sekų skaičius yra T ( n 2) . Tuo būdu,
T (n) T (n 1) T ( n 2) . (3.5.3)
Kad ši rekurentinė išraiška generuotų Fibonačio skaičių seką, reikia, kad
T (1) T ( 2) sutaptų su dviem iš eilės einančiais Fibonačio skaičiais.
Aišku, kad T (1) 2 (sekos “0” ir “1”), o T ( 2) 3 (sekos “00”,
“01” ir “10”).
Kadangi T (1) F (1) , o T ( 2) F (2) , tai (3.5.3) rekurentinė
išraiška generuos Fibonačio skaičius.
272
F1 F3 F2 ,
F2 F4 F3 ,
Fn Fn 2 Fn1 ,
n
Fi Fn 2 F2 .
i 1
273
F12 F1 F2 F0 F1 ,
F22 F2 F3 F1 F2 ,
Fn2 Fn Fn1 Fn1 Fn ,
n
Fi 2 Fn Fn1 , nes F0 0.
i 1
274
Trečias pavyzdys. Hanojaus bokštų uždavinys2 [DGP83]
Duoti trys strypai: S1, S 2 ir S 3 . Ant pirmojo strypo užmauta n
skirtingo skersmens d1 , d 2 ,..., d n diskų, tenkinančių sąlygą:
d1 d 2 ... d n (žr. 3.5.1 pav.). Šiuos diskus reikia perkelti nuo strypo S1
ant kito strypo, pvz. S3, laikantis taisyklių:
1) kiekviename žingsnyje galima perkelti tik vieną viršutinį diską;
2) niekada negalima uždėti didesnio skersmens disko ant mažesnio
skersmens disko;
3) bet kuriuo momentu visi diskai turi būti užmauti ant vieno iš strypų.
Kiek diskų perkėlimų reikės atlikti?
Simboliu h(n) pažymėkime veiksmų (disko perkėlimų) skaičių.
S1 S2 S3
4
3
2
1
2
Šis uždavinys paimtas iš legendos, kurioje pasakojama, kad kadaise Hanojuje
buvo pastatyta šventykla ir prie jos trys bokštai (strypai). Ant pirmojo bokšto
buvo užmauti 64 skirtingo skersmens diskai taip, kad didžiausias būtų apačioje
o mažiausias – viršuje. Tos šventyklos vienuoliai turėjo perkelti visus diskus
nuo pirmojo bokšto ant trečiojo, laikantis uždavinyje nurodytų sąlygų.
Legendoje sakoma, kad perkėlus diskus įvyks pasaulio pabaiga.
275
t.y. norint perkelti n diskų, reikės du kartus perkelti ( n 1) diskų ir dar vieną
n-ąjį diską.
Šio rekurentinio sąryšio pradinė sąlyga yra h(1) 1 .
(3.5.7) rekurentinis sąryšis generuos seką: h(1) 1 ;
h( 2) 2h(1) 1 2 1 1 3 , h(3) 2h(2) 1 2 3 1 7 ,
h( 4) 2h(3) 1 2 7 1 15 ir t.t.
Iš pateiktų pavyzdžių matyti, kad visi rekurentiniai sąryšiai generuoja
skaičių an sekas (žymėsime {an } n 0 ), kurios priklauso tiek nuo
rekurentinio sąryšio, tiek ir nuo pradinių sąlygų. Kitaip tariant, rekurentinis
sąryšis su fiksuotom pradinėm sąlygom nusako natūraliojo argumento funkciją.
Apibrėžimas. k-osios eilės tiesiniu rekurentiniu sąryšiu vadinsime
formulę, rišančią a n su an1 , an 2 ,..., an k :
c0 ( n)an c1 ( n)an1 ... ck ( n)ank (n), n k ,
čia c0 ( n), c1 ( n),..., ck ( n) ir (n) yra natūraliojo argumento funkcijos
ir c0 ( n) 0 , ck ( n) 0 .
Tam, kad sąryšis generuotų skaičių seką, reikia k pradinių sąlygų:
a0 , a1 ,..., ak 1 . Jei c0 ( n),..., ck ( n) yra konstantos, tai sakome, kad
turime tiesinį rekurentinį sąryšį su pastoviais koeficientais.
Jei ( n) 0 , tai rekurentinis sąryšis vadinamas homogeniniu,
priešingu atveju – nehomogeniniu.
Pavyzdžiui,
a) an 3an1 2an2 0 ,
b) a n 3an 1 2an 2 n 2 1 ,
c) a n ( n 1) a n1 ( n 1)a n 2 0 ,
d) an 9an1 26an2 24an 3 5n ,
e) an 3( an 1 ) 2 2an2 n ,
f) an a0 an1 a1 an2 ... an1 a0 ,
g) an2 ( an1 ) 2 1 .
Visos rekurentinės išraiškos, išskyrus e), f) ir g), yra tiesinės. e) išraiška
nėra tiesinė, kadangi turi narį ( an1 ) 2 . a), b) ir d) sąryšiai yra tiesiniai su
pastoviais koeficientais. Pavyzdžiui, a) ir b) sąryšiai yra 2-osios eilės, o d)
sąryšis yra 3-iosios eilės. a) ir c) sąryšiai yra homogeniniai, o b) ir d) –
nehomogeniniai.
276
3.5.2. Rekurentinių sąryšių sprendimas
Turimą k-tosios eilės rekurentinį sąryšį
f (n) a1 f (n 1) a2 f (n 2) ... ak f (n k )
tenkina be galo daug skirtingų sekų. Mat k pirmųjų sekos narių (pradines
sąlygas) galima pasirinkti laisvai, jie nėra susieti sąryšiais. Tačiau, kai k
pirmųjų narių pasirinkta, visi kiti nariai apskaičiuojami vienareikšmiškai: narys
f ( k 1) pagal rekurentinį sąryšį išreiškiamas nariais f (1) , f ( 2) , ...,
f (k ) , narys f ( k 2) – nariais f ( 2) , f (3) , ..., f ( k 1) ir t.t.
Remiantis rekurentiniu sąryšiu ir pirmaisiais sekos nariais, galima vieną
po kito apskaičiuoti sekos narius ir anksčiau ar vėliau surasti bet kokį sekos
narį. Tačiau tokiu atveju turime apskaičiuoti ir visus pirmesniuosius narius: juk
jų nežinodami, negalime rasti tolesnių narių. Tačiau dažnai reikalingas tik
vienas konkretus sekos narys, o kitų narių nereikia. Todėl labai svarbu žinoti
rekurentinio sąryšio sprendinį: natūraliojo argumento funkciją, kuri generuoja
tą pačią seką, kaip ir rekurentinis sąryšis.
Rekurentinio sąryšio sprendinį galima apibrėžti ir taip: natūraliojo
argumento funkcija f (n) yra rekurentinio sąryšio sprendinys, jei ją įstatę į
sąryšį, gausime tapatybę.
Pavyzdys. Imkime rekurentinę išraišką
f ( n) 3 f ( n 1) 2 f ( n 2) .
Tada f ( n) 2 n yra šios išraiškos sprendinys, nes
3 2 n1 2 2 n2 2 n2 (3 2 2) 2 n .
Reikia pabrėžti, kad f ( n) 2 n yra atskirasis rekurentinio sąryšio
sprendinys.
Apibrėžimas. k-osios eilės rekurentinio sąryšio sprendinys vadinamas
bendruoju sprendiniu, jei jis priklauso nuo k laisvųjų konstantų C1 ,..., C k ,
kurias pasirinkus galima gauti bet kurį to sąryšio sprendinį.
Pavyzdžiui, sąryšio
f ( n) 3 f ( n 1) 2 f ( n 2) (3.5.8)
bendrasis sprendinys yra
f (n) C1 2 n C21n (3.5.9)
Iš tikrųjų, lengva patikrinti, kad (3.5.9) funkcija (3.5.8) sąryšį paverčia
tapatybe. Todėl belieka patikrinti, ar kiekvieną (3.5.8) sąryšio seką galima
išreikšti (3.5.9) pavidalu. Kitaip tariant, reikia parodyti, kad bet kokioms
f (0) ir f (1) reikšmėms egzistuoja konstantos C1 ir C2.
Įstatę (3.5.9) į (3.5.8), kai n 0 ir n 1 , gausime:
277
C1 C 2 f (0),
2C1 3C 2 f (1).
Kadangi sistemos determinantas nelygus nuliui, tai ši sistema visada turi
sprendinį prie bet kokių f (0) ir f (1) reikšmių.
278
1 Lema. Jei f1 ( n) ir f 2 ( n) yra tiesiškai nepriklausomi (3.5.9)
rekurentinio sąryšio sprendiniai, tai bet kokiems skaičiams – konstantoms C1 ir
C2 funkcija
f (n) C1 f1 (n) C2 f 2 (n) (3.5.10)
yra (3.5.9) sąryšio sprendinys.
Įrodymas. (3.5.10) įstatykime į (3.5.9) sąryšį. Kairioji (3.5.9) sąryšio
pusė bus lygi
C1 f1 (n) C 2 f 2 ( n) .
Apskaičiuokime kairiąją (3.5.9) sąryšio pusę.
a1 (C1 f1 (n 1) C2 f 2 ( n 1)) a2 (C1 f1 ( n 2) C2 f 2 (n 2))
C1 ( a1 f1 (n 1) a2 f1 (n 2)) C 2 (a1 f 2 (n 1) a2 f 2 (n 2))
C1 f1 ( n) C2 f 2 ( n),
nes f1 ( n) ir f 2 ( n) yra atskiri (3.5.9) sąryšio sprendiniai.
2 lema. Jei r1 yra kvadratinės lygties
r 2 a1r a2
(ši lygtis vadinama charakteristine lygtimi) šaknis, tai f ( n) r1n yra (3.5.9)
išraiškos sprendinys.
Įrodymas. Kadangi r1 yra charakteristinės lygties šaknis, tai
r12 a1r1 a2 .
Šią lygybę padauginę iš r1n 2 , gausime:
r1n a1r1n1 a2 r1n2 ,
t.y. f ( n) r1n yra (3.5.9) sprendinys.
Teorema. (3.5.9) rekurentinio sąryšio bendrasis sprendinys
apskaičiuojamas taip:
1) randame charakteristinės lygties r12 a1r1 a 2 šaknis r1 ir r2,
2) bendrąjį sprendinį užrašome:
f (n) C1r1n C2 r2n , jei r1 r2 ,
f (n) C1r n C2 nr n , jei r1 r2 r .
Šios teoremos teisingumas tiesiogiai išplaukia iš 1-osios ir 2-osios lemos
ir to fakto, kad nr n yra (3.5.9) sprendinys, jei r1 r2 r .
Be to, kadangi f1 ( n) ir f 2 ( n) yra tiesiškai nepriklausomi, tai
konstantos C1 ir C2 egzistuoja prie bet kokių f (0) ir f (1) reikšmių.
279
Kaip minėjome aukščiau, k-osios eilės rekurentinė išraiška sprendžiama
analogiškai. Čia reikia įvertinti tik tą faktą, kad, jei charakteristinės lygties
šaknys r1 r2 ... rs r , tai atskirieji tiesiškai nepriklausomi rekurentinio
sąryšio sprendiniai yra f1 ( n) r n , f 2 (n) nr n , ..., f s ( n) n s 1r n .
Pirmas pavyzdys. Išspręskime Fibonačio seką nusakantį rekurentinį
sąryšį:
Fn Fn1 Fn2 ,
F0 0 , F1 1 .
Sudarome charakteristinę lygtį
r2 r 1 .
Šios lygties šaknys yra
1 5
r1 ,
2
1 5
r2 .
2
Vadinasi, bendrasis sprendinys yra
n n
1 5
Fn C1 C2 1 5 .
2 2
Konstantas C1 ir C2 parinksime taip, kad jos atitiktų pradines sąlygas:
F0 0 , F1 1 .
Gausime
C1 C2 0 ,
1 5 1 5
C1 C2 1.
2 2
Iš šios lygčių sistemos gausime:
1
C1 C2 .
5
Vadinasi, Fibonačio seką generuoja tokia natūraliojo argumento funkcija
n
1 5
n
1 1 5
Fn
5 2 2 .
Seka Fn yra glaudžiai susijusi su auksinio piūvio santykiu .
Primename, kad atkarpa (žr. 3.5.2 pav.) auksiniu piūvio santykiu daloma
į dvi dalis a ir b taip, kad
280
a ab
.
b a
a b
1 n
Kadangi | ˆ | 1 , tai Fn . Pasirodo (žr [Kn76]), kad, kai
5
1 n
n 3 , Fn , apvalinant iki artimiausiojo sveikojo skaičiaus.
5
Pavyzdžiui, Fibonačio skaičių seka yra:
F0 0, F1 1, F2 1, F3 2, F4 3, F5 5, F6 8 ir t.t.
1 3
Paėmę n 3 , gausime: 1,89 . Suapvalinę gausime 2.
5
1 4
Paėmę n 4 , gausime 3,07 . suapvalinę gausime 3. . Paėmę
5
1 5
n 5 , gausime 4,96 . suapvalinę gausime 5.
5
281
Antras pavyzdys. Išspręskime trečiosios eilės rekurentinį homogeninį
sąryšį: f (n) 9 f ( n 1) 26 f ( n 2) 24 f ( n 3) 0 , kai f (0) 0
, f (1) 1 , f ( 2) 3 .
Sąryšio rekurentinė lygtis yra
r 3 9r 2 26r 24 0 .
Šios lygties šaknys yra: r1 2 , r2 3 ir r3 4 . Tada sąryšio
bendrasis sprendinys yra
f ( n) C1 2 n C2 3n C3 4 n .
Apskaičiuosime konstantas:
C1 C2 C3 0,
2C1 3C2 4C3 1,
4C 9C 16C 3.
1 2 3
Išsprendę lygčių sistemą, gausime
C1 2 , C2 3 ir C3 1 .
Vadinasi, nagrinėjamo rekurentinio sąryšio su nurodytomis pradinėmis
sąlygomis sprendinys yra
f (n) 2 2 n 3 3n 4 n 2 n1 3n1 4 n .
282
Pirmiausia rasime HR f ( n) 7 f (n 1) 10 f ( n 2) 0
sprendinį. Šios HR charakteristinė lygtis yra
r 2 7 r 10 0 ,
o šaknys r1 2 , r2 5 . Tada
f H (n) C1 2 n C2 5n .
Apskaičiuosime atskirąjį NHR sprendinį. Jo ieškosime laisvojo nario
(n) pavidale:
f N ( n) C 4 n .
Įstatę f N (n) į NHR, gausime
C 4 n 7C 4 n 1 10C 4 n 2 4 n ,
C 4 n2 ( 4 2 7 4 10) 4 n ,
C (16 28 10) 4 2 ,
2C 16 ,
C 8 .
Vadinasi, f N (n) 8 4 2 4 n1 .
n
283
Kadangi 1-tas nėra charakteristinio polinomo šaknis, tai atskirojo NHR
sprendinio ieškosime laisvojo nario pavidale
hN ( n ) C .
Apskaičiuosime C statydami hN (n) į NHR.
C 2C 1 .
Iš čia C 1 .
Vadinasi,
h( n) C1 2 n 1 . (3.5.11)
Apskaičiuosime C1 įstatydami n 1 į (3.5.11). Gausime:
1 C1 2 1 ,
C1 1 .
Tokiu būdu h( n) 2 1 .
n
284
ir jo šaknys yra: r1 4 , r2 2 .
Tada f H ( n) C1 4 n C 2 2 n .
Kadangi šiame pavyzdyje a 1 ir a nėra charakteringojo polinomo
šaknis, tai f N (n) ieškosime pavidale f N (n) C .
Įstatę f N (n) į NHR, gausime, kad C 3 . Tuo būdu bendras NHR
sprendinys
f ( n) C1 4 5 C 2 2 n 3 .
Įvertindami pradines sąlygas: f (0) 10 , f (1) 25 , gausime
sistemą:
C1 C2 3 10,
4C1 2C2 3 25,
kurios sprendinys yra C1 4 , C 2 3 .
Vadinasi, f (n) 4 4 n 3 2 n 3 .
Antras pavyzdys. Išspręskime NHR:
f (n) 4 f (n 1) 4 f ( n 2) 2 n .
HR charakteristinė lygtis yra
k 2 4 k 4 ( k 2) 2 0
ir jo šaknys yra: k1 2 , k 2 2 . Todėl HR bendrasis sprendinys yra
f H ( n) C1 2 n C 2 n 2 n .
Kadangi 2 yra charakteristinės lygties du kartus kartotinė šaknis, tai
f N (n) ieškosime pavidale:
f N (n) Cn 2 2 n .
Įstatę šią išraišką į NHR, gausime:
Cn 2 2 n 4C ( n 1) 2 2 n1 4C ( n 2) 2 2 n 2 2 n .
C 2 n2 ( 4n 2 8( n 1) 2 4( n 2) 2 ) 2 n ,
8 C 2 n 2 2 n ,
8 C 2 2 1 ,
C 1 2 .
n2 n
Vadinasi, f (n) 2 C1 2 n C2 n2 n yra NHR bendrasis
2
sprendinys.
285
Teorema. Tarkime, kad f1 N ( n) yra atskirasis NHR
f ( n) a1 f ( n 1) ... a k f (n k ) 1 (n)
sprendinys, o f 2 N ( n) yra atskirasis NHR
f ( n) a1 f (n 1) ... ak f (n k ) 2 ( n)
sprendinys, tai f N ( n) f1 N ( n) f 2 N ( n) yra atskirasis NHR
f (n) a1 f (n 1) ... ak f (n k ) 1 (n) 2 (n)
sprendinys.
Pavyzdys. Raskime NHR
f ( n) 7 f ( n 1) 10 f ( n 2) 7 3n 4 n
atskirąjį sprendinį.
Pirmiausia rasime f (n) 7 f (n 1) 10 f (n 2) 7 3n atskirąjį
sprendinį f1 N ( n) , po to – f ( n) 7 f (n 1) 10 f ( n 2) 4 n atskirąjį
sprendinį f 2 N (n) ir juos sudėsime.
Nesunku įsitikinti, kad
63 n
f1 N ( n ) 3 ,
2
o f 2 N (n) 8 4 n .
Vadinasi, nagrinėjamosios NHR atskirasis sprendinys yra
63 n
f N (n) 3 8 4n .
2
NHR atskirojo sprendinio pavidalas, kai (n) yra polinomo ir
eksponentės sandauga:
(n) ( p0 p1n ... p s n s ) a n ,
čia pi , i 0, s ir a – konstantos.
Šiuo atveju atskirojo sprendinio pavidalas
(q0 q1n ... q s n s ) a n , jei CH ( a) 0,
f N ( n) n m (q0 q1n ... qs n s ) a n , jei a yra m kartų kartotinė
charakteristinio polinomo CH ( n) šaknis,
čia CH ( n) r k a1r k 1 ... ak 1r ak 0 .
Pavyzdys. Išspręskime NHR f ( n) 5 f (n 1) 6 f ( n 2) n 2 4 n ,
n 2.
286
Charakteristinio polinomo r 2 5r 6 0 šaknys yra r1 2 ,
r2 3 .
Kadangi 4 nėra CH (n) šaknis, tai
f N (n) ( q2 n 2 q1n q0 ) 4 n .
Įstatę šį sprendinį į NHR, gausime:
(q2 n 2 q1n q0 ) 4 n 5(q2 (n 1) 2 q1 (n 1) q0 ) 4 n1
6(q2 (n 2) 2 q1 (n 2) q0 ) 4 n2 n 2 4 n ,
4 n2 ((q2 n 2 q1n q0 ) 16 5(q2 (n 2 2n 1) q1 (n 1) q0 ) 4
6(q2 (n 2 4n 4) 2 q1 (n 2) q0 ) n 2 4 n.
Sudauginę ir sutraukę panašius narius, gausime:
2q2 n 2 (16q2 2q1 ) n 4q2 8q1 2q0 16n 2 .
Palyginę koeficientus prie tų pačių n laipsnių, gausime sistemą
2q2 16,
16q2 2q1 0,
4q 8q 2q 0,
2 1 0
287
f (n) C1 nC2 n 2 (4 n 2) .
Išnagrinėtus atvejus galima sutraukti į 9 lentelę.
Iš pateikto nagrinėjimo galime padaryti išvadą, kad NHR atskirojo
sprendinio f N (n) išraiška priklauso nuo NHR laisvojo nario – funkcijos
(n) , tačiau f N (n) turi būti tiesiškai nepriklausomas nuo HR sprendinio
f H (n) .
288
konverguoja. Todėl mes niekada neskaičiuosime tos eilutės sumos prie
konkrečios x reikšmės. Su šiomis eilutėmis mes vykdysime konkrečias
operacijas ir palyginsime koeficientus prie tų pačių x laipsnių. Tarkime, turime
dvi eilutes:
A( x ) ak x k ir B ( x ) bk x k .
k 0 k 0
Apibrėšime šių eilučių sumą.
A( x ) B ( x) (ak bk ) x k .
k 0
Apibrėšime sandaugos iš pastovaus skaičiaus operaciją.
pA( x ) pak x k .
k 0
Apibrėšime šių eilučių sandaugą.
A( x ) B ( x) ck x k ,
k 0
k
čia ck a0bk a1bk 1 a2bk 2 ... ak b0 ai bk i .
i 0
289
a0
c0 ,
b0
a1 b1c0
c1 ,
b0
(3.6.4)
n
an bi cni
cn i 1
,
b0
Iš matematinės analizės žinome, kad, jei eilutė kažkurioje nulio
aplinkoje konverguoja, tai (3.6.1) eilutė yra funkcijos A( x ) Makloreno
eilutė. Šiuo atveju generuojanti funkcija yra matematinės funkcijos A( x )
Makloreno eilutė. Todėl, šiuo atveju, atliekant operacijas, vietoje eilutės galima
imti analitinę funkciją A( x ) .
Pavyzdžiui, galime rašyti:
xk (1 x ) 1 , (3.6.5)
k 0
1
k! x k e x ir t.t.
k 0
Apskaičiuokime kai kurių sekų generuojančias funkcijas.
Imkime seką C n0 , C n1 ,..., C nn ,... , čia C nk , kai k n , yra lygus 0.
Šios sekos generuojanti funkcija yra Niutono binomas, t.y.
Cnk x k (1 x) n , (3.6.6)
k 0
Panagrinėkime (3.6.6) formulės fizinę prasmę. Kiekvieną daugiklį
(1 x ) galima traktuoti kaip aibės X {a1 , a2 ,..., an } atitikmenį, kuris
nusako elemento ai pasirodymo skaičių X poaibyje: 0 kartų (dėmuo 1 x 0 )
ir vieną kartą (dėmuo x x1 ). Aišku, kad kiekvienas aibės X poaibis
vienareikšmiškai apibrėžiamas, nurodant, kiek kartų kiekvienas elementas ai
pasirodo poaibyje, t.y. iš kiekvieno daugiklio (1 x ) (1 x ) ... (1 x )
išrenkant po vieną dėmenį. Vadinasi, šios sandaugos koeficientas prie x k-tojo
laipsnio ir parodo aibės X k-elemenčių poaibių skaičių.
290
Aišku, kad šį nagrinėjimą galima apibendrinti nagrinėjant aibes su
pasikartojančiais elementais. Pavyzdžiui, imsime aibę
X {2 a1 , 3 a2 , 1 a1 , 4 a1} , ir simboliu ck pažymėsime šios aibės k-
elemenčių poaibių skaičių. Apibendrinus aukščiau pateiktus samprotavimus,
sekos c0 , c1 , c2 ,... generuojanti funkcija yra
c
k 0
k xk (1 x x 2 ) (1 x x 2 x 3 ) (1 x )
(1 x x 2 x 3 x 4 ) 1 4 x 9 x 2 15 x 3
20 x 4 22 x 5 20 x 6 15 x 7 9 x 8 4 x 9 x10 .
Iš šios funkcijos matosi, kad skaičius poaibių, turinčių 5-is elementus,
yra 22.
Nesunku suvokti, kad, atitinkamai parinkus i-ąjį daugiklį, galima įvesti
įvairius apribojimus elementui ai. Pavyzdžiui, jei šis daugiklis yra 1 x 3 x 7 ,
tai reiškia, kad poaibyje elementas ai gali pasirodyti 0, 3, arba 7 kartus; jei
daugiklis yra 1 x 2 x 4 ... (1 x 2 ) 1 , tai reiškia, kad elementas ai
poaibyje gali pasirodyti lyginį skaičių kartų.
Jei mes neįvedame jokio apribojimo elemento ai, i 1, n , pasirodymo
skaičiui, tai generuojanti funkcija yra
(1 x x 2 ...) (1 x x 2 ...) ... (1 x x 2 ...)
(1 x) 1 (1 x) 1 ... (1 x) 1 (1 x) n .
Aišku, kad aukščiau pateiktiems pavyzdžiams galima suteikti ir kitokią
interpretaciją. Pavyzdžiui, nagrinėkime lygtį
e1 e2 r ,
čia e1, e2, ir r – natūralieji skaičiai. Skaičiams e1 ir e2 gali būti įvesti apribojimai.
Mus domina šios lygties sprendinių skaičius. Tarkime, e1 gali būti arba 0, arba
1, arba 9, o e2 tenkina nelygybę 0 e2 8 . Simboliu cr , r 0, 1, 2, ...
pažymėkime šios lygties sprendinių skaičių. Tada šios sekos generuojanti
funkcija yra dėmenų e1 ir e2 apribojimus nusakančių funkcijų
A1 ( x ) (1 x x 9 ) ir A2 ( x ) (1 x ... x 8 ) sandauga:
ck x k (1 x x 9 ) (1 x x 2 x 3 ... x 8 ) .
k 0
291
generuojančią funkciją: A1 ( x ) A2 ( x ) ... An ( x ) ir koeficientas prie x r
duos atsakymą.
Imkime seką 1,2,4,8,...,2 k ,... . Šios sekos generuojanti funkcija
yra
2k x k (2 x) k (1 2 x ) 1 (žr. (3.6.5) formulę).
k 0 k 0
Remiantis tuo, kad analitinę funkciją galima panariui diferencijuoti,
išveskime sekos 0, 1, 2, 3, ..., n ,... generuojančią funkciją.
d n k
kx k x kx k 1 x x
dx k 0
k 0 k 0
d
x (1 x) 1 x(1 x) 2 .
dx
Žemiau pateikiame lentelę, kurioje surašytos kai kurių sekų
generuojančios funkcijos.
292
10 lentelė. Generuojančios funkcijos
Eil. Sekos Generuojančios funkcijos
nr.
1 C nk (1 x) n
2 1 (1 x ) 1
3 an (1 ax ) 1
4 (1) n (1 x ) 1
5 ( 1) n a n ( a ) n (1 ax ) 1
6 C nn k 1 (1 x ) n
7 C nn k 1a n (1 ax ) n
8 C nn k 1 ( a ) n (1 ax ) n
9 n 1 (1 x ) 2
10 n x (1 x ) 2
11 ( n 2)(n 1) 2(1 x ) 3
12 ( n 1) n 2 x (1 x ) 3
13 n2 x(1 x )(1 x ) 3
14 (n 3)(n 2)(n 1) 6(1 x ) 4
15 (n 2)(n 1) n 6 x (1 x ) 4
16 n3 x (1 4 x x 2 )(1 x ) 4
17 ( n 1)a n (1 ax ) 2
18 na n ax (1 ax ) 2
19 n2a n ax(1 ax )(1 ax ) 3
20 n3a n ax (1 4ax a 2 x 2 )(1 ax) 4
293
f ( x)
Tam tikslui panagrinėkime taisyklingąją algebrinę trupmeną ,
( x)
čia f (x ) ir ( x ) – atitinkamai n-osios ir m-osios ( n m ) eilės
polinomai:
f ( x) a0 a1 x a2 x 2 ... an x n ,
( x ) b0 b1 x b2 x 2 ... bm x m ,
ir b0 0 .
Aišku, kad
f ( x)
c0 c1 x c2 x 2 ... ck x k ... (3.7.1)
( x)
Vadinasi,
a0 a1 x a 2 x 2 ... a n x n (b0 b1 x b2 x 2 ... bm x m )
( c0 c1 x c 2 x 2 ... c k x k ...).
294
Pastaba. Tarkime, r 1min
i m
| xi | , čia xi – polinomo
b0 b1 x b2 x 2 ... bm x m šaknys. Tada (3.7.1) eilutė konverguoja srityje
| x | r .
Pavyzdys. Sudarysime Fibonačio skaičių sekos generuojančią funkciją.
Fibonačio skaičius generuojantis rekurentinis sąryšis yra
Fn Fn1 Fn 0, F0 0, F1 1 .
Vadinasi, Fibonačio skaičius generuojanti funkcija yra
f ( x) a a1 x
0 .
( x) 1 x x 2
Koeficientus a0 ir a1 apskaičiuosime pagal (3.7.2) formules:
a0 b0 c0 1 0 0,
a1 b0 c1 b1c0 1 1 (1) 0 1.
Tuo būdu, Fibonačio skaičių sekos generuojanti funkcija yra
x
A( x) .
1 x x2
Iš pirmo žvilgsnio atrodo, kad mažai ką laimėjome, rekurentinį sąryšį
pakeisdami generuojančia funkcija: juk vis tiek reikės skaitiklį dalyti iš
vardiklio, o iš to gausime tą patį rekurentinį sąryšį. Tačiau (3.7.4) trupmeną
galima tapačiai pertvarkyti, o tai palengvina skaičių ck radimą.
Pavyzdys. Tarkime, generuojanti funkcija yra
x3 2x 2 6x 1
.
x 4 5x 2 4
Išdėstykime šią trupmeną paprastesnėmis trupmenomis.
Šis uždavinys buvo spręstas matematinės analizės kurse. Tam tikslui
raskime vardiklio polinomo šaknis:
x 4 5 x 2 4 ( x 2 1)( x 2 4) ( x 1)( x 1)( x 2)( x 2) .
Vadinasi,
x3 2x 2 6x 1 A B C D
.
x 5x 4
4 2
x 1 x 1 x 2 x 2
Abi lygybės puses padauginę iš bendro vardiklio ir palyginę skaitiklių
koeficientus prie tų pačių x laipsnių, gausime:
295
A B C D 1,
A B 2C 2 D 2,
4 A 4 B C D 6,
4 A 4 B 2C 2 D 1.
Šios sistemos sprendinys yra:
A 1 , B 4 3 , C 13 12 ir D 9 4 .
A
Trupmenos eilutė žinoma. Pavyzdžiui,
x
1
13 1 13 x 13 x x2 xn
1 1 2 ... n ... .
12 x 2 24 2 24 2 2 2
Tokiu būdu, gausime:
x3 2x 2 6x 1
(1 x x 2 ... x n ...)
x 4 5x 2 4
4
1 x x 2 ... (1) n x n ...
3
13 x x2 xn
1 2 ... n ...
24 2 2 2
9 x x2 xn
1 2 ... (1) n n ... .
8 2 2 2
Apskaičiavę koeficientą prie x n , gausime:
4 13 9 (1) n
cn 1 (1)
n
.
3 24 2 n 8 2n
Tuo pačiu gavome generuojančiai funkcijai atitinkančio rekurentinio
sąryšio sprendinį.
Šis nagrinėjimas duoda mintį, kaip galima spręsti rekurentinį sąryšį,
panaudojant generuojančias funkcijas.
Tam tikslui reikia:
f ( x)
1) sudaryti rekurentiniam sąryšiui generuojančią funkciją ,
( x)
f ( x)
2) išreikšti elementariųjų trupmenų suma, o jas – laipsninėmis
( x)
eilutėmis (pagal Niutono formulę),
296
3) gautos eilutės koeficientas cn prie x n ir bus ieškomasis
sprendinys.
Pavyzdys. Išspręskime rekurentinį sąryšį:
f (n) 5 f ( n 1) 6 f ( n 2) 0 , f (0) 1 , f ( 2) 2 .
Šiuo atveju b0 1 , b1 5 ir b2 6 .
Pagal (3.7.2) formules apskaičiuosime a0 ir a1:
a0 b0 c0 1,
a1 b0 c1 b1c0 7.
Vadinasi, rekurentinį sąryšį atitinkanti generuojanti funkcija yra
f ( x) 7 x 1
2 .
( x) x 5 x 6
Ši trupmena elementariosiomis trupmenomis išreiškiama taip:
7 x 1 13 20
,
x 5x 6 x 2 x 3
2
297