Note G
নোট জি ছিল অ্যাডা লাভলেস রচিত একটি কম্পিউটার অ্যালগরিদম, এবং অনুমানমূলক বিশ্লেষণাত্মক ইঞ্জিন ব্যবহার করে বার্নৌলি সংখ্যা গণনা করার জন্য ডিজাইন করা হয়েছিল। নোট জি সাধারণত একটি কম্পিউটারের জন্য বিশেষভাবে প্রথম অ্যালগরিদম হিসাবে সম্মত হয় এবং ফলস্বরূপ লাভলেসকে প্রথম কম্পিউটার প্রোগ্রামার হিসাবে বিবেচনা করা হয়। অ্যালগরিদমটি এ থেকে জি লেবেলযুক্ত একটি সিরিজের শেষ নোট ছিল, যা তিনি লুইজি মেনাব্রিয়ার 1842 সালের তুরিনের বিশ্ববিদ্যালয়ে বিশ্লেষণাত্মক ইঞ্জিনের উপর চার্লস ব্যাবেজের বক্তৃতার ফরাসি প্রতিলিপির ইংরেজি অনুবাদের সাথে ভিজ্যুয়াল সহায়ক হিসাবে নিযুক্ত করেছিলেন, "নোশনস সুর লা মেশিন অ্যানালিটিক ডি চার্লস ব্যাবেজ" ("চার্লস ব্যাবেজের বিশ্লেষণাত্মক মেশিনের উপাদান")। লাভলেসের নোট জি কখনও পরীক্ষা করা হয়নি, কারণ ইঞ্জিনটি কখনও তৈরি করা হয়নি। তাঁর অনুবাদ সহ তাঁর নোটগুলি 1843 সালে প্রকাশিত হয়। আধুনিক যুগে, আরও সহজেই উপলব্ধ কম্পিউটিং সরঞ্জাম এবং প্রোগ্রামিং সংস্থানগুলির জন্য ধন্যবাদ, লাভলেসের অ্যালগরিদমটি আধুনিক প্রোগ্রামিং ভাষাগুলিতে "অনুবাদ" হওয়ার পরে পরীক্ষা করা হয়েছে। এই পরীক্ষাগুলি স্বাধীনভাবে এই সিদ্ধান্তে পৌঁছেছে যে একটি ছোটখাটো টাইপোগ্রাফিক ত্রুটির কারণে স্ক্রিপ্টে একটি বাগ ছিল, যা অ্যালগরিদমটিকে তার মূল অবস্থায় অব্যবহারযোগ্য করে তোলে। 1840 সালে, চার্লস ব্যাবেজকে তুরিনে তাঁর বিশ্লেষণাত্মক ইঞ্জিনের উপর একটি সেমিনার দেওয়ার জন্য আমন্ত্রণ জানানো হয়েছিল, যা ইঞ্জিনের উপর তাঁর দেওয়া একমাত্র প্রকাশ্য ব্যাখ্যা। ব্যাবেজের বক্তৃতার সময় গণিতবিদ লুইজি মেনাব্রিয়া ফরাসি ভাষায় ইঞ্জিনের একটি বিবরণ লিখেছিলেন। ব্যাবেজের বন্ধু চার্লস হুইটস্টোন পরামর্শ দিয়েছিলেন যে অবদান রাখার জন্য লাভলেসকে মেনাব্রিয়ার বিবরণ অনুবাদ করা উচিত। ব্যাবেজ পরামর্শ দিয়েছিলেন যে তিনি পরিশিষ্ট দিয়ে অ্যাকাউন্টটি বৃদ্ধি করুন, যা তিনি তার অনুবাদের শেষে এ-জি লেবেলযুক্ত সাতটি "নোট" এর একটি সিরিজ হিসাবে সংকলন করেছিলেন। তাঁর অনুবাদ 1843 সালের আগস্ট মাসে টেলরের সায়েন্টিফিক মেমোয়ার্সে প্রকাশিত হয়, যেখানে লাভলেসের নাম "এ. এ. এল" স্বাক্ষরিত হয়। এই নোটগুলিতে, লাভলেস ব্যাবেজের বিশ্লেষণাত্মক ইঞ্জিনের ক্ষমতা বর্ণনা করেছিলেন যদি এটি কম্পিউটিংয়ের জন্য ব্যবহার করা হয়, এমনকি ব্যাবেজের নিজের চেয়েও ইঞ্জিনের জন্য আরও উচ্চাভিলাষী পরিকল্পনা তৈরি করে। নিবন্ধটির জন্য লাভলেসের নোটগুলি নিবন্ধটির চেয়ে তিনগুণ দীর্ঘ ছিল। প্রথম নোটে, তিনি ব্যাবেজের যন্ত্রের জন্য সংখ্যাসূচক উচ্চাকাঙ্ক্ষার বাইরেও অনুসন্ধান করেন এবং পরামর্শ দেন যে যন্ত্রটি সঙ্গীত, গ্রাফিক্স এবং ভাষার ক্ষেত্রগুলি মোকাবেলা করার জন্য গণনার সুবিধা নিতে পারে। তিনি পাঠকদের কাছে ব্যাখ্যা করেছেন যে কীভাবে বিশ্লেষণাত্মক ইঞ্জিনটি ব্যাবেজের আগের ডিফারেন্স ইঞ্জিন থেকে আলাদা ছিল এবং এর কার্যকারিতাকে জ্যাকওয়ার্ড মেশিনের সাথে তুলনা করেছেন, যাতে এটি যন্ত্রের ভাষা বোঝাতে বাইনারি পাঞ্চ কার্ড ব্যবহার করে। নোট সি-তে, এই বিষয়টিকে আরও এগিয়ে নিয়ে যাওয়া হয়েছে এই সত্যের দ্বারা যে মেশিনটি একযোগে এবং পুনরাবৃত্তিমূলক ক্রিয়া করতে পারে, এটি নিশ্চিত করে যে কোনও কার্ড বা কার্ডের সংগ্রহ একটি একক সমস্যার সমাধানে বেশ কয়েকবার ব্যবহার করা যেতে পারে, মূলত নিয়ন্ত্রণের আধুনিক পদ্ধতির প্রত্যাশা করে প্রবাহ এবং লুপিং। এই ধারণাগুলি চূড়ান্ত নোট জি-তে মাথায় আনা হয়েছিল, যেখানে লাভলেস গণনার একটি উদাহরণ প্রদর্শন করতে চেয়েছিলেন। নোট জি শুধুমাত্র চারটি গাণিতিক ক্রিয়াকলাপ ব্যবহার করেছেঃ যোগ, বিয়োগ, গুণ এবং বিভাজন, ব্যাবেজের দৃষ্টিভঙ্গির বাস্তবায়নঃ এটি ব্যাবেজের ডিস্কের কলামে তথ্য সংরক্ষণের ধারণাটিও ব্যবহার করে, প্রতিটি দ্বারা চিহ্নিত (পরিবর্তনশীল জন্য) এবং একটি সাবস্ক্রিপ্ট নম্বর যা নির্দেশ করে যে কোন কলামটি উল্লেখ করা হচ্ছে। ফাংশন লাভলেস বার্নৌলি সংখ্যা গণনা করার জন্য একটি পুনরাবৃত্তিমূলক সমীকরণ ব্যবহার করেছিলেন, যেখানে তিনি পরবর্তীটি তৈরি করার জন্য একটি সমীকরণে পূর্ববর্তী মানগুলি ব্যবহার করেছিলেন। তার পদ্ধতিটি এইভাবে চলেঃ যেখানে একটি দ্বিপদী সহগ,। বার্নুলি সংখ্যা বিভিন্ন উপায়ে গণনা করা যেতে পারে, তবে লাভলেস ইচ্ছাকৃতভাবে ইঞ্জিনের শক্তি প্রদর্শনের জন্য একটি ইচ্ছাকৃতভাবে বিস্তৃত পদ্ধতি বেছে নিয়েছিলেন। নোট জি-তে তিনি বলেনঃ "ইঞ্জিনটি যে ধাপগুলির মাধ্যমে বার্নৌলির সংখ্যা গণনা করতে পারে তা বিস্তারিতভাবে অনুসরণ করে আমরা এই নোটগুলি শেষ করব, এটি (যে আকারে আমরা এটি অনুমান করব) এর ক্ষমতার একটি জটিল উদাহরণ।" নোট জি-তে লাভলেস দ্বারা ব্যবহৃত নির্দিষ্ট অ্যালগরিদমটি অষ্টম বার্নৌলি সংখ্যা তৈরি করে (যেমনটি তিনি শুরু করেছিলেন)। অ্যালগরিদমের টেবিল প্রতিটি কমান্ডকে ক্রমানুসারে সংগঠিত করে। প্রতিটি কমান্ড দুটি পদে একটি অপারেশনকে বোঝায়। দ্বিতীয় কলামে বলা হয়েছে যে শুধুমাত্র অপারেটর ব্যবহার করা হচ্ছে। ভেরিয়েবলগুলিকে "হিসাবে চিহ্নিত করা হয়, যেখানে এর আগের সুপারস্ক্রিপ্টটি ভেরিয়েবলকে বরাদ্দ করা বিভিন্ন মানের পরিমাণকে উপস্থাপন করে এবং এর পরের সাবস্ক্রিপ্টটি ভেরিয়েবলের অর্ডিনাল অ্যাসাইনমেন্টকে উপস্থাপন করে, অর্থাৎ এটি কোন পরিবর্তনশীল। (উদাহরণস্বরূপ, পরিবর্তনশীল সংখ্যা 4-এর দ্বিতীয় অ্যাসাইনমেন্টকে বোঝায়। এখন পর্যন্ত অনির্ধারিত যে কোনও চলকের একটি সুপারস্ক্রিপ্ট থাকে 0।) ভ্যারিয়েবলগুলি থেকে শুরু করে সংখ্যাযুক্ত করা হয়। তৃতীয় কলামটি কম্পিউটারকে ঠিক কী কমান্ড হচ্ছে তা জানায়, (উদাহরণস্বরূপ, লাইন 1-এ, কমান্ডটি সঞ্চালিত হয় "-পরিবর্তনশীল 2-এর প্রথম পুনরাবৃত্তি পরিবর্তনশীল 3-এর প্রথম পুনরাবৃত্তি দ্বারা গুণিত হয়।) এবং প্রতি লাইনে দুটি পদের মধ্যে শুধুমাত্র একটি অপারেশন অন্তর্ভুক্ত করে। কলাম 4-"ভেরিয়েবলস রিসিভিং রেজাল্টস" নোট করে যে 3 নম্বর কলামে অপারেশনের ফলাফল কোথায় সংরক্ষণ করা উচিত। এইভাবে, এই কলামের যে কোনও চলকের সুপারস্ক্রিপ্ট সংখ্যা প্রতিবার একটি করে বৃদ্ধি পায়। (যেমন। লাইন 1-এ, এর ফলাফল ভেরিয়েবলকে বরাদ্দ করা হয়, এবং।) 5 নম্বর কলামে বলা হয়েছে যে কমান্ডের পরিচালনায় ব্যবহৃত ভেরিয়েবলগুলির মধ্যে কোনও একটি পরিবর্তন করা হয়েছে কিনা। কোঁকড়া বন্ধনীতে আবদ্ধ, প্রতি কমান্ডের দুটি সারি মূল পরিবর্তনশীলটিকে একটি সমান চিহ্নের বাম দিকে রাখে এবং নতুন পরিবর্তনশীলটিকে অন্য দিকে রাখে-অর্থাৎ, যদি পরিবর্তনশীলটি পরিবর্তন করা হয়, তবে এর সুপারস্ক্রিপ্টটি এক দ্বারা বৃদ্ধি করা হয় এবং যদি না হয় তবে এটি একই থাকে। (যেমন। তৃতীয় লাইনটি পরিবর্তনশীলের দ্বিতীয় পুনরাবৃত্তির ফলাফল নির্ধারণ করে এবং পঞ্চম কলামটি উল্লেখ করে এটি প্রতিফলিত করে; পরিবর্তিত হয়েছে, কিন্তু হয়নি। 6 নম্বর কলামে, "ফলাফলের বিবৃতি", 4 নম্বর কলামে পরিবর্তনশীলকে নির্ধারিত ফলাফলটি পূর্বে নির্ধারিত দুটি পদের মানের উপর ভিত্তি করে তার সঠিক মান দেখানো হয়েছে। (যেমন। লাইন 1-- এর শুরুতে সেট করা হয়েছিল, এবং পরিবর্তনশীল হিসাবে সেট করা হয়েছিল। অতএব, গাণিতিক স্বরলিপিতে)। এই কলামটি আপাতদৃষ্টিতে ইঞ্জিন দ্বারা গণনা করা হয় না, এবং স্পষ্টতা এবং প্রোগ্রামের পদক্ষেপগুলি অনুসরণ করার জন্য পাঠকের ক্ষমতাকে সহায়তা করার জন্য আরও বেশি বলে মনে হয়। (উদাহরণস্বরূপ, লাইন 5-এর একটি ভগ্নাংশকে দুটি দ্বারা ভাগ করা হয়েছে, যা সম্ভবত সঙ্গতি এবং একটি নেস্টেড ভগ্নাংশের টাইপোগ্রাফিক জটিলতার জন্য অর্ধেক দ্বারা গুণিত হিসাবে চিহ্নিত করা হয়।) এটি প্রোগ্রাম, এবং ভেরিয়েবলের বাইরে পৃথক পরিবর্তনশীল স্বরলিপিও ব্যবহার করে, যা চূড়ান্ত মান খুঁজে বের করার জন্য পর্যায়ক্রমে গুণিত হয়, এইভাবেঃ এর বাইরে, প্রতিটি ধারাবাহিক কলাম সময়ের সাথে প্রদত্ত পরিবর্তনশীলের মান দেখায়। প্রতিবার যখন কোনও পরিবর্তনশীল পরিবর্তন হয়, বা বর্তমান কমান্ডের একটি পদ হিসাবে তার উপস্থিতির টোকেন দ্বারা তার মান প্রাসঙ্গিক হয়ে ওঠে, তখন তার মান তার নিজ নিজ কলামে বর্ণিত বা পুনরায় উল্লেখ করা হয়। অন্যথায়, এটির অপরিবর্তনীয়তাকে বোঝাতে এটি একটি উপবৃত্তাকার দিয়ে চিহ্নিত করা হয়। এটি সম্ভবত শুধুমাত্র প্রাসঙ্গিক তথ্যের জন্য কম্পিউটারের প্রয়োজনীয়তার অনুকরণ করে, যার ফলে প্রোগ্রাম পার্স হওয়ার সাথে সাথে একটি পরিবর্তনশীলের মান ট্র্যাক করে। পদ্ধতি প্রোগ্রামটি গণনা করার চেষ্টা করেছিল যা আধুনিক কনভেনশন দ্বারা অষ্টম বার্নৌলি সংখ্যা হিসাবে পরিচিত, যেমন তালিকাভুক্ত, যেমন লাভলেস গণনা শুরু করে। ত্রুটি অপারেশন 4-এ, অনুমিতভাবে যে বিভাজনটি ঘটছে তা হল, "পরিবর্তনশীল অবস্থায় সংরক্ষণ করা হবে। যাইহোক, "ফলাফলের বিবৃতি" বলে যে বিভাজনটি হওয়া উচিতঃ প্রকৃতপক্ষে, বিভাজনটি ভুল উপায়; এর দ্বিতীয় পুনরাবৃত্তি, যা অপারেশন 2-এ দেখা যায়। একইভাবে, এটি দ্বিতীয় পুনরাবৃত্তি, যা অপারেশন 3-এ দেখা যায়। সুতরাং, অপারেশন 4 হওয়া উচিত নয়, বরং হওয়া উচিত। এই বাগের অর্থ হল যে ইঞ্জিনটি যদি কখনও এই অবস্থায় এই অ্যালগরিদমটি চালায় তবে এটি সঠিকভাবে বার্নৌলি সংখ্যা তৈরি করতে ব্যর্থ হবে এবং এর চূড়ান্ত লক্ষ্য মানটি খুঁজে পাবে। আধুনিক বাস্তবায়ন লাভলেসের প্রোগ্রামটি একটি আধুনিক প্রোগ্রামিং ভাষায় প্রয়োগ করা যেতে পারে, যদিও উপরে বর্ণিত ত্রুটির কারণে, যদি ঠিক প্রতিলিপি করা হয় তবে এটি এর জন্য একটি ভুল চূড়ান্ত মান প্রদান করবে। সিউডোকোডে সাধারণীকরণ করা মূল প্রোগ্রামটি নিম্নরূপঃ ভি [1] = 1 ভি [2] = 2 ভি [3] = এন (লাভলেসের প্রোগ্রামে এন = 4)। V [4] = V [4]-V [1] V [5] = V [5] + V [1] V [11] = V [5]/V [4] V [11] = V [11]/V [2] V [13] = V [13]-V [11] V [10] = V [3]-V [1] V [7] = V [2] + V [7] V [11] = V [6]/V [7] উপরন্তু, লাভলেসের প্রোগ্রামটি শুধুমাত্র দুটি পদের উপর যোগ, বিয়োগ, গুণ বা বিভাজন সম্পাদন করে ভেরিয়েবলগুলিকে সংজ্ঞায়িত করার অনুমতি দেয় যা পূর্বে সংজ্ঞায়িত ভেরিয়েবল ছিল। আধুনিক বাক্যবিন্যাস প্রতিটি গণনা আরও সংক্ষিপ্তভাবে সম্পাদন করতে সক্ষম হবে। এই সীমাবদ্ধতা কয়েকটি জায়গায় স্পষ্ট হয়ে ওঠে, উদাহরণস্বরূপ কমান্ড 6 ()-এ। এখানে লাভলেস নিজেই একটি অনির্ধারিত পরিবর্তনশীলকে () সংজ্ঞায়িত করে, যার ফলে ধরে নেওয়া হয় যে সমস্ত অনির্ধারিত পরিবর্তনশীল স্বয়ংক্রিয়ভাবে 0-এর সমান, যেখানে বেশিরভাগ আধুনিক প্রোগ্রামিং ভাষাগুলি একটি ত্রুটি প্রদান করবে বা পরিবর্তনশীলটিকে নাল হিসাবে তালিকাভুক্ত করবে। তিনি যা চেয়েছিলেন তা হল "", কিন্তু তিনি কেবল পরিবর্তনশীলকে শব্দ হিসাবে ব্যবহার করতে নিজেকে সীমাবদ্ধ করেছিলেন। একইভাবে, কমান্ড 8 ()-এ, দ্বি-মেয়াদী গাণিতিকের কঠোর স্বরলিপি জটিল হয়ে ওঠে, কারণ 2 হিসাবে সংজ্ঞায়িত করার জন্য, লাভলেস তার মান (0) যোগ (2) নির্ধারণ করে। এই সীমাবদ্ধ স্বরলিপির কারণে এইভাবে সংজ্ঞায়িত করা হয়েছে। উদ্ধৃতি সূত্র 1843 পরিচিতি অ্যালগরিদম অ্যাডা লাভলেস