পাইথন প্রজেক্টস ও লাইব্রেরি

Math (Zero to Hero) কমপ্লিট গাইড

পাইথনে সাধারণ যোগ-বিয়োগের জন্য আমরা +, -, *, / ব্যবহার করি। কিন্তু যখনই একটু জটিল গাণিতিক হিসাব (যেমন: সাইন-কস, লগারিদম, ফ্যাক্টোরিয়াল বা রাউন্ডিং) করার দরকার হয়, তখন পাইথনের বিল্ট-ইন math মডিউলটি কাজে আসে।

যেহেতু এই মডিউলটি সরাসরি C ল্যাঙ্গুয়েজ দিয়ে লেখা, তাই এটি সাধারণ পাইথন কোডের চেয়ে অনেক বেশি ফাস্ট এবং অ্যাকুরেট (Accurate)।

এই টিউটোরিয়ালে আমরা একদম বিগিনার (Beginner) লেভেল থেকে শুরু করে অ্যাডভান্সড (Advanced) লেভেলের ফ্লোটিং পয়েন্ট একুরেসি (math.isclose), ডিস্টেন্স এবং জিওমেট্রি পর্যন্ত সবকিছু বিস্তারিত শিখবো।


🟢 বিগিনার লেভেল (Beginner)

১. গাণিতিক ধ্রুবক (Constants)

পাইথনে নিজে থেকে পাই (Pi) এর ভ্যালু 3.14159... লেখার দরকার নেই।

import math

print("Pi (π):", math.pi)      # 3.141592653589793
print("Euler's Number (e):", math.e) # 2.718281828459045

# অসীম (Infinity) এবং NaN (Not a Number)
print("Infinity:", math.inf)   # inf
print("Not a Number:", math.nan) # nan

২. রাউন্ডিং (Rounding) বা সংখ্যা পূর্ণ করা

সাধারণ পাইথনের round() ফাংশন পয়েন্টের ভ্যালু ৫ হলে একটু অদ্ভুত আচরণ করে। তাই গাণিতিক কাজে math মডিউলের ফাংশনগুলো ব্যবহার করা ভালো।

import math

num = 4.3

# ceil (সিলিং) - পয়েন্ট যাই হোক না কেন, সব সময় ওপরের পূর্ণসংখ্যা দিবে
print("Ceil:", math.ceil(num))   # 5

# floor (ফ্লোর) - পয়েন্ট যাই হোক না কেন, সব সময় নিচের পূর্ণসংখ্যা দিবে
print("Floor:", math.floor(4.9)) # 4

# trunc (ট্রাঙ্কেট) - দশমিকের পরের সব বাদ দিয়ে শুধু পূর্ণসংখ্যা নিবে
print("Trunc:", math.trunc(4.9)) # 4

৩. সাধারণ হিসাব (পাওয়ার, রুট, ফ্যাক্টোরিয়াল)

import math

# ১. পাওয়ার বা ঘাত (x টু দ্য পাওয়ার y)
print("2^3 =", math.pow(2, 3)) # 8.0 (এটি সবসময় ফ্লোট রিটার্ন করে)

# ২. স্কয়ার রুট বা বর্গমূল
print("Square Root of 16 =", math.sqrt(16)) # 4.0

# ৩. ফ্যাক্টোরিয়াল (যেমন: 5! = 5*4*3*2*1)
print("Factorial of 5 =", math.factorial(5)) # 120

🟡 ইন্টারমিডিয়েট লেভেল (Intermediate)

৪. লগারিদম (Logarithms)

বিজ্ঞানের বিভিন্ন কাজে এক্সপোনেনশিয়াল গ্রোথ (Exponential Growth) মাপার জন্য লগারিদম লাগে।

import math

# ১. Natural Log (বেস হলো e)
print("Log of e:", math.log(math.e)) # 1.0

# ২. সাধারণ Log (বেস 10)
print("Log10 of 100:", math.log10(100)) # 2.0

# ৩. বাইনারি Log (বেস 2) - কম্পিউটার সায়েন্সে খুব লাগে
print("Log2 of 8:", math.log2(8)) # 3.0

# ৪. যেকোনো কাস্টম বেস (যেমন: বেস 5)
print("Log 25 base 5:", math.log(25, 5)) # 2.0

৫. ত্রিকোণমিতি (Trigonometry)

সাইন (Sin), কস (Cos) বা ট্যান (Tan) এর ভ্যালু বের করা। (বিঃদ্রঃ এই ফাংশনগুলো ইনপুট হিসেবে সব সময় রেডিয়ান (Radians) নেয়, ডিগ্রি নয়!)

import math

# ১. ডিগ্রিকে রেডিয়ানে কনভার্ট করা (যেমন: 90 ডিগ্রি)
angle_rad = math.radians(90)
print("90 Degree to Radian:", angle_rad) # 1.5707...

# ২. Sin 90 এর মান (1 হওয়া উচিত)
print("Sin(90):", math.sin(angle_rad)) # 1.0

# ৩. রেডিয়ান থেকে আবার ডিগ্রিতে ফেরা
print("Radian to Degree:", math.degrees(math.pi)) # 180.0

৬. বিন্যাস ও সমাবেশ (Combinatorics - nCr, nPr)

