Professional Documents
Culture Documents
Skripta e P
Skripta e P
Manipulacije sa listama
Veoma esto je potrebno vie razliitih izraza tretirati kao jedan objekt. Liste daju tu
mogunost u programskom paketu Mathematica. Lista je izraz koji poinje sa otvorenom
vitiastom zagradom {, a zavrava sa zatvorenom vitiastom zagradom } a izmeu koji se
navode izrazi koji su odvojeni meusobno zarezom. Na primjer:
{myName, yourName, 3.14159, a, Obala Kulina Bana}.
Svakoj listi moemo pridruiti ime. Na primjer:
myList = {a, b, c}
Elementu u listi preko imena liste pristupan tako to prvo navedemo ime liste pa
zatim u dvostrukim uglastim zagradama navedemo redni broj elementa u listi (indeks). Na
primjer, ako elimo da dobijemo drugi element iz liste myList to radimo sa sljedeom
naredbom
myList[[2]].
Elementi liste, takoer, mogu da budu i druge liste (podliste). Na primjer:
myList = {{a,b,c},{d,e,f},g,h,{k,l,m}}
Za pristup prvom elementu liste koristimo naredbu myList[[1]] i kao rezultat emo
dobiti {a,b,c}. Ako elimo da pristupimo drugom elementu prve podliste u listi myList to
radimo tako to u dvostrukim uglastim zagradama prvo navedemo indeks podliste u listi
myList a to je u naem sluaju 1, a zatim indeks odgovarajueg elementa u podlisti, pa bi
naredba izgledala ovako myList[[1,2]].
Postoji mnogo ugraenih funkcija koje omoguavaju manipulaciju sa listom. Mi emo navesti
samo one koje se najee koriste.
Naredba Length[myList] vraa duinu liste myList, a naredba Length[myList[[2]]]
vraa duinu druge podliste. Rezultat prve naredbe je 5, a druge 3. Naredba
Length[myList[[3]]] e izazvati grek jer trei element liste myList nije lista. Zato, prilikom
manipulacije sa listom treba imati na umu koji elementi liste su liste a koji obini izrazi.
Naredba Reverse[myList] vraa listu kod koje su elementi u obrnutom poretku u odnosu na
listu myList. Ako elimo da dodamo izraz Sarajevo na kraj liste, to radimo sa sljedeom
naredbom
Append[myList,Sarajevo],
Naredba Append kao prvi parametar uzima listu u koju se dodaje element na kraj, a
drugi parametar je element koji se dodaje. Treba imati na umu da se ovom naredbom ne
mijenja sama lista myList, ve se vraa lista koja nastaje dodavanjem izraza Sarajevo na kraj
liste myList, a ako elimo da lista myList postane upravo to, onda koristimo naredbu
AppendTo[myList, Sarajevo]
Analogno, ako elimo da dodamo izraz Sarajevo na prvo mjesto u listi myList,
koristimo naredbeu Prepend[myList, Sarajevo], odnosno, naredbu PrependTo[myList,
Sarajevo] ako elimo da mijenjamo listu myList.
Naredba Position[list,expression] vraa listu indeks koji odgovaraju poziciji izraza
expression u list, a naredba MemberQ[list,expression] vraa True ako je izraz expession
element liste list, a u suprotnom False. Naredbe First[list], Last[list] vraaju prvi odnosno
zadnji element iz liste respektivno. Pored naprijed navedenih funkcija postoji jo mnotvo
funkcija za manipulaciju sa listama. Navedimo jo neke.
Take[list, n]
Take[list,-n]
Take[list,{m,n}]
Drop[list,n]
Drop[list,-n]
Dop[list,{m,n}]
Rest[list]
Stavimo da je
In[2]:=Last[ t ]
Out[2]={aa, bb}
In[3]:=Take[ t, 3
Out[3]={a, b, c}
In[4]:=Drop[ t, -2
Out[4]={a, b, c, d}
In[5]:=Position[t,
Out[5]= {{1}}
a]
In[6]:=Insert[ {a, b, c,
Out[6]={a, x, b, c, d}
d }, x, 2]
In[7]:= MemberQ[{a,
Out[7]=True
b, d, e, f, {c}}, d]
Sljedea naredba kreira matricu formata 2x2 i In[9]:=m = Table[i - j, {i, 1, 2}, {j, 0, 1}]
dodjeljuje joj ime m
Out[9]={{1, 0}, {2, 1}}
Ovo vraa duinu prve podliste od m
In[10]:=Length[m[[1]]]
Out[10]=2
2}}, {g}]
Sort[ list ]
Reverse[ list ]
Permutations[ list]
20
-3
-2
-1
1
-20
-40
0.5
-0.5
-1
{i, 1, 20}]]
70
60
50
40
30
20
10
10
15
20
Prilikom koritenja naredbe Plot postoje mnoge osobina koje se mogu specificirati.
Kao zadnji argument u funkciji Plot moemo ih ukljuiti sa naredbom oblika option
value. Za opciju za koju nismo specificirali vrijednost uzeta je podrazumijevana vrijednost.
default value
Automatic
$DisplayFunction
False
None
1/GoldenRatio
Automatic
0.5
-0.5
-1
0
x vrijednost
-2
Prilikom crtanja grafika funkcija mogue je kombinovati zajedno vie opcija. Na primjer:
In[5]:=Plot[x Cos[x]
x vrijednost
-1
-2
Mathematica za bilo koji grafikon koji crta, snima sve informacije o njemu, tako da
je mogue taj grafik ponovo iscrtati. Prilikom ponovnog iscrtavanja grafika (odnosno bilo
kojeg grafikog objekta) mogue je i mijenjati neke opcije. Za ponovno iscrtavanje grafika
koriste nam sljedee naredbe:
Show[ grafik]
Show[ grafik, option - > value ]
Show[ grafik1, grafik2, ... ]
InputForm[ grafik ]
crta grafik
crta grafik sa promijenjenim opcijama
kombinuje vie grafika
prikazuje informacije koje su snimljene interno za grafik
Sljedea naredba samo rauna informacije za grafik funkcije i snima ih u promjenljivu grafik
bez crtanja grafika
In[6]:=grafik
0.5
2
-0.5
-1
10
12
10
15
20
In[9]:=InputForm[%]
Out[9]=Graphics[{Point[{1, 2}],
Point[ {x, y} ]
Line[ { {x1, y1}, {x2, y2}, ....} ]
Rectangle[ {xmin, ymin},{ xmax, ymax}]
Polygon[{ {x1, y1}, {x2, y2}, ....} ]
Cicle[ {x, y}, r ]
Disk[{x, y}, r ]
Text[ expr, {x, y} ]
= Show[Graphics[linije]]
0.5
-0.5
-1
Takoer je mogue kombinovati grafike objekte koji se dobiju naredbom Plot ili ListPlot sa
naim vlastitim grafikim objektima:
In[13]:=Show[tacke,
5
-2
10
15
20
1 1
Out[14]=
(5 + 5), (-1+ 5) ,
4
2 2
1 1
1
(5 - 5), (-1- 5) ,
2 2
1
1 1
(5 - 5), (-1- 5) ,
4
2 2
1
1 1
2 2
Da bismo generisali poligon koristimo primitivu Polygon, a za prikaz naredbu Show.
In[15]:=Show[Graphics[Polygon[petougao]],
In[17]:=Show[Graphics[{Table[{AbsoluteThickness[n],
In[18]b=Show[Graphics[{AbsolutePointSize[10],
Table[Point[{n, Prime[n]}],
12
10
8
6
4
2
1
Pored funkcije Plot Mathematica ima i ugraenu funkciju Plot3D. Ova funkcija
omoguava crtanje grafika funkcija od dvije promjenljive. Ima sljedeu sintaksu:
Plot3D[ f, {x, xmin, xmax}, {y, ymin, ymax }]
Prvi parametar je funkcija koja zavisi od dvije promjenljive x i y a drugi i trei
parametar odreuju raspon za promjenljive x i y. Demonstrirajmo upotrebu ove funkcije
postavljajui da je funkcija za sjenenje GrayLevel.
In[19]:=Plot3D[Sin[x y],
1
0.5
0
3
-0.5
-1
0
2
1
1
2
3
4
1
0.5
0
-0.5
-1
0
Sljedeom naredbom crtamo grafik funkcije bez mree (triangulacione podjele) koristei
opciju Mesh:
In[21]:=Plot3D[Sin[x y],
1
0.5
0
-0.5
-1
4
1
3
2
2
3
1
0
4
Ako elimo samo triangulacionu podjelu grafika funkcije sa dvije promjenljive, onda
koristimo opciju Shading. Pogledajmo kroz sljedei primjer kako je moemo koristiti:
In[22]:= Plot3D[Sin[x y],
1
0.5
0
-0.5
-1
4
1
3
2
2
3
1
0
4
0.5
0
-0.5
0.5
-0.5
-1
4
5
0
-5
5
-5
-1 0
-0.5
0.5 1
In[25]:=Show[Graphics3D[
3. Funkcije i moduli
U svakom sloenijem programu postoje nizovi naredbi koji opisuju neki postupak
zajedniki nizu ulaznih vrijednosti. Do sada ako smo htjeli ponoviti neki postupak sa drugim
podacima, morali smo preslikati sve naredbe na sva mjesta gdje se taj postupak koristi. Mane
takvog postupka su oigledne: osim to programski kod postaje glamurozan, oteava se i
ispravka pogreki- primijeti li se pogreka u postupku, ispravku je potrebno unijeti na svako
mjesto gdje smo postupak koristili.
Kako bi se takva ponavljanja izbjegla, programski paket Mathematica nudi rjeenje
tako da se ponavljani postupak smjesti u zasebne cjeline funkciju, te se pozove na mjestu
gdje je to potrebno.
Funkciju je mogue pozvati i iz neke druge funkcije , pa ak i iz sebe same. Svaka se
funkcija moe pozvati neogranien broj puta. Kao ni varijable, ni funkcije nije potrebno
deklarisati, ve samo definisati.
Sintaksa za funkciju ima sljedei oblik:
Ime_funkcije[ arg1_ , arg2_ , ... ] := ( tijelo_funkcije )
Argumenti unutar uglastih zagrada iza imena funkcije su podaci koji se predaju
funkciji prilikom njenog poziva. Broj tih argumenata moe biti proizvoljan, s tim da funkcija
moe biti i bez argumenata Znak _ na lijevoj strani argumenta je jako vaan, i arg1_ ima
znaenje jednog jednostavnog izraza izraz ije je ime arg1. Ako se tijelo_funkcije sastoji od
vie naredbi, onda se svaka od njih treba da zavri sa znakom taka-zarez ;. Ako se
tijelo_funkcije sastoji samo od jedne naredbe onda se mogu izostaviti zagrade ( ). Kao rezultat
ove funkcije vraa se zadnja naredba iz bloka tijelo_funkcije. Kad smo definisali funkciju,
moemo je pozvati na bilo kojem mjestu u programu tako to navedemo ime funkcije i u
uglastim zagradama [ ] specificiramo argumente.
Na primjer, sljedea funkciju ima jedan argument, i za dati izraz x rauna njegov kvadrat
In[1]:=Kvadrat[
x_ ] := x^2;
Funkciju Kvadrat moemo koristiti kao i bilo koju ugraenu funkciju. Na primjer:
In[4]:=Expand[Kvadrat[(x+1+y)]]
2
2
Out[4]= 1 + 2x + x + 2y + 2 x y + y
Ako elimo da vidimo definiciju funkcije, onda ispred naziva funkcije koristimo znak ?.
Na primjer:
In[5]:= ?Kvadrat
Out[5]=Global Kvadrat
Kvadrat[ x_ ] := x^2;
Ako znamo da nam nije vie potrebna funkcija koju smo definisali, onda je uvijek
dobro datu funkciju izbrisati. Ako to ne uradimo onda moemo imat problema u kasnijem
radu ako koristimo isti naziv za funkciju sa drugom definicijom. Da bismo to uradili
koristimo funkciju Clear koja kao svoj argument uzima naziv funkcije koju briemo. Tako
ako elimo izbrisati funkciju Kvadrat onda to radimo sa sljedeom naredbom:
In[6]:=Clear[Kvadrat]
Navedimo sad jedan primjer funkcije koja poziva drugu funkciju koju smo ranije definisali, i
ije se tijelo sastoji od vie naredbi:
n
( x i) :
i 1
In[7]:= Proizvod[n_] :=
+ x3
2]
Ako sad koristimo varijablu t unutar modula ona e biti tretirana nezavisno od globalne
varijable t, to vidimo iz sljedeeg primjera:
In[12]:=Module[{
Out[12]=8
t }, t=8; Print[ t ]]
Veoma est nain koritenja modula je sa funkcijama. Sve varijable koje se javljaju u tijelu
funkcije stavljamo da budu lokalne, stavljajui da tijelo funkcije bude tijelo modula. Ako
funkciju coef napiemo preko modula dobijemo:
In[14]:=ceof[n_, i_] :=
Poslije poziva
In[15]:=coef[3,
Out[15]=6
2]
In[2]:=If[
asocirana za taj formi. Ako izraz daje rezultat koji nije jednak ni jednom od izraza formi tada
se izvodi blok naredbi def. Evo i konkretnog primjera Switch grananja:
In[3]:=r[x_]:=Switch[Mod[x,3],
0, a, 1, b, 2, c]
Definisali smo funkciju koja zavisi od vrijednost ostatka dijeljenja svog argumenta sa 3. Kako
je Mod[7, 3]=1 to imamo da je
In[4]:=r[7]
Out[4]=b
Iza kljune rijei For, unutar uglastih zagrada [ ], navode se etiri grupe naredbi,
meusobno odvojenih znakom zareza ,. Postupak izvoenja For-bloka je sljedei
1. Izraunava se start. Najee je to pridruivanje poetne vrijednosti brojau kojim e
se kontrolirati ponavljanje petlje.
2. Izraunava se test. Ako je rezultat jednak False preskae se blok naredba body i
program se nastavlja prvom naredbom iza uglaste zagrade ].
3. Ako je rezultat jedna True izvodi se blok naredbi body.
4. Na kraju se izraunava blok naredbi increment . Program se vraa na poetak petlje,
te se ona ponavlja od take 2.
Kao primjer za For petlju napiimo Modul koji rauna faktorijel od n (faktorijel od n je
proizvod svih brojeva od 1 do n) .
In[5]:=faktorijel[n_] :=
Module[{pro = 1, i},
For[i = 1, i <= n, i++, pro = pro*i];
pro
]
Ako pozovemo ovaj modul za broj 6 dobiem vrijednost od 3!.
In[6]:=faktorijel[3]
Out[6]=6
Prije ulaska u petlju stavljamo da nam je poetna vrijednost pro u koju emo gomilati
proizvod jednaka 1. Na ulasku u petlju stavljamo broja petlje i na 1. Unutar same petlje
mnoimo sa brojaem i proizvod pro , a na kraju tijela petlje uveam broja za jedan. Petlju
ponavljamo sve dok je broja manji ili jednak od broja koji smo prenijeli kao argument
funkcije.
Druga petlje kojom raspolae programski paket Mathematica jeste While petlja. Ona se koristi
uglavnom za ponavljanje dijelova koda kod kojeg broj ponavljanja nije unaprijed poznat.
Sintaksa While naredbe je sljedea:
While[test, body]
Tok izvoenja While bloka je sljedei:
1. Izrauna se izraz test
2. Ako je rezultat jednak False, preskae se body i program nastavlja od prve naredbe
iza uglaste zagrade ].
3. Ako je rezultat jedna True izvodi se blok naredbi body . Potom se program vraa na
While naredbu i izvodi od take 1.
Demonstrirajmo upotrebu ove naredbe na primjeru Eratostenovog sita. Najefikasniji algoritam
za generisanje tabele svih prosti brojeva koji su manji ili jednaki datom broju n koji je danas
poznat, je algoritam koji je bio poznat i Erathosthen-u od Cyrene ( u dananjoj Libiji).
Poinje postavljanjem liste L={ 2, 3, . . . , n}. Prvi element liste , broj 2, je prost. Precrtamo
sve sadrioce broja 2 koji su vei od 2. prvi element liste koji je vei od 2 i nije precrtan,
dakle broj 3, je prost broj. Precrtamo sve sadrioce broja 3 koji su vei od 3. Onda idemo na
sljedei element liste koji nije precrtan, itd.
Sljedei modul za dati prirodan broj n vraa listu prostih brojeva koji su manji ili jednaki od n
In[7]:=Eratosten[n_]:= Module[{k=1,j,a=Table[i,{i,2,n}]},
While[k<Length[a],
For[j=k+1,jLength[a],j++,
If[Mod[a[[j]],a[[k]]]0 && a[[j]]a[[k]], a=Drop[a,{j}]
]];
k++;
];
a
]
Ako pozovemo ovu funkciju za n=50 dobijemo sljedee:
In[8]:=Eratosten[5]
Out[8]={2, 3, 5, 7, 11,
13, 17, 19, 23, 29, 31, 37, 41, 43, 47}
Table[Random[Integer, {10,100}],{10}]
45, 98, 49, 28, 87, 61, 33, 91, 19}
Out[4]={15,
Table[Random[Integer, {10,100}],{10}]
45, 98, 49, 28, 87, 61, 33, 91, 19}
Out[5]={15,
dobijamo isti niz sluajnih brojeva. To je upravo zato to smo oba puta koristili iste poetne
parametre pri generisanju sluajnih brojeva.
Da bi na raunaru proizvodili sluajne brojeve potrebno je na neki nain generisati
brojeve koji pokazuju statistika svojstva sluajnosti. Dva najvanija ovakva svojstva su
ravnomjerna rasporeenost i neperiodninost.
Ravnomjerna rasporeenost sastoji se u tome da se generisani brojevi moraju
ravnomjerno rasporediti na cijeli interval. Tako npr. ako interval iz kojega se trebaju
generisati sluajni brojevi podijelimo na k jednakih dijelova, tada u svakom dijelu treba da se
nalazi priblino isti broj sluajnih brojeva.
Meutim uslov ravnomjernosti nije dovoljan. Naime oigledno brojevi
1,2,3,1,2,3,...,1,2,3 zadovoljavaju princip ravnomjerne rasporeenosti, ali mi znamo da nakon
2 dolazi 3, nakon 3 dolazi 1 i nakon 1 dolazi 2, pa dakle, ovaj niz brojeva nije niz sluajnih
brojeva, jer se ovi brojevi periodino ponavljaju. Sluajni brojevi ne smiju biti periodini.
Ispitivanje neperiodinosti je vrlo sloen problem i sastoji se u ispitivanju mustri. Uzima se
dio niza (podniz) sluajnih brojeva i provjerava se da li se ovaj dio niza ponavlja u nekom
drugom dijelu niza. Nakon toga se uzima drugi podniz i ispitivanje se vri i za ovaj podniz itd.
Upravo metoda kongruencije koju je 1948. godine objavio D.H.Lehmer daje ovakve brojeve.
Bit ove metode je slijedea formula:
zn+1= (azn +b) mod m,
gdje x modul y predstavlja ostatak pri dijeljenju x sa y, a je multiplier i njegova vrijednost je
izmeu 2 i m-1, b je increment i njegova vrijednost je manja od m. Takoer se uzima da je
vrijednost z0 izmeu 0 i m.
Slijedei kod napisan u programskom paketu Mathematica predstavlja jedan linearni
kongruentni generator sluajnih brojeva. Kao poetne vrijednosti potrebne su nam etiri
vrijednosti: a-multiplier, m-modul, n-broj sluajnih brojeva koje generiemo i seed-sjeme
generatora. Na poetku modula formirati emo listu od n elemenata. Zatim emo za prvi
element liste postaviti ostatak dijeljenja sjemena seed sa m. Vrijednost svakog slijedeeg
elementa definiimo uz pomo elementa koji mu prethodi, tako to emo za njegovu
vrijednost uzeti ostatak pri dijeljenju, proizvoda prethodnog elemenata sa a, sa m. Kao
vrijednost funkcije vratimo output.
In[6]:=ran[a_, m_,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
]
Pozivanjem ove funkcije sa
In[10]:=uran[6,
13, 20, 2]
dobijamo:
Out[10]={0.153846,
c p / 3 c p / 3
For[c=Ceiling[p/3],c<Ceiling[p/2],c++,
For[a=p-2*c,aFloor[(p-c)/2],a++,
b=p-c-a;
broj++;
AppendTo[x,{a,b,c}];
];
];
Return[x];
];
Navedimo nekoliko primjera:
In[2]:=Trouglovi[17]
Out[2]={{5, 6, 6}, {3,
7, 7}, {4, 6, 7}, {5, 5, 7}, {1, 8, 8}, {2, 7, 8},{3, 6, 8}, {4, 5, 8}}
In[3]:=Trouglovi[40]
Out[3]={{12, 14, 14}, {13,
13, 14}, {10, 15, 15}, {11, 14, 15}, {12, 13, 15}, {8, 16,16},
{9, 15, 16}, {10, 14, 16}, {11, 13, 16}, {12, 12, 16}, {6, 17, 17}, {7, 16, 17},
{8, 15, 17}, {9, 14, 17}, {10, 13, 17}, {11, 12, 17}, {4, 18, 18}, {5, 17, 18},
{6, 16, 18}, {7, 15, 18}, {8, 14, 18}, {9, 13, 18}, {10, 12, 18}, {11, 11, 18},
{2, 19, 19}, {3, 18, 19}, {4, 17, 19}, {5, 16, 19}, {6, 15, 19}, {7, 14, 19},
{8, 13, 19}, {9, 12, 19}, {10, 11, 19}}
7. Tornjevi Hanoja
Problem Tornjevi hanoja sastoji se u slijedeem: Data su tri stuba i proizvoljan broj
diskova razliitih veliina stavljen je na jedan od stubova i to tako da se na svakom disku
nalazi manji od njega. Zadatak je prebaciti sve diskove sa jednog stuba na drugi uz potovanje
odreenih pravila:
1. Moe se prebacivati samo jedan po jedan disk.
2. Nikada se vei disk ne moe staviti na manji.
Rjeenje ovog problema mogue je uz koritenje rekurzivnog1 algoritma. Njegova
implementacija je data sa:
In[1] :=
In[2]:=hanoi[3,1,3]
prebaci sa 1 na 3
prebaci sa 1 na 2
prebaci sa 3 na 2
prebaci sa 1 na 3
prebaci sa 2 na 1
prebaci sa 2 na 3
prebaci sa 1 na 3
Ovaj algoritam moemo malo modifikovati, tako da umjesto ispisa sa kojeg na koji stub
prebacuje diskove, ne ispisuje nita, ve samo broji potrebne poteze.
In[3]:=hanoi1[n_,r_,s_]:=Module[{},
If[n==1,
potez++,
hanoi1[n-1,r,6-r-s];
hanoi1[1,r,s];
hanoi1[n-1,6-r-s,s]
];
]
Algoritam se nije u biti promijenio osim to umjesto Print sada imamo potez++ to je
ekvivalentno sa potez = potez+1
Izvravenjem ovog algoritma dobijamo slijedee:
In[4]:= potez=0;
Out[4]:=7
hanoi1[3,1,3]; potez
Table[potez=0;hanoi1[n,1,3];AppendTo[w,{n,potez}],{n,3,10}];
Kompajliranjem ovog dijela i izvravanjem dobijemo
In[6]:=w
Out[6]={{3,
7}, {4, 15}, {5, 31}, {6, 63}, {7, 127}, {8, 255}, {9, 511}, {10, 1023}}
1000
800
600
400
200
10
- 1, {n, 1, 12}]]
2500
2000
1500
1000
500
10
12
3/7x + 12;
In[2]:=c2[x_] :=
-3/5x + 132/5;
In[3]:=c3[x_] :=
-3 x + 84;
In[5]:=g2
In[6]:=g3
Pri tome intervale u kojima crtamo grafike odreujemo tako to nalazimo take u kojima se
pojedine prave sijeku, npr. za prave c1 i c2 presjena taka je
In[7]:=Solve[c1[x]
Out[7]={x->14}
== c2[x], x]
17.5
15
12.5
10
7.5
5
2.5
5
10
15
20
25
:= -3/4 x + 10;
In[10]:=f2[x_]
:= -3/4 x + 20;
In[11]:=f3[x_]
:= -3/4 x + 30;
In[12]:=f4[x_]
:= -3/4 x + 40;
In[13]:=gf1
In[14]:=gf2
In[15]:=gf3
In[16]:=gf4
dobijemo
Vidimo da trea prava
dodiruje konveksni prostor u taki
(24,14) i da pomjeranjem funkcije
prema etvrtoj funkciji bi sve take
koje joj pripadaju leale izvan
konveksnog prostora. Stoga je
(24,14) optimalno rjeenje naeg
problema.
40
30
20
10
20
30
40
50
In[18]:=prostor
= Graphics[
Text[FontForm["Prostor dozvoljenih rjeenja", {"Tahoma", 12}], {12, 6}]];
In[19]:=optimum =
In[20]:=komentar
Pored toga dodajmo jo i neke atribute naoj slici: Frame, PlotLabel. Nakon svih dodataka
dobijamo:
In[21]:=Show[{g1,
Machine
40
30
20
824, 12<
10
10
20
30
40
50
Dakle optimalno rjeenje dobijamo za x=24 i y=12 i pri tome je vrijednost objektne funkcije
30.
Optimalno rjeenje zavisi od ove funkcije, tako da za razliite funkcije moemo dobiti
razliita rjeenja. Koristei naredbu Maximize ovo moemo demonstrirati.
In[23]:=k
3
4
Dakle u sluaju da je objektna funkcija f=3/4 x+y optimum je za x = 24, y =12. U sluaju da
je objektna funkcija f = 0 x + y, optimum je za x =14, y = 18 i iznosi 18, itd.
1
N
iN
r (i )
i 0
Postoji grafika ilustracija ovog rezultata za prvi kvadrant. Crtajui krunicu sa centrom u
taki {0,0} i poluprenika 17 u prvom kvadrantu imamo:
In[2]:=Show[Graphics[{PointSize[0.04],
r(n)
iN
1
N
1
5
9
9
13
21
21
21
25
29
37
37
37
45
45
45
49
57
61
61
5.00
4.50
3.00
3.25
4.20
3.50
3.00
3.13
3.22
3.70
3.36
3.08
3.46
3.21
3.00
3.06
3.35
3.39
3.21
i 0
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
1
4
4
0
4
8
0
0
4
4
8
0
0
8
0
0
4
8
4
0
iN
r (i )
r (i )
i 0
1
N N
Theorem: lim
iN
r (i )
i 0
Neka je C(n) skup svih taaka u xy-ravni, koje lee unutar ili na krunici x2 + y2 = N. Kako je
iN
r (i )
i 0
n i take sa
In[3]:=LaticePoint[n_]:=Module[{latticePoints
= {},v = Sqrt[n],x,y,w,
horizon={},vertical={},qq1,qq2,stars},
For[x = 0, x <=Floor[v], x++,
w = Sqrt[n - x^2];
For[y = 0, y <= Floor[w], y++,
If[IntegerQ[y], AppendTo[latticePoints, {x, y}];
AppendTo[latticePoints, {-x, y}];
AppendTo[latticePoints, {-x, -y}];
AppendTo[latticePoints, {x, -y}]]
]];
latticePoints = Union[latticePoints];
stars = Map[Point, latticePoints];
qq1 = Sqrt[n]; qq2 = Ceiling[qq1];
horizon = Table[Line[{{-qq2, i}, {qq2, i}}], {i, -qq2, qq2}];
vertical = Table[Line[{{i, -qq2}, {i, qq2}}], {i, -qq2, qq2}];
Show[Graphics[{PointSize[0.03], stars, Point[{0, 0}], horizon,
vertical, Thickness[0.01], Circle[{0, 0}, qq1]}],
AspectRatio -> Automatic];
]
Provjerimo sad teorem koji smo naprijed naveli. Sljedei modul za prirodan broj n rauna
iN
r (i ) .
i 0
In[5]:=pii[x_]:=Module[{i,sigma=0},
For[i=0,ix,i++,
sigma=sigma+Gauss[i]
];
Return[ N[(sigma+1)/x] ]
]
Pozivajui ovaj modul za n=2000 dobijemo:
In[6]:=pii[2000]
Out[6]=3.1465
10. Zig-Zag
Uzmimo horizontalnu liniju duine 100 i dva ugla i , za koje pretpostavimo da su
cijeli brojevi razliiti od nule, u stepenima, i uzmimo du duinu l ( ili R). Na kraju
horizontalne linije duine 100 docrtamo drugu horizontalnu liniju duine l. Sada poinjemo sa
zig-zagom (cik-cak) docrtavajui sekvencu linija duine 100, l, 100, l, 100, l,... u smjeru
suprotnom od kretanja kazaljke na satu i pod uglovima , , 2, 2 , 3, 3 ,... u odnosu na
horizontalu (Sl. 1.). Sve linije duine 100 nazivamo zig ili cik a sve linije duine l nazivamo
zags ili cak. Interesantna je stvar da se konstrukcija zig_zags uvijek zatvara. Broj koraka, gdje
je jedan korak =jedan zig +jedan zag, potrebnih za zatvaranje zigzaga je dat formulom:
360
.
NZD(360, , )
10
0
100
10
sl.1
Naredni modul iscrtava zig-zag-ove za dato (l, , ) na nain kako je prethodno
opisano koristei funkciju Rotat2D koja se nalazi u paketu Rotations, kojeg uitavamo sa
sljedeom naredbom:
<<Geometry`Rotations`
ZigZag[al_,ua_,ub_]:=Module[{aa=ua,bb=ub,a={},b={},k,l={},p,j},
b={100,0};
a={al,0};l={};
k={a[[1]]+b[[1]],0};
AppendTo[l,Line[{{0,0},{a[[1]],0}}]];
AppendTo[l,Line[{{a[[1]],0},{a[[1]]+b[[1]],0}}]];
For[j=1;i=3,j360/GCD[360,Abs[aa],Abs[bb]],j++,
p=Rotate2D[k+b,-(i-2)*Pi*aa/180,k];
AppendTo[l,Hue[0.7]];AppendTo[l,Line[{k,p}]];
k=p;p=Rotate2D[k+a,-(i-2)*Pi*bb/180,k];
AppendTo[l,Hue[0.1]];AppendTo[l,Line[{k,p}]]; k=p; i++;
];
Show[Graphics[l],AspectRatioAutomatic]
]
Trojke koje crtaju estougao, krug i elipsu su sljedee (0,60,120), (0,10,60), (30,1,-1)
(0,60,120)
(0,10,60)
(30,1,-1)
(100,90,-40)
(200,5,6)
(100,55,22)
(100,62,-60)
(200,299,45)
(100,20,207)
(100,19,-20)
(100,175,185)
(500,155,300)
0
50
Out[2]= 10
30
27
26
42 27 20
31 40 44
14
30 22
23 33
48 27
23
45
0
Sad u matrici imamo smjetene ivice. Meutim, paket moe raditi sa specijalnim skupovima
oblika Graph[skup ivica (matrica), skup vorova]. Da bismo na graf predstavili u takvom
obliku iskoristiemo naredbu Vertices[CompleteGraph[5] ].
Vertices[graf] vraa vorove graf-a u obliku koordinata svakog vora u grafu.
Edges[graf] vraa ivice graf-a u obliku matrice pripadnosti vorova.
In[3]:=mojGraf
= Graph[matrica, Vertices[CompleteGraph[5]]];
Sada mojGraf sadri sve potrebne podatke o naem grafu i sve je spremno za pozivanje
funkcije TravelingSalesman.
In[4]:=tour = TravelingSalesman[mojGraf]
Out[4]={1, 5, 4, 2, 3, 1}
2
Neka je X neprazan skup a U neka binarna relacija u X. Tada ureeni par G=(X ,U) nazivano grafom.
Elementi skupa X su vorovi grafa , a elementi skupa U su grane grafa.
Dakle, dobili smo najkrai put kojim treba obilaziti vorove. Da bismo izraunali koliko je
vremena potrebno za obilazak grafa ovim redosljedom potreban nam je slijedei kod.
In[5]:=
cost = 0;
For[i = 1, i <= 5, i++,
cost = cost + matrica[[tour[[i]], tour[[i + 1]]]]
];
cost
Za svaku ivicu izmeu dva vora oitavamo teinu ivice iz matrice i dodajmo je promjenjivoj
cost. Na kraju e promjenjiva cost sadravati ukupnu teinu puta.
Primijetimo da je ovaj kod mogue napisati i na drugi nain koristei naredbu Sum.
In[6]:=cost=Sum[matrica[[tour[[i]],tour[[i+1]]]],{i,1,5}]
Out[6]=107
Izvravanjem bilo kojeg od ova dva koda dobijamo kao rezultat 107. Pa vidim da je najkraa
duina puta 107 jedinica.
Da bismo se uvjerili u tanost ove funkcije iz paketa, napiimo kod koji e traiti najkrai put
tako to e raunati duine svih moguih puteva kroz graf. Pri tome emo korisiti naredbu
Permutations.
U skup allTours smjestimo permutacije puteva kroz graf. Inicijalizirajmo prazan skup
w. Za svaku permutaciju raunajmo teinu puta. Poto skup permutacija ne sadri vezu
izmeu zadnjeg i poetnog vora, moramo nakon svakog raunanja na sumu dodati i teinu
zavrnog puta, tj. teinu puta izmeu petog i prvog vora. Svaku izraunatu duinu puta
dodajmo skupu w.
Izvravanjem sljedeeg koda
In[7]:=allTours = Permutations[{1, 2, 3, 4, 5}];
w = {};
For[i = 1, i <= 120, i++,
cost1 = 0;
For[j = 1, j <= 4, j++,
cost1 = cost1 + matrica[[allTours[[i, j]], allTours[[i, j + 1]]]]
];
cost1 = cost1 + matrica[[allTours[[i, 5]], allTours[[i, 1]]]];
AppendTo[w, cost1]
]
i izvravanjem
In[8]:=w
132, 148, 148, 157, 136, 168, 153, 166, 215, 182, 160, 130, 131, 145, 180, 161,
163, 159, 151, 131, 150, 107, 140, 215, 160, 180, 163, 150, 140, 161, 107, 159, 159, 130, 132,
182, 131, 151, 148, 168, 148, 166, 145, 131, 157, 153, 136, 148, 136, 131, 161, 151, 107, 163,
140, 131, 168, 145, 153, 157, 159, 150, 166, 159, 215, 148, 130, 180, 182, 132, 160, 132, 157,
153, 182, 159, 131, 160, 150, 107, 130, 166, 131, 136, 151, 140, 145, 148, 180, 159, 168, 215,
161, 148, 163, 159, 148, 168, 166, 130, 145, 215, 180, 161, 159, 182, 151, 148, 131, 163, 131,
157, 150, 132, 153, 160, 107, 136, 140}
Najkrai put kroz graf je prema tome:
In[9]:=Min[w]
Out[9]=107
{118}}
Dakle, 23, 32, 54, 81, 118 su permutacije osnovnog puta kroz graf koje daju put najkrae
duine. Ispiimo sada koji su to putevi. Da bismo to izveli potreban nam je slijedei kod.
u = Flatten[Position[w, Min[w]]];
Table[allTours[[u[[i]]]], {i, 1, Length[u]}]
In[11]:=
U skup u smjestimo ispeglan prethodni skup. Sada formirajmo skup koji e sadravati
one permutacije puteva koje se nalaze na mjestima najkraih puteva.
Kada izvrimo ovaj kod dobijamo slijedee:
Out[11]={{1,
Vidimo da postoji pet puteva kroz graf koji svi imaju istu duinu. Meutim kada bolje
pogledamo uoavamo da su svi ovi putevi ekvivalentni i da im je jedina razlika poetni vor,
tj. da se samo razlikuju jedan od drugog po tome koji vor je izabran za polaznu taku.
RSA algoritam
Pretpostavimo da osoba A treba da poalje osobi B poruku koja koja je od velike vanosti za
osobu B, a pri tome je niko drugi ne smije proitati. Na primjer:
In[2]:=u =
ToCharacterCode[m] 31
Out[2]={
55, 70, 68, 70, 83, 66, 84, 1, 68, 70, 1, 86, 1, 81, 80, 79, 80, 68, 1, 79, 66, 81, 66, 84,
85, 74, 15, 47, 66, 69, 75, 74, 78, 80, 1, 84, 70, 1, 79, 66, 1, 84, 85, 66, 83, 80, 78, 1, 78, 75,
70, 84, 85, 86, 1, 86, 1, 19, 18, 27, 17, 17 }
Pretpostavimo da osoba B ima dva velika prosta broja, p i q, i da je uinila javnim
njihov proizvod. Osoba B, takoer, mora uzeti, eksponent za kriptovanje nazvan e, koji je,
takoer, javan, pri emu, e mora biti relativno prosto sa (p-1) (q-1). Osobi B nije teko da
nae takav broj jer poznaje brojeve p i q. Ureeni par (n, e) naziva se javnim kljuem i on je
jedino potreban da osoba A poalje poruku osobi B. Iako je klju (n, e) javan, osoba B je
jedina koja zna p i q, pa moe da izrauna vrijednost (n) Eulerove funkcije. Navedimo sad
definiciju Eulerove funkcije (n) , Eulerov teorem i jednu Lemu koje e nam koristiti za
deifrovanje poruke.
Definicija: Neka je n 0 i neka (n) oznaava broj prirodnih brojeva x za koje vrijedi
1 x n i koji su uzajamno prosti sa n. Funkciju (n) nazivamo Euler-ovom funkcijom.
Teorem (Euler): Ako je m 0 i (a, m) 1 , tada je a ( m) 1(mod m) .
Lema: Pretpostavimo da je s relativno prost sa a i b i da je a b(mod (n)) . Tada je
s a s b (mod n) .
Osoba A e uzeti svoju poruku i pretvorit je u broj na nain da lista u predstavlja cifre
broja u bazi 100 (pretpostaviemo da nee biti vie od 100 razliitih znakova u poruci m), a
zatim izraunati s = me (mod n) te dobijeni broj poslati otvorenom linijom osobi B.
Kako je e relativno prosto sa (p-1) (q-1) osoba B e moi da izrauna broj d takav da je
de 1(mod (n)) . Broj d emo zvati klju za deifrovanje. Kako je de 1(mod (n)) , to
na osnovu prethodne Leme i Euler-ovog teorema dobijemo da je s d m(mod n)
Da bismo izraunali s = me (mod n) koristimo ugraenu funkciju u programsko paketu
Mathematica PowerMod[a,b, n] koja rauna ab (mod n ) , a ako je b negativan onda odreuje
broj k takav da je kab 1(mod n ) .
Navedimo sad modul koji vraa prvi prost broj koji je vei od datog broja, kao i modul koji za
prirodan broj n vraa sluajan prost broj koji ima barem n cifara.
In[3]:=
Module[{qq, ww},
Formirajmo sada broj od cifara iz liste u bazi 100. To emo uraditi sa sljedeim naredbama
In[7]:=v
i odgovarajui broj je
Out[7]=557068708366840168700186018180798068017966816684857415476669757478800
1847001796601848566838078017875708485860186011918271717
Generiimo sad proste brojeve p i q od 100 i 50 cifara redom
In[8]:=p =
moveRandomPrime[100]
Out[8]=4831265603021480184849695498786959608096231314439085549007367345780277
997438500411764013855846850561
In[9]:=q =
moveRandomPrime[50]
Out[9]=13859881529304149621457447513785297873362935672349
Stavimo da je
In[10]:=e
= 17
n = p*q
Out[10]=66960768894479887408557170376531472206086037851181149808380768837212
927617820407809366608416479690376665026667118847384673050870196885426130662
837789
Izraunajmo s i d:
In[11]:=s
= PowerMod[codedMessage, e, n]
Out[11]=363403241455381445689760372647172565889677240871404661577472393529172
807497527062144229765846442721420571896375030116858930985481552997730538132
77712
In[12]:=d
Out[5]=4332755634348698597024287494952036436864390684487879435120913064278287
394973751937337315494334222141469514796912694660808234196564694464282533432
1393
Izraunajmo sad m koristei s i d
In[13]:=desifrat
= PowerMod[s, d, n]
Out[13]=557068708366840168700186018180798068017966816684857415476669757478800
1847001796601848566838078017875708485860186011918271717
In[14]:=z =
IntegerDigits[desifrat, 100]
Out[14]={55,
70, 68, 70, 83, 66, 84, 1, 68, 70, 1, 86, 1, 81, 80, 79, 80, 68, 1, 79, 66, 81, 66, 84,
85, 74, 15, 47, 66, 69, 75, 74, 78, 80, 1, 84, 70, 1, 79, 66, 1, 84, 85, 66, 83, 80, 78, 1, 78, 75,
70, 84, 85, 86, 1, 86, 1, 19, 18, 27, 17, 17}
In[15]:=FromCharacterCode[z + 31]
Out[15]= Veceras ce u ponoc napasti.Nadjimo se
)}}
Kako je k 0.25 i temperatura tijela u trenutku smrti 98.6 F (to je normalna temperatura
tijela) to treba odrediti n tako da bude
60 0.75n 20 98.6
Da bismo odredili n koristiemo naredbu NSolve kojom emo rijeiti datu jednainu po n pa
imamo slijedei kod
In[2]:= NSolve[60
Kao samo sa T(n) oznaili temperaturu poslije 2n sati nakon ponoi, to imamo da je smrt
nastupila prije 2 * 2.28558 4.57116 sati prije ponoi, tj. oko 19 : 26h .