সরাসরি পর্বে যান
পর্ব ০১ · ৮৩-এর মধ্যে · মডিউল ১

Discrete math-এর মানচিত্র — কেন কম্পিউটার বিজ্ঞানের ভাষা এটি

The Map of Discrete Mathematics — Why It Is the Language of Computer Science

Taught in Bangla, this lesson explains what "discrete" means and where the subject shows up in computing: conditions, algorithm correctness, password counts, networks and cryptography. It maps the 83-lesson, 14-module course with three reader paths, shows how to read definitions, theorems and proofs, and runs in-page Python that counts PINs and passwords, checks eight warm-up answers, and finds where n² + n + 41 stops being prime at n = 40.

এই পর্বে যা শিখবেন

  • “Discrete” আর “continuous” গণিতের পার্থক্য, আর কম্পিউটার কেন discrete
  • কম্পিউটার বিজ্ঞানের কোন কাজে কোন অংশ লাগে, আর এই কোর্সের ১৪টি মডিউল কী দেয়
  • নিজের লক্ষ্য অনুযায়ী তিনটি পড়ার পথের একটি বেছে নেওয়া
  • একটি সংজ্ঞা, উপপাদ্য আর প্রমাণ ধাপে ধাপে পড়া; প্রথম প্রমাণটি নিজে লেখা
  • ℕ, ℤ, ∑, ⌊ ⌋, n!, mod-এর মতো প্রতীক; আর Python দিয়ে দাবি যাচাইয়ের সীমা

১ · “Discrete” মানে কী — সিঁড়ি বনাম ঢাল

একটি বাড়িতে ওপরে ওঠার দুটি পথ ভাবুন। একটি সিঁড়ি, আরেকটি হুইলচেয়ারের ঢাল। সিঁড়িতে আপনি তৃতীয় ধাপে থাকতে পারেন, চতুর্থ ধাপেও, কিন্তু “সাড়ে তিন নম্বর ধাপে” দাঁড়ানোর জায়গা নেই। ঢালে যেকোনো উচ্চতায় থামা যায়: ১.৭ মিটার, ১.৭১ মিটার, ১.৭১৪ মিটার, যত সূক্ষ্ম চান। সিঁড়ি হলো discrete (বিচ্ছিন্ন): মানগুলো আলাদা আলাদা, মাঝখানে ফাঁক। ঢাল হলো continuous (অবিচ্ছিন্ন): দুটি মানের মাঝে সবসময় আরও মান আছে।

দৈনন্দিন জীবনে দুটোই আছে। বাজারঘর নামের একটি কাল্পনিক অনলাইন দোকান (এই কোর্সের চলমান উদাহরণ) একদিনে কয়টি অর্ডার পেল, সেটি discrete: ১৪৭টি হতে পারে, ১৪৭.৫টি নয়। কিন্তু একটি চালের বস্তার ওজন continuous: ২৫ কেজি, ২৫.০৩ কেজি, মাপার যন্ত্র যত সূক্ষ্ম, তত দশমিক। ক্রিকেটে রান discrete; বলের গতি continuous. পরীক্ষার রোল নম্বর discrete; আপনার উচ্চতা continuous.

মূল ধারণা

Discrete mathematics হলো সেই গণিত, যার বিষয়বস্তু আলাদা আলাদা, গোনা যায় এমন বস্তু: পূর্ণসংখ্যা, সসীম সেট, যুক্তির বাক্য, গ্রাফের বিন্দু আর রেখা, bit-এর সারি। Calculus-এর মতো continuous গণিতে প্রধান প্রশ্ন “কতটা দ্রুত বদলায়?”; discrete গণিতে প্রধান প্রশ্ন “কয়টি?”, “আছে কি না?”, “সবসময় সত্য কি না?”, “সবচেয়ে ভালো বিন্যাস কোনটি?”

“গোনা যায়” কথাটির একটি নিখুঁত গাণিতিক রূপ আছে। একটি সেট countable যদি সেটি সসীম হয়, অথবা তার উপাদানগুলোকে ১ম, ২য়, ৩য়… এভাবে একটি তালিকায় সাজানো যায় যাতে প্রতিটি উপাদান কোনো এক জায়গায় আসে। সব পূর্ণসংখ্যার সেট অসীম, কিন্তু countable: 0, 1, −1, 2, −2, 3, … এভাবে তালিকা করা যায়। অথচ সব বাস্তব সংখ্যাকে এমন কোনো তালিকায় আনা যায় না; Georg Cantor ১৮৯১ সালে তাঁর বিখ্যাত diagonal যুক্তিতে এটি দেখান। সেই প্রমাণ আসবে পর্ব ১৮-এ (Cardinality — countable, uncountable আর Cantor-এর diagonal).

কম্পিউটার কেন discrete যন্ত্র

কম্পিউটারের মেমরিতে প্রতিটি ঘরে থাকে 0 অথবা 1; মাঝামাঝি কিছু নয়। ৬৪টি bit দিয়ে ঠিক 264টি আলাদা অবস্থা লেখা যায়, তার বেশি নয়। তাহলে কম্পিউটার দশমিক সংখ্যা রাখে কীভাবে? সসীম একটি সংখ্যার তালিকা থেকে সবচেয়ে কাছেরটি বেছে নিয়ে। এজন্যই Python-এ 0.1 + 0.2 লিখলে আসে 0.30000000000000004: 0.1, 0.2 বা 0.3, এদের কোনোটিই সেই সসীম তালিকায় হুবহু নেই। কম্পিউটারের “বাস্তব সংখ্যা” আসলে বাস্তব সংখ্যার কাছাকাছি একটি বিশাল কিন্তু সসীম, discrete সেট। অংশ ৬-এর Python ব্লকে এর একটি চমকপ্রদ প্রমাণ দেখবেন।

১৮৫৪ সালে ইংরেজ গণিতবিদ George Boole “The Laws of Thought” বইয়ে যুক্তিকে বীজগণিতের মতো হিসাবযোগ্য করে তোলেন: সত্য = 1, মিথ্যা = 0. প্রায় ৮৩ বছর পরে, ১৯৩৭ সালে Claude Shannon তাঁর master's thesis-এ দেখান যে বৈদ্যুতিক relay-এর সার্কিট ঠিক এই Boolean algebra মেনে চলে। একটি শতাব্দী-পুরোনো “বিশুদ্ধ” গণিত হয়ে গেল ডিজিটাল কম্পিউটারের নকশার ভাষা। Discrete গণিতের ইতিহাসে এমন ঘটনা বারবার ঘটেছে।

২ · কম্পিউটার বিজ্ঞানের কোথায় এই গণিত

“Discrete math কেন পড়ব?” প্রশ্নের সবচেয়ে ভালো উত্তর হলো একটি তালিকা: কম্পিউটার বিজ্ঞানের প্রায় প্রতিটি শাখা এর কোনো না কোনো অংশের ওপর দাঁড়িয়ে আছে। নিচের সারণিতে বাঁ দিকে গণিতের অংশ, মাঝে সেটি কোথায় কাজে লাগে, আর ডানে এই কোর্সের কোন মডিউলে আসবে।

গণিতের অংশকম্পিউটার বিজ্ঞানে কোথায়মডিউল
যুক্তি (logic)if-শর্ত, database query, software-এর specification, SAT solver দিয়ে hardware যাচাই১
প্রমাণ (proof)algorithm সবসময় ঠিক উত্তর দেয় কি না, loop-এর সঠিকতা, নিরাপত্তার দাবি২
সেট, ফাংশনdata type, database-এর table, hash table-এর key থেকে ঘরে যাওয়া৩
সংখ্যাতত্ত্বcryptography (RSA, Diffie–Hellman), check digit, hashing, random সংখ্যা৪, ৫
গণনা (counting)algorithm কত ধাপ নেবে, password কতগুলো হতে পারে, test case কতগুলো৬, ৮
সম্ভাবনাhash collision, randomized algorithm, load balancing৭
Relation, গ্রাফ, treeনেটওয়ার্ক, map-এ পথ খোঁজা, social network, file system, compiler-এর syntax tree৯–১১
বীজগাণিতিক কাঠামোerror-correcting code, digital logic, আধুনিক cryptography১২
Automata, grammarparser, regular expression, compiler, কোনটি গণনাযোগ্য আর কোনটি নয়১৩

তিনটি ছোট উদাহরণ, বাজারঘর থেকে

১. যুক্তি: কুপনের নিয়ম। বাজারঘরের ম্যানেজার লিখলেন: “অর্ডার ৫০০ টাকার বেশি এবং গ্রাহক নতুন অথবা কুপন কোড আছে, তাহলে ছাড়।” Programmer দুইভাবে পড়তে পারেন: “(৫০০-এর বেশি এবং নতুন) অথবা কুপন”, কিংবা “৫০০-এর বেশি এবং (নতুন অথবা কুপন)”। তিনটি শর্তের সত্য-মিথ্যার ২ × ২ × ২ = ৮টি সমন্বয়ের মধ্যে দুটিতে এই দুই রকম বোঝার উত্তর আলাদা: যখন অর্ডার ৫০০ টাকার বেশি নয় কিন্তু কুপন আছে। বাস্তবে এর মানে কোনো গ্রাহক ভুলভাবে ছাড় পাবেন, অথবা প্রাপ্য ছাড় পাবেন না। যুক্তির প্রতীক (∧ মানে “এবং”, ∨ মানে “অথবা”) আর বন্ধনী এই দ্ব্যর্থতা দূর করে; পর্ব ০২-এ এটি পুরো truth table দিয়ে দেখবেন।

২. প্রমাণ: “সবসময়” শব্দটির দাম। বাজারঘরের ডেলিভারি সফটওয়্যার শত শত test-এ ঠিক চলল। তবু কি নিশ্চিতভাবে বলা যায় যে এটি সব অর্ডারে ঠিক চলবে? Test কেবল কিছু ইনপুট দেখে; প্রমাণ সব ইনপুটের কথা বলে। DSA কোর্সের পর্ব ০৩ algorithm-এর সঠিকতা প্রমাণের কৌশল দেখায়; এই কোর্স সেই প্রমাণ-লেখার গণিতটি শেখাবে।

৩. গণনা: password কতগুলো। নিরাপত্তার অনেক প্রশ্ন আসলে গণনার প্রশ্ন। ৪ অঙ্কের PIN কতগুলো হতে পারে? প্রতিটি ঘরে ১০টি বিকল্প, চারটি ঘর, তাই ১০ × ১০ × ১০ × ১০ = ১০,০০০টি। এটি গুণের নিয়ম, পর্ব ৩১-এর বিষয়। নিচের ব্লক একই সংখ্যা দুইভাবে বের করে: একবার সব PIN একটি একটি করে তৈরি করে গুনে (brute force), একবার সূত্র দিয়ে। এরপর দেখায় ৮ আর ১২ অক্ষরের password-এ brute force কেন অসম্ভব হয়ে পড়ে। (এই কোর্সের Python ব্লক আপনার ব্রাউজারেই চলে; প্রথমবার চালাতে কয়েক সেকেন্ড লাগতে পারে, কারণ ব্রাউজার তখন Python নামিয়ে আনে।)