পাইথন ৩.৮ থেকে math মডিউলে বিন্যাস ও সমাবেশের হিসাব সরাসরি দেওয়া হয়েছে (আগে এটি শুধু itertools এ ছিল)।

import math

# ১. সমাবেশ বা Combinations (nCr)
# ৫ জনের গ্রুপ থেকে ৩ জনকে কতভাবে বেছে নেওয়া যায়? (অর্ডার ম্যাটার করে না)
print("Combinations (5C3):", math.comb(5, 3)) # 10

# ২. বিন্যাস বা Permutations (nPr)
# ৫ জন থেকে ৩ জনকে কতভাবে সাজানো যায়? (অর্ডার ম্যাটার করে)
print("Permutations (5P3):", math.perm(5, 3)) # 60

🔴 অ্যাডভান্সড লেভেল (Advanced)

৭. ফ্লোটিং পয়েন্ট একুরেসি (math.isclose)

কম্পিউটার সায়েন্সের সবচেয়ে বড় একটি সমস্যা হলো ফ্লোটিং পয়েন্ট (দশমিক সংখ্যা) মেমোরিতে ১০০% সঠিকভাবে সেভ হয় না! যেমন: 0.1 + 0.2 করলে রেজাল্ট 0.3 হওয়ার কথা, কিন্তু পাইথন আপনাকে দিবে 0.30000000000000004!

আপনি যদি চেক করেন (0.1 + 0.2) == 0.3, তবে পাইথন বলবে False! এই মারাত্মক সমস্যার সমাধান হলো math.isclose()

import math

a = 0.1 + 0.2
b = 0.3

# সাধারণ চেক (ভুল রেজাল্ট দিবে!)
print("Normal == Check:", a == b) # False

# isclose দিয়ে চেক (এটি বুঝবে যে দুটি ভ্যালু খুব কাছাকাছি, তাই True দিবে)
print("isclose Check:", math.isclose(a, b)) # True

৮. নিখুঁত যোগফল (math.fsum)

একই কারণে, অনেকগুলো দশমিক সংখ্যা লুপ দিয়ে যোগ করলে রেজাল্টে ভুল আসতে পারে। fsum এই ফ্লোটিং পয়েন্ট লস (loss) রিকভার করে নিখুঁত যোগফল দেয়।

import math

numbers = [0.1] * 10 # 0.1 কে ১০ বার লেখা হলো

# সাধারণ sum (রেজাল্ট 1.0 আসার কথা, কিন্তু আসবে 0.9999999999999999)
print("Normal sum:", sum(numbers))

# fsum (নিখুঁত 1.0 দিবে)
print("fsum:", math.fsum(numbers))

৯. ইউক্লিডিয়ান ডিস্টেন্স বা দূরত্ব (math.dist)

মেশিন লার্নিং (KNN অ্যালগরিদম) বা ২ডি/৩ডি গেম বানানোর সময় দুটি পয়েন্টের মাঝের দূরত্ব বের করতে এটি লাগে। (পাইথন ৩.৮+)

import math

point1 = (1, 2)
point2 = (4, 6)

# দুটি পয়েন্টের মাঝের সোজা দূরত্ব (২ডি বা ৩ডি যাই হোক না কেন)
distance = math.dist(point1, point2)
print("Distance:", distance) # 5.0

১০. পিথাগোরাস এবং হাইপোটেনিউজ (math.hypot)

সমকোণী ত্রিভুজের অতিভুজ বের করার জন্য আমরা sqrt(x^2 + y^2) ব্যবহার করি। কিন্তু ভ্যালু অনেক বড় হলে মেমোরি ওভারফ্লো (Overflow) হতে পারে। hypot ফাংশনটি ওভারফ্লো ছাড়াই নিখুঁতভাবে অতিভুজ বের করে!

import math

base = 3
height = 4

# অতিভুজ বের করা
hypotenuse = math.hypot(base, height)
print("Hypotenuse:", hypotenuse) # 5.0

# পাইথন ৩.৮ এর পর থেকে এটি দিয়ে ভেক্টরের লেন্থ (Length of vector) ও বের করা যায়
vector_length = math.hypot(3, 4, 12)
print("3D Vector Length:", vector_length) # 13.0

১১. গসাগু (GCD) এবং লসাগু (LCM)

import math

# ১. গরিষ্ঠ সাধারণ গুণনীয়ক (Greatest Common Divisor)
print("GCD of 10 and 15:", math.gcd(10, 15)) # 5

# ২. লঘিষ্ঠ সাধারণ গুণিতক (Least Common Multiple) - Python 3.9+
print("LCM of 10 and 15:", math.lcm(10, 15)) # 30

সারসংক্ষেপ (Conclusion)

যদিও বিশাল ডেটাসেট নিয়ে কাজ করার সময় আমরা NumPy বা Pandas ব্যবহার করি, কিন্তু যখন কোনো প্রোজেক্টে থার্ড-পার্টি লাইব্রেরি ইনস্টল করার অপশন থাকে না, অথবা আপনি শুধুমাত্র ছোট একটি গাণিতিক হিসাব বা লজিক লিখতে চান—তখন math মডিউলটিই আপনার সেরা এবং ফাস্টেস্ট অপশন! বিশেষ করে math.isclose() এবং math.fsum() এর ব্যবহার জানা একজন সিনিয়র পাইথন ডেভেলপারের লক্ষণ!