Tuesday, November 5, 2024



    R প্রোগ্রামিং: 1L, 2L, 3L কেন? ধরুন আমরা একটা ভেক্টর বানালাম এরকম:

     
     class(x) দেখলে দেখা যাবে "numeric"। 

    এবার একটু আলাদা করে লিখুন।

       

    এবার class(x) দেখলে দেখা যাবে "integer"। এখানেই পার্থক্য। শুধু 1, 2, 3 লিখলে R ধরে নেয় এটা নিউমেরিক ভেক্টর। মানে সংখ্যাগুলোতে ভগাংশও থাকতে পারে। তবে আমরা যদি জানি আমরা শুধু পূর্ণসংখ্যা নিয়ে কাজ করব তাহলে integer-এর ব্যবহার কাজের গতি বাড়িয়ে দিতে পারে। আর সেজন্যই c(1L, 2L, 3L) লিখে আমরা নির্দিষ্ট করে বলে দেই, আমাদের ভেক্টরটা হবে ইন্টিজার ভেক্টর। 

    এতে সুবিধা হলো ভেক্টরটা কম্পিউটারে কম মেমোরি দখল করবে। numeric ভেক্টর প্রতিটি ভ্যালুর জন্য ৮ বাইট ব্যবহার করে। integer সেখানে ব্যবহার করে ৪ বাইট। object.size(x) দিয়ে ভেক্টরটার সাইজ দেখলে পাওয়া যায় ৬৪ বাইট। কিন্তু object.size(y) হলো ৮০ বাইট। ভেক্টরের মধ্যে শুধুই সংখ্যার সাইজ থাকলে আসলে হত যথাক্রমে ১২ ও ২৪ বাইট। কিন্তু আরও কিছু তথ্যও থাকে। এই যেমন এটা যে নিউমেরিক ভেক্টর সে তথ্যও মেমোরিতে থাকে। এগুলোকে ওভারহেড তথ্য। তাও বড় ডেটার ক্ষেত্রে ইন্টিজার ও নিউমেরিক ডেটার মধ্যে পার্থক্য গুরুত্বপূর্ণ হয়ে ওঠে। ইন্টিজার র‍্যামের ওপর প্রেশার কমাবে। 

    কম্পিউটার সিপিইউ (CPU)কে দ্রুত কাজ করতে সহায়তা। আরেকটা উদাহরণ দেখুন।

       

     তবে R দিয়ে ইন্টিজার বানাতে হলে $-2 \times 10^9$ থেকে $2 \times 10^9$-এর মধ্যে সংখ্যা থাকতে হবে।
    Category: articles

    Friday, August 9, 2024

    প্রথম অধ্যায় 

    কিছুই না করার গল্প 

    [শূন্যের সূচনা] 


    তখন অস্তিত্ব বা অনস্তিত্ব কোনোটাই ছিল না। ছিল না স্থানের জগৎ, আর না ছিল তার বাইরের আকাশ। কে জাগাল? কোথায় জাগাল? 

    -ঋগ্বেদ




    শূন্যের গল্প খুব পুরনো। গণিতের জন্মের সময়েই এর জন্ম হয়। সে আজ থেকে হাজার হাজার বছর আগের কোথা। তখনও প্রথম সভ্যতারও জন্ম হয়নি। মানুষের লিখতে-পড়তে পারারও বহু আগের কথা। শূন্যকে আজ আমাদের কাছে খুব স্বাভাবিক মনে হয়। কিন্তু প্রাচীনকালের মানুষের কাছে সংখ্যাটিকে বহিরাগত মনে হত। মনে হত ভীতিকর।


    ধারণাটির জন্ম প্রাচ্যের ফার্টাইল ক্রিসেন্ট[১] বা উর্বর চন্দ্রকলা অঞ্চলে। খ্রিস্টের জন্মের কয়েক শ বছর আগে। এই শূন্য শুধু আদিম শূন্যতার প্রতিচ্ছবিই নয়। এর ছিল ভয়ানক গাণিতিক ধর্মও। শূন্যের মধ্যে রয়েছে যুক্তির ভিত্তিকে গুঁড়িয়ে দেওয়ার শক্তি। 


    ভেড়া গুনতে মানুষের মধ্যে গাণিতিক চিন্তার সূচনা ঘটে। এছাড়াও সম্পদের হিসাব রাখতে ও সময় মাপতে গণিত লাগত। এগুলোর কোনোটাতেই শূন্যকে দরকার হয়নি। শূন্যের আবিষ্কারের আগেও হাজার বছর ধরে সভ্যতা ঠিকঠাক কাজ করছিল। শূন্যের প্রতি ঘৃণা কাজ করায় কিছু কিছু সংস্কৃতির মানুষ সংখ্যাটিকে বাদ দিয়েই বাঁচতে চেয়েছিল। 


    শূন্যবিহীন জীবন 

    আমাদের দৈনন্দিন জীবনে শূন্যকে প্রয়োজন হয় না। কেউই শূন্যটি মাছ কিনতে যায় না। এক দিক থেকে সব অঙ্কবাচক সংখ্যার মধ্যে এটি সবচেয়ে সভ্য। চিন্তার পরিশীলিত রূপই আমাদেরকে সংখ্যাটি ব্যবহার করতে বাধ্য করেছে। 

    -আলফ্রেড নর্থ উইথহেড 


    একজন আধুনিক মানুষ শূন্যবিহীন জীবনের কথা ভাবতেও পারেন না। ঠিক যেমনি ৭ বা ৩১ সংখ্যাগুলো ছাড়া জীবন চলা অসম্ভব। কিন্তু এক সময় শূন্য বলতে কোনো সংখ্যা ছিল না। ঠিক যেভাবে ছিল না ৭ বা ৩১। সেটা প্রাগৈতিহাসিক কালের কথা। তাই জীবাশ্মবিদরা পাথর ও হাড়ের টুকরো থেকে তথ্য সংগ্রহ করে গণিতের জন্মকাহিনি বের করেছেন। এসব থেকে গবেষকরা জেনেছেন, প্রস্তর যুগের গণিতবিদরা এখনকার গণিতবিদদের চেয়ে অমার্জিত ছিলেন। ব্ল্যাকবোর্ডের বদলে তারা ব্যবহার করতেন নেকড়ে। 


    ১৯৩০-এর দশকে প্রস্তর যুগের গণিতবিদদের সম্পর্কে বড় একটি তথ্য পাওয়া যায়। প্রত্নতত্ত্ববিদ কার্ল অ্যাব্লোসম চেকোস্লোভাকিয়ার মাটি নিয়ে পরীক্ষা করছিলেন। তিনি এ সময় ৩০ হাজার বছরের পুরনো একটি নেকড়ের হাড় খুঁজে পান। তাতে রয়েছে অনেকগুলো খাঁজ কাটা। কেউ জানে না, জনৈক গুহামানব গগ এই হাড় দিয়ে তার শিকার করা হরিণ, আঁকা ছবি বা তার গোসল না করা দিনগুলো গুনেছিল কি না। তবে এটা নিশ্চিত, প্রাচীন মানুষেরা কিছু না কিছু গুনেছিল। 


    প্রস্তর যুগে নেকড়ের একটি হাড়ই বর্তমান সময়ের একটি সুপারকম্পিউটার। গগের আদিপুরুষরা তো দুই পর্যন্তুও গুনতে পারত না। সেখানে শূন্যের দরকার হওয়ার তো প্রশ্নই ওঠে না। মনে হচ্ছে গণিতের একেবারে শুরুর দিকে মানুষ শুধু এক ও বহুর পার্থক্য বুঝত। একজন গুহামানবের বর্শা হয় একটা থাকত, নাহয় বহু। তিনি হয় একটি টিকটিকি খেতেন, নাহয় বহু। এক বা বহু ছাড়া অন্য রাশিকে বোঝানোর মতো কিছুর অস্তিত্ব ছিল না। ধীরে ধীরে প্রাচীন ভাষাগুলো বিকশিত হলো। এক, দুই ও বহুর মধ্যে পার্থক্য পাওয়া গেল। শেষ পর্যন্ত এক, দুই, তিন ও বহুর পার্থক্যও জানা গেল। কিন্তু আরও বড় সংখ্যার কোনো নাম ছিল না। এই সমস্যা এখনও কিছু কিছু ভাষায় দেখা যায়। বলিভিয়ার সিরিয়না ইন্ডিয়ান বা ব্রাজিলের ইয়ানোয়ামাদের কথাই ধরুন। তাদের ভাষায় তিনের বেশি সংখ্যাকে প্রকাশ করার জন্য নেই কোনো শব্দ। তেমন দরকার হলে তারা বলেন “অনেক” বা “প্রচুর।”


    কিন্তু সংখ্যার একটি দারুণ বৈশিষ্ট্যের কারণে সংখ্যাপদ্ধতি সেখানেই থেমে যায়নি। সংখ্যাদেরকে যোগ করে নতুন নতুন সংখ্যা পাওয়া যায়। তাই কিছুদিন পরেই বুদ্ধিমান মানুষগুলো সংখ্যা-শব্দগুলোকে বিভিন্ন সারিতে সাজাতে লাগল। বর্তমান ব্রাজিলের বাকাইরি ও বোরোরো জাতির মানুষের ব্যবহৃত ভাষায় এই কাজটি করা হয়েছে। তাদের সংখ্যাগুলো এ রকম: এক, দুই, দুই ও এক, দুই ও দুই, দুই ও দুই এবং এক ইত্যাদি। তারা দুইয়ের মাধ্যমে হিসাব করে। গণিতবিদরা একে বলেন বাইনারি বা দ্বিমিক (binary) পদ্ধতি। 


    বাকাইরি বা বোরোরোদের মতো করে তেমন কেউ গণনা করেন না। প্রাচীন নেকড়ের হাড়ই প্রাচীনকালের গণনাপদ্ধতির আদর্শ উদাহরণ। গগের নেকড়ের হাড়ে ৫৫টি খাঁজ ছিল। প্রতি গ্রুপে ছিল ৫টি করে খাঁজ। প্রথম ২৫টি দাগের পরে দ্বিতীয় আরও একটি খাঁজ ছিল। মনে হচ্ছে, গগ হয়ত ৫ দিয়ে হিসাব করছিলেন। এবং গ্রুপগুলোকে ৫ দিয়ে গুচ্ছবদ্ধ করছিলেন। এটা করা খুবই অর্থবহ। দাগগুলোকে একটি একটি করে গণনা করার চেয়ে গ্রুপে গ্রুপে সাজিয়ে নিলে অনেক দ্রুত কাজ করা যায়। আধুনিক গণিতবিদরা বলবেন খোদাই শিল্পী গগ পাঁচভিত্তিক (quinary) গণনা পদ্ধতি ব্যবহার করেছিলেন।


    কিন্তু কেন পাঁচ-ই? গভীরে গিয়ে চিন্তা করলে বোঝা যাবে আসলে যেকোনো একটি সংখ্যা নিলেই চলত। গগ চারটি নিয়ে গুচ্ছ করে দাগ টানলে এবং চার ও ষোলো এর গুচ্ছ বানালেও তার সংখ্যাপদ্ধতি ঠিকই কাজ করত। একইভাবে কাজ করত ছয় ও ছত্রিশের গুচ্ছও। কয়টা নিয়ে গুচ্ছ করা হলো সেটার ওপর হাড়ের ওপর দাগের সংখ্যা নির্ভর করে না। কিন্তু গগ চারের বদলে ৫টি নিয়ে গুচ্ছ করেছেন। পৃথিবীর সব মানুষই গগের বৈশিষ্ট্যটা পেয়েছে। মানুষের প্রতি হাতে পাঁচটি করে আঙ্গুল আছে। ফলে বিভিন্ন সংস্কৃতির সংখ্যাপদ্ধতির ভিত্তি হিসেবে ৫-কে জনপ্রিয় হতে দেখা গেল। যেমন, প্রাথমিক যুগের গ্রিকরা ট্যালি চিহ্ন আঁকাকে বলত 'ফাইভিং'।


    এমনকি দক্ষিণ আমেরিকার দ্বিমিক গণনা পদ্ধতিতেও ভাষাবিদরা পাঁচভিত্তিক সংখ্যাপদ্ধতির সূচনা দেখেছেন। বোরোরো ভাষায় “দুই ও দুই এবং এক” বলার আরেকটি উপায় হলো, “এটা হলো আমার এই পুরো হাতের সমান।” বোঝাই যাচ্ছে, প্রাচীন আমলের মানুষ শরীরের অঙ্গ-প্রত্যঙ্গ দিয়ে গণনা করতে চাইত। পাঁচ (এক হাত), দশ (উভয় হাত) এবং বিশ (উভয় হাত ও উভয় পা) ছিল খুব পছন্দনীয় চিহ্ন। ইংরেজি ভাষার ইলেভেন (এগারো) ও টুয়েলভ (বারো) শব্দ দুটি সম্ভবত “ওয়ান ওভার টেন” ও “টু ওভার টেন” থেকে এসেছে। আর তের (থার্টিন), চৌদ্দ (ফোর্টিন), পনের (ফিফটিন) ইত্যাদি হলো যথাক্রমে “থ্রি অ্যান্ড টেন”, “ফোর অ্যান্ড টেন” এবং “ফাইভ অ্যান্ড টেন”-এর সংক্ষিপ্ত রূপ। এ কারণে ভাষাবিদরা মনে করছেন, যে জার্মানীয় আদিভাষাসমূহ থেকে ইংরেজি ভাষা এসেছে সেগুলোতে দশ ছিল মৌলিক একক। এ কারণে সেই ভাষাগুলোর মানুষরাও ১০-ভিত্তিক সংখ্যাপদ্ধতি ব্যবহার করতেন। অন্য দিকে ফরাসি ভাষায় আশি-কে বলে কোয়াত্রে ভিংত (চারটি বিশ)। আর নব্বইকে বলে কোয়াত্রে ভিংত দি (চারটি বিশ ও একটি দশ)। হয়ত এখনকার ফ্রান্সে যে মানুষগুলো বাস করতেন তারা ২০-ভিত্তিক বা ভিজেসিনাল (vigesimal) সংখ্যাপদ্ধতি ব্যবহার করতেন। সাত ও ৩১-এর মতো সংখ্যাগুলো এই সবগুলো সংখ্যাপদ্ধতিতেই ছিল। হোক সেটা ৫-ভিত্তিক, ১০-ভিত্তিক, কিংবা ২০-ভিত্তিক। কিন্তু এগুলোর কোনোটিতেই ছিল না শূন্যের জন্যে কোনো নাম। এই ধারণাটারই অস্তিত্ব ছিল না। 


    শূন্যটি ভেড়ার যত্ন তো কখনও নিতে হয় না। কিংবা শুন্যসংখ্যক সন্তানের হিসাব রাখার দরকার হয় না। “আমার কাছে শূন্যটি কলা আছে” না বলে দোকানী বলেন, “আমার কাছে কোনো কলা নেই।” কোনো কিছুর অভাব বোঝানোর জন্যে আপনার সংখ্যার প্রয়োজন হয় না। আর কোনো বস্তুর অভাবকে প্রতীক দিয়ে প্রকাশ করার বিষয়টিও কারও মাথায় আসেনি। এ কারণেই শূন্য ছাড়াই মানুষ এতগুলো সময় পার করে দিয়েছে। শূন্যের দরকারই পড়েনি। শূন্যের উদয়ও তাই ঘটেনি। 


    সত্যি বলতে, প্রাগৈতিহাসিক কালে সংখ্যার জ্ঞান ছিল বড় এক গুণ। গুনতে পারা ছিল দারুণ মেধার পরিচায়ক। একে জাদুমন্ত্রের মতোই অতীন্দ্রিয় ও গুপ্ত মনে করা হত। মিশরীয় বই বুক অব ডেড-এ আকেন নামে এক নৌকার মাঝি বিদেহী আত্মাকে নদী পার করে নরকে পৌঁছে দেয়। তিনি একবার একটি মৃত আত্মার মুখোমুখি হন। এ সময় তিনি “তার আঙ্গুলের সংখ্যা জানে না” এমন কাউকে নৌকায় নিতে অস্বীকার করেন। মাঝিকে সন্তুষ্ট করতে তখন আত্মাকে আঙ্গুলের সংখ্যা বের করতে একটি গণনার ছড়া আওড়াতে হয়। (অবশ্য গ্রিক গল্পে মাঝি চাইত টাকা, যা মৃত ব্যক্তির জিহ্বার নিচে বাঁধা থাকত)। 


    প্রাচীন পৃথিবীতে গুনতে পারত হাতে গোনা কিছু মানুষ। তবে সংখ্যা ও গণনার মৌলিক ধারণাগুলো সবসময় মানুষ আয়ত্ত করে লিখতে-পড়তে পারার আগেই। আগেকার যুগের সভ্যতার মানুষ যখন খাগড়া দিয়ে মাটির লিপিতে লিখতে, পাথরে খোদাই করে ছবি আঁকতে ও পশুচর্ম ও প্যাপাইরাসে কালি দিয়ে লিখতে শুরু করে, তত দিনে সংখ্যাপদ্ধতি সুপ্রতিষ্ঠিত হয়ে গেছে। মৌখিক সংখ্যাপদ্ধতিকে লিখিত আকারে উপস্থাপন জটিল কিছু ছিল না। দরকার শুধু একটি সাঙ্কেতিক পদ্ধতি। যার মাধ্যমে লেখকরা সংখ্যাকে আরও স্থায়ী রূপ দিতে পারে। (কিছু কিছু সমাজের মানুষ তো লেখালেখি শেখার আগেই এই কাজটি করে ফেলেছে। যেমন নিরক্ষর ইনকারা কুইপু নামে একটি পদ্ধতি ব্যবহার করত। এটা ছিল হিসাব করার জন্য বানানো একটি রঙিন ও গিঁট বাঁধা দড়ি।)  


    প্রথমদিকের লেখকদের লেখা সংখ্যাগুলোর সাথে তাদের সংখ্যাপদ্ধতির মিল থাকত। আর অনুমিতভাবেই তারা সেটা যথাসম্ভব সংক্ষিপ্ত উপায়ে লিখত। গগের সময়ের পরে সমাজ জীবনে উন্নতি সাধিত হয়েছে। একের পর এক ছোট ছোট দাগের গুচ্ছ না বানিয়ে লেখকরা প্রতিটি গুচ্ছের জন্যে প্রতীক তৈরি করল। পাঁচ-ভিত্তিক সংখ্যাপদ্ধতিতে লেখক এক লেখার জন্যে হয়ত একটি দাগ দেবেন। পাঁচ-এর একটি গুচ্ছ বোঝাতে আলাদা আরেকটি চিহ্ন ব্যবহার করবেন। ২৫-এর গুচ্ছ বোঝাতে ব্যবহার করবেন অন্য আরেকটি দাগ। এভাবেই চলবে। 


    মিশরীয়রা ঠিক এই কাজটিই করেছে। ৫ হাজার বছরেরও আগে, পিরামিডও তৈরির আগেই মিশরীয়রা তাদের দশমিক পদ্ধতিকে লেখায় রূপ দেওয়ার একটি নিয়ম তৈরি করে। সেখানে তারা ছবি দিয়ে সংখ্যা বোঝাত। একটি খাড়া দাগ দিয়ে এক একক বোঝানো হত। আবার গোড়ালির একটি হাড় দিয়ে বোঝানো হত ১০, একটি মোচড়ানো দড়ি ছিল ১০০ ইত্যাদি। এভাবে সংখ্যা লিখে যাওয়ার জন্যে তাদেরকে শুধু এই প্রতীকগুলোর গুচ্ছ রেকর্ড করতে হত। এক শ তেইশ বোঝানোর জন্যে ১২৩টি দাগ দেওয়ার বদলে লেখকরা ছয়টি প্রতীক লিখত। একটি রশি, দুটি গোড়ালি ও তিনটি খাড়া দাগ। প্রাচীনকালেই মূলত এভাবেই গাণিতিক কাজ হত। আর অন্য অনেক সভ্যতার মতোই মিশরেও শূন্য ছিল না। বা বলা যায়, প্রয়োজন হয়নি। 


    তবুও প্রাচীন মিশরীয়রা গণিতে ভালোই হাত পাকিয়েছিল। জ্যোতির্বিদ্যা ও সময় গণনায় তারা কারিশমা দেখিয়েছিল। তার মানে তাদেরকে উন্নত গণিত ব্যবহার করতে হয়েছিল। কারণ পঞ্জিকার পাতা খুব দ্রুত বদলে যায়। 


    বেশিরভাগ প্রাচীন মানুষের কাছেই একটি স্থিতিশীল পঞ্জিকা বানানো ছিল বড় এক সমস্যার কাজ। এর কারণ ছিল তারা সাধারণত চান্দ্র পঞ্জিকা দিয়ে কাজ শুরু করতেন। পরপর দুটি পূর্ণিমার মাঝের সময়টুকু ছিল এক মাস। এভাবে গণনা করাই ছিল সহজাত অভ্যাস। আকাশে চাঁদের বড়-ছোট হওয়া সহজেই সবার নজর কাড়ে। আর সময়ের চক্র হিসাব করার জন্যে এখান থেকে সুবিধাজনক একটি উপায়ও খুঁজে পাওয়া যায়। কিন্তু চান্দ্র মাসের দৈর্ঘ্য হয় ২৯ থেকে ৩০ দিনের মাঝামাঝি। ১২টি মাস যোগ করে সব মিলিয়ে ৩৫৪ দিনের বেশি পাওয়া যায় না। যা সৌর বছরের চেয়ে ১১ দিন কম। চান্দ্র মাস তেরটি নিলে আবার ১৯ দিন বেশি হয়ে যায়। ওদিকে আবার চাষাবাদ নির্ভর করে সৌর বছরের ওপর, চান্দ্র বছর নয়। অসংশোধিত চান্দ্র মাস দিয়ে হিসাব করলে ঋতুর মাসগুলোকে বদলে যেতে দেখা যায়। 


    চান্দ্র মাসকে সংশোধন করাও আরেক মুশকিলের কাজ। আধুনিক সময়েও সৌদি আরব ও ইসরায়েলসহ অনেকগুলো  দেশ এখনও পরিমার্জিত চান্দ্র পঞ্জিকা ব্যবহার করে। কিন্তু ৬ হাজার বছর আগে মিশরীয়রা আরও ভাল একটি সমাধান পেয়ে যায়। তাদের দিনের হিসাব রাখার পদ্ধতিটি ছিল খুবই সরল। সেই পঞ্জিকা ঋতুর সাথে মিল রেখে চলত অনেক দিন পর্যন্ত। সময়ের হিসাব রাখতে তারা চাঁদের বদলে সূর্যের ধারস্থ হয়। যেমনটা বর্তমানে বেশিরভাগ জাতি করেন। 


    চান্দ্র পঞ্জিকার মতোই তাদের মাস ছিল ১২টি। কিন্তু প্রতিটি মাস ছিল ৩০ দিনের। (১০-ভিত্তিক সংখ্যা ব্যবহার করায় তাদের এক সপ্তাহের দৈর্ঘ্য ছিল ১০ দিন। বছর শেষ হলে আরও বাড়তি পাঁচটি দিন যোগ করা হত। এতে করে সব মিলিয়ে ৩৬৫ দিন হয়ে যেত। এই পঞ্জিকাই আমাদের বর্তমান ক্যালেন্ডারের আদিরূপ। মিশরীয়দের এই পদ্ধতি গ্রিক ও পরে রোমানরা গ্রহণ করে। রোমানরা একে পরিমার্জন করে অধিবর্ষ যোগ করে। এটাই পরে পাশ্চাত্যে আদর্শ পঞ্জিকা হিসেবে আত্মপ্রকাশ করে। তবে মিশরীয়, গ্রিক ও রোমানদের কাছে শূন্যের ব্যবহার না থাকায় পশ্চিমা পঞ্জিকায়ও নেই শূন্য। এই অমনোযগই সহস্র বছর পরে সমস্যার কারণ হয়ে দাঁড়ায়। 


    মিশরীয়দের সৌর পঞ্জিকার উদ্ভাবন ছিল দারুণ এক অগ্রগতি। তবে ইতিহাসের পাতায় তারা আরও গুরত্বপূর্ণ একটি অবদানের স্বাক্ষরও রাখে। জ্যামিতির জ্ঞান। শূন্য ছাড়াই মিশরীয় অল্প সময়ের মধ্যেই গণিতের বিশেষজ্ঞ হয়ে ওঠে। পাশেই একটি উত্তাল নদীর উপস্থিতিতে আসলে না হয়েও উপায় ছিল না। প্রতি বছর নীল নদের পানি উপচে পড়ে এর কূল ভাসিয়ে দিত। বদ্বীপে নেমে আসত বন্যা। একটি ভাল দিকও ছিল এর। উন্নত পলি এসে জমত কৃষি জমিতে। এর ফলে প্রাচীন পৃথিবীতে নীল বদ্বীপ হয়ে উঠেছিল সবচেয়ে উর্বর কৃষিজমি। খারাপ দিকের মধ্যে ছিল সীমানার দাগ হারিয়ে যাওয়া। কৃষকরা বুঝতে পারতেন না কোনটা কার আবাদি জমি। মিশরে মালিকানাকে খুব গুরত্ব দেওয়া হত। মিশরীয় বই বুক অব ডেড পড়লে দেখা যায়, একজন মৃত মানুষকে ঈশ্বরের কাছে শপথ করে বলতে হয় যে সে প্রতারণা করে তার প্রতিবেশীর জমি দখল করেনি। এই পাপের শাস্তি ছিল এক ভয়ানক ভক্ষক প্রাণীকে পাপীর হৃদপিণ্ড খেতে দেওয়া। মিশরে চুরি করা ছিল শপথ ভাঙা, কাউকে হত্যা করা বা মন্দিরের ভেতরে স্বমৈথুনের মতোই কঠিন অপরাধ। 


    প্রাচীন ফেরাউনরা ক্ষয়ক্ষতি পরিমাপ ও নতুন করে সীমানা নির্দেশক স্থাপন করার জন্য জরিপ-আমিন নিয়োগ দিত। আর এভাবেই জন্ম হয় জ্যামিতির। এই জরিপ-আমিন বা দড়ি প্রসারকরা (এ নাম দেওয়র কারণ তারা পরিমাপের যন্ত্র ও গিঁট বাঁধা রশি দিয়ে সমকোণ বানাত) শেষ পর্যন্ত জমিকে আয়তক্ষেত্র ও ত্রিভুজে বিভক্ত করে ক্ষেত্রফল বের করার কায়দা বের করে। এছাড়া মিশরীয়রা পিরামিডের মতো বিভিন্ন বস্তুর আয়তন মাপার কৌশলও আয়ত্ত করে। পুরো ভূমধ্যসাগর এলাকায় মিশরীয় গণিত খ্যাতি অর্জন করেছিল। এবং সম্ভবত প্রাথমিক যুগের গ্রিক গণিতবিদরা, বিশেষ করে থ্যালিস ও পিথাগোরাসের মতো জ্যামিতিবিদরা মিশরে পড়াশোনা করেছিলেন। কিন্তু মিশরীয়দের এতসব দারুণ জ্যামিতিক কর্ম সত্ত্বেও মিশরের কোথাও শূন্যের অস্তিত্ব ছিল না। 


    এর বড় কারণ, মিশরীয়া ছিল কড়া বাস্তববাদী। আয়তন এবং দিন ও ঘণ্টা পরিমাপের বেশি কিছু তারা করতে পারেনি। প্রয়োগ নেই এমন কোনো কিছুতে গণিত তারা কাজে লাগাত না। ব্যতিক্রম হলো জ্যোতিষবিদ্যা (astrology)২। এ কারণে মিশরের সেরা গণতিবিদরাও বাস্তব জগতের সাথে অসম্পর্কিত কোনো গাণিতিক সমস্যায় জ্যামিতির মূলনীতিকে কাজে লাগাতে পারতেন না। তারা তাদের গাণিতিক ব্যবস্থাকে বিমূর্ত যুক্তির কাঠামোতে রূপ দিতে পারেনি। গণিতকে দর্শনে স্থান দিতেও তাদের কোনো উদ্যোগ ছিল না। গ্রিকরা আবার এমন ছিল না। বিমূর্ত ও দার্শনিক যুক্তিকে তারা সাদরে গ্রহণ করেছিলেন। প্রাচীন গণিতকে তারাই সর্বোচ্চ উচ্চতায় নিয়ে গিয়েছিল। তবুও তারা শূন্য আবিষ্কার করতে পারেনি। শূন্যে এসেছে প্রাচ্য থেকে। পাশ্চাত্য থেকে নয়।

    Category: articles

    Thursday, July 25, 2024

    জিরো: দ্য বায়োগ্রাফি অব অ্যা ড্যাঞ্জারাস আইডিয়া 

    মূল: চার্লস সিফ 

    অনুবাদ: আব্দুল্যাহ আদিল মাহমুদ 

    শূন্যতম অধ্যায়: নাল অ্যান্ড ভয়েড 




    ইউএসএস ইয়র্কটাউন জাহাজে শূন্যের আঘাতটা টর্পেডোর মতোই হলো। 


    ১৯৯৭ সালের ২১ সেপ্টেম্বর। জাহাজটি ভার্জিনিয়া উপকূল থেকে প্রমোদভ্রমণে বের হয়। শত কোটি ডলারের মিসাইল ক্রুজারটি হঠাৎ কাঁপতে কাঁপতে থেমে যায়। ইয়র্কটাউন জাহাজের সলীল সমাধি ওখানেই। 


    যুদ্ধজাহাজগুলো বানানোই হয় টর্পেডো বা বিস্ফোরকের আঘাতের প্রতি সহনীয় করে। ইয়র্কটাউন জাহাজকে সব ধরনের অস্ত্র থেকে বাঁচানোর ব্যবস্থা করা হয়েছিল। কিন্তু শূন্য থেকে বাঁচানোর কথা কেউ ভাবেনি। মারাত্মক এক ভুল।


    মাত্রই ইয়র্কটাউনের কম্পিউটারে নতুন এক সফটওয়্যার ইন্সটল করা হয়েছে। এটিই নিয়ন্ত্রণ করছে জাহাজের ইঞ্জিন। কিন্তু কোডের মধ্যে যে একটি টাইম বোমা লুকিয়ে আছে তা খেয়াল করেনি। সফটওয়্যার ইন্সটল করার সময় শূন্যটার দিকে প্রকৌশলীদের নজর দেওয়া উচিত ছিল। কিন্তু কী কারণে কে জানে—শূন্যটার দিকে কেউ তাকিয়ে দেখেনি। ফলে সেটি লুকিয়ে থাকল কোডের ভিড়ে। যতক্ষণ না  সফটওয়্যার শূন্যটাকে মেমোরিতে নিয়ে আসল। আর তাতেই সব শেষ। 


    ইয়র্কটাউনের কম্পিউটার শূন্য দিয়ে ভাগ করার চেষ্টা করেছিল। সাথে সাথে ৮০ হাজার হর্সপাওয়ারের যান অকেজো হয়ে গেল। ইঞ্জিনকে জরুরি নিয়ন্ত্রণ ব্যবস্থায় আনতে প্রায় তিন ঘণ্টা সময় লেগে গিয়েছিল। পরে কোনোরকমে তীরে ভিড়তে সক্ষম হয়। শূন্য থেকে মুক্তি পাওয়া, ইঞ্জিন মেরামত করা ও ইয়র্কটাউনকে পুনরায় সচল করতে লেগে গেল দুই দিন সময়। 


    অন্য কোনো সংখ্যার দ্বারা এমন ক্ষতি করা সম্ভব নয়। ইয়র্কটাউনে ঘটা কম্পিউটারের ত্রুটি শূন্যের ক্ষমতার খুব ছোট্ট এক নমুনা। বিভিন্ন সংস্কৃতির মানুষ শূন্যের বিরুদ্ধে রুখে দাঁড়িয়েছিল। শূন্যের মুখোমুখি হলে দার্শনিকদের বিদ্যেবুদ্ধি লোপ পেত। কারণ শূন্য অন্য সংখ্যা থেকে একেবারেই আলাদা। অবর্ণনীয় ও অসীমের এক ছোট্ট বহিঃপ্রকাশ। এ কারণেই মানুষ একে ভয় পেয়েছে। ঘৃণা করেছে। নিষিদ্ধ করেছে। 


    এ বইটা শূন্যের গল্প। প্রাচীনকালে এর জন্মের কথা। প্রাচ্যে এর সাদরে গৃহীত হবার কথা। ইউরোপে স্বীকৃতি পাওয়ার সংগ্রাম। আর আধুনিক পদার্থবিদ্যায় এর নিত্যনতুন হুমকির কথা। এখানে বলা হয়েছে সেইসব পণ্ডিত, মরমিবাদী, বিজ্ঞানী ও পাদ্রীদের কথা যারা এই সংখ্যাটির অর্থ নিয়ে লড়াই করেছেন। প্রত্যেকেই বুঝতে চেয়েছেন। প্রাচ্যের ধারণাগুলো থেকে নিজেদেরকে অপ্রয়োজনীয়ভাবে (কখনও কখনও সহিংস উপায়ে) মুক্ত রাখার পাশ্চ্যাতের একটি ব্যর্থ চেষ্টারও ইতিহাস এটি। এছাড়াও একটি সরল-দর্শন সংখ্যা থেকে সৃষ্ট বিভিন্ন প্যারাডক্সেরও ইতিহাস এটি। বর্তমান শতাব্দীর সেরা বুদ্ধির মানুষগুলোও পেরে উঠছেন না এর সাথে। বৈজ্ঞানিক চিন্তার পুরো অবকাঠামোকে হয়ত এই সংখ্যাটিই পরিষ্কার করবে। 


    শূন্যের অনেক ক্ষমতার কারণ এটি অসীমের যমজ। এরা সমান এবং বিপরীত। একের মধ্যে দুই। বিভ্রান্তির জন্ম ও কষ্ট দেওয়ার ক্ষেত্রে দুটোরই অবদান সমান। বিজ্ঞান ও ধর্মের বড় বড় প্রশ্নগুলো করা হয় শূন্যতা ও চিরন্ততা নিয়ে। শূন্যতা ও অসীমতা নিয়ে। শূন্য ও অসীম নিয়ে। শূন্য নিয়ে সংঘটিত যুদ্ধ দর্শন, বিজ্ঞান, গণিত ও ধর্মের ভিত্তিতে আলোড়ন তুলেছিল। সব বিপ্লবের পেছনে কাজ করেছে শূন্য। সাথে ছিল অসীম। 


    প্রাচ্য ও পাশ্চ্যাতের সংঘাতের মূলে ছিল শূন্য। খৃষ্টধর্ম ও বিজ্ঞানের সংগ্রামের কেন্দ্রে ছিল শূন্য। শূন্য পরিণত হলো প্রকৃতির ভাষায়। হয়ে গেল গণিতের সবচেয়ে গুরুত্বপূর্ণ হাতিয়ার। পদার্থবিজ্ঞানের সবচেয়ে ব্যাপক সমস্যাগুলোর সমাধানে মোকাবেলা করতে হয় শূন্যকে। হোক সে ব্ল্যাকহোলের অন্ধকার কেন্দ্র কিংবা বিগ ব্যাংয়ের উজ্জ্বল ঝলক। 


    কিন্তু ইতিহাসে পাতা বলছে, বাজিমাত সবসময় করেছে শূন্যই। প্রত্যাখ্যান, নির্বাসন সব মোকাবেলা করে শূন্য সবসময় প্রতিপক্ষকে হারিয়ে দিয়েছে। মানুষ কখনোই শূন্যকে দর্শনে অন্তর্ভূক্ত হতে বাধ্য করতে পারেনি। বরং মহাবিশ্ব ও ঈশ্বরের ধারণা পেতে শূন্যের কাছেই যেতে হয়েছে মানুষকে। 

    Category: articles

    Saturday, July 13, 2024

    চলুন একটি খেলা খেলি। আপনাকে একটা খাম দিলাম। খুলে দেখলেন, এতে ২০ টাকা আছে। আর এদিকে আমার হাতে আছে আরেকটি খাম। আপনাকে জানালাম, আমার হাতের খামে হয় ১০ বা ৪০ টাকা আছে। মানে আপনার খামের টাকার অর্ধেক বা দ্বিগুণ। দুই পরিমাণের সম্ভাবনা সমান ৫০% করে। আপনাকে দুটো অপশন দিলাম।


    খাম প্যাারাডক্স


    ১। ২০ টাকার খামটি রাখুন অথবা

    ২। আগের খান ফেরত দিয়ে আমার কাছে থাকা খামটা নিন


    আপনি কী করবেন? অনেকেই হয়ত অতশত ভাবনায় না গিয়ে ১ম খামটাই (২০ টাকার) রেখে দিতে চাইবেন। তবে একটু হিসাব করেই দেখি না! 


    এ ধরনের হিসাব করতে কাজে লাগবে পরিসংখ্যান। কারণ এখানে সিদ্ধান্ত নিতে গেলে দরকার হবে এক্সপেরিমেন্ট বা পরীক্ষার। তো করে ফেলি একটা সরল পরীক্ষা। ধরা যাক আমরা কাজটা করলাম ১০ বার। 


    ১। প্রত্যেকবার ২০ টাকার খামটাই রেখে দিলে মোট টাকা পাওয়া যাবে ২০ x ১০ = ২০০ টাকা।

    ২। খাম বদলে নিলে গড়ে ৫ বার ১০ টাকা আর ৫ বার ৪০ টাকা পাবেন (কারণ সম্ভাবনা সমান ৫০% করে)। তাহলে মোট পাবেন ১০ × ৫ + ৪০ × ৫ = ৫০ + ২০০ = ২৫০।


    তাহলে দেখা গেল, পাল্টালে লাভ। দারুণ তো!


    আরেকটা খেলা!


    আমার হাতে আছে দুটো খাম। কোনটায় কত আছে তা আপনাকে জানাইনি। শুধু বললাম, একটায় আরেকটার দ্বিগুণ টাকা আছে। আপনাকে বললাম, ইচ্ছামতো একটা তুলে নিন। তবে আগের মতো ভেতরে কত আছে তা দেখা যাবে না। এবারও আপনাকে দুটো অপশন দিলাম৷ 


    ১। তোলা খামটা রেখে দিন। বা

    ২। অপর খামটা নিন, যাতে অর্ধেক বা দ্বিগুণ টাকা আছে।


    আপনি কি খামটা পাল্টাবেন?


    হিসাবে কী আসে দেখি!


    ধরুন তোলা খামটায় 'ক' টাকা আছে। তাহলে অপর খামে আছে হয় ক/২ বা ২ক টাকা। দুটো পরিমাণেরই সম্ভাবনা সমান ৫০%।


    আগের মতো ১০ বার কাজটা করলে কী হয় দেখি।


    ১। না পাল্টালে পাবেন ক × ১০ = ১০ক টাকা

    ২। পাল্টালে পাবেন ২ক × ৫ + ক/২ × ৫ = ১০ক + ৫ক/২ = ১২.৫ ক,  যা ১০ক-এর চেয়ে বেশি। 


    দ্বিতীয় অপশনে গড়ে বেশি আসে আগের মতোই। তাহলে পাল্টালে লাভ!


    গাণিতিক বুদ্ধির সদ্ধ্যবহার করে আপনি পাল্টানোর সিদ্ধান্ত নিলেন। আপনার হাতে এখন দ্বিতীয় খামটি। 

    এবার আমি আপনাকে আরেকটা অফার দিলাম।  আমি বললাম, খাম আরেকবার পাল্টাবেন? 


    আপনি প্রথম খামটার দিকে তাকালেন। যা একটু আগেই আপনার কাছে ছিল। তাকালেন, অপর খামের দিকেও। কোনটায় কী আছে জানা নেই। তবে এটা পরিষ্কার, পাল্টালেই আপনি আগের মতোই অর্ধেক বা দ্বিগুন পাবেন। আগেই দেখেছি আমরা, পাল্টালে লাভ। অতএব, পাল্টান।


    এতে করে ফিরে গেলেন আগের জায়গায়। এবারও খাম নেওয়ার আগে মনে পড়ল, পাল্টে নিলে লাভের সম্ভাবনা বেশি। তাই, আবার পাল্টালেন। আবার, আবার, আবার...


    শেষমেশ দেখা গেল, টাকা পাওয়ার বদলে আপনি বাকি জীবন খাম পাল্টাতে পাল্টাতে সময় পার করবেন। 

    Category: articles

    Sunday, June 23, 2024

    কত শত কাজে এখন পাসওয়ার্ড লাগে। থাকে কত শর্ত। পাসওয়ার্ড হতে হবে শক্ত। এতে কোনো সন্দেহ নেই। R জানলে এ কাজটাও করা যায় সহজেই। যদিও কাজটা R দিয়ে করতে হবে এমন কোনো কথা নেই। আরও কত উপায় তো আছেই। তাও একটি কোডিং করেই দেখি না।




    আমাদের পাসওয়ার্ডে থাকবে-

    ১। 0 থেকে 9 পর্যন্ত ডিজিটগুলো

    ২। ইংরেজি বড় ও ছোট হাতের অক্ষর 

    ৩। বিশেষ কিছু ক্যারেক্টার (যেমন @, #, $ ইত্যাদি) 


    পাসওয়ার্ড বানানো যাবে যে-কোনো দৈর্ঘ্যের। প্রথমেই আমরা ওপরের সবগুলো ধরন থেকে একটি করে ক্যারেক্টার নেবো। তাহলে পেলাম চারটি ক্যারেক্টার। পাসওয়ার্ড চার ক্যারেক্টারের বেশি হলে আরও কিছু ক্যারেক্টার লাগবে। সেগুলো আমরা র‍্যান্ডমলি নেবো সব ধরনের ক্যারেক্টার থেকেই। এজন্য আগেই সবাইকে একত্র করে একটি ভেক্টর বানিয়ে রাখব। 



    বিশেষ ধরনের ক্যারেক্টারগুলো S ভেক্টরে সেভ করলাম। সবগুলো একত্র করে রাখলাম allchr ভেক্টরের মধ্যে।  

    nC = পাসওয়ার্ডের দৈর্ঘ্য। বাই ডিফল্ট ৮ অক্ষরের পাসওয়ার্ড তৈরি হবে। 

    nD = ডিজিটের সংখ্যা 

    nS = বিশেষ ক্যারেক্টারের সংখ্যা 

    এভাবেই বাকিগুলো যথাক্রমে বড় হাতের ও ছোট হাতের অক্ষরের সংখ্যা। সবগুলোর ডিফল্ট মান ১ দেওয়া আছে। 


    সবশেষে জেনারেটেড পাসোওয়ার্ডের ক্যারেক্টারগুলোকে র‍্যান্ডমলি সাজিয়ে নেবো। নাহলে সবসময় শুরুর ক্যারেক্টারগুলো একইরকম হবে। 


    টেস্ট টাইম 



    কিছু রেজাল্ট (১০ অক্ষরের)

    "6ku$HdeNFy"
    "#Yy|-vMIZ4"
    "gz7Rer|*V?"
    "2Gt/^v;967"
    "`yHaD9KW/i"
    "<o4eJ6-p8R"
    "9kPG>A:F.l"
    ".i@19Rql3c"
    "z@?;+9*Y*a"
    "r`4yVcf6J*"


    বলুন তো, একসাথে অনেকগুলো পাসওয়ার্ড বানাতে কী করব? একটু ভাবুন। 


    জানতে এখানে ক্লিক করুন।

     

    Category: articles

    Sunday, June 12, 2022




    হঠাৎ একটা প্রয়োজনে একটা ফোল্ডারের সব ফাইলের নাম চেঞ্জ করা দরকার হলো। ২৭টি ফাইলে একটি একটি করে কাজ করতে সময় লাগবে অনেক। তার চেয়ে খারাপ হলো বিরক্তি। মনে পড়ল লিনাক্স কমান্ড লাইনের কথা। মনে হতেই ব্যাশে গিয়ে কোড লিখলাম। 

    এ কাজের জন্য এক লাইনের কোডই যথেষ্ট। 




    এখানে একটি লুপ তৈরি করা হয়েছে। do এবং done দিয়ে লুপ শুরু ও শেষ হয়েছে। tr দিয়ে মূলত রিনেম করা হয়েছে। এখানে যেহেতু আমরা স্পেসকে পরিবর্তন করেছি তাই tr এর পরে ' ' দেওয়া হয়েছে। অন্য কিছু চেঞ্জ করতে হলে ' ' এর ভেতরে লিখলেই হবে। যেমন a বদলাতে চাইলে হবে tr 'a'। একইভাবে ঠিক পরের অংশ লিখতে হবে। 

    আর বিশেষ কিছু ফাইল চেঞ্জ করতে চাইলে তা * এর পরে লিখতে হবে। যেমন শুধু পিডিএফ (pdf) ফাইলগুলো রিনেম করতে হবে in *.pdf;। 

    লিনাক্সে mv কমান্ড দিয়েই মূলত রিনেম করা হয়। আর লুপের জন্যেই ডলার সাইন দেওয়া হয়েছে। 
    Category: articles

    Monday, August 30, 2021

     হ্যাঁ, R এর ggplot2 প্যাকেজে পাই চার্টের মতো নান্দনিক চার্ট আঁকার সরাসরি কোনো উপায় নেই। আঁকতে হয় বার চার্ট থেকে ঘুরিয়ে। কিন্তু আসলেই কি চার্ট দুটো আলাদা? আসলে তো পাই চার্টও এক ধরনের বার চার্টই! যেখানে বারগুলো সোজা দাঁড়িয়ে না থেকে বৃত্তাকার পথে চলছে। উপরের দিকে না গিয়ে ঘুরছে। 

    এই যে চার্টটিই দেখুন। পাই চার্টের এরিয়াগুলোকে চাইলে আপনি কৌণিক পথ বেয়ে চলা বার বা স্তম্ভ মনে করতে পারেন। 

    এখন আমরা ধাপে ধাপে দেখব, কীভাবে বার চার্টটিকে আপনি পাই চার্টে রূপান্তরিত করবেন। 

    আমরা কাজ করব নিচের ডেটাটি দিয়ে। এটা হলো যুক্তরাষ্ট্রের বিভিন্ন জাতিগোষ্ঠীর মানুষের শতাংশ। 


    এবার এখান থেকে বার চার্টটি আগে এঁকে ফেলি। বার চার্টের সংখ্যাগুলো একটি কলামে উপস্থিত থাকলে geom_bar() এর ভেতরে stat="identity" দিতে হয়। আর যদি এভাবে থাকে: true, false, false, true ইত্যাদি, তাহলে stat="identity" দেওয়া লাগবে না। width না দিলেও হবে। সেক্ষেত্রে স্বয়ংক্রিয়ভাবে বারগুলো মোটা বা চিকন হবে। 



    %>% চিহ্নটির নাম পাইপ অপারেটর। এভাবে লেখা আর ggplot(data=us_races, aes...) লেখা একই কথা। তবে এটা ব্যবহার করতে হলে tidyverse প্যাকেজ লোড করে নিলেই। একই সাথে পাইপের magrittr, ggplot2, dplyrসহ অনেকগুলো দরকারি প্যাকেজ লোড হয়ে যাবে। 


    এবারে RColorBrewer প্যাকেজ দিয়ে বারের কালারগুলো সাজিয়ে নেই। না করলেও ক্ষতি নেই। পাশাপাশি বারের মধ্যেই প্রতিটি বারের সাথে সংশ্লিষ্ট সংখ্যাগুলো দেখিয়ে দেই। 


     

    খেয়াল করুন বারে ডান পাশে লিজেন্ড থাকার আসলে কোনো প্রয়োজন নেই। এটাকে ফেলেই দেওয়া যায়। 



    এবার পাই চার্ট বানানো শুরু করা যাক। প্রথম কাজ হলো, x অক্ষে Race রাখা যাবে না। পাই চার্টে যেহেতু এরিয়াগুলো একটা আরেকটার ওপরে থাকবে, তাই y অক্ষে সংখ্যাগুলো বসিয়ে Race দিয়ে কালার করে নিচ্ছি। 




    এটাকে পাই চার্ট বলার সময় হয়নি এখনও। পাই চার্ট হবার জন্যে প্রস্তুত বলতে পারি। 

    এখন সে কাজটাই করব। বারগুলোকে ঘুরিয়ে দিতে হবে। এটাই করবে coord_polar() ফাংশনটা। 



    দেখতে পাই চার্টের মতোই হয়েছে। তবে x অক্ষ, y অক্ষ ও আরও নানান জায়গায় অপ্রয়োজনীয় জিনিসে ভর্তি। এগুলো সরিয়ে একটু ক্লিন করি। theme_void() কাজটা করে দেবে। 




    এখন মোটামুটি কাজ চলার অবস্থায় আছে। এখনও অনেক কাজ করার সুযোগ আছে। লিজেন্ড না দিয়ে এরিয়ার ওপরই লেবেল দিয়ে দিলে ভাল হয়। এছাড়াও এরিয়ার মধ্যেই সংখ্যা বা পারসেন্টেজ দেখানো যায়। আমাদের ডেটায় অবশ্য সংখ্যাগুলোই পারসেন্টেজ। তাই দুটো একই কথা। 



    এবার কালার কম্বিনেশন আরেকটু ঠিক করে নেই। 






    চাইলে তো আরও কত কিছুই করা যায়। করার আগে চিন্তা করতে হবে সেটা কতটা অর্থবহ। 

    পাই চার্ট ভাল না লাগলে যদি ডোনাট চার্ট আঁকতে চান, সেটাও করতে পারেন। 

    Category: articles

    Saturday, August 28, 2021

     পত্রিকার পাতা খুললেই ইদানিং সুন্দর সুন্দর ডোনাট চার্ট দেখা যায়। এগুলোও আসলে পাই চার্টই। তবে মাখখানে থাকে একটি ছিদ্র। 

    কিছু দিন মনে করতাম, R মনে হয় এমন প্লট বানাতে পারে না। মজার ব্যাপার হলো, অন্য কেউ পারে R পারবে না এমনটা হতেই পারে না। হলে এমন হতে পারে যে R পারে কিন্তু অন্যরা (যেমন এক্সেল, SPSS পাইথন) পারে না। 

    এই প্লটটাও R-এই বানিয়েছি।

    এমনিতে R-এর ggplot2 প্যাকেজে পাই চার্ট বানানোর জন্যে কোনো ফাংশন নেই। তবে একটু ঘুরিয়ে চিন্তা করলেই বোঝা যায়, পাই চার্ট আসলে এক ধরনের বার চার্টই। তবে বারগুলো খাড়াভাবে না থেকে কৌণিকভাবে অবস্থান করছে। একটা যেখানে শেষ আরেকটা সেখানে শুরু। 

    ওপরের ডোনাট চার্টটির দিকেই দেখুন। এরিয়াগুলোকে চাইলেই বার হিসেবে কল্পনা করতে পারেন। অতএব, ডোনাট চার্টের কায়দা কানুন বুঝতে হলে বার চার্ট বানানোর নিয়ম জানতে হবে। একদম চিন্তা নেই, অনেকগুলো পোস্টে সেটা আমরা ব্যাখ্যা করেছি। 

    ☛ বার প্লট বানানোর কায়দা কানুন

    তাহলে বানিয়ে ফেলি। ও, আগে কিছু ডেটা বানিয়ে নেই। টেবিলটা উইকিপিডিয়া থেকে নেওয়া। 



    এখানে আমি ডেটাফ্রেইম তৈরি করার জন্যে tidyverse প্যাকেজমালার tibble() ফাংশন ব্যবহার করেছি। এভাবে করতে হলে আপনাকে library(tidyverse) কমান্ড দিয়ে এটা লোড করে নিতে হবে। চাইলে এটা লোড না করেও ডেটা বানাতে পারেন। সেক্ষেত্রে ফাংশনটা হবে data.frame()। তবে tidyverse লোড করলে সাথে সাথে ggplot2ও লোড হয়ে যায়। আলাদাভাবে ggplot2 লোড করতে রান করুন library(ggplot2)।  


    এবার প্লট করে ফেললেই হলো। 

     

    বার প্লট বোঝার পরেও এটা না বুঝতে না পারলে কিছু ব্যাপার খেয়াল করুন:`

    • এখানে পাই চার্ট বানানোর সুবিদার্থে আমরা geom_bar এর বদলে geom_col ব্যবহার করেছি। 
    • xlim দিয়ে ডোনাটের পুরুত্ব ঠিক করা হয়েছে। এর ওপর নির্ভর করে পাইয়ের ভেতরের ছিদ্র ছোট-বড় হবে।
    • মূলত coord_polar দিয়ে বারগুলোকে কৌণিক রূপ দেওয়া হয়েছে।
    • theme_void দিয়ে অপ্রয়োজনীয় ব্যাকগ্রাউন্ড রিমুভ করা হয়েছে। 
    • geom_text সম্পর্কে আরও জানতে এই লেখাটি দেখুন। 
    • বাকি জিনিসগুলো বিভিন্ন লেখায় আগেই বলেছি। দেখতে চাইলে দেখে নিন
    • প্লট কালারিং করার নানান উপায় দেখুন এখানে

    আজ এ পর্যন্তই। 
    Category: articles

    Thursday, July 22, 2021

     ধরুন আমাদের কাছে একটি ডেটাফ্রেইম আছে যাতে অনেকগুলো কলাম আছে। এগুলোর সবগুলোর গড় , মধ্যমা বা পরিমিত ব্যবধান আমরা এক কমান্ডেই বের করতে চাই। 

    আজকের পোস্টে আমরা R-এর বিল্ট-ইন ডেটাসেট airquality ব্যবহার করব। এতে ৬টি কলাম বা চলক আছে। Rstudio ব্যবহার করলে আপনি View(airquality) দিয়ে ডেটাকে একনজর দেখে নিতে পারেন। Rstudio ব্যবহার না করে থাকলে প্রথমে ডেটাকে লোড করে নিতে হবে।  


    এবার str দিয়ে দেখে নিতে পারেন কলাম বা চলকগুলো কী ধরনের। দেখা যাবে, পাঁচটি কলামই পূর্ণ সংখ্যা দিয়ে তৈরি। একটিতে আছে ভগ্নাংশ। তাহলে সবগুলো কলামই সংখ্যাবাচক। 

    তাহলে এবার গড় করে ফেলি। 

    স্বাভাবিক উপায়ে গড় বের করতে গেলে হয়ত আমরা এভাবে করব:


    এখানে na.rm = TRUE দেওয়ার কারণ হলো, ডেটায় কিছু মিসিং ভ্যালু  (NA) আছে। এই কথা দিয়ে আমরা বলে দিয়েছি, সেগুলোকে বাদ দিয়ে হিসাব করে দাও। 

    কিন্তু এভাবে একটা একটা করে গড় বের করা প্রোগ্রামিং-এর আদর্শ বিরোধী। কাজটা করে ফেলতে হবে একটা কমান্ড দিয়েই। আর সেটা করার উপায় আছে বেশ কয়েকটি। 

    আমরা চাইলে এভাবে করতে পারি:

     

     এখানে 2 দিয়ে বোঝানো হলো, আমরা কলামের গড় চাই। সারির (row) গড় চাইলে দিতাম ১। খেয়াল করে দেখুন চলকের নামসহ কত সুন্দর করে গড় দেখানো হয়েছে। আরও খেয়াল করলে দেখবেন, প্রথম দুই কলামের গড়ের জায়গায় NA লেখা। এর কারণ na.rm = TRUE দেওয়া হয়নি। দিয়ে দিন:

       

    এখানে আমরা TRUE কে সংক্ষেপে T লিখেছি। এভাবে লিখলেও চলে, তবে আদর্শ কোডিং হলো না আর কি। 

     শুধু কি গড়? একইভাবে আমরা সব কলাম বা সারির অন্য কোনো তথ্যও বের করতে পারব। শুধু এতে ফাংশনটার নাম দিয়ে দিতে হবে। যেমন মধ্যমা বা পরিমিত ব্যবধান (standard deviation) বের করতে হলে:


    এখন, মজার ব্যাপার হলো গড় বের করতে চাইলে এতটুকুও কষ্ট করার দরকার নেই আসলে। কল্পনাও করতে পারবেন না, এর চেয়েও সহজ একটি কোডও আছে। কলামের গড় বের করতে চাইলে:

      

    একইভাবে সারির গড় বের করতে চাইলে ফাংশনটা হবে rowMeans()। 

    আপাতত আর কোনো কৌশল দেখব না। তার চেয়ে একটা সমস্যার সমাধান করি। আমরা উপরে যে উদাহরণ দেখলাম, এখানে সবগুলো কলাম ছিল সংখ্যাসূচক। নিউমেরিক বা ইন্টিজার। যদি এক বা একাধিক character ভেক্টর থাকে? যেমন ধরুন আমরা যদি mpg ডেটা দিয়ে এই কাজ করতে যাই তাহলে কী হয় দেখুন:

     

    error দেখাবে। তাহলে সমাধান হলো সংখ্যাবাচক কলামগুলোকে আলাদা করে নিতে হবে।

     

    অথবা ব্যবহার করতে পারেন tidyverse প্যাকেজমালা থেকে dplyr এর ফাংশনটা।

     

    এসব উপায়ে গড় বের করার আরেকটা সুবিধাও আছে। গ্রাফ আঁকতে চাইলেও ডেটা প্রস্তুত হয়েই আছে। যেমন ধরুন, আমরা যদি airquality ডেটার গড়গুলো বারপ্লটে দেখাতে চাই। 



    ডেটাফ্রেইমের কলাম ইনফরমেশন থেকে সহজ বারপ্লট

    ☛ প্লট আঁকার কলাকৌশল দেখতে দেখুন এই লিঙ্কটি। 

    ব্যস! হ্যাপি প্রোগ্রামিং !!!
    Category: articles

    Thursday, October 1, 2020

     

    চেনাজানা সংখ্যাগুলোর সূচকের নিয়ম তো আমরা জানি। $3^2$ এর অর্থ হলো $3 \times 3$। মানে ৩ কে নিজের সাথে দুইবার গুণ করা। কিন্তু কাল্পনিক সংখ্যা  $i^i$ এর মানে কী? এর মানই বা কী হবে? কেন হবে? সেটার অর্থ কী? 

     

    জটিল জিনিসকে সহজ করে চিন্তা করি।  $i^i$কে $1 \cdot i^i$ চিন্তা করি। মানে আমরা ১ থেকে $i^i$ সংখ্যাটিতে যাব। আর ভাবব সেটার মানে আসলে কী। 


    আগেই বলেছি, ১ যেকোনো গুণের মৌলিক অংশ। ১-কে বলা হয় গুণজ অভেদ। যেভাবে যোগ-বিয়োগের মৌলিক অংশ শূন্য। যোগ-বিয়োগ করে কিছু না থাকলে থাকে শূন্য। গুণ (ও ভাগে) কাটাকাটি করে কিছু নেই মানে ১ আছে। যেমন, ৩কে ২ দিয়ে গুণ করা মানে আসলে ১কে ৬ দিয়ে গুণ করা। গুণ মানে আসলে ১কে ফুলিয়ে দেওয়া।

     

     সংখ্যাকে একটু ভিন্নভাবে চিন্তা করতে শুরু করি। ধরুন একটি গ্রামে ৩০০ জন শিক্ষিত মানুষ আছেন। এখন আপনি চাইলেই এই ৩০০ সংখ্যাকে ভিন্নভাবে চিন্তা করতে পারেন। শুরু করি ১ থেকে। শুরুতে গ্রামে একজন শিক্ষিত মানুষ ছিলেন। তিনি এবং ক্রমেই তার ছাত্ররা বাকিদের শিক্ষিত করেছেন। 

     

    যেহেতু বৃদ্ধির (growth) কথা চলে এল, তাই কাজে আসবে আসবে সূচকীয় ফাংশন। বৃদ্ধির সাথে সূচকীয় ফাংশনের সম্পর্ক নিয়ে কিঞ্চিত (তবে এ লেখার জন্যে যথেষ্ট) আলোচনা আছে এখানে। সূচকীয় বৃদ্ধিটা মূলত ব্যবহার করা হয় অবিরাম বা প্রতি মুহূর্তেবৃদ্ধি পাওয়া জিনিসের ক্ষেত্রে। 


     সূচকীয় ফাংশনের ব্যবহারটা দেখে নেই। সূত্রটা এ রকম: $P=P_oe^{rt}$

     

    এখানে 

     

    P =বৃদ্ধির পরে যা হবে। আমাদের উদাহরণে এটা ৩০০। 


    $P_o$= শুরুতে যা ছিল। এটা আমাদের উদাহরণে ১। কারণ আমরা ধরে নিয়েছি ১ জন শিক্ষিত মানুষ আছেন। 


    e = অয়লার সংখ্যা (২.৭১৮...)। এখানে এটা নিয়েও আলোচনা আছে। 


    r = বৃদ্ধির হার 


    t = $P_o$ থেকে $P$ হতে যতটুকু সময় লাগবে। 

     

    সূত্রে মানগুলো বসালে আমরা পাই, 

     

    $300=1 \cdot e^{rt}$

     

    বা $\ln(300)=rt$

     

    বোঝার সুবিধার্থে সময়কে এক একক (যেমন এক মাস) ধরে নিলে এই কথার অর্থ হয়: $\ln(300)$ হারে ১ জন শিক্ষিত মানুষ গ্রামের সবাইকে অবিরাম পড়াতে থাকলে এক মাসেই ৩০০ জন মানুষ শিক্ষিত হয়ে যাবেন। $\ln(300)$ এর মান ৫.৭০২ দেখে ভাববেন না, কীভাবে এটা সম্ভব? মনে রাখতে হবে, তিনি একজনকে শিক্ষিত করা মাত্রই সেই শিক্ষিত মানুষ আরেকজনকে, তিনি আরেকজনকে, ... এভাবে শিক্ষাদান এগিয়ে যেতে থাকবে। 

     

    তার মানে, সহজ কথা হলো, ৩০০ মানে আমরা বুঝব, $\ln(300)$ হারে অবিরাম কিছু একটা বৃদ্ধি পেতে থাকলে চূড়ান্ত মান হবে ৩০০। একইভাবে $\ln(5)$ হারে একইভাবে বৃদ্ধি পেলে মান হবে ৫। এটাই হলো সংখ্যাকে অন্য আরেকভাবে চিন্তা করা। সবসময় হয়ত আপনি ৩, ৫ কে এভাবে সূচকীয় বৃদ্ধির মাধ্যমে পাবেন না। তবে এটাও কিন্তু সংখ্যাকে অনুভব করার আরেকটি উপায়। 


    দেখা যাক, এই অনুভব দিয়ে কাল্পনিক সংখ্যাকে বোঝা যায় কি না। প্রথমে ১ থেকে i তে যাওয়া যাক। এজন্যে আমাদেরকে ৯০ ডিগ্রি বাঁয়ে ঘুরতে হবে। মানে X অক্ষ থেকে ঘড়ির কাঁটার উল্টো দিকে ঘুরে Y অক্ষে যেতে হবে। কারণ i এর অবস্থান ১ একক সমান দৈর্ঘ্যের Y অক্ষে। 

     


    তাহলে ১ থেকে iতে যেতে হলে আমাদেরকে $\frac {\pi} 2$ পরিমাণ বা ৯০ ডিগ্রি ঘুরতে হবে। তাহলে আমাদের বৃদ্ধির হার হবে $i \cdot \frac{\pi}{2}$। 

     

    বৃদ্ধির ফর্মুলাটা হলো, $e^{rt}$। আমাদেরকে এই ফর্মুলা দিয়ে $i$ অবস্থানে যেতে হবে। তাহলে ১ থেকে ১ একক সময়ে i অবস্থানে যেতে হলে আমাদেরকে ঐ সময়ে ৯০ ডিগ্রি ($\frac{\pi}{2}$ রেডিয়ান) ঘুরতে হবে। অতএব, ১ থেকে $i$ পেতে আমরা এই সূত্র ব্যবহার করতে পারি 

      

    $i=e^{i \frac{\pi}{2}}$

     

    একে আরেকভাবেও চিন্তা করা যায়। ১ থেকে (-১) এ যেতে আমরা ১৮০ ডিগ্রি ঘুরি। আর সেটাকে অয়লারের অভেদ দিয়ে প্রকাশ করি $e^{i \pi}$ দিয়ে। তাহলে ১৮০ এর অর্ধেকটা মানে ৯০ ডিগ্রি বা $i$ অবস্থানে যেতে ফর্মুলাটা হবে $e^{i \frac{\pi}{2}}$। 


    এ তো গেল i। কিন্তু i এর পাওয়ারও তো i। সেটার কী হবে? এটা বলছে আমাদেরকে $i \frac{\pi}{2}$ হারের বদলে  $i \frac{\pi}{2} \cdot i$ হারে বৃদ্ধি করতে হবে। ঠিক যেমন $3^4$ মানে আমাদেরকে $\ln(3)$ হারে বৃদ্ধি করে তার আবার চারগুণ যেতে হবে। মানে নতুন হার হয়েছিল $\ln(3) \times 4$।

     

    তার মানে বৃদ্ধির হার হবে $i \frac{\pi}{2} \cdot i = \frac{\pi}{2} \cdot -1 = - \frac{\pi}{2}$ 

     

     কারণ, আমরা জানি, $i \cdot i $ বা $i^2$ এর মান (-1)। 


     আমাদের বৃদ্ধির হারটা বাস্তব সংখ্যা হয়ে গেল!  কিন্তু নেগেটিভ। এর মানে আসলে বৃদ্ধির বদলে হ্রাস ঘটবে। তার মানে, আমরা শুরু করেছিলাম ১ থেকে। আর এখন যাকে পাব সে হবে ১ এর চেয়ে ছোট। দেখা যাক, সেটা কী? 

    0.2078796

    আপনি কম্পিউটারের $i^i$ বা $e^{- \frac{\pi}{2}}$ যেটাই দিন, উপরের মানটাই আসবে। যেমন R প্রোগ্রামিং দিয়ে করলে
     
      
     
    তাহলে দেখতে অদ্ভুত হলেও কাল্পনিক সংখ্যার ভিত্তি ও সূচক মিলেও পাওয়া গেল বাস্তব সংখ্যা! 
     

    i এর মান যে $e^{i \cdot \frac{\pi}{2}}$ সেটা আমরা অয়লারের ফর্মুলা থেকেও বের করতে পারি। আমরা জানি, $e^{ix}=cos(x)+isin(x)$। এখন, এখানে x এর জায়গায় $\frac{\pi}{2}$ বসালে হয়
     
     
    $e^{i \frac{\pi}{2}}=cos(\frac{\pi}{2})+isin(\frac{\pi}{2})=0+i \cdot 1=i$
     
    সূত্র 
     
    আরও পড়ুন 
    Category: articles