from itertools import product
import string

# ৪ অঙ্কের PIN: সব সম্ভাবনা একটি একটি করে তৈরি করে গোনা
pins = list(product("0123456789", repeat=4))
print("PIN, brute force :", len(pins))
print("PIN, formula 10^4:", 10 ** 4)
print("first three:", ["".join(p) for p in pins[:3]])

# ৮ অক্ষরের password: a-z, A-Z, 0-9
alphabet = string.ascii_letters + string.digits
total = len(alphabet) ** 8
print("alphabet size:", len(alphabet))
print("8-char passwords:", total)

# ধরে নেওয়া গতি: সেকেন্ডে 10^9টি চেষ্টা (শুধু হিসাবের জন্য)
days = total / 10 ** 9 / 86400
print("days to try all 8-char :", round(days, 1))
years12 = len(alphabet) ** 12 / 10 ** 9 / 86400 / 365
print("years to try all 12-char:", f"{years12:.2e}")

আসল আউটপুট (ব্রাউজারের Python):

PIN, brute force : 10000
PIN, formula 10^4: 10000
first three: ['0000', '0001', '0002']
alphabet size: 62
8-char passwords: 218340105584896
days to try all 8-char : 2.5
years to try all 12-char: 1.02e+05

দুই পদ্ধতিতেই ১০,০০০; গুণের নিয়ম আর গুনে দেখা মিলে গেল। ৮ অক্ষরের password-এ বিকল্প ৬২টি (২৬টি ছোট হাতের, ২৬টি বড় হাতের অক্ষর, ১০টি অঙ্ক), তাই মোট 628 ≈ ২১৮ লক্ষ কোটি। এগুলো Python-এর পক্ষে তালিকা বানিয়ে গোনা অসম্ভব, কিন্তু সূত্রে এক মুহূর্তে আসে। সেকেন্ডে ১০০ কোটি চেষ্টার একটি কাল্পনিক গতি ধরলে সব ৮ অক্ষর পরীক্ষা করতে প্রায় আড়াই দিন; ১২ অক্ষরে প্রায় ১ লক্ষ বছর। দৈর্ঘ্য মাত্র ৪ বাড়লে সময় বাড়ে 624 ≈ ১.৫ কোটি গুণ। শিক্ষা: গণনার সূত্র brute force-এর চেয়ে অনেক দূর যায়। (বাস্তবের password নিরাপত্তা শুধু এই গণনা নয়; মানুষ এলোমেলো password বাছেন না। সেটি Cybersecurity কোর্সের বিষয়।)

এই কোর্স আর অন্য কোর্সের ভাগাভাগি: এখানে আপনি পাবেন গণিত: সংজ্ঞা, উপপাদ্য, প্রমাণ, গণনা। Algorithm-এর কোড আর বাস্তবায়ন পাবেন DSA কোর্সে (যেমন পর্ব ০৪ · Big-O, পর্ব ৩৯ · গ্রাফ)। যুক্তি AI-তে কীভাবে ব্যবহার হয়, তা আছে AI-এর ভিত্তি কোর্সের পর্ব ৪৫ আর পর্ব ৪৬-এ। Boolean algebra-র hardware রূপ আছে Computer Fundamentals কোর্সের পর্ব ১৯-এ। আর বাস্তব cryptography-র নিয়মকানুন Cybersecurity কোর্সের পর্ব ১০-এ।

৩ · কোর্সের মানচিত্র — ১৪টি মডিউল

৮৩টি পর্ব একসাথে দেখলে ভয় লাগতে পারে। কিন্তু কাঠামোটি সরল। ভিত্তিতে তিনটি মডিউল: যুক্তি, প্রমাণ, আর সেট-ফাংশন। এগুলো গণিতের “ব্যাকরণ”: সব পরের মডিউল এই ভাষাতেই লেখা। তার ওপর তিনটি ধারা পাশাপাশি চলে: সংখ্যার ধারা, গণনার ধারা, কাঠামোর ধারা। শেষে সব ধারা মেলে গণনার মডেলে, আর সবার শেষে পরীক্ষা ও ইন্টারভিউর প্রস্তুতি।

ডিসক্রিট ম্যাথমেটিক্স কোর্সের মানচিত্র

Course map: three foundation modules, three parallel tracks, then models of computation and exam practice

Course map of Discrete Mathematics: 14 modules ১ · যুক্তি (Logic) ২ · প্রমাণ (Proof) ৩ · সেট, ফাংশন, ক্রম ৪ · সংখ্যাতত্ত্ব ৫ · Crypto ১২ · বীজগণিত ৬ · গণনা ৭ · সম্ভাবনা ৮ · উন্নত গণনা ৯ · Relation ১০ · গ্রাফ ১১ · Tree ১৩ · গণনার মডেল আর যাচাই ১৪ · পরীক্ষা ও ইন্টারভিউ পর্ব ১–৭ · আপনি এখানে পর্ব ৮–১৩ পর্ব ১৪–১৯ পর্ব ২০–২৬ পর্ব ২৭–৩০ পর্ব ৬৯–৭২ পর্ব ৩১–৩৭ পর্ব ৩৮–৪৩ পর্ব ৪৪–৫১ পর্ব ৫২–৫৬ পর্ব ৫৭–৬৪ পর্ব ৬৫–৬৮ পর্ব ৭৩–৭৮ · ক্যাপস্টোনসহ পর্ব ৭৯–৮৩ সংখ্যা কাঠামো
ছবি ১.১ — নীল ভিত্তি (মডিউল ১–৩) সবার আগে। তারপর তিনটি ধারা: কমলা সংখ্যার ধারা, সবুজ গণনার ধারা, বেগুনি কাঠামোর ধারা; প্রতিটি কলামে ওপর থেকে নিচে পড়ার ক্রম। গোলাপি অংশে সব ধারা মেলে। তীরগুলো মোটা দাগের নির্ভরতা দেখায়, কঠোর নিয়ম নয়।

ছবির প্রতিটি মডিউল কী দেবে, তার সংক্ষিপ্ত তালিকা নিচে। প্রতিটি পর্বের পূর্ণ নাম বাঁ পাশের সূচিপত্রে (ফোনে ওপরের মেনুতে) পাবেন।

মডিউলপর্বযা পাবেন
১ · Discrete math-এর মানচিত্র আর যুক্তি১–৭Proposition, truth table, De Morgan, quantifier, অনুমানের নিয়ম, SAT solver
২ · প্রমাণ৮–১৩Direct, contrapositive, contradiction; induction; program-এর সঠিকতা
৩ · সেট, ফাংশন আর ক্রম১৪–১৯সেটের অপারেশন, one-to-one ও onto ফাংশন, যোগফলের সূত্র, অসীমের আকার
৪ · সংখ্যাতত্ত্ব২০–২৬বিভাজ্যতা, মৌলিক, GCD, modular arithmetic, CRT, Fermat ও Euler
৫ · সংখ্যাতত্ত্ব থেকে cryptography২৭–৩০Classical cipher, RSA আর Diffie–Hellman-এর গণিত, finite field
৬ · গণনা৩১–৩৭যোগ-গুণের নিয়ম, pigeonhole, permutation, combination, binomial
৭ · বিচ্ছিন্ন সম্ভাবনা৩৮–৪৩Event, Bayes, expectation, variance, birthday paradox, randomized algorithm
৮ · উন্নত গণনা৪৪–৫১Recurrence, generating function, inclusion–exclusion, Catalan, Burnside
৯ · Relation৫২–৫৬Relation-এর ধর্ম, database-এর গণিত, closure, equivalence, partial order
১০ · গ্রাফ৫৭–৬৪Degree, connectivity, Euler ও Hamilton, shortest path, planar, coloring, matching
১১ · Tree৬৫–৬৮Tree-র ধর্ম, traversal, spanning tree, Huffman code
১২ · বীজগাণিতিক কাঠামো৬৯–৭২Boolean algebra, group, ring, field, error-correcting code
১৩ · গণনার মডেল আর উন্নত বিষয়৭৩–৭৮Grammar, finite automaton, Turing machine, Ramsey, SAT/SMT, ক্যাপস্টোন
১৪ · পরীক্ষা ও ইন্টারভিউ প্রস্তুতি৭৯–৮৩Numerical, MCQ, লিখিত ও ভাইভা, প্রমাণ লেখা, ইন্টারভিউ ও contest

মডিউল ১৩-এ finite automaton আর Turing machine-এর শুধু পরিচয় থাকবে। Automata, grammar আর computability নিয়ে পূর্ণ গভীরতার একটি আলাদা “Theory of Computation” কোর্স পরে আসবে।

৪ · আপনার পথ বেছে নিন — তিনটি পড়ার পথ

সবাই একই কারণে discrete math পড়েন না। কেউ বিষয়টি ভিত্তি থেকে বুঝতে চান, কেউ সামনের চাকরির পরীক্ষা বা ইন্টারভিউর জন্য প্রস্তুতি নিচ্ছেন, কেউ programming contest-এ ভালো করতে চান। তিনজনের জন্য কোর্সের ক্রম একটু আলাদা হতে পারে। নিচের stepper-এ “পরে” চেপে তিনটি পথ দেখুন। প্রতিটি পথের তালিকায় পর্বের নম্বর দেওয়া আছে; পর্বগুলোর নাম সূচিপত্রে পাবেন।

  1. লক্ষ্যকেন পড়ছেন?
  2. পথ কভিত্তি থেকে গভীরে
  3. পথ খপরীক্ষা ও ইন্টারভিউ
  4. পথ গProgramming contest
  5. সব পথেপ্রতিদিনের অভ্যাস
