যুক্তি বা লজিক হচ্ছে প্রমাণের ভিত্তিতে সিদ্ধান্ত গ্রহন। যুক্তি তাই সবসময় রীতিসিদ্ধ। দর্শন এবং গণিতে ব্যাপকভাবে লজিক টার্মটি উচ্চারিত হয়। কম্পিউটার প্রোগ্রামিংয়ে গাণিতিক যুক্তির সহায়তা নেওয়া হয়। প্রোগ্রামিং তাই গণিতের উপর বিশেষভাবে নির্ভরশীল। কম্পিউটিং মানে গণনা আর গণনার জন্য চাই গাণিতিক যুক্তি। কম্পিউটিং এর কাজ পরিচালনা করতে যৌক্তিক পদ্ধতিতে চিন্তা করতে পারাটা খুব জরুরি। যুক্তিকে ব্যবহার করেই কম্পিউটেশনের ধাপগুলো গড়ে তুলতে হয়। আমরা কম্পিউটারকে দিয়ে কোন কাজ করানোর জন্য প্রোগ্রাম লিখি। প্রোগ্রামিং এ কিছু স্বতঃসিদ্ধ (axiom) ও নিয়ম কানুন ব্যবহার করা হয় যা গাণিতিক বিচারে যৌক্তিক। সরাসরি প্রোগ্রাম লেখার আগে আমরা অ্যালগরিদম, ফ্লো-চার্ট ইত্যাদি তৈরি করি। এগুলোতে আমরা মূলত কম্পিউটারকে দিয়ে নির্দিষ্ট কাজ করানোর জন্য যৌক্তিক কাঠামো তৈরি করি।
একটি প্রোগ্রামের মাধ্যমে কোন সমস্যা সমাধানের কাজটি সাধারণত কয়েকটি ধাপে করা হয়। এই ধাপের সমষ্টিই অ্যালগরিদম। অ্যালগরিদমের ধাপগুলো কিছু তথ্য বা ডেটার উপর কাজ করে। অধিকাংশ প্রোগ্রামই কিছু ডেটাকে ইনপুট হিসেবে নেয়, তার উপর কয়েকটি ধাপে কাজ সম্পন্ন করে আউটপুট তৈরি করে। অ্যালগরিদম ইনপুট থেকে আউটপুট পাওয়ার কার্যপদ্ধতি বর্ণনা করে। আমরা গাণিতিক ফাংশনের মাধ্যমে দুটি সংখ্যা যোগ করার প্রোগ্রামকে প্রকাশ করতে পারি।
অ্যালগরিদমের কিছু বৈশিষ্ট্য থাকেঃ
১) ইনপুটঃ ইনপুট ডেটা, সাধারণত ব্যবহারকারী প্রদান করে
২) আউটপুটঃ প্রোগ্রামের ফলাফল
৩) সসীম ধাপঃ সীমিত সংখ্যক ধাপে অ্যালগরিদম শেষ হবে
৪) সুনির্দিষ্টতাঃ ধাপগুলোর অর্থ সুনির্দিষ্ট হবে, দ্ব্যর্থক হতে পারবে না।
৫) কার্যকারিতাঃ অ্যালগরিদম এমন হবে যেন তা কম্পিউটার প্রোগ্রামে (যে কোন ভাষায়) রূপান্তরযোগ্য হয়।
আমরা একটি গাণিতিক সমস্যা সমাধানের মাধ্যমে অ্যালগরিদম ও তার বৈশিষ্ট্যগুলো বুঝতে চেষ্টা করতে পারি। মনে করি, আমরা একটি সংখ্যা n এর ফ্যাক্টোরিয়াল বের করতে চাই। কোন পূর্ণ সংখ্যার ফ্যাক্টোরিয়াল হল ঐ সংখ্যা ও তার চেয়ে ছোট সকল পূর্ণ সংখ্যার গুণফল। যেমন, 6 এর ফ্যাক্টোরিয়ালের মান হবে 6*5*4*3*2*1 = 720. কম্পিউটারে যেকোন সংখ্যার ফ্যাক্টোরিয়াল নির্ণয়ে আমরা নিচের ধাপগুলো অনুসরণ করে নির্দেশ দিতে পারি।
এখানে n এর মান ব্যবহারকারীর কাছ থেকে নেওয়া হচ্ছে (ইনপুট) এবং এর ফ্যাক্টোরিয়াল প্রিন্ট হচ্ছে (আউটপুট)। n এর মানের উপর ভিত্তি করে ৪, ৫, ৬ ধাপগুলো পুনরাবর্তিত হবে কিন্তু n এর সসীম মানের জন্য অ্যালগরিদমের ধাপগুলো সসীম সংখ্যক বার ব্যবহৃত হবে (সসীম ধাপ)। উক্ত ধাপগুলো অবলম্বন করলে n এর একটি মানের জন্য একাধিক উত্তর পাওয়া যাবে না (সুনির্দিষ্টতা)। অ্যালগরিদমটির কার্যকারিতা আমরা একটি ছকের মাধ্যমে n=6 ধরে নিয়ে দেখতে পারি।
উক্ত অ্যালগরিদমকে আমরা ফ্লো-চার্টের মাধ্যমে দেখাতে পারি। ফ্লো-চার্ট হল অ্যালগরিদমের চিত্রিত উপস্থাপনা। এতে কিছু সংযুক্ত প্রতীকের মাধ্যমে তথ্য ও কন্ট্রোলের প্রবাহ(ফ্লো) দেখানো হয়। ফ্লো-চার্টের প্রতীক ও এর তাৎপর্য জানতে আমরা নিচের ছকটি দেখতে পারি।
আমরা প্রতীকগুলো ব্যবহার করে ফ্যাক্টোরিয়ালের ফ্লো-চার্ট আঁকতে পারি।
এবারে আমরা দেখব, উক্ত অ্যালগরিদমকে কোন প্রোগ্রামিং ভাষায় রূপান্তর করা যায় কি না। একটি নমুনা প্রোগ্রামিং ভাষা হিসেবে C ব্যবহার করে আমরা চেষ্টা করতে পারি। প্রোগ্রামটিতে /* এবং */ চিহ্নের মাঝখানের সকল লেখা কমেন্ট বলে বিবেচ্য হবে এবং কম্পাইলার তাকে C ইন্সট্রাকশান হিসেবে পড়বে না।
অর্থাৎ, অ্যালগরিদমটি প্রোগ্রামিং ভাষায় রূপান্তরযোগ্য বা কার্যকরি। এভাবে ভিন্ন ভিন্ন কাজের জন্য অ্যালগরিদম লিখে প্রোগ্রামিং করা সম্ভব। প্রবলেম ডোমেইনের উপর ভিত্তি করে কম্পিউটার প্রোগ্রাম কয়েক লাইন থেকে কয়েক হাজার লাইন পর্যন্ত হতে পারে।
কম্পিউটার প্রোগ্রামিং বর্ণময় এক যৌক্তিক রাজ্য। প্রতি পদক্ষেপে যুক্তির ছোট ছোট বুননে বিশাল রাজ্যটি গড়ে ওঠে এতে। যে রাজ্যের প্রতিটি ধুলিকণাই যুক্তির কাঠামোতে গড়া। ক্ষুদ্র ক্ষুদ্র যুক্তির বুননে গড়ে ওঠে জটিল জটিল অপারেটিং সিস্টেম, অ্যাপ্লিকেশন, গেমস ও সফটওয়্যার। এই যুক্তিগুলোর একে অন্যের সাথে সামান্য সংঘাত থাকলেই পুরো রাজ্যটি ধ্বসে পড়তে পারে। তাই খুব সতর্কতার সাথে এসব যুক্তি নির্ধারণ করতে হয়। তাই কম্পিউটার হয়ে উঠেছে যুক্তির এক বিশাল বিকাশক্ষেত্র, বুদ্ধিমত্তার চরম উৎকর্ষভূমি। কম্পিউটার প্রোগ্রামিং শুধু মানুষের গণনার কাজকে সহজ করতেই নয়, ব্যবহৃত হতে পারে মানুষের যুক্তিবাদী মনন বিকাশে। বাংলাদেশের মত দুর্বল অর্থনীতির দেশে যুবসমাজ প্রোগ্রামিং শিখে স্বল্পসময়েই নিজেদের দক্ষ জনশক্তিতে রূপান্তর করতে পারে। জনশক্তি রপ্তানিতে প্রোগ্রামারেরাও স্থান করে নিতে পারে। উন্নত বিশ্বে বিপুল পরিমাণ প্রোগ্রামারের চাহিদা থাকে। এছাড়া যুক্তির চর্চা আমাদের মত কুসংস্কারাচ্ছন্ন জাতিকে দিতে পারে মুক্তির আশ্বাস।
(একই প্রোগ্রামের জন্য বিভিন্নভাবে অ্যালগরিদম লেখা যেতে পারে, যার মধ্য থেকে এফিশিয়েন্ট অ্যালগরিদম নির্বাচন করতে পারাটা প্রোগ্রামারের দক্ষতা। এ নিয়ে আগামীতে লেখার আশা আছে।)
ইইইই! মুক্তমনায় এত্ত এত্ত টেকি পোষ্ট দেখে আমার টেকিব্লাড আনচান করছে :))
স্বাগতম (W) আমি সিঙ্গুলারিটি নিয়ে কিছু একটা লিখবো ভাবছিলাম, আপনার এই লেখা এবং প্রতিফলনের লেখাটার জন্য অ্যাগরিদম ও অ্যালগরিদমের বুদ্ধিমত্তা আমাকে আর আলাদাভাবে খুব ব্যাখ্যা করতে হবেনা, মুক্তমনায় আগে নিজেরে এলিয়েন এলিয়েন লাগতো এখন দেখি মুক্তমনায় প্রোগ্রামারের অভাব নাই :rotfl:
দারুণ লিখেছেন। খুবই সহজ ভাষায় লেখা যা পড়ে বুঝতে কোনো সমস্যা কারো হবার কথা না। আমার মতো যাদের প্রোগ্রামিংয়ে হাতেখড়ি হচ্ছে তাদের জন্য খুবই উপকারী লেখা।
@নিটোল,
ধন্যবাদ। প্রোগ্রামিং আসলেই মজার এক দুনিয়া। একবার প্রোগ্রামিংয়ের মজাটা পেতে পারলে দেখবেন, এর থেকে দূরে থাকাটাই মুশকিল হয়ে পড়বে।
প্রোগ্রামিং কিংবা এর সাথে সম্পর্কিত কোন বাংলা লেখা দেখলে তা বেশ আগ্রহ নিয়ে পড়ি। তবে বেশিরভাগ ক্ষেত্রেই বেশ হতাশ হই – কারণ লেখাগুলো বেশ কঠিন আর দুর্বোধ্য হয়। জানি, এমন বিষয় সহজ করে বলা খুব কঠিন। তবে আপনার সহজ লেখনী আমাকে আপনার পরবর্তী লেখার প্রতি আগ্রহী করে তুললো। 🙂
@প্রতিফলন,
আপনার সহৃদয় মন্তব্য অনেক উৎসাহ জাগালো। আগামীর লেখাগুলোতে আপনাদের আগ্রহের প্রতি সুবিচারের আকাঙ্খা রইল।
ভালো লিখেছেন,মুক্তমনায় স্বাগতম। এখন দেখি প্রোগ্রামিং নিয়ে লেখালেখির মানুষ আরো বেড়ে গেল,বিবর্তনবাদীদের রক্ষা নেই।
শেষ অংশটুকু বেশি ভালো লেগেছে। প্রোগ্রামিং শিখতে হলে অবশ্যই আমরা সাধারণ লেখাপড়ায় যেভাবে চিন্তা-ভাবনা করি সেখান থেকে বেরিয়ে আসতে হবে,যুক্তি দিয়ে ভাবতে শিখতে হবে,out of the box চিন্তা করতে জানতে হবে কারণ বাস্তবে সমস্যা সমাধান করতে কোনো অ্যালগোরিদম হুবুহু ব্যবহার করা যায় না,মোডিফাই করতে হয়। এসব অভ্যাস প্রোগ্রামিং এর বাইরের জীবনেও মানুষের কাজে লাগে।
@রামগড়ুড়ের ছানা,
ধন্যবাদ পড়ার ও মন্তব্যের জন্য।
ঠিক তাই, একটি Mathematical Puzzle সমাধান করতে যে পরিমাণ মাথা খাটাতে হয়, একটি প্রোগ্রাম তৈরি করতে তার চেয়ে কম কিছু হয় না। বাস্তব সমস্যার ভিত্তিতে প্রোগ্রাম সলভ করতে গেলে বুদ্ধি ও যুক্তিবোধ দুইয়েরই চর্চা হয়।
বিবর্তনবাদীদের সাথে পাল্লা দেওয়ার কথা ভাবার মত বুকের পাটা এখনও আমার হয় নি। 🙂
খুব সুন্দর লেখা। সসীম, নির্দিষ্টতা ব্যাপারগুলো উদাহরণ দিয়ে আরেকটু ব্যাখ্যা করলে ভালো হতো। আর, নির্দিষ্টতা কি ডিটারমিনিস্টিক/ডিটারমিনিজম শব্দ থেকে অনুবাদ করেছেন? সেক্ষেত্রে নন-ডিটারমিনিস্টিক অ্যালগোরিদম্ও কিন্তু আছে।
পরবর্তী পর্ব লিখবেন আশা করছি। 🙂
@মইনুল রাজু,
ধন্যবাদ পড়ার ও মন্তব্যের জন্য। লেখার দুর্বলতাগুলোতে একে একে আলোকপাত করার চেষ্টা করছি।
অসীম অ্যালগোরিদমের একটি উদাহরণ হতে পারে ইনফাইনাইট লুপ। একটি for loop কে আমরা যদি এভাবে লিখি,
for(i=0;i>10;i++)
{
// instruction
}
লুপটি i এর 0 ভ্যালু থেকে শুরু করে 10 থেকে বড় কোন ভ্যালুতে গিয়ে থামতে হবে তা ঠিকভাবে বলা নেই। অ্যালগোরিদমটি এমনভাবে লিখতে হবে যেন এধরণের জটিলতার সম্মুখীন হতে না হয়।
নির্দিষ্টতা বলতে আসলে definiteness বুঝাতে চেয়েছি, যে বৈশিষ্ট্যগুণে অ্যালগোরিদমটি অবশ্যম্ভাবীভাবে আকাঙ্খিত ফলাফলের দিকে এগিয়ে যাবে।
ডিটারমিনিস্টিক / নন-ডিটারমিনিস্টিক টার্মগুলো আসলে স্টেট মেশিনের সাথে সম্পর্কিত। এই লেখাটিতে আসলে ঐ জটিলতার পর্যায়ে যাই নি। আলোচিত অ্যালগোরিদমটি ডিটারমিনিস্টিক, কারণ তা স্টেট মেশিনের একই স্টেটসমূহ অনুসরণ করেই ইনিশ্যাল থেকে ফাইনাল স্টেটের দিকে যাবে। কিছু কিছু অ্যালগোরিদমে ইনিশ্যাল থেকে ফাইনাল স্টেটে যাওয়ার অনেক route থাকে।
সেগুলোই নন-ডিটারমিনিস্টিক। Definiteness সেই তুলনায় অনেক প্রাথমিক একটি ধারণা।
ধন্যবাদ।
@তুহিন তালুকদার,
অনেক ধন্যবাদ আপনার উত্তরের জন্য। আমি আপনার উত্তরগুলো বুঝতে পারছি। কিন্তু, একজন পাঠকের বুঝার ক্ষেত্রে যে সমস্যাগুলো হতে পারতো বলে আমার মনে হচ্ছে সেটি একটু বলি। তাতে করে হয়তো পরের পর্ব লিখতে আপনি জিনিসগুলো মাথায় রাখতে পারবেন।
আপনি খুব সহজভাবে অ্যালগোরিদম ব্যাখ্যা করছেন। এর মাঝে হঠাৎ যদি ফর লুপ চলে আসে, তাহলে বুঝাটা কি একটু কঠিন হয়ে উঠে না? কারণ, অনেকের কাছে এটি অপরিচিত একটা ব্যাপার। তার উপর আপনি যে উদাহরণ দিয়েছেন সেটি ইনফাইনাইট লুপ তো না-ই, বরং সেটা এত বেশী রকমের ফাইনাইট যে একবারও রান করার কথা না।
সসীমতা এবং নির্দিষ্টতা যদি ফাইনাইটনেস এবং ডেফিনিটনেস হয়, তার মানে দুইটা শব্দই কিন্তু ফাইনাইট শব্দ থেকে এসেছে। একটু কেমন জানি খটকা লাগছে। আরো একটু দেখে নিচ্ছি নেট থেকে।
রিয়েল লাইফ অনেক মজার প্রব্লেম সল্ভিং আছে। সেগুলো থেকে আপনার মত করে সহজ ভাষায় কিছু লিখতে পারেন কিনা দেখেন। আমি নিজেও কয়েকটা প্রব্লেম নিয়ে লিখবো ভাবছি। 🙂
@মইনুল রাজু,
বৈশিষ্ট্যগুলোর নামকে গ্রামাটিক্যালি ব্যাখ্যা করতে পারব না। :))
তবে সোজা কথায় ফাইনাইটনেস হচ্ছে অ্যালগোরিদমের ধাপ সংখ্যা সীমিত হওয়া, তবে ধাপগুলো পুনরাবর্তিত হতে পারবে। আর ডেফিনিটনেস হচ্ছে প্রতিটি ধাপের একমাত্র একটি অর্থ থাকতে পারবে, যেন প্রোগ্রাম লেখার সময় ঐ ধাপের সমতূল্য দুই বা ততোধিক অর্থ তৈরি হয় এমন ইন্সট্রাকশান লিখতে না হয়।
ঠিক বুঝলাম না, একটু ব্যাখ্যা করা যায়?
আপনার লেখা “একটি মাইক্রোসফট ইন্টারভ্যিউ প্রশ্ন” খুব মজার আর বুদ্ধিদীপ্ত ছিল। ভবিষ্যতেও তেমন কিছু লিখবেন আশা করি।
@তুহিন তালুকদার,
for(i=0;i>10;i++)
{
// instruction
}
এটা দিয়ে কি ইনফাইনাইট লুপ বুঝাতে চেয়েছেন? এটাতো ইনফাইনাইট লুপ নয়। এটার কন্ডিশান ট্রু হবে না, অতএব ইন্সট্রাকশান একবার ও ইক্সিকিউট হবে না। অসীমভাবে লুপিংও হবে না। for(i=1;i>0;i++) এটা ইনফাইনাইট লুপ। আমার বুঝার ভুল হতে পারে।
ধন্যবাদ।
@মইনুল রাজু,
আপনার ধারণাই ঠিক। আমি উভয় শর্তের জন্য সি কোড লিখে রান করিয়ে দেখেছি। আপনার প্রস্তাবিত শর্তের জন্যই (for(i=1;i>0;i++)) ইনফাইনাইট লুপ তৈরি হচ্ছে। আমার%2
@মইনুল রাজু,
মন্তব্যটি সম্পূর্ণ এল না। তাই আবার দিলাম।
আপনার ধারণাই ঠিক। আমি উভয় শর্তের জন্য সি কোড লিখে রান করিয়ে দেখেছি। আপনার প্রস্তাবিত শর্তের জন্যই (for(i=1;i>0;i++)) ইনফাইনাইট লুপ তৈরি হচ্ছে। আমার শর্ত অনুযায়ী, কম্পাইলেশনের পর for লুপেই ঢুকছে না। অনেক ধন্যবাদ ভুল ধরিয়ে দেওয়ার জন্য।
আগামী লেখাগুলোতে আপনার সাথে হওয়া এই আলোচনাটি খুব কাজে আসবে বলে আমি মনে করি।
@তুহিন তালুকদার,
আপনার লেখার সূত্র ধরেই বলি – যুক্তি দিয়ে বিচার করুন, প্রোগ্রাম চালিয়ে না। আপনার প্রোগ্রামে ‘i’ যদি int অথবা অন্য কোন বেসিক টাইপ হয়ে থাকে, তাহলে for(i=1;i>0;i++) কিন্তু কোন ইনফাইনাইট লুপ না, তবে অনেক দীর্ঘ একটা লুপ। i এর মান সর্বোচ্চ হয়ে যাওয়ার পর i++ করলে তার মান কত হবে? 2’s complement এর হিসাব অনুযায়ী i আবার সর্বনিম্ন মানে ফেরত আসবে। তখন লুপের কন্ডিশন satisfy করবে না, লুপ থেমে যাবে। নিচের লুপটা চালালে ব্যাপারটা দ্রুত ধরতে পারবেন –
for(i=MAX_INT-10; i>0; i++);
@প্রতিফলন,
ধন্যবাদ আপনার তথ্যের জন্য। আপনার প্রস্তাবিত লুপটি আমি চালিয়ে দেখেছি।
তুহিন তালুকদার,
খুব সহজ ভাষায় প্রোগ্রামিং এর বেসিক তুলে ধরেছেন। বউনি লেখা হিসেবে চমৎকার। মুক্তমনার ইদানিংকার লেখাগুলো দেখে আমি সত্যই মুগ্ধ। আগে রামগড়ুড়ের ছানাই কেবল প্রোগ্রামিং এর শৈল্পিক জগৎ নিয়ে লিখতো। এখন আপনি, প্রতিফলন অনেকেই হাজির হয়েছেন। অনেক ধন্যবাদ মুক্তমনায় লেখা শুরু করার জন্য। ধর্ম, দর্শন, রাজনীতি, বিবর্তন প্রভৃতি নিয়ে মুক্তমনায় তো চমৎকার সব লেখা আসছেই, পাশাপাশি গনিত, আধুনিক বিজ্ঞান প্রভৃতি নিয়েও লেখা আসা দরকার। আপনারা সেই প্রত্যাশা পূরণ করে চলেছেন।
পরবর্তী পর্বের প্রত্যাশায় থাকলাম।
@অভিজিৎ,
হ্যা + উনারা আসলেই ভালো লিখেন, এখন আমার আর “বেইল” নাই 🙁 🙁 🙁 :-[ ।
@অভিজিৎ,
আপনার মন্তব্যটিকে আমি একটি বড় প্রাপ্তি হিসেবে বিবেচনা করছি।
লেখক রামগড়ুড়ের ছানাের সিরিজটি আমার কাছেও অনেক আগ্রহের এবং অনুপ্রেরণার।
অনেক অনেক ধন্যবাদ।
@তুহিন তালুকদার,
একমত। (Y)
আপনার পোস্টটি অত্যন্ত সুন্দর। কঠিন একটা বিষয় অত্যন্ত সহজ ভাবে উপস্থাপন করেছেন। ধন্যবাদ।
@জাহাঙ্গীর আলাম,
ধন্যবাদ পড়ার ও মন্তব্যের জন্য।