ফ্যাক্টোরিয়াল ফ্যাক্টস (Factorial Facts)-১

Factorial সম্পর্কে আমরা মোটামুটি সবাই বেশ ভালোই জানি। যারা জানি না বা ভুলে গেছি তাদের জন্য একটু অ, আ , ক, খ বলে নেয়া ভালো।
কোনো একটা নাম্বারের Factorial হলো, ঐ নাম্বার থেকে ছোট বা সমান যতগুলো পজিটিভ নাম্বার আছে তাদের সবগুলোর গূণফল। যেটাকে প্রকাশ করা হয় এভাবে N!
আবার, কোনো একটা নাম্বারের Factorial বের করার জন্য নাম্বারটিকে তার আগের নাম্বারের Factorial এর সাথে গুণ করেও পারা যায়। অর্থাৎ-
N! = N* (N-1)!
Factorial (1)
Factorial এর (!) এই চিহ্ন প্রথম ব্যবহার করেন ফরাসী গণিতবিদ Christian Kramp.
এখন কথা হলো Factorial কোথায় কোথায় প্রয়োজন পড়ে তা কি আমরা জানি?
Factorial এর সবচাইতে বেশি ব্যবহার Combinatorics এ। যেমন, আমরা যদি বলি N টি বিভিন্ন বস্তুকে আমরা কতভাবে বিন্যস্ত (permutation) করতে পারি, সেক্ষেত্রে উত্তরটি হবে N!.
যাই হোক, ফ্যাক্টরিয়াল কি তাতো খুব সহজে বোঝা গেল, এখন যে কাউকে ধরে বসিয়ে দিলেই সে একটা একটা করে গুণ করে যে কোনো নাম্বারের Factorial খুব সহজেই বের করতে পারবে। তাই না?
আচ্ছা, আমরা একটু দেখি তো 20! কত?
20!= 2432902008176640000
ঘটনা কি? এত বড় কেন?
আচ্ছা, 50! কত?
50!=30414093201713378043612608166064768844377641568960512000000000000
তাহলে ১০০ এর Factorial বের করতে হলে অবস্থা তো পুরাই শ্যাষ!!!!!!!!

Factorial হচ্ছে সেই নোটেশন যার মান খুব দ্রুত বাড়তে থাকে। সুতরাং, ইচ্ছে করলেই আমরা আমাদের বাসার চাল ডালের হিসেব করা ক্যালকুলেটরে ১০০ এর factorial বের করতে পারবো না, কারণ সেটা খুব বড় একটা সংখ্যা হয়ে যাবে।

আমরা যদি কোনো একটা নাম্বারের Factorial বের করতে চাই, কোড করে সেটা খুব দ্রুতই বের করে ফেলা যায়।

এরকম-
1
এই পদ্ধতিতে খুব বড় নাম্বারের Factorial বের করা যায় না। সেক্ষেত্রে আমরা অন্য কোনো পদ্ধতি ব্যবহার করবো। সেক্ষেত্রে আমরা, JAVA এর Big Integer ব্যবহার করতে পারি, যেখানে বড় নাম্বার নিয়ে খুব সহেজই কাজ করা যায়, আর যদি C/C++ দিয়েই করতে চাই সেক্ষেত্রে নাম্বারগুলোকে Character String হিসেবে বিবেচনা করে স্ট্রিং এর Addition,Multiplication করে করা যায়, যদিও সেটা বেশ বড় প্রসেস হয়ে যায়। তাই, সেটা নিয়ে এখন আলোচনা করতে চাচ্ছি না। নিজেরাই চেষ্টা করে দেখতে পারো। 🙂
একটা নাম্বারের Factorial যেহেতু খুব বড় হয়ে যায় তাই Factorial  বের না করেও আমরা ঐ বড় নাম্বারের আরো কিছু বৈশিষ্ট্য নিয়ে কাজ করতে পারি। সেরকমই কয়েকটি বিষয় নীচে বলার চেষ্টা করলাম-

Number of Digits in N! :

