არსებობს პროგრამირებისადმი მიძღვნილი, უამრავი ძველი წიგნი, რომელთა ავტორებიც არიან უმთავრესად მათემატიკის და თეორიული პროგრამირების სპეციალისტები, ლაპარაკია 50, 60, 70-იან წლებზე, თემები მიახლოებით ასე ჟღერს: ალგორითმების თეორია, ალგორითმების ანალიზი, ოპტიმიზაციები, სორტირებები, კომპილატორიკა და ა.შ.
ამ ხალხის ძირითად პროფესიონალურ საქმიანობას წარმოადგენდა ალგორითმების და კომპიუტერული პროგრამების მათემატიკური მხარე, დამუშავება და გამოკვლევა. ეს მომენტი უმთავრესად გამოწვეული იყო იმ დროინდელი კომპიუტერების მწირი შესაძლებლობებით.
ცხადია ცოტათი მეტი მათემატიკოსობაა საჭირო რომ დღევანდელი პროგრამირების ენის if/else ოპერატორის სრული დანიშნულება განახორციელო 1 და 0-ების დონეზე :)
შემთხვევით არ იყო, რომ იმ დროინდელ პროგრამებს უწოდებდნენ კომპიუტერის არა პროგრამულ არამედ მათემატიკურ უზრუნველყოფას.
სადღაც წამიკითხავს, რომ თავის დროზე იყვნენ ისეთი პროგრამისტებიც, რომლებსაც კომპიუტერთან არანაირი შეხება არ ჰქონდათ, ისინი წერდნენ გარკვეულ ალგორითმებს, ამუშავებდნენ მათ გარკვეული შეზღუდვების და მიხედვით და გადასცემდნენ უკვე იმათ ვისაც უშუალოდ შეჰყავდათ ეს პროგრამა კომპიუტერში და ახდენდნენ მის რედაქტირებას.
პროგრამირების და პროგრამისტების ისტორიის მსგავსი განშტოებების ძირითადი მიზეზი, როგორც უკვე ზემოთ აღვნიშნეთ იყო, მაშინდელი კომპიუტერების მცირე შესაძლებლობები: მეხსიერების ზომა და მუშაობის სიჩქარე. სწორედ ამიტომაც ხდებოდა პროგრამის შედგენა-ოპტიმიზაცია მისი მოცულობის და სწრაფქმედების მიხედვით, დამოკიდებული იყო რა ამოცანის პირობებზე.
ეს ისე არ უნდა გავიგოთ, თითქოს დღეს არ იყოს აქტუალური ალგორითმის ოპტიმიზაცია, პირიქით, სანამ იარსებებს “შეზღუდული” სიდიდის მეხსიერება და მთვლელის ტიპის ორობითი სისტემები კომპიუტერში, მანამ იქნება საჭირო ალგორითმების მათემატიკური დამუშავება.
შემდგომ Hardware-ს ევოლუციასთან ერთად გაჩნდა აზრი რომ ზემოთ აღნიშნული ტიპის წიგნები საჭიროებას აღარ წარმოადგენენ ისეთ სიჩქარეების დროში როგორიც არის 0.1 , 0.5 , 1 და ბოლოს და ბოლოს 2 გეგაჰერცი.
ერთი შეხედვით ასეთი ტენდენცია მომხიბვლელია, ოღონდ გააჩნია ვისთვის. . .
თანაც, როგორც იტყვიან ყველაფერი ახალი კარგად მივიწყებული ძველიაო და ასეთ ძველ ლიტერატურას შეიძლება შემთხვევით აღმოჩნდეს ფრიად სასარგებლო ინფორმაცია თუნდაც იგივე Delphi ანდა Visual C++ ვინდოუს-პროექტებისათვის.
მე პირადად სიმპატიით ვარ განწყობილი მსგავსი ტიპის ინფორმაციისადმი, მით უმეტეს თუ გავითვალისწინებთ, რომ თანამედროვე Windows-ის ექსფლორერთან მუშაობის დროის 70% მიაქვს სორტირების ალგორითმს. (და არა მარტო ექსფლორერთან მუშაობისას).
მოკლედ, ბევრი რომ არ გავაგრძელო მოვიყვან რამოდენიმე ლამაზ და იმედია სასარგებლო ფორმულას პროგრამისტებისათვის, რომლეთაგან რამოდენიმე მე თვითონ არაერთხელ გამომიყენებია.
1. მოკლე გზა
ფაქტორიალი უფრო ხშირად გამოყენებადი მათემატიკური ოპერაციაა რიცხვის ჯამთან შედარებით, სამაგიეროდ ჯამის გამზადებული ზუსტი ფორმულა არსებობს, ხოლო ფაქტორიალისა კი არა (ზუსტი-არა, მიახლოებითი-კი).
როგორც ვიცით:
ფაქტორიალი n რიცხვისა არის :
ხოლო ჯამი კი n რიცხვისა არის:
რიცხვის ჯამის დასათვლელად, რომ არ ვწეროთ ფაქტორიალის გამოსათვლელი პროგრამის მსგავსი რეკურსიული ფუნქციები, საკმარისია მივმართოთ პააწკუნა ეშმაკობას და დავწეროთ ფორმულა
მაგალითად
S5=1+2+3+4+5=15.
ანუ თუ გამოვიყენებთ ბოლო ფორმულას
S5=5(5+1)/2=15.
ესეც შენი პატარა კოდი და სწრაფქმედება, ერთდროულად, რაც ბუნების და მათემატიკის არც თუ ისე ხშირი საჩუქარია.
კიდევ ერთი პატარა საიდუმლო: კომპიუტერში გამრავლება უფრო სწრაფად სრულდება ვიდრე გაყოფა, ამიტომ უკეთესია ფორმულა იყოს ასეთი:
S5 = 0.5 n (n+1).
ასე რომ საქმე გვაქვს შემდეგ შედარებებთან:
ა)
1. ერთსტიქონიანი, პატარა ფორმულის შემცველი კოდი და
2. მინიმუმ 2 სტრიქონიანი ციკლების შემცველი კოდი.
ბ)
1. სამი მათემატიკური ოპერაცია (*,*,+) და
2. ინდექსებისა და ცვლადების გროვა.
ა)1 და ბ)1 ვარიანტები შეესაბამება ჯამის ფორმულით გამოთვლას, ხოლო ა)2 და ბ)2 კი - ჯამის ციკლებით ან/და რეკურსიით დათვლას.
ცხადია ყველაფერს აქვს თავისი დადებითი და უარყოფით მხარე და ამაში არც ეს ჩვენი ფორმულაა გამონაკლისი. (მაგალითად დიდი რიცხვები, მათემატიკური ოპერაციების თავისებურებები და ა.შ. გარდა ამისა გასათვალისწინებელია პროცესორის ტიპის ორიენტირებულობა ამა თუ იმ მათემატიკური ოპერაციისადმი.)
2. სხვადასხვა
კიდევ არსებობს ასეთი წვრილ-წვრილი ფორმულები:
1. 12 + 22 + 32 + …+ n2 = n (n+1) (2n+1) / 6.
2. 1 + 2 + 22 + 23 + … + 2n-1 = 2n-1;
3. 13 + 23 + 33 + … + n3 = (1+2+…n)2
4. 1 + 3 + 5 + … + (2n-1) = n2
5. 2n > n3 , n >= 10
როგოც იტყვიან, კაცმა არ იცის კონკრეტულად სად შეიძლება გამოგვადგეს ეს და მსგავსი ფორმულები, თუმცა გამორიცხული არაფერი არ არის და მათი რეზერვში ყოფნა ნამდვილად არაფერს დაგავაკლებს თუ არ გვარგებს.
R-ფუნქციები
მიუხედავად იმისა, რომ არაერთხელ დავრწმუნებულვარ გამოჩენილი მეცნიერის ფეინმანის სიტყვების - “ინტუიცია ცდილობს შებღალოს და დაამახინჯოს მათემატიკა” სისწორეში, მაინც ვენდობი ჩემს ინტუიციას და მგონია რომ შემდეგი ფუნქციები აუცილებლად უნდა გამომადგეს სადღაც, როდესღაც და ერთხელ მაინც:
მათი ღირსება არის ის რომ ისინი იქცევიან ისევე, როგორც ორობითი ლოგიკური ოპერაციები, 'და', 'ან', 'არა' და სხვა, ოღონდ '1' და '0'-ის მაგიერ აქ ლაპარაკია ნიშნებზე '+' და '-'
აი, შესაბამისი ცხრილიც:
x
|
y
|
f1
|
f2
|
f3
|
f4
|
f5
|
f6
|
-
|
-
|
+
|
-
|
-
|
+
|
+
|
+
|
-
|
+
|
-
|
-
|
+
|
+
|
+
|
+
|
+
|
-
|
-
|
-
|
+
|
-
|
+
|
-
|
+
|
+
|
+
|
+
|
+
|
+
|
-
|
-
|
ენა Pascal-ის ფიქრები:
- “მალე ენა C ვიქნები!”
ვიცით რომ C-ში პასკალისგან განსხვავებით არსებობს პირობის შემოწმების ორი გზა: if/else და ე.წ. ტენარული ოპერაცია
ოპერანდი1 ? ოპერანდი2 : ოპერანდი3;
არის სიტუაციები როცა უკეთესია მეორე ვარიანტის გამოყენება, მაგრამ არც პასკალშია მთლად ცუდად საქმე თუ კი მივმართავთ ერთ ისეთსავე პააწკუნა ეშმაკუნობას.
ალბათ დაუსვიათ თქვენთვის როგორც პროგრამისტისათვის ასეთი ამოცანა: შემიდგინე ისეთი პროგრამა რომელიც დამიწერს ორი რიცხვიდან მინიმუმსა და მაქსიმუმს if ოპერატორის გამოყენების გარეშე-ო. ბევრი გვიფიქრია თუ ცოტა გვიფიქრია . . .
თუმცა, ამაზე ვიღაცეებს უკვე კაი ხნის წინ უფიქრიათ და . . . ესეც შენი პროგრამა:
პირველი ფუნქცია აბრუნებს ორი რიცხვიდან მინიმალურს, ხოლო მეორე კი - მაქსიმალურს.
ამჯერად, ამ უმარტივესი და უაღრესად მოკრძალებული რაოდენობის მაგალითებით დავკმაყოფილდეთ.
მსგავსი ფორმულები არა მარტო სახალისო პროგრამირების ამოცანებისათვის არის საჭირო, არამედ პრაქტიკაშიც საკმაოდ ხშირად შეიძლება გამოგვადგეს.
ამ თემის სათაური ცოტათი ხმამაღლა ჟღერს, მაგრამ სინამდვილეში ხმადაბლაა დაწერილი, რადგან თვით მისი უმაღლესობა Windows-ი წარმოადგენს გაცოცხლებულ მათემატიკას!
აი, სულ ეს იყო. . .
რეზიუმე
ფორმულები -> კომპიუტერი
ავტორი: გიორგი ბაწაშვილი (G3B)
აღდგენილია სტატიის საწყისი ვარიანტი