প্রথম প্রশ্নআপনার লক্ষ্য কোনটি?
ক) বিষয়টি ভিত্তি থেকে বুঝতে
খ) চাকরির পরীক্ষা বা ইন্টারভিউ
গ) programming contest
তিন পথেই শুরু: পর্ব ১–৪
পথ কপুরো কোর্স, ক্রম অনুযায়ী
মডিউল ১ → ২ → ৩ (পর্ব ১–১৯)
তারপর ৪ → ৫ আর ৬ → ৭ → ৮
তারপর ৯ → ১০ → ১১
শেষে ১২, ১৩, ১৪
প্রথমবার: "আরও গভীরে" বাদ
দ্বিতীয়বার: সব বাক্স
পথ খপরীক্ষায় যা বেশি আসে
যুক্তি: পর্ব ২, ৩, ৪, ৬
প্রমাণ: পর্ব ৮, ১০
সেট-ফাংশন: পর্ব ১৪–১৬
গণনা: পর্ব ৩১–৩৪
সম্ভাবনা: পর্ব ৩৮–৪০
সংখ্যা: পর্ব ২০–২২
গ্রাফ: পর্ব ৫৭, ৬০, ৬৩, ৬৫
শেষে: পর্ব ৭৯–৮৩
পথ গContest-এর গণিত
সংখ্যাতত্ত্ব: পর্ব ২০–২৫
গণনা: পর্ব ৩১–৩৭
Recurrence: পর্ব ৪৪–৫০
সম্ভাবনা: পর্ব ৩৮–৪০
গ্রাফ ও tree: পর্ব ৫৭–৬৮
শেষে: পর্ব ৮৩
প্রতিটি পর্বেপাঁচটি অভ্যাস
১. সংজ্ঞা নিজের ভাষায় লিখুন
২. ছোট উদাহরণ হাতে করুন
৩. Python দিয়ে যাচাই করুন
৪. প্রমাণের প্রতিটি কারণ খুঁজুন
৫. অনুশীলন আর quiz শেষ করুন
  1. ধাপ ১ — আগে লক্ষ্য। নিজেকে জিজ্ঞেস করুন, এই কোর্স শেষে কী করতে পারতে চান। যে পথই নিন, প্রথম চারটি পর্ব (মানচিত্র, propositional logic, logical equivalence, predicate logic) সবার জন্য। এগুলো ছাড়া পরের কোনো প্রমাণ পড়া যায় না, যেমন বর্ণমালা ছাড়া বাক্য পড়া যায় না।
  2. ধাপ ২ — পথ ক: ভিত্তি থেকে গভীরে। কোর্সটি ঠিক যে ক্রমে সাজানো, সেভাবে পড়ুন। সংখ্যার ধারা (৪, ৫) আর গণনার ধারা (৬, ৭, ৮) আলাদা, তাই চাইলে আগে-পরে করা যায়। প্রথম পড়ায় “আরও গভীরে” বাক্সগুলো বাদ দিতে পারেন; দ্বিতীয়বার সেগুলো পড়ুন। গবেষণা বা উচ্চশিক্ষার লক্ষ্য থাকলে এই পথই সেরা।
  3. ধাপ ৩ — পথ খ: পরীক্ষা আর ইন্টারভিউ। বিশ্ববিদ্যালয়, চাকরি বা ইন্টারভিউর পরীক্ষায় সাধারণত truth table, সমতুল্যতা, quantifier-এর negation, induction, গণনা, সম্ভাবনা, modular হিসাব আর গ্রাফের মৌলিক ধর্ম বেশি আসে। এই তালিকা আগে শেষ করে মডিউল ১৪-এর অনুশীলনে যান। পরে সময় পেলে বাদ পড়া পর্বগুলো পড়ে নিন।
  4. ধাপ ৪ — পথ গ: programming contest. Online judge আর ICPC ধাঁচের প্রতিযোগিতায় সংখ্যাতত্ত্ব (modular inverse, CRT), combinatorics, recurrence আর গ্রাফ সবচেয়ে কাজে লাগে। এখানে গণিতের পাশাপাশি DSA কোর্সের কোডও লাগবে। পর্ব ৮৩-তে এই দুইয়ের মিলন।
  5. ধাপ ৫ — যে পথই হোক, পাঁচটি অভ্যাস। সংজ্ঞা নিজের ভাষায় লিখুন, ছোট উদাহরণ হাতে করুন, Python দিয়ে মিলিয়ে নিন, প্রমাণের প্রতিটি ধাপের কারণ খুঁজুন, আর পর্বের শেষের অনুশীলন ও quiz শেষ করুন। শুধু পড়ে গেলে গণিত মাথায় থাকে না; হাতে করলে থাকে।

শর্টকাটের দাম: পথ খ আর গ সময় বাঁচায়, কিন্তু প্রমাণের মডিউল (২) বাদ দেবেন না। পরীক্ষায় “প্রমাণ করুন” প্রশ্ন আসে, ইন্টারভিউতে “কেন এটি সবসময় কাজ করে?” প্রশ্ন আসে, আর contest-এ ভুল ধারণার ওপর লেখা কোড “Wrong Answer” পায়। প্রমাণ লেখার অভ্যাস তিনটিরই ভিত্তি।

৫ · সংজ্ঞা, উপপাদ্য আর প্রমাণ — গণিত পড়ার নিয়ম

গল্পের বইয়ে একটি বাক্য না বুঝলেও এগিয়ে যাওয়া যায়; গণিতে একটি শব্দ ভুল বুঝলে পরের পুরো পাতা ভুল দাঁড়ায়। তাই গণিত পড়ুন কলম-খাতা হাতে, প্রতিটি লাইনে থেমে। এই কোর্সে বারবার কয়েক রকম লেখা পাবেন:

সংজ্ঞা (Definition)

একটি শব্দের হুবহু অর্থ ঠিক করে দেয়। সংজ্ঞা প্রমাণ করা হয় না; এটি খেলার নিয়ম। প্রতিটি শব্দ গুরুত্বপূর্ণ।

যেমন: জোড় সংখ্যা কাকে বলে

উপপাদ্য (Theorem)

একটি গুরুত্বপূর্ণ দাবি, যা প্রমাণিত। উপপাদ্য-এর দুই অংশ: শর্ত (“যদি …”) আর সিদ্ধান্ত (“তবে …”)।

ছোট সহায়ক উপপাদ্য: lemma; সরাসরি ফল: corollary

প্রমাণ (Proof)

শর্ত থেকে সিদ্ধান্তে পৌঁছানোর যুক্তির শিকল। প্রতিটি ধাপের পেছনে একটি কারণ: সংজ্ঞা, আগের উপপাদ্য, বা বীজগণিতের নিয়ম।

শেষে ∎ চিহ্ন

অনুমান (Conjecture)

যে দাবি সত্য মনে হয়, কিন্তু এখনো প্রমাণ বা খণ্ডন হয়নি। Conjecture একটি counterexample পেলেই মিথ্যা।

যেমন: অংশ ৭-এর Fermat-এর দাবি

উপপাদ্যের বাইরে আরও দুটি শব্দ দেখবেন: lemma হলো বড় প্রমাণের পথে ব্যবহারের জন্য প্রমাণ করা একটি ছোট সহায়ক ফল, আর corollary হলো একটি উপপাদ্য থেকে প্রায় সরাসরি বেরিয়ে আসা ফল। প্রমাণের শেষের ∎ চিহ্নের (tombstone) অর্থ “প্রমাণ শেষ”; পুরোনো বইয়ে এর জায়গায় লেখা থাকে Q.E.D. (লাতিন “quod erat demonstrandum”, অর্থাৎ “যা দেখানোর ছিল”)।

এবার একটি সংজ্ঞা আর একটি উপপাদ্য ধরে ধরে পড়ি। এটিই এই কোর্সের প্রথম প্রমাণ।

সংজ্ঞা ১.১

একটি পূর্ণসংখ্যা n-কে জোড় (even) বলা হয়, যদি এমন একটি পূর্ণসংখ্যা k থাকে যে n = 2k. একটি পূর্ণসংখ্যা n-কে বিজোড় (odd) বলা হয়, যদি এমন একটি পূর্ণসংখ্যা k থাকে যে n = 2k + 1.

উপপাদ্য ১.১

যদি a আর b দুটিই জোড় পূর্ণসংখ্যা হয়, তবে a + b জোড়।

সংজ্ঞা: n জোড়, যদি কোনো পূর্ণসংখ্যা k-এর জন্য n = 2k. উপপাদ্য: a, b জোড় হলে a + b জোড়।
ধাপ
লেখা
যাচাই
  1. সংজ্ঞার প্রতিটি শব্দ। “পূর্ণসংখ্যা k” শব্দটি বাদ দিলে কী হতো? তখন 7 = 2 × 3.5 লিখে 7-কেও জোড় বলা যেত! তাই k-কে পূর্ণসংখ্যা হতেই হবে। সংজ্ঞা থেকে উদাহরণ বানান: 0 = 2 × 0, তাই 0 জোড়; −6 = 2 × (−3), তাই −6 জোড়। আর একটি “অ-উদাহরণ”: 7-এর জন্য k = 3.5, পূর্ণসংখ্যা নয়, তাই 7 জোড় নয়।
  2. উপপাদ্যকে দুই ভাগে ভাঙুন। “যদি” অংশটি শর্ত (hypothesis): a জোড় এবং b জোড়। “তবে” অংশটি সিদ্ধান্ত: a + b জোড়। ভালো প্রমাণে প্রতিটি শর্ত কোথাও না কোথাও ব্যবহার হয়। যে শর্ত ব্যবহারই হলো না, সেটি হয় অপ্রয়োজনীয়, নয়তো প্রমাণে ফাঁক আছে।
  3. ছোট উদাহরণে দেখুন। 4 + 10 = 14 = 2 × 7; −2 + 6 = 4 = 2 × 2. দাবিটি সত্য বলে মনে হচ্ছে। কিন্তু সাবধান: দুটি, দুশো বা দুই কোটি উদাহরণ মিললেও সেটি প্রমাণ নয়, কারণ জোড় সংখ্যা অসীম। উদাহরণের কাজ বোঝা, প্রমাণ নয়।
  4. প্রমাণ শুরু: সংজ্ঞা বসানো। a জোড়, তাই সংজ্ঞা অনুযায়ী কোনো পূর্ণসংখ্যা j আছে যাতে a = 2j. একইভাবে b = 2k, কোনো পূর্ণসংখ্যা k-এর জন্য। (দুটির জন্য আলাদা অক্ষর j আর k নেওয়া জরুরি; একই অক্ষর নিলে ভুলে ধরে নেওয়া হয় a = b.) যোগ করলে a + b = 2j + 2k = 2(j + k), গুণের বিতরণ নিয়মে।
  5. শেষ ধাপ: আবার সংজ্ঞায় ফেরা। দুটি পূর্ণসংখ্যার যোগফল পূর্ণসংখ্যা, তাই j + k একটি পূর্ণসংখ্যা। অর্থাৎ a + b = 2 × (একটি পূর্ণসংখ্যা), যা হুবহু জোড়ের সংজ্ঞা। ∎ চিহ্ন দিয়ে প্রমাণ শেষ। খেয়াল করুন, প্রমাণ শুরু হলো সংজ্ঞা দিয়ে, শেষও হলো সংজ্ঞায়।
  6. উল্টো দাবি কি সত্য? “a + b জোড় হলে a আর b দুটিই জোড়”: এটি মূল উপপাদ্যের converse (উল্টো রূপ)। একটি উদাহরণেই এটি ভেঙে যায়: 3 + 5 = 8 জোড়, অথচ 3 আর 5 দুটিই বিজোড়। মূল উপপাদ্য সত্য হলেও তার উল্টো সত্য হবে, এমন কোনো নিয়ম নেই। এই ভুলটি পরীক্ষায় আর AI-এর লেখা প্রমাণে খুব বেশি দেখা যায়।

এখন একই প্রমাণ পরিষ্কার আকারে লিখি, যেভাবে খাতায় বা পরীক্ষায় লিখবেন: প্রতিটি ধাপের পাশে তার কারণ।