আমরা জানি কোনো একটা নাম্বার N এ কতগুলো ডিজিট আছে সেটা বের করার পদ্ধতি হলো-
num_of_digit= ceiling(log(N))
কিন্তু নাম্বারটা যদি ১০ এর perfect power হয় সেক্ষেত্রে আমরা এক(১) কম পাবো। এজন্য ভালো বুদ্ধি হলো-
num_of_digit= floor(log(N))+1
নাম্বারটা যদি 10-base এর হয়, তাহলে এ পদ্ধতি ঠিক আছে। কিন্তু নাম্বারের base যদি অন্য কিছু হয়, যেমন আমরা যদি জানতে চাই বাইনারী (base-2) তে এই নাম্বারের কতগুলো ডিজিট থাকবে, তাহলে আমরা এভাবে করতে পারি-
num_of_digit= floor(log(N)/log(b))+1
এখানে b=base, বাইনারীর জন্য, b=2 , ডেসিমাল এর জন্য b=10 হবে, ইত্যাদি ইত্যাদি।
এখন এই একই বুদ্ধিতে আমরা N! এ কতগুলো ডিজিট আছে সেটা বের করতে পারি।
যদি N! অনেক বড় নাম্বারও হয়, সেক্ষেত্রে আমাদের দুশ্চিন্তার কিছু নেই। কারণ আমরা N! = ? সেটা বের না করেই বলে দিতে পারবো যে, N! এ কতগুলো ডিজিট আছে।
এখন আমরা যদি উপরের নিয়মে N! এর জন্য করতে চাই তাহলে প্রক্রিয়াটা কি হবে বোঝা যাচ্ছে নিশ্চয়ই?
digit_of_fact= floor(log(N!))+1
                  = floor(log(N*(N-1)*(N-2)*……..*2*1))+1
এখন, যদি আমরা N! বের করে তারপর তার log  করতে চাই তাহলে তো সমস্যা। এজন্য আমরা ছোটোবেলায় শেখা log এর ফর্মুলা ব্যবহার করবো। আমরা জানি,
log(a*b*c) = loga+logb+logc
তারমানে আমাদের কাজ সহজ হয়ে গেলো-
digit_of_fact = floor(logN+log(N-1)+log(N-2)+……….+log1)+1
এখন আর কোনো সমস্যা নেই, কারণ আমরা যখন নাম্বারগুলোর log ব্যবহার করবো তখন নাম্বারগুলো অনেক ছোটো হয়ে যাচ্ছে আর মোটের ওপর log গুলোর যোগফল আমাদের int এর লিমিটের মধ্যেই থাকবে।
উপরের ফর্মুলা তো base-10 এর জন্য, কিন্তু আমরা যদি অন্য base এর জন্য করতে চাই তাহলে কি হবে? হ্যাঁ, আগের মতই, অর্থাৎ-
digit_of_fact = floor((logN+log(N-1)+log(N-2)+……….+log1) / logB)+1
তো, কোড করা তো এখন খুবই সহজ হয়ে গেলো, করে ফেলো ধুপধাপ। 🙂

An Interesting Fact:

আমরা তো দেখলাম যে, 1 থেকে N পর্যন্ত নাম্বারগুলোকে গুণ করলে আমরা Factorial of N পাই।
Factorial(N)= 1*2*3*……………..*(N-1)*N
কিন্তু আমরা যদি নাম্বারগুলোকে গূণ না করে যোগ করি সেক্ষেত্রে আমরা একটা মজার জিনিস দেখবো।
1=1
1+2=3
1+2+3=6
1+2+3+4=10
1+2+3+4+5=15
1+2+3+4+5+6=21
………………………….
এই যে নাম্বারগুলো পাওয়া গেলো, 1,3,6,10,15,21…………….এই নাম্বারগুলোকে বলা হয় Triangular Number.
Triangular Number বলা হয় সেই সব নাম্বারকে যাদেরকে দিয়ে Triangle বানানো যায়, অর্থাৎ ৩ টি ডট(.) কে বসিয়ে একটা ত্রিভুজ বানানো যায়, ৬টি কে বসিয়ে বানানো যায়, ১০ টি কে বসিয়ে বানানো যায়, কিন্তু কখনোই ৪,৫,৭,৮…… এগুলোকে দিয়ে বানানো যাবে না। এরকম-
374px-First_six_triangular_numbers.svg
তারমানে, আমরা 1 থেকে N পর্যন্ত যোগ করলে N-তম Triangular Number পাবো। Triangular number সম্পর্কে আরো জানতে এখানেদেখতে পারো।
তো Factorial নিয়ে আজকে এ পর্যন্তই, আরো কিছু জিনিস বলার আছে। আগামী পোষ্টে বলার ইচ্ছে আছে।
চলতে থাকুক Coding……………………………..
Want to like or share?:
0

Leave a Reply

Your email address will not be published. Required fields are marked *