প্রমাণ (উপপাদ্য ১.১)
  1. a জোড়, তাই কোনো পূর্ণসংখ্যা j-এর জন্য a = 2j. (কারণ: শর্ত আর জোড়ের সংজ্ঞা)
  2. b জোড়, তাই কোনো পূর্ণসংখ্যা k-এর জন্য b = 2k. (কারণ: শর্ত আর জোড়ের সংজ্ঞা)
  3. a + b = 2j + 2k = 2(j + k). (কারণ: ধাপ ১, ২ আর গুণের বিতরণ নিয়ম)
  4. j + k একটি পূর্ণসংখ্যা। (কারণ: দুটি পূর্ণসংখ্যার যোগফল পূর্ণসংখ্যা)
  5. অতএব a + b জোড়। (কারণ: ধাপ ৩, ৪ আর জোড়ের সংজ্ঞা) ∎

এই ধাঁচের প্রমাণকে বলে direct proof: শর্ত ধরে নিয়ে সোজা সিদ্ধান্তে পৌঁছানো। আরও দুটি পদ্ধতি আসবে পর্ব ০৮-এ (প্রমাণের পদ্ধতি — direct, contrapositive আর contradiction).

সংজ্ঞা পড়ার চেকলিস্ট: (১) প্রতিটি শব্দের নিচে দাগ দিন, আর ভাবুন সেটি বাদ দিলে কী বদলায়। (২) অন্তত দুটি উদাহরণ আর একটি অ-উদাহরণ বানান। (৩) সীমার উদাহরণ খুঁজুন: 0, ঋণাত্মক সংখ্যা, ফাঁকা সেট। (৪) উপপাদ্যে কোনটি শর্ত আর কোনটি সিদ্ধান্ত, আলাদা করে লিখুন। (৫) প্রমাণে প্রতিটি শর্ত কোথায় ব্যবহার হলো, চিহ্নিত করুন।

৬ · প্রতীকের প্রাথমিক পরিচয় — আর ৮টি ওয়ার্ম-আপ প্রশ্ন

গণিতের প্রতীক হলো শর্টহ্যান্ড: লম্বা বাক্যকে ছোট আর দ্ব্যর্থহীন করে। এই কোর্সে প্রথম দিন থেকেই যে প্রতীকগুলো দেখবেন, সেগুলো নিচে। প্রতিটি পরে নিজের পর্বে বিস্তারিত আসবে; এখানে শুধু চেনা-পরিচয়।

প্রতীকপড়া হয়অর্থ আর উদাহরণ
ℕnatural numbersস্বাভাবিক সংখ্যা: {0, 1, 2, 3, …}. কিছু বইয়ে 0 বাদ, {1, 2, 3, …}; তাই যেখানে গুরুত্বপূর্ণ, সেখানে স্পষ্ট বলা হবে। ধনাত্মক পূর্ণসংখ্যার জন্য দ্ব্যর্থহীন প্রতীক ℤ+
ℤintegersসব পূর্ণসংখ্যা: {…, −2, −1, 0, 1, 2, …}. জার্মান “Zahlen” (সংখ্যা) থেকে Z
ℚrationalsমূলদ সংখ্যা: p/q আকারে লেখা যায়, যেখানে p, q পূর্ণসংখ্যা আর q ≠ 0. যেমন 0.5 = 1/2, −3 = −3/1
ℝrealsবাস্তব সংখ্যা: সংখ্যারেখার সব বিন্দু; √2, π-সহ। ℕ ⊂ ℤ ⊂ ℚ ⊂ ℝ
x ∈ A, x ∉ Ax is in Ax সেট A-এর উপাদান (বা নয়)। 3 ∈ ℕ, −3 ∉ ℕ, 1/2 ∈ ℚ
∑i=1n aisumযোগফল: a1 + a2 + … + an. ∑i=14 i = 1 + 2 + 3 + 4 = 10
⌊x⌋floorFloor: x-এর সমান বা ছোট সবচেয়ে বড় পূর্ণসংখ্যা। ⌊3.7⌋ = 3, ⌊−3.2⌋ = −4
⌈x⌉ceilingCeiling: x-এর সমান বা বড় সবচেয়ে ছোট পূর্ণসংখ্যা। ⌈3.2⌉ = 4, ⌈−3.7⌉ = −3
n!n factorialFactorial: 1 × 2 × … × n; নিয়ম অনুযায়ী 0! = 1. 4! = 24
a mod ma modulo mভাগশেষ: m > 0 হলে, a-কে m দিয়ে ভাগ করে পাওয়া r, যেখানে 0 ≤ r < m. 17 mod 5 = 2, −17 mod 5 = 3
a ∣ ba divides ba, b-কে নিঃশেষে ভাগ করে: কোনো পূর্ণসংখ্যা k-এর জন্য b = ak. 3 ∣ 12, কিন্তু 12 ∤ 3
a ≡ b (mod m)a is congruent to b mod mm ∣ (a − b), অর্থাৎ m দিয়ে ভাগ করলে একই ভাগশেষ। 17 ≡ 2 (mod 5). এর নাম modular arithmetic

ঋণাত্মক সংখ্যার mod নিয়ে সাবধান। গণিতে −17 mod 5 = 3, কারণ −17 = 5 × (−4) + 3 আর 0 ≤ 3 < 5. Python-এর % এই নিয়মই মানে: -17 % 5 দেয় 3. কিন্তু C, C++ আর Java-তে -17 % 5 দেয় -2, কারণ সেখানে ভাগফল শূন্যের দিকে কাটা হয়। Contest-এ বা hash-এর হিসাবে এই পার্থক্য থেকে বহু bug আসে। Floor-এর ক্ষেত্রেও একই সাবধানতা: ⌊−3.2⌋ = −4, −3 নয়।

ওয়ার্ম-আপ: নিজেকে যাচাই করুন

আগে খাতায় উত্তর লিখুন, তারপর নিচের উত্তর আর Python ব্লক মিলিয়ে নিন। ৬টি বা তার বেশি ঠিক হলে আপনি মডিউল ১-এর জন্য তৈরি। কম হলে চিন্তা নেই; প্রতিটি বিষয় পরের পর্বগুলোতে আবার আসবে।

  1. ∑i=110 i = ?
  2. ⌊7/2⌋ + ⌈7/2⌉ = ?
  3. ⌊−3.2⌋ = ?
  4. 5! আর 0! কত?
  5. 17 mod 5 আর −17 mod 5 কত?
  6. 0.5 ∈ ℚ? আর −3 ∈ ℕ?
  7. ∑k=03 2k = ?
  8. ১ থেকে ১০০-এর মধ্যে কয়টি সংখ্যা 7 দিয়ে বিভাজ্য?

১. 55 (১ + ২ + … + ১০)। ২. ⌊3.5⌋ + ⌈3.5⌉ = 3 + 4 = 7. ৩. −4 (−3.2-এর চেয়ে ছোট বা সমান সবচেয়ে বড় পূর্ণসংখ্যা)। ৪. 5! = 120, 0! = 1. ৫. 2 আর 3. ৬. হ্যাঁ, 0.5 = 1/2 ∈ ℚ; না, −3 ∉ ℕ, কারণ ℕ-এ ঋণাত্মক সংখ্যা নেই। ৭. 1 + 2 + 4 + 8 = 15. ৮. ⌊100/7⌋ = 14টি (7, 14, …, 98).

import math
from fractions import Fraction

print("Q1 sum of 1..10      :", sum(range(1, 11)))
print("Q2 floor(7/2)+ceil(7/2):", math.floor(7 / 2) + math.ceil(7 / 2))
print("Q3 floor(-3.2)       :", math.floor(-3.2))
print("Q4 5!, 0!            :", math.factorial(5), math.factorial(0))
print("Q5 17 mod 5, -17 mod 5:", 17 % 5, -17 % 5)
print("Q6 0.5 as a fraction :", Fraction(0.5))
print("   sqrt(2) as float  :", Fraction(math.sqrt(2)))
print("Q7 2^0+2^1+2^2+2^3   :", sum(2 ** k for k in range(4)))
by_hand = sum(1 for m in range(1, 101) if m % 7 == 0)
print("Q8 multiples of 7    :", by_hand, "| floor(100/7) =", 100 // 7)

আসল আউটপুট (ব্রাউজারের Python):

Q1 sum of 1..10      : 55
Q2 floor(7/2)+ceil(7/2): 7
Q3 floor(-3.2)       : -4
Q4 5!, 0!            : 120 1
Q5 17 mod 5, -17 mod 5: 2 3
Q6 0.5 as a fraction : 1/2
   sqrt(2) as float  : 6369051672525773/4503599627370496
Q7 2^0+2^1+2^2+2^3   : 15
Q8 multiples of 7    : 14 | floor(100/7) = 14

আটটি উত্তরই মিলেছে। প্রশ্ন ৮-এ দুই পদ্ধতি পাশাপাশি: ১০০টি সংখ্যা একটি একটি পরীক্ষা করে গোনা, আর সূত্র ⌊100/7⌋ দিয়ে। সবচেয়ে মজার লাইনটি Q6-এর দ্বিতীয় লাইন। √2 মূলদ নয় (এর প্রমাণ contradiction পদ্ধতির সবচেয়ে বিখ্যাত উদাহরণ), অথচ Python তার “√2”-কে একটি ভগ্নাংশ হিসেবে লিখে দিল! কারণ math.sqrt(2) আসল √2 নয়; এটি অংশ ১-এ বলা সেই সসীম তালিকার সবচেয়ে কাছের সংখ্যা, আর সেই তালিকার প্রতিটি সংখ্যা একটি ভগ্নাংশ, যার হর 2-এর কোনো ঘাত (এখানে 4503599627370496 = 252). কম্পিউটার যে discrete, এটি তার সরাসরি প্রমাণ। শিক্ষা: কম্পিউটার দিয়ে “√2 মূলদ কি না” প্রশ্নের উত্তর মেলে না; সেজন্য প্রমাণ লাগে।

পরীক্ষা ও ইন্টারভিউতে: এই পর্বের ধাঁচে সাধারণত যা আসে। (১) “Discrete আর continuous গণিতের পার্থক্য উদাহরণসহ লিখুন।” উত্তর: আলাদা, গোনা যায় এমন মান বনাম মাঝখানে ফাঁকহীন মান; অর্ডারের সংখ্যা বনাম ওজন। (২) “⌊−2.5⌋ কত?” উত্তর: −3. (৩) “−7 mod 3 কত?” উত্তর: 2, কারণ −7 = 3 × (−3) + 2. (৪) “কিছু উদাহরণে সত্য দেখালে কি প্রমাণ হয়?” উত্তর: না; সসীম কয়েকটি উদাহরণ অসীম সংখ্যক ক্ষেত্রের কথা বলে না, তবে একটি counterexample দাবি খণ্ডনের জন্য যথেষ্ট। (৫) “n² + n + 41 কি সব n-এর জন্য মৌলিক?” উত্তর: না, n = 40-এ 1681 = 41², তাই মৌলিক নয়।

৭ · Python দিয়ে যাচাই — brute force বনাম প্রমাণ

এই কোর্সের প্রতিটি পর্বে Python ব্লক থাকবে। তাদের কাজ তিনটি: একটি সূত্রকে ছোট n-এ গুনে মেলানো, একটি দাবির বিরুদ্ধে counterexample খোঁজা, আর বড় হিসাব (যেমন 21000 mod 97) হাতে না করে কম্পিউটারে করা। কিন্তু একটি বিষয় শুরুতেই পরিষ্কার থাকা দরকার: কম্পিউটারের যাচাই কোথায় থামে।

বিখ্যাত একটি উদাহরণ: f(n) = n² + n + 41. n = 0 বসালে 41, মৌলিক। n = 1-এ 43, n = 2-এ 47, n = 3-এ 53: সবই মৌলিক সংখ্যা। এই বহুপদীটি সাধারণত Euler-এর নামে পরিচিত; তিনি ১৭৭২ সালের দিকে এর এই আশ্চর্য ধর্ম লক্ষ করেছিলেন বলে উল্লেখ পাওয়া যায়। কেউ যদি বলেন “f(n) সব n-এর জন্য মৌলিক”, কীভাবে যাচাই করবেন? নিচের stepper দেখুন।

দাবি: “প্রতিটি n ≥ 0-এর জন্য f(n) = n² + n + 41 মৌলিক।”
n
f(n)
পরীক্ষা
রায়
  1. n = 0 থেকে শুরু। f(0) = 41. 41-এর ভাজক কেবল 1 আর 41, তাই মৌলিক। একটি উদাহরণ মিলল, দাবিটি এখনো টিকে আছে।
  2. আরও কয়েকটি। f(1) = 43, f(2) = 47, f(3) = 53: তিনটিই মৌলিক। এখানেই অনেকে থেমে যান: “চারটি মিলেছে, তাহলে সত্য।” কিন্তু চারটি উদাহরণ অসীম সংখ্যক n-এর কথা বলে না।
  3. টানা চল্লিশটি। কম্পিউটারে n = 0 থেকে 39 পর্যন্ত সব পরীক্ষা করলে প্রতিটি f(n) মৌলিক। সবশেষে f(39) = 1601; এটি মৌলিক কি না দেখতে 2 থেকে 40 পর্যন্ত ভাজক খুঁজলেই চলে, কারণ √1601 ≈ 40.01 (কোনো যৌগিক সংখ্যার অন্তত একটি ভাজক তার বর্গমূলের সমান বা ছোট)। কেউ ভাগ করে না, তাই মৌলিক।
  4. n = 40: দাবি ভেঙে গেল। f(40) = 1600 + 40 + 41 = 1681 = 41 × 41. কেন? 40² + 40 = 40 × 41, তাই f(40) = 40 × 41 + 41 = 41 × 41. চল্লিশটি সফল উদাহরণের পর একটি counterexample, আর দাবিটি মিথ্যা।
  5. n = 41-ও। f(41) = 41² + 41 + 41 = 41 × (41 + 1 + 1) = 41 × 43 = 1763. প্রতিটি পদে 41 আছে, তাই 41 দিয়ে বিভাজ্য। এটি কাকতালীয় নয়, একটি প্যাটার্ন।
  6. প্যাটার্নটি প্রমাণে রূপ নেয়। n = 41k (k ≥ 1) বসালে f(41k) = 41²k² + 41k + 41 = 41(41k² + k + 1). দ্বিতীয় গুণনীয়কটি 1-এর বড়, তাই f(41k) মৌলিক নয়। একটি নয়, অসীম সংখ্যক counterexample, আর তা প্রমাণসহ। Brute force পথ দেখাল, প্রমাণ নিশ্চিত করল।

একই পরীক্ষা কোডে। নিচের ব্লক f(n) মৌলিক থাকা পর্যন্ত n বাড়াতে থাকে, প্রথম ব্যর্থতায় থামে, তারপর প্রমাণের ভবিষ্যদ্বাণীটি (41 দিয়ে বিভাজ্যতা) কয়েকটি n-এ মেলায়।

def is_prime(m):
    if m < 2:
        return False
    d = 2
    while d * d <= m:
        if m % d == 0:
            return False
        d += 1
    return True

def f(n):
    return n * n + n + 41

n = 0
while is_prime(f(n)):          # দাবি না ভাঙা পর্যন্ত এগোই
    n += 1
print("prime for every n from 0 to", n - 1)
print("first failure: n =", n, "f(n) =", f(n), "=", 41, "*", f(n) // 41)

hits = sum(is_prime(f(k)) for k in range(100))
print("primes among n = 0..99:", hits, "of 100")

for k in range(1, 5):          # প্রমাণ বলে: f(41k) সবসময় 41 দিয়ে বিভাজ্য
    v = f(41 * k)
    print(f"n = {41 * k:3d}  f(n) = {v:6d}  f(n) % 41 = {v % 41}")

আসল আউটপুট (ব্রাউজারের Python):

prime for every n from 0 to 39
first failure: n = 40 f(n) = 1681 = 41 * 41
primes among n = 0..99: 86 of 100
n =  41  f(n) =   1763  f(n) % 41 = 0
n =  82  f(n) =   6847  f(n) % 41 = 0
n = 123  f(n) =  15293  f(n) % 41 = 0
n = 164  f(n) =  27101  f(n) % 41 = 0

প্রথম লাইন: টানা ৪০টি মৌলিক (n = 0 থেকে 39). দ্বিতীয় লাইন: n = 40-এ প্রথম ব্যর্থতা, 1681 = 41 × 41. তৃতীয় লাইনটি আরও শিক্ষণীয়: প্রথম ১০০টি n-এর মধ্যে ৮৬টিতে f(n) মৌলিক। অর্থাৎ বহুপদীটি সত্যিই অস্বাভাবিক রকম “মৌলিক-প্রিয়”, কিন্তু “সবসময়” নয়। শেষ চার লাইন প্রমাণের ভবিষ্যদ্বাণী মেলায়: n = 41, 82, 123, 164-এ ভাগশেষ 0. প্রমাণটি stepper-এর শেষ ধাপের বীজগণিত; কোড শুধু দেখাল যে সেই বীজগণিতে ভুল নেই।

এখন প্রশ্ন জাগে: অন্য কোনো বহুপদী কি আছে যা সব n-এ মৌলিক দেয়? উত্তর “না”, আর এটি প্রমাণ করা যায়। প্রমাণের ধারণাটি ঠিক উপরের 41-এর কৌশল, শুধু সাধারণ আকারে।

উপপাদ্য ১.২

ধরুন f(n) পূর্ণসংখ্যা সহগের একটি বহুপদী, যা ধ্রুবক নয় আর যার মুখ্য সহগ (সবচেয়ে বড় ঘাতের সহগ) ধনাত্মক। তবে এমন কোনো n ≥ 0 আছে যার জন্য f(n) মৌলিক নয়।

প্রমাণ
  1. যদি কোনো n ≥ 0-এর জন্যই f(n) মৌলিক না হয়, তাহলে কিছু প্রমাণের বাকি নেই। তাই ধরুন কোনো a ≥ 0-এর জন্য f(a) = p একটি মৌলিক সংখ্যা। (কারণ: দুটি সম্ভাবনার একটি ধরে নেওয়া)
  2. যেকোনো পূর্ণসংখ্যা k-এর জন্য f(a + kp) − f(a) সংখ্যাটি p দিয়ে বিভাজ্য। (কারণ: প্রতিটি পদ c(a + kp)i − c·ai-কে বিস্তার করলে ai বাদে প্রতিটি পদে kp গুণনীয়ক থাকে; এটি modular arithmetic-এর একটি মৌলিক ধর্ম, পর্ব ২২-এ পূর্ণ রূপে আসবে)
  3. তাই p ∣ f(a + kp), সব k ≥ 1-এর জন্য। (কারণ: ধাপ ২ আর p ∣ f(a))
  4. f ধ্রুবক নয় আর মুখ্য সহগ ধনাত্মক, তাই n বড় হলে f(n) অসীমের দিকে বাড়ে; কোনো এক k-এর জন্য f(a + kp) > p. (কারণ: বহুপদীর বৃদ্ধি)
  5. সেই k-এর জন্য f(a + kp) সংখ্যাটি p-এর চেয়ে বড় আর p দিয়ে বিভাজ্য, তাই মৌলিক নয়। (কারণ: মৌলিকের সংজ্ঞা, যার ভাজক কেবল 1 আর নিজে) ∎

f(n) = n² + n + 41-এ a = 0, p = 41 নিলে ঠিক উপরের stepper-এর শেষ ধাপটি পাই: f(41k) সব সময় 41 দিয়ে বিভাজ্য। প্রমাণ শুধু “মিথ্যা” বলেনি; বলেছে কেন মিথ্যা, আর সেটি সব বহুপদীর জন্য।

আরেকটি বিখ্যাত দাবি: Fermat-এর সংখ্যা

১৬৪০ সালের দিকে Pierre de Fermat লক্ষ করেন যে Fk = 22k + 1 সংখ্যাগুলো k = 0, 1, 2, 3, 4-এর জন্য মৌলিক: 3, 5, 17, 257, 65537. তিনি অনুমান করেন যে সব Fk মৌলিক। প্রায় এক শতাব্দী পরে, সাধারণত বলা হয় ১৭৩২ সালে, Leonhard Euler দেখান যে F5 = 4294967297 = 641 × 6700417. আজ আমাদের কাছে যে হিসাব কয়েক মিলিসেকেন্ডের, Euler-কে তা হাতে করতে হয়েছিল (তিনি কোন কোন ভাজক পরীক্ষা করার দরকার, তা চতুর যুক্তিতে কমিয়ে এনেছিলেন)।

def smallest_factor(m):
    d = 2
    while d * d <= m:
        if m % d == 0:
            return d
        d += 1
    return m                    # কোনো ভাজক নেই: m নিজেই মৌলিক

for k in range(6):
    F = 2 ** (2 ** k) + 1       # Fermat সংখ্যা F_k
    p = smallest_factor(F)
    if p == F:
        print(f"F{k} = {F}  prime")
    else:
        print(f"F{k} = {F} = {p} * {F // p}")

আসল আউটপুট (ব্রাউজারের Python):

F0 = 3  prime
F1 = 5  prime
F2 = 17  prime
F3 = 257  prime
F4 = 65537  prime
F5 = 4294967297 = 641 * 6700417

প্রথম পাঁচটি মৌলিক, ষষ্ঠটিতে দাবি ভাঙল। ছোট ভাজক 641 থাকায় ভাজক খোঁজা দ্রুত শেষ হয়েছে; কিন্তু বড় সংখ্যায় এই পদ্ধতি অচল, কারণ পরীক্ষার সংখ্যা সংখ্যাটির বর্গমূলের মতো বাড়ে। দ্রুত মৌলিকতা পরীক্ষা (Miller–Rabin) আসবে পর্ব ২৫-এ। তাই brute force-এর দুটি সীমা: এটি প্রমাণ দেয় না, আর বড় ইনপুটে শেষই হয় না।

উদাহরণ সাহস দেয়, counterexample খণ্ডন করে,
আর শুধু প্রমাণই নিশ্চিত করে।

আরও গভীরে: উপপাদ্য ১.২ বলে কোনো বহুপদী সবসময় মৌলিক দেয় না; কিন্তু একটি বহুপদী অসীম সংখ্যক মৌলিক দেয় কি না, সেটি অনেক কঠিন প্রশ্ন। n² + 1 আকারের মৌলিক অসীম সংখ্যক আছে কি না, তা আজও অজানা; এটি Landau-র চারটি বিখ্যাত সমস্যার একটি (১৯১২), আর এর সাধারণ রূপ Bunyakovsky-র অনুমান নামে পরিচিত। আরেকটি সতর্কবার্তা: Pólya-র একটি অনুমান (১৯১৯) এত বড় সংখ্যা পর্যন্ত সত্য ছিল যে কম্পিউটারের আগে কেউ খণ্ডন খুঁজে পাননি; ১৯৫৮ সালে Haselgrove অপ্রত্যক্ষভাবে এটি খণ্ডন করেন, আর সবচেয়ে ছোট counterexample (৯০৬,১৫০,২৫৭) পাওয়া যায় ১৯৮০ সালে, বলে উল্লেখ আছে। “অনেক দূর পর্যন্ত সত্য” আর “সবসময় সত্য” এক কথা নয়।

৮ · AI-এর যুগে discrete math — সহকারী, বিচারক নয়

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

AI-এর সাধারণ ভুলকেমন দেখায়কীভাবে ধরবেন
উল্টো দাবি প্রমাণ (converse)“a + b জোড়” থেকে শুরু করে “a, b জোড়” প্রমাণশর্ত আর সিদ্ধান্ত আলাদা করে লিখুন
চক্রাকার যুক্তিযা প্রমাণ করার কথা, তা মাঝপথে ধরে নেওয়াপ্রতিটি ধাপের কারণ জিজ্ঞেস করুন
কিছু উদাহরণকে প্রমাণ বলা“n = 1, 2, 3-এ সত্য, তাই সবসময় সত্য”বড় n-এ Python দিয়ে counterexample খুঁজুন
শর্ত বাদ দিয়ে উপপাদ্য বলা“p মৌলিক” বা “p ∤ a” ছাড়া Fermat-এর উপপাদ্যপ্রতিটি উপপাদ্যের পূর্ণ শর্ত চেয়ে নিন
গণনায় ভুলএকটি কম-বেশি (off-by-one), একই জিনিস দুবার গোনা, ক্রম উপেক্ষাছোট ক্ষেত্রে brute force-এ গুনে মেলান
বড় সংখ্যার mod-এ ভুল2100 mod 7-এর মতো হিসাবে আত্মবিশ্বাসী ভুল উত্তরPython-এর pow(a, b, m)
শূন্য দিয়ে ভাগ, ফাঁকা ক্ষেত্র“উভয় পক্ষকে x দিয়ে ভাগ করি” যখন x = 0 হতে পারেসীমার মান (0, ফাঁকা সেট) বসিয়ে দেখুন
বানানো সূত্র বা তথ্যসূত্রনেই এমন বই, পাতা বা উপপাদ্যের নামবিশ্বস্ত পাঠ্যবইয়ে মিলিয়ে নিন

AI-কে গণিতের প্রশ্ন করার সময় শুধু উত্তর নয়, যাচাইয়ের উপকরণও চেয়ে নিন। নিচের কাঠামোটি এই কোর্সের যেকোনো পর্বে কাজে লাগবে:

আমি discrete math শিখছি। নিচের দাবিটি প্রমাণ করো: [এখানে দাবিটি লিখুন] ১. প্রথমে দাবির শর্ত আর সিদ্ধান্ত আলাদা করে লেখো। ২. প্রমাণটি সংখ্যা দেওয়া ধাপে লেখো, প্রতিটি ধাপের পাশে কারণ (কোন সংজ্ঞা, কোন উপপাদ্য, কোন নিয়ম) দাও। ৩. কোনো উপপাদ্য ব্যবহার করলে তার পূর্ণ শর্তগুলো বলো। ৪. দাবিটি ছোট n-এ যাচাই করার একটি ছোট Python কোড দাও (শুধু standard library). ৫. প্রমাণের কোন ধাপ সবচেয়ে সহজে ভুল হতে পারে, সেটিও বলো।

AI-এর দেওয়া গণিত হাতে পেলে — যাচাইয়ের চেকলিস্ট

ভাবনার প্রশ্ন

প্রতিটি প্রশ্ন নিয়ে নিজে কিছুক্ষণ ভাবুন — তারপর “→ উত্তর” চাপুন।

প্র ০১পৃথিবী তো অনেকটাই continuous — সময়, দূরত্ব, তাপমাত্রা। তাহলে কম্পিউটার বিজ্ঞান discrete গণিতের ওপর কেন দাঁড়াল?

কারণটি প্রকৌশলের, দর্শনের নয়। প্রথম দিকের অনেক কম্পিউটার ছিল analog: বৈদ্যুতিক ভোল্টেজ বা যান্ত্রিক চাকার অবস্থান দিয়ে সংখ্যা প্রকাশ করত। বিংশ শতাব্দীর প্রথমার্ধে differential equation সমাধানের জন্য এমন যন্ত্র সত্যিই ব্যবহার হতো। সমস্যা ছিল নির্ভুলতা: ভোল্টেজ সামান্য ওঠানামা করলেই ফল বদলে যেত, আর প্রতিটি ধাপে ভুল জমত।

Discrete যন্ত্রে এই সমস্যা প্রায় নেই। একটি তারে ভোল্টেজ “বেশি” হলে 1, “কম” হলে 0; মাঝখানে কিছুটা ওঠানামা হলেও সিদ্ধান্ত বদলায় না। প্রতিটি ধাপে সংকেতটি আবার পরিষ্কার 0 বা 1-এ ফিরিয়ে আনা যায়, তাই কোটি কোটি ধাপের পরেও ভুল জমে না। ১৯৩৭ সালে Claude Shannon দেখান যে relay-এর সার্কিট Boolean algebra দিয়ে নকশা আর সরল করা যায়; এর পর থেকে ডিজিটাল সার্কিটের নকশা একটি গাণিতিক কাজে পরিণত হয়।

তবে continuous পৃথিবী হারিয়ে যায়নি। কম্পিউটার তাপমাত্রা বা ছবি রাখে নমুনা নিয়ে (sampling) আর মান গোল করে (quantization). অংশ ৬-এ দেখেছেন, কম্পিউটারের “√2” আসলে একটি ভগ্নাংশ। এজন্য numerical analysis নামে একটি পূর্ণ শাখা আছে, যা দেখে continuous সমস্যাকে discrete যন্ত্রে সমাধান করলে কতটা ভুল হয়। আর machine learning-এর বেশিরভাগ গণিত (gradient, probability density) continuous, যদিও শেষ পর্যন্ত তা চলে discrete যন্ত্রেই।

আরেকটি গভীর কারণ: প্রোগ্রাম নিজেই একটি discrete বস্তু। কোড হলো অক্ষরের সসীম সারি, প্রোগ্রামের অবস্থা হলো মেমরির bit-এর বিন্যাস, আর প্রোগ্রাম চলে ধাপে ধাপে। তাই “এই প্রোগ্রাম সবসময় থামবে কি না”, “দুটি প্রোগ্রাম একই কাজ করে কি না” ধরনের প্রশ্ন স্বভাবতই যুক্তি, সেট আর গ্রাফের প্রশ্ন।

মূল উপলব্ধি: কম্পিউটার discrete, কারণ discrete সংকেত ভুল জমতে দেয় না। আর যন্ত্রটি discrete বলে তাকে বোঝার, প্রোগ্রাম করার আর তার সঠিকতা প্রমাণের গণিতও মূলত discrete; continuous পৃথিবী সেখানে আসে আসন্ন মান হিসেবে।

প্র ০২কম্পিউটার যদি কোটি কোটি ক্ষেত্র পরীক্ষা করতে পারে, তাহলে আর প্রমাণের দরকার কী? কম্পিউটার কি কখনো নিজেই প্রমাণ হতে পারে?

দুটি আলাদা পরিস্থিতি আছে। যদি দাবিটি অসীম সংখ্যক ক্ষেত্রের কথা বলে (যেমন “সব n-এর জন্য”), তাহলে কোটি কোটি ক্ষেত্র পরীক্ষা করেও প্রমাণ হয় না; শুধু আস্থা বাড়ে। এই পর্বেই দেখেছেন, n² + n + 41 টানা ৪০টি ক্ষেত্রে মৌলিক, আর Pólya-র একটি অনুমান কোটি কোটি পর্যন্ত টিকে থেকেও শেষে মিথ্যা প্রমাণিত হয়েছে (সবচেয়ে ছোট counterexample প্রায় ৯০ কোটির ঘরে, বলে উল্লেখ আছে)। এমন উদাহরণের জন্যই গণিতবিদেরা উদাহরণকে প্রমাণ মানেন না।

কিন্তু দাবিটি যদি সসীম সংখ্যক ক্ষেত্রে নামিয়ে আনা যায়, তাহলে সব ক্ষেত্র পরীক্ষা করা একটি বৈধ প্রমাণ পদ্ধতি; একে বলে proof by exhaustion বা case analysis. সবচেয়ে বিখ্যাত উদাহরণ চার রঙের উপপাদ্য: যেকোনো মানচিত্রে চারটি রং দিয়েই পাশাপাশি দেশগুলোকে আলাদা রং দেওয়া যায়। ১৯৭৬ সালে Kenneth Appel আর Wolfgang Haken এটি প্রমাণ করেন। তাঁরা যুক্তি দিয়ে দেখান যে প্রশ্নটি প্রায় দুই হাজার বিশেষ বিন্যাসে নেমে আসে, আর সেগুলো কম্পিউটারে পরীক্ষা করেন। তখন অনেক গণিতবিদ অস্বস্তিতে ছিলেন: যে প্রমাণ মানুষ হাতে পড়ে যাচাই করতে পারে না, তা কি প্রমাণ?

উত্তর এসেছে আরেক দিক থেকে। ২০০৫ সালের দিকে Georges Gonthier ও সহকর্মীরা Coq নামের একটি proof assistant-এ চার রঙের উপপাদ্যের পূর্ণ প্রমাণ লেখেন। Proof assistant এমন সফটওয়্যার যা প্রমাণের প্রতিটি যুক্তির ধাপ নিয়ম মেনে হয়েছে কি না, যন্ত্রের মতো খুঁটিয়ে যাচাই করে। এখানে কম্পিউটার উদাহরণ পরীক্ষা করছে না, প্রমাণ পরীক্ষা করছে। আজ Lean-এর মতো proof assistant-এ বহু গণিত আনুষ্ঠানিকভাবে লেখা হচ্ছে।

তাহলে এই কোর্সে Python-এর ভূমিকা কী? তিনটি: অনুমান তৈরি (প্যাটার্ন দেখা), খণ্ডন (একটি counterexample খুঁজে পাওয়া), আর আস্থা (আপনার প্রমাণে হিসাবের ভুল নেই কি না দেখা)। প্রমাণের জায়গা সে নেয় না।

মূল উপলব্ধি: অসীমের দাবি পরীক্ষা দিয়ে প্রমাণ হয় না; সসীমে নামিয়ে আনতে পারলে পরীক্ষাই প্রমাণ। আর কম্পিউটার প্রমাণে সবচেয়ে নির্ভরযোগ্য সাহায্য করে প্রমাণের প্রতিটি ধাপ যাচাই করে, উদাহরণ গুনে নয়।

প্র ০৩Software তো test করেই ছাড়া হয়। কোন পরিস্থিতিতে test যথেষ্ট নয়, আর গাণিতিক প্রমাণ লাগে?

Test আর প্রমাণের পার্থক্য এই পর্বের মূল শিক্ষার সরাসরি প্রয়োগ। Test কিছু নির্দিষ্ট ইনপুটে প্রোগ্রাম চালায়। প্রোগ্রামের সম্ভাব্য ইনপুট সাধারণত এত বেশি যে সব পরীক্ষা করা অসম্ভব: দুটি 64-bit সংখ্যা নেয় এমন একটি ফাংশনের ইনপুট 2128টি। Edsger Dijkstra-র একটি বহুল উদ্ধৃত কথা আছে: test দিয়ে bug-এর উপস্থিতি দেখানো যায়, অনুপস্থিতি নয়।

একটি বিখ্যাত ঘটনা: ১৯৯৪ সালে একটি জনপ্রিয় processor-এর ভাগ করার সার্কিটে একটি ত্রুটি ধরা পড়ে (সাধারণত “Pentium FDIV bug” নামে পরিচিত)। ভাগের একটি lookup table-এ কয়েকটি ঘর ফাঁকা ছিল, ফলে খুব বিরল কিছু ইনপুটে ভাগফল সামান্য ভুল আসত। প্রচলিত test-এ এটি ধরা পড়েনি, কারণ ভুল ইনপুটগুলো ছিল বিশাল ইনপুট-স্থানের ক্ষুদ্র একটি অংশ। ঘটনাটির আর্থিক ক্ষতি ছিল বিশাল, আর এরপর hardware শিল্পে formal verification, অর্থাৎ গাণিতিক যুক্তি দিয়ে নকশা যাচাই, অনেক বেশি গুরুত্ব পায়।

Software-এও একই ধারা। ২০০৯ সালে seL4 নামের একটি operating system kernel-এর জন্য দেখানো হয় যে তার C কোড একটি আনুষ্ঠানিক specification মেনে চলে, যন্ত্রে যাচাই করা প্রমাণ দিয়ে। এ ধরনের প্রমাণ তৈরি অনেক শ্রমসাধ্য, তাই সাধারণত শুধু বেশি ঝুঁকির জায়গায় করা হয়: বিমান, চিকিৎসা যন্ত্র, cryptography library, chip-এর নকশা। মাঝামাঝি পথ হিসেবে SAT ও SMT solver দিয়ে নির্দিষ্ট ধর্ম যাচাই করা হয়, যা পর্ব ০৭ আর পর্ব ৭৭-এ দেখবেন।

দৈনন্দিন programming-এও প্রমাণের ধারণা কাজে লাগে, পূর্ণ আনুষ্ঠানিকতা ছাড়াই। Loop invariant (প্রতিটি ধাপের পরে যা সত্য থাকে) মাথায় রেখে কোড লিখলে off-by-one ভুল কমে; DSA কোর্সের পর্ব ০৩ আর এই কোর্সের পর্ব ১৩ সেটি দেখায়।

মূল উপলব্ধি: Test বলে “এই ইনপুটগুলোতে ঠিক”, প্রমাণ বলে “সব ইনপুটে ঠিক”। যেখানে একটি বিরল ভুলের দাম বিশাল, সেখানে প্রমাণ বিলাসিতা নয়, প্রয়োজন।

প্র ০৪একটি শহরের সাতটি সেতুতে হাঁটার ধাঁধা থেকে কীভাবে আজকের নেটওয়ার্ক আর map অ্যাপের গণিত এলো?

Königsberg (আজকের Kaliningrad) শহরের মাঝ দিয়ে একটি নদী বয়ে যেত, নদীতে দুটি দ্বীপ, আর স্থলভাগ ও দ্বীপগুলো জুড়ে ছিল সাতটি সেতু। প্রচলিত ধাঁধা ছিল: এমনভাবে কি হাঁটা যায় যাতে প্রতিটি সেতু ঠিক একবার পার হওয়া হয়? ১৭৩৬ সালে Leonhard Euler প্রমাণ করেন যে এটি অসম্ভব।

Euler-এর আসল কৃতিত্ব উত্তরটি নয়, পদ্ধতিটি। তিনি লক্ষ করেন যে শহরের মানচিত্র, রাস্তার দৈর্ঘ্য, সেতুর আকার, সবই অপ্রাসঙ্গিক। প্রাসঙ্গিক শুধু কোন ভূখণ্ড কোনটির সঙ্গে কয়টি সেতুতে যুক্ত। আজকের ভাষায়: চারটি বিন্দু (vertex) আর সাতটি রেখা (edge), অর্থাৎ একটি গ্রাফ। এরপর যুক্তি সহজ: হাঁটার মাঝপথের প্রতিটি ভূখণ্ডে যতবার ঢোকেন, ততবার বের হন, তাই সেখানে সেতুর সংখ্যা জোড় হতে হবে। Königsberg-এর চারটি ভূখণ্ডেই সেতুর সংখ্যা বিজোড় (৫, ৩, ৩, ৩), তাই এমন হাঁটা অসম্ভব। এটি অংশ ৫-এর মতোই একটি জোড়-বিজোড় যুক্তি।

এই “অপ্রাসঙ্গিক খুঁটিনাটি বাদ দিয়ে শুধু সংযোগ দেখা” ধারণাই গ্রাফ তত্ত্বের জন্ম, আর আজ এটি সর্বত্র। Internet-এর router আর তাদের সংযোগ একটি গ্রাফ; সবচেয়ে ছোট পথ খোঁজার Dijkstra-র algorithm (প্রকাশ ১৯৫৯) router-এর routing protocol-এ ব্যবহার হয় (Computer Networks কোর্সের পর্ব ২৪)। Map অ্যাপে রাস্তার মোড় বিন্দু, রাস্তা রেখা। বাজারঘরের গুদাম থেকে জেলায় জেলায় ডেলিভারির রুট, software-এর package-গুলোর নির্ভরতা, social network-এর বন্ধুত্ব: সবই গ্রাফ।

মজার ব্যাপার, Euler-এর প্রশ্নের একটি সামান্য বদল, “প্রতিটি বিন্দু ঠিক একবার” (Hamilton path), সম্পূর্ণ ভিন্ন জাতের কঠিন প্রশ্ন। প্রথমটির জন্য দ্রুত পরীক্ষা আছে; দ্বিতীয়টি NP-complete শ্রেণির, যার জন্য কোনো দ্রুত algorithm জানা নেই। পর্ব ৬০-এ এই পার্থক্য দেখবেন।

মূল উপলব্ধি: Discrete গণিতের শক্তি হলো বিমূর্তকরণ: একটি নির্দিষ্ট শহরের ধাঁধা থেকে খুঁটিনাটি বাদ দিলে যে কাঠামো থাকে, তা কোটি কোটি ভিন্ন সমস্যায় একই রকম কাজ করে।

প্র ০৫“বিশুদ্ধ” সংখ্যাতত্ত্বকে একসময় সম্পূর্ণ অব্যবহারিক বলা হতো। কীভাবে তা আজ internet নিরাপত্তার ভিত্তি হলো?

১৯৪০ সালে ইংরেজ গণিতবিদ G. H. Hardy “A Mathematician's Apology” বইয়ে গর্বের সঙ্গে লেখেন যে সংখ্যাতত্ত্বের মতো “আসল” গণিতের কোনো যুদ্ধকালীন বা ব্যবহারিক প্রয়োগ নেই। মৌলিক সংখ্যা, ভাগশেষ, Fermat আর Euler-এর উপপাদ্য: শতাব্দী ধরে এগুলো চর্চা হয়েছে শুধু সৌন্দর্যের জন্য।

কয়েক দশকের মধ্যে ছবিটি উল্টে যায়। ১৯৭৬ সালে Whitfield Diffie আর Martin Hellman দেখান, দুজন মানুষ খোলা চ্যানেলে কথা বলেও একটি গোপন চাবি ভাগ করে নিতে পারেন; এর ভিত্তি discrete logarithm-এর কঠিনতা। ১৯৭৭ সালে Ron Rivest, Adi Shamir আর Leonard Adleman প্রকাশ করেন RSA, যার ভিত্তি দুটি বড় মৌলিকের গুণফলকে ভেঙে মৌলিক দুটি ফিরে পাওয়ার কঠিনতা। পরে জানা যায় যে ব্রিটিশ গোয়েন্দা সংস্থার Clifford Cocks ১৯৭৩ সালেই অনুরূপ ধারণা পেয়েছিলেন, কিন্তু তা গোপন রাখা হয়েছিল এবং প্রকাশ পায় ১৯৯৭ সালে।

আজ ব্রাউজারে তালার চিহ্ন, ব্যাংকের অ্যাপ, মোবাইলে পাঠানো বার্তা: প্রতিটির পেছনে এই ধরনের public-key cryptography, আর সেগুলোর ভেতরে Fermat আর Euler-এর শতাব্দী-পুরোনো উপপাদ্য। Hash function-এর নকশাতেও modular arithmetic আর finite field-এর গণিত আছে। এই কোর্সের মডিউল ৪ আর ৫ সেই গণিত প্রমাণসহ শেখাবে।

তবে একটি জরুরি সতর্কবার্তা, যা পুরো কোর্সে বারবার আসবে: পাঠ্যবইয়ের ছোট সংখ্যার RSA বা Diffie–Hellman শুধু বোঝার জন্য। বাস্তবে এগুলো নিরাপদ হয় বড় key, সঠিক padding আর বহু বছর যাচাই করা library দিয়ে। নিজে cryptography বানিয়ে বাস্তবে ব্যবহার করা বিপজ্জনক। বাস্তব ব্যবহারের নিয়ম Cybersecurity কোর্সের পর্ব ১০-এ।

আরও একটি মোড়: বড় quantum computer তৈরি হলে Shor-এর algorithm (১৯৯৪) RSA আর Diffie–Hellman ভাঙতে পারবে বলে জানা আছে। তাই lattice-এর মতো অন্য গাণিতিক কাঠামোর ওপর নতুন post-quantum পদ্ধতি তৈরি হচ্ছে; ২০২৪ সালের আগস্টে মার্কিন NIST এমন প্রথম তিনটি মানদণ্ড (FIPS 203, 204, 205) প্রকাশ করেছে বলে জানা যায়, আর আরও মানদণ্ডের কাজ চলছে। আবারও, “বিশুদ্ধ” গণিত ব্যবহারিক হয়ে উঠছে।

মূল উপলব্ধি: কোন গণিত কবে কাজে লাগবে, আগে থেকে বলা যায় না। যিনি ভিত্তি বোঝেন, নতুন প্রযুক্তি এলে তিনিই দ্রুত বোঝেন কোথায় নিরাপত্তা আর কোথায় ঝুঁকি।

অনুশীলন

খাতা-কলম নিন। আগে নিজে চেষ্টা করুন, তারপর উত্তর মেলান।

  1. প্রথম নিজের প্রমাণ: প্রমাণ করুন: a আর b দুটিই বিজোড় পূর্ণসংখ্যা হলে a + b জোড়। সংজ্ঞা ১.১ ব্যবহার করুন, আর প্রতিটি ধাপের পাশে কারণ লিখুন।
    1. a বিজোড়, তাই কোনো পূর্ণসংখ্যা j-এর জন্য a = 2j + 1. (শর্ত আর বিজোড়ের সংজ্ঞা)
    2. b বিজোড়, তাই কোনো পূর্ণসংখ্যা k-এর জন্য b = 2k + 1. (শর্ত আর বিজোড়ের সংজ্ঞা; j থেকে আলাদা অক্ষর)
    3. a + b = 2j + 2k + 2 = 2(j + k + 1). (ধাপ ১, ২ আর বিতরণ নিয়ম)
    4. j + k + 1 একটি পূর্ণসংখ্যা। (পূর্ণসংখ্যার যোগফল পূর্ণসংখ্যা)
    5. অতএব a + b জোড়। (জোড়ের সংজ্ঞা) ∎

    সাধারণ ভুল: দুটির জন্য একই অক্ষর নেওয়া (a = 2k + 1, b = 2k + 1). তাতে প্রমাণটি শুধু a = b হলে খাটে।

  2. বাজারঘরের কুপন কোড গোনা: বাজারঘরের প্রতিটি কুপন কোডে প্রথমে ২টি ইংরেজি বড় হাতের অক্ষর (A–Z), তারপর ৩টি অঙ্ক (0–9), যেমন BG417. (ক) মোট কতগুলো কোড সম্ভব? (খ) যদি দুটি অক্ষর একই হতে না পারে (যেমন AA নিষেধ), তাহলে কতগুলো?

    (ক) প্রতিটি অক্ষরের ঘরে ২৬টি, প্রতিটি অঙ্কের ঘরে ১০টি বিকল্প, আর ঘরগুলো স্বাধীন। গুণের নিয়মে 26 × 26 × 10 × 10 × 10 = 676,000টি।

    (খ) প্রথম অক্ষরে ২৬টি, দ্বিতীয়টিতে প্রথমটি বাদে ২৫টি: 26 × 25 × 1000 = 650,000টি। যাচাই: যেসব কোডে দুটি অক্ষর একই, সেগুলো 26 × 1000 = 26,000টি, আর 676,000 − 26,000 = 650,000. দুই পদ্ধতিতে একই উত্তর। (Python-এ itertools.product দিয়ে সব কোড বানিয়ে গুনেও মেলাতে পারেন; ৬ লাখ ছোট string তৈরি করা ব্রাউজারেও সম্ভব।)

  3. আউটপুট অনুমান করুন: চালানোর আগে লিখুন, নিচের Python লাইনটি কী ছাপবে, আর কেন: import math; print(-7 // 2, -7 % 2, math.floor(-2.5), math.ceil(-2.5))

    আউটপুট: -4 1 -3 -2

    Python-এর // হলো floor division: −7/2 = −3.5, আর ⌊−3.5⌋ = −4 (−3 নয়)। % সেই ভাগের সঙ্গে মিল রেখে ভাগশেষ দেয়: −7 = 2 × (−4) + 1, তাই 1; এটি গণিতের নিয়মের (0 ≤ r < 2) সঙ্গে মেলে। ⌊−2.5⌋ = −3 আর ⌈−2.5⌉ = −2. যাঁরা “দশমিক অংশ ফেলে দেওয়া” ভাবেন, তাঁরা −3, −1, −2, −2 লেখেন; সেটি C-এর মতো শূন্যের দিকে কাটার নিয়ম, floor নয়।

  4. প্রমাণের ভুল খুঁজুন: একজন লিখলেন: “দাবি: প্রতিটি n ≥ 1-এর জন্য n² − n + 41 মৌলিক। প্রমাণ: n = 1 থেকে 40 পর্যন্ত Python দিয়ে পরীক্ষা করেছি, সবগুলোই মৌলিক। তাই দাবি সত্য। ∎” ভুলটি কোথায়? দাবিটি কি আসলে সত্য?

    যুক্তির ভুল: সসীম ৪০টি উদাহরণ থেকে অসীম সংখ্যক n-এর দাবিতে লাফ দেওয়া হয়েছে। উদাহরণ যত বেশিই হোক, এটি প্রমাণ নয়।

    দাবিটিও মিথ্যা: n = 41 বসালে 41² − 41 + 41 = 41² = 1681 = 41 × 41, মৌলিক নয়। (আসলে n² − n + 41 = f(n − 1), যেখানে f(n) = n² + n + 41; তাই n = 1 থেকে 40-এ সবই মৌলিক, আর n = 41-এ প্রথম ব্যর্থতা।) সঠিক পদ্ধতি: হয় সব n-এর জন্য খাটে এমন যুক্তি, নয়তো একটি counterexample.

নিজেকে যাচাই করুন

ভুল হলে কারণসহ ব্যাখ্যা পাবেন, আবার চেষ্টাও করতে পারবেন।

ক্রমএকটি নতুন গাণিতিক দাবি নিয়ে কাজ করার ধাপগুলো সঠিক ক্রমে সাজান (▲▼ চেপে সরান)

  1. দাবিটি নিখুঁতভাবে লেখা: শর্ত কী, সিদ্ধান্ত কী
  2. ছোট কয়েকটি উদাহরণ হাতে পরীক্ষা করা
  3. Python দিয়ে অনেক বড় পরিসরে counterexample খোঁজা
  4. Counterexample না পেলে সব ক্ষেত্রে খাটে এমন প্রমাণ লেখা
  5. প্রমাণের প্রতিটি ধাপের কারণ আর প্রতিটি শর্তের ব্যবহার যাচাই করা

নিচের কোনটি স্বভাবতই discrete (আলাদা আলাদা, গোনা যায় এমন) মান?

  • একটি চালের বস্তার ওজন
  • একটি দোকানে একদিনে আসা অর্ডারের সংখ্যা
  • দুপুরের তাপমাত্রা
  • একটি বলের গতি

⌊−2.5⌋-এর মান কত? (⌊x⌋ মানে x-এর সমান বা ছোট সবচেয়ে বড় পূর্ণসংখ্যা)

  • −3
  • −2
  • −2.5
  • 2

f(n) = n² + n + 41 নিয়ে কোন কথাটি সত্য?

  • সব n ≥ 0-এর জন্য f(n) মৌলিক
  • n = 0-তেই f(n) মৌলিক নয়
  • n = 40-এর পর আর কোনো n-এ f(n) মৌলিক নয়
  • n = 0 থেকে 39-এ মৌলিক, কিন্তু n = 40-এ f(n) = 41²

গণিতের সংজ্ঞায় (m > 0 হলে a mod m-এর মান 0 ≤ r < m) −7 mod 3 কত?

  • −1
  • 1
  • 2
  • 3

RSA-এর মতো public-key cryptography গণিতের প্রধানত কোন শাখার ওপর দাঁড়িয়ে?

  • গ্রাফ তত্ত্ব
  • সংখ্যাতত্ত্ব
  • Calculus
  • ইউক্লিডীয় জ্যামিতি

একজন একটি দাবি “প্রতিটি ধনাত্মক পূর্ণসংখ্যা n-এর জন্য P(n) সত্য” কম্পিউটারে n = 1 থেকে 106 পর্যন্ত পরীক্ষা করে কোনো counterexample পাননি। সঠিক সিদ্ধান্ত কোনটি?

  • দাবিটি প্রমাণিত হয়েছে
  • দাবিটি মিথ্যা
  • দাবিটির পক্ষে জোরালো ইঙ্গিত আছে, কিন্তু প্রমাণ এখনো দরকার
  • পরীক্ষাটি অর্থহীন, কারণ কম্পিউটার গণিত বোঝে না

শব্দকোষ

লেখার মধ্যে ডটেড দাগ দেওয়া শব্দে মাউস রাখুন বা চাপুন — অর্থ দেখাবে। এই পর্বের সব নতুন শব্দ এখানে একসাথে:

মনে রাখুন

  1. Discrete মানে আলাদা আলাদা, গোনা যায় এমন মান; কম্পিউটার নিজেই একটি discrete যন্ত্র, তাই তার গণিতও মূলত discrete.
  2. যুক্তি, প্রমাণ, গণনা, সম্ভাবনা, সংখ্যাতত্ত্ব, গ্রাফ আর automata: কম্পিউটার বিজ্ঞানের প্রতিটি শাখায় এদের কোনো না কোনোটি লাগে।
  3. কোর্সের কাঠামো: ভিত্তি (মডিউল ১–৩), তারপর সংখ্যা, গণনা আর কাঠামোর তিন ধারা, শেষে গণনার মডেল আর পরীক্ষার প্রস্তুতি।
  4. সংজ্ঞার প্রতিটি শব্দ গুরুত্বপূর্ণ; উপপাদ্যে শর্ত আর সিদ্ধান্ত আলাদা; প্রমাণের প্রতিটি ধাপে কারণ; উল্টো দাবি আপনাআপনি সত্য নয়।
  5. উদাহরণ সাহস দেয়, একটি counterexample খণ্ডন করে, শুধু প্রমাণ নিশ্চিত করে: n² + n + 41 টানা ৪০ বার মৌলিক, তারপর ব্যর্থ।

পরের পর্বে: বাজারঘরের কুপনের নিয়মে “এবং”, “অথবা”, “যদি… তবে” কী নিখুঁত অর্থ বহন করে, তা দেখব। Proposition, connective আর truth table দিয়ে শুরু হবে যুক্তির গণিত।

আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ

এই পর্বটি শেয়ার করুন:
এই পর্বে ভুল পেয়েছেন? জানান