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

Ring আর field — modular ring, polynomial আর GF(2ⁿ)

Rings and Fields — Modular Rings, Polynomial Rings, Ideals and the Construction of GF(2ⁿ)

Taught in Bangla, this lesson defines rings, units, zero divisors, integral domains and fields, and proves that a finite integral domain is a field. It does polynomial division, Euclid's algorithm and Bézout over fields, studies irreducible polynomials, and builds quotient rings F[x]/(f). GF(16) is constructed from x⁴ + x + 1, with a proof that its multiplicative group is cyclic. CRC, AES bytes, Reed–Solomon and Shamir secret sharing use toy numbers, and in-page Python does the field arithmetic.

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

  • Ring, commutative ring, integral domain আর field-এর নির্ভুল সংজ্ঞা, আর উদাহরণ ও পাল্টা-উদাহরণ দিয়ে তাদের পার্থক্য
  • Unit আর zero divisor চেনা, আর “সসীম integral domain মানেই field” উপপাদ্যের প্রমাণ
  • F[x]-এ division algorithm, polynomial-এর gcd আর Euclid, root-এর সংখ্যার সীমা আর ℤ8-এ তার ভেঙে পড়া
  • Ideal আর quotient ring, আর irreducible polynomial দিয়ে GF(pn) বানানো; irreducible polynomial গোনা
  • Finite field-এর গুণের group কেন cyclic, আর CRC, AES ও Shamir secret sharing-এ এই গণিতের ব্যবহার

১ · Ring কী — যোগ আর গুণের একটি জগৎ

ঘড়ির কাঁটার কথা ভাবুন। ১০টা থেকে ৫ ঘণ্টা পরে ৩টা: এখানে যোগ চলে, কিন্তু সংখ্যা ১২ পেরোলেই আবার শুরুতে ফেরে। এই “ঘড়ির গণিত” আপনি পর্ব ২২-এ শিখেছেন। আবার বাজারঘরের হিসাবরক্ষক টাকার অঙ্কে যোগ-গুণ করেন, প্রোগ্রামার bit-এর ক্রমকে polynomial ধরে XOR করেন, আর গ্রাফিক্সের কোড matrix গুণ করে। চারটি জগৎ আলাদা, কিন্তু নিয়মগুলো আশ্চর্যভাবে এক। গণিতবিদরা এই সাধারণ নিয়মগুলোর নাম দিয়েছেন ring. একবার নিয়ম থেকে কিছু প্রমাণ করলে তা চারটি জগতেই একসঙ্গে সত্য হয়।

আগের পর্ব ৭০ “Group — symmetry, cyclic group আর Lagrange-এর উপপাদ্য”-এ একটি অপারেশনের জগৎ, অর্থাৎ group দেখেছেন। Ring-এ অপারেশন দুটি, আর তাদের মধ্যে একটি সেতু: বণ্টন বিধি।

সংজ্ঞা ১.১ (Ring)

একটি সেট R, দুটি অপারেশন + আর ·, আর দুটি উপাদান 0 ও 1. (R, +, ·) একটি ring, যদি

  1. (R, +) একটি abelian group: যোগ associative আর commutative, 0 হলো identity, আর প্রতিটি a-এর একটি −a আছে;
  2. গুণ associative: (ab)c = a(bc), আর 1 গুণের identity: 1 · a = a · 1 = a;
  3. দুই দিকের বণ্টন বিধি: a(b + c) = ab + ac আর (a + b)c = ac + bc.

সব a, b-তে ab = ba হলে R একটি commutative ring.

খেয়াল করুন, গুণের inverse চাওয়া হয়নি। কিছু বইয়ে 1 থাকা বাধ্যতামূলক নয়; আমরা এই কোর্সে 1-সহ ring ধরছি, তাই অন্য বই পড়ার সময় সংজ্ঞাটি মিলিয়ে নেবেন। চারটি উদাহরণ:

  • ℤ: সাধারণ পূর্ণসংখ্যা, commutative ring. ℚ, ℝ-ও ring.
  • ℤn = {0, 1, …, n − 1}: যোগ আর গুণের পর mod n (পর্ব ২২-এর ℤn). Commutative ring, n উপাদানের।
  • R[x]: কোনো commutative ring R-এর সহগের সব polynomial, সাধারণ নিয়মে যোগ-গুণ। একে polynomial ring বলে; §৩ থেকে এটিই মূল চরিত্র।
  • M2(ℝ): বাস্তব সংখ্যার সব 2 × 2 matrix, matrix গুণ দিয়ে (পর্ব ১৯)। এটি ring, কিন্তু commutative নয়: A = [[0, 1], [0, 0]] আর B = [[0, 0], [1, 0]] নিলে AB = [[1, 0], [0, 0]], অথচ BA = [[0, 0], [0, 1]].

Axiom থেকে স্কুলের কিছু “স্বাভাবিক” নিয়ম প্রমাণ করা যায়। এগুলো ধরে নেওয়া যায় না, কারণ অদ্ভুত ring-এও এদের সত্য হতে হবে।

উপপাদ্য ১.২ (শূন্য দিয়ে গুণ আর চিহ্নের নিয়ম)

যেকোনো ring-এ সব a, b-এর জন্য (ক) a · 0 = 0 · a = 0, (খ) (−a)b = −(ab), (গ) (−1)a = −a.

  1. (ক) 0 + 0 = 0, তাই a · 0 = a · (0 + 0) = a · 0 + a · 0. — বণ্টন বিধি
  2. দুই দিকে −(a · 0) যোগ করলে 0 = a · 0. 0 · a-এর জন্য একই যুক্তি ডান দিকের বণ্টন দিয়ে। — যোগের inverse
  3. (খ) ab + (−a)b = (a + (−a))b = 0 · b = 0, তাই (−a)b হলো ab-এর যোগের inverse, অর্থাৎ −(ab). — বণ্টন আর (ক)
  4. (গ) (খ)-তে a-এর জায়গায় 1 আর b-এর জায়গায় a বসান: (−1)a = −(1 · a) = −a. ∎

২ · Unit, zero divisor, integral domain আর field

Ring-এ ভাগ সবসময় চলে না। কোন উপাদান দিয়ে “ভাগ” করা যায়, সেটি প্রথম প্রশ্ন।

সংজ্ঞা ২.১

Commutative ring R-এ a একটি unit, যদি এমন b থাকে যাতে ab = 1. অশূন্য a একটি zero divisor, যদি এমন অশূন্য b থাকে যাতে ab = 0. যে commutative ring-এ 1 ≠ 0 আর কোনো zero divisor নেই, তা একটি integral domain. যে commutative ring-এ 1 ≠ 0 আর প্রতিটি অশূন্য উপাদান unit, তা একটি field.

ℤ-এ unit শুধু 1 আর −1, আর কোনো zero divisor নেই: ℤ integral domain কিন্তু field নয়। ℤ12-এ ছবিটি অন্যরকম। Unit চারটি: 1, 5, 7, 11, আর মজার ব্যাপার, প্রতিটি নিজেরই inverse (5 · 5 = 25 ≡ 1, 7 · 7 = 49 ≡ 1, 11 · 11 = 121 ≡ 1). বাকি সাতটি অশূন্য উপাদান 2, 3, 4, 6, 8, 9, 10 সবাই zero divisor, যেমন 3 · 4 = 12 ≡ 0 আর 8 · 3 = 24 ≡ 0. মাঝামাঝি কেউ নেই। এটি কাকতালীয় নয়।

উপপাদ্য ২.২ (ℤn-এ দুই ভাগ)

n ≥ 2 আর a ∈ ℤn, a ≠ 0. gcd(a, n) = 1 হলে a একটি unit; gcd(a, n) = d > 1 হলে a একটি zero divisor.

  1. gcd(a, n) = 1 হলে পর্ব ২১-এর Bézout থেকে sa + tn = 1, তাই mod n-এ sa ≡ 1: s হলো a-এর inverse. — Bézout
  2. d > 1 হলে b = n/d নিন। 1 ≤ b < n, তাই b ≢ 0. — d ≥ 2
  3. ab = (a/d) · n, কারণ d ∣ a; তাই ab ≡ 0 (mod n), আর a zero divisor. ∎ — বিভাজ্যতা

বিশেষ করে ℤn-এ unit-এর সংখ্যা ঠিক φ(n) (পর্ব ২৪)। একটি unit কখনো zero divisor হতে পারে না: ab = 1 আর ac = 0 হলে c = (ba)c = b(ac) = 0. ফলে n মৌলিক হলে সব অশূন্য উপাদান unit, আর ℤn field; n যৌগিক হলে zero divisor আছে, field নয়। এই “ℤn field ⇔ n মৌলিক” উপপাদ্যের পূর্ণ প্রমাণ পর্ব ৩০-এ দেখেছেন; এখানে আমরা তার পেছনের সাধারণ কারণটি খুঁজব।

Matrix-এর ring-এও একই দুই দল দেখা যায়, তবে commutative না হওয়ায় একটু সাবধানে। M2(ℝ)-এ A একটি unit (উল্টানো যায়) ঠিক তখন, যখন det A ≠ 0. আর det A = 0 এমন অশূন্য A-এর জন্য এমন অশূন্য B পাওয়া যায় যাতে AB = 0: §১-এর A = [[0, 1], [0, 0]] নিজেই A · A = 0 দেয়। অর্থাৎ শূন্য নয় এমন একটি উপাদানের বর্গ শূন্য, যা সংখ্যার জগতে কল্পনাও করা যায় না।

Integral domain-এর সবচেয়ে কাজের গুণ হলো কাটাকাটি (cancellation): a ≠ 0 আর ab = ac হলে a(b − c) = 0, zero divisor নেই বলে b − c = 0, অর্থাৎ b = c. স্কুলে “দুই দিক থেকে a কেটে দিন” যে নিয়ম মানতেন, তা আসলে এই উপপাদ্য। ℤ12-এ এটি ভাঙে: 3 · 4 = 3 · 8 (দুটোই 0), অথচ 4 ≠ 8.

উপপাদ্য ২.৩ (সসীম integral domain মানেই field)

প্রতিটি সসীম integral domain একটি field.

  1. D সসীম integral domain, a ∈ D অশূন্য। ফাংশন ma: D → D, ma(x) = ax সংজ্ঞায়িত করুন। — গুণের map
  2. ma one-to-one: ax = ay হলে cancellation দিয়ে x = y. — zero divisor নেই
  3. D সসীম, আর সসীম সেট থেকে নিজের ভেতরে one-to-one ফাংশন onto-ও (পর্ব ৩২-এর pigeonhole যুক্তি)। — সসীমতা
  4. তাই কোনো b-এর জন্য ma(b) = ab = 1, অর্থাৎ a একটি unit. সব অশূন্য a-এর জন্য এটি সত্য, তাই D একটি field. ∎

“সসীম” শর্তটি জরুরি: ℤ integral domain, কিন্তু অসীম, আর তার m2(x) = 2x onto নয় (বিজোড় সংখ্যা বাদ পড়ে)। প্রমাণটি আরও একটি জিনিস দেখায়: ℤp (p মৌলিক) field, কারণ সেখানে ab ≡ 0 হলে p ∣ ab, আর Euclid-এর lemma দিয়ে p ∣ a বা p ∣ b. নিচের ছবিটি চারটি শ্রেণির সম্পর্ক দেখায়।

Ring-এর পরিবার: প্রতিটি ভেতরের বাক্স বাইরের বাক্সের বিশেষ রূপ

প্রতি বাক্সে শ্রেণির নাম আর এমন উদাহরণ, যা ঠিক সেই বাক্সে পড়ে, ভেতরেরটিতে নয়।

Ring ⊃ commutative ring ⊃ integral domain ⊃ field, with examples Ring Commutative ring Integral domain Field 2 × 2 matrix: AB ≠ BA ℤ₁₂, ℤ₈: zero divisor আছে ℤ, F[x]: ভাগ সবসময় নয় ℚ, ℝ, ℤ₇ GF(16), GF(2⁸)

৩ · Polynomial ring F[x] — ভাগশেষসহ ভাগ

এখন থেকে F একটি field (প্রায়ই ℤp, যাকে GF(p)-ও লেখা হয়)। F[x]-এর একটি উপাদান f(x) = adxd + ⋯ + a1x + a0, যেখানে ad ≠ 0 হলে d হলো f-এর ঘাত (deg f), আর ad leading coefficient. Leading coefficient 1 হলে f monic. শূন্য polynomial-এর ঘাত সংজ্ঞায়িত নয়।

পূর্ণসংখ্যায় সবচেয়ে কাজের হাতিয়ার ছিল division algorithm (পর্ব ২০): n = qd + r, 0 ≤ r < d. Polynomial-এ “ছোট” মানে ছোট ঘাত। প্রমাণে একটি তথ্য লাগবে: F integral domain বলে দুই অশূন্য polynomial-এর leading coefficient-এর গুণফল অশূন্য, তাই deg(uv) = deg u + deg v.

উপপাদ্য ৩.১ (F[x]-এ division algorithm)

F একটি field, f, g ∈ F[x] আর g ≠ 0. তাহলে ঠিক একজোড়া q, r ∈ F[x] আছে, যাতে f = qg + r, আর r = 0 অথবা deg r < deg g.

  1. অস্তিত্ব, deg f-এর ওপর strong induction. f = 0 বা deg f < deg g হলে q = 0, r = f. — ভিত্তি
  2. নইলে deg f = m ≥ n = deg g, আর f-এর leading coefficient a, g-এর b. b ≠ 0 আর F field, তাই b−1 আছে। f1 = f − (ab−1)xm−ng নিন; xm-এর পদ কেটে যায়, তাই f1 = 0 বা deg f1 < m. — সর্বোচ্চ পদ মোছা
  3. Hypothesis থেকে f1 = q1g + r, আর deg r < n (বা r = 0). তাহলে f = (q1 + ab−1xm−n)g + r. — inductive step
  4. অনন্যতা: q1g + r1 = q2g + r2 হলে (q1 − q2)g = r2 − r1. q1 ≠ q2 হলে বাঁ দিকের ঘাত ≥ deg g, কিন্তু ডান দিকের ঘাত < deg g. বিরোধ, তাই q1 = q2, আর তখন r1 = r2. ∎ — deg(uv) = deg u + deg v

ধাপ ২-এ b−1 লেগেছে, তাই field জরুরি। ℤ[x]-এ x2-কে 2x দিয়ে ভাগ করে ভাগশেষ ঘাত 1-এর কম রাখা যায় না: ভাগফল x/2 হতো, যা ℤ[x]-এ নেই। তবে g monic হলে যেকোনো commutative ring-এ ভাগ চলে, যেমন ℤ[x]-এ x − c দিয়ে।

GF(2)-এ হিসাব সবচেয়ে সহজ: সহগ 0 বা 1, আর 1 + 1 = 0, তাই বিয়োগ মানে যোগ, আর bit-এর ভাষায় XOR. একটি polynomial-কে তার সহগের bit-এ লেখা যায়: x3 + x + 1 = 1011. নিচের stepper এভাবে একটি লম্বা ভাগ করে, ঠিক পর্ব ২৬-এর CRC-এর মতো, তবে এবার ভাগফলও লিখে রাখি।

1f = 1101 0011, g = 10112⊕ x⁴·g = 1011 00003⊕ x³·g = 101 10004⊕ x²·g = 10 11005⊕ x·g  = 1 01106q = 11110, r = 1
চলতি ভাগশেষ আর ভাগফল
ভাগশেষ
ঘাত
ভাগফল
  1. Bit-এ লেখা। f = x7 + x6 + x4 + x + 1 = 1101 0011 আর g = x3 + x + 1 = 1011. ঘাত 7 ≥ 3, তাই ভাগ চলবে। প্রতি ধাপে বাঁয়ের প্রথম 1-এর নিচে g বসিয়ে XOR.
  2. প্রথম ধাপ। x7 মুছতে x4 · g = 1011 0000 XOR করুন: 1101 0011 ⊕ 1011 0000 = 0110 0011, অর্থাৎ x6 + x5 + x + 1. ভাগফলে x4.
  3. দ্বিতীয় ধাপ। এখন সর্বোচ্চ x6, তাই x3 · g = 101 1000: 110 0011 ⊕ 101 1000 = 011 1011 = x5 + x4 + x3 + x + 1. ভাগফলে x3 যোগ হলো।
  4. তৃতীয় ধাপ। x2 · g = 10 1100: 11 1011 ⊕ 10 1100 = 01 0111 = x4 + x2 + x + 1. ভাগফলে x2.
  5. চতুর্থ ধাপ। x · g = 1 0110: 1 0111 ⊕ 1 0110 = 0 0001 = 1. ঘাত 0, যা deg g = 3-এর কম, তাই থামুন।
  6. ফল। q = x4 + x3 + x2 + x (bit-এ 11110) আর r = 1. ভাগশেষ অশূন্য, তাই g ∤ f. CRC-এর ভাষায়: f যদি একটি পাঠানো codeword হতো, প্রাপক বুঝতেন পথে ভুল ঢুকেছে। (নিচের কোডে q · g + r = f যাচাই করা আছে।)

বাজারঘরের দৃষ্টিতে এই ভাগের মানে কী? ধরুন ঢাকা অফিস থেকে চট্টগ্রাম গুদামে একটি অর্ডারের bit-ক্রম যাচ্ছে। প্রেরক এমনভাবে কয়েকটি bit জুড়ে দেন যাতে পুরো ক্রমের polynomial g-এর গুণিতক হয়। গুদামের কম্পিউটার শুধু এই লম্বা ভাগটি চালায়: ভাগশেষ 0 হলে ক্রমটি গ্রহণ করে, অন্য কিছু হলে আবার পাঠাতে বলে। পুরো কাজটি XOR আর shift, যা হার্ডওয়্যারে কয়েকটি গেট দিয়েই করা যায়; এজন্যই Ethernet-এর মতো অনেক নেটওয়ার্কের frame-এ এমন একটি পরীক্ষা থাকে।

৪ · Polynomial-এর gcd — Euclid আবার

Division algorithm থাকলেই Euclid চলে, কারণ পর্ব ২১-এর প্রমাণে শুধু এটুকুই লেগেছিল। F[x]-এ f আর g-এর gcd হলো এমন monic polynomial d, যা দুটিকেই ভাগ করে আর তাদের প্রতিটি সাধারণ ভাজক d-কেও ভাগ করে।

উপপাদ্য ৪.১ (F[x]-এ Euclid আর Bézout)

f, g ∈ F[x], g ≠ 0, আর f = qg + r. তাহলে f ও g-এর সাধারণ ভাজক আর g ও r-এর সাধারণ ভাজক একই সেট, তাই gcd(f, g) = gcd(g, r). এই ধাপ বারবার চালালে ভাগশেষের ঘাত প্রতিবার কমে, তাই সসীম ধাপে ভাগশেষ 0 হয়; শেষ অশূন্য ভাগশেষকে monic করলে gcd. তাছাড়া এমন s, t ∈ F[x] আছে যাতে sf + tg = gcd(f, g).

প্রমাণ পূর্ণসংখ্যার মতো হুবহু: d ∣ f আর d ∣ g হলে d ∣ f − qg = r; উল্টোভাবে d ∣ g আর d ∣ r হলে d ∣ qg + r = f. ঘাত একটি অঋণাত্মক পূর্ণসংখ্যা, আর প্রতি ধাপে কঠোরভাবে কমে, তাই প্রক্রিয়া থামে (পর্ব ১১-এর well-ordering). Bézout-এর s, t পেছনে হেঁটে আসে, extended Euclid-এর মতোই। ∎ এবার GF(3)-এ একটি উদাহরণ, যেখানে সহগ 0, 1, 2 আর হিসাব mod 3; একমাত্র নতুন জিনিস হলো leading coefficient 2 হলে তার inverse লাগে, আর 2 · 2 = 4 ≡ 1, তাই 2−1 = 2.

1a = x⁴+2x³+x²+2x+22b = x³+2x²+2x+13a = x·b + (2x²+x+2)4b = 2x·r₁ + (x+1)5r₁ = (2x+2)(x+1) + 06gcd = x + 1
প্রতিটি ভাগ (সহগ mod 3)
ভাজ্য
ভাজক
ভাগফল
ভাগশেষ
  1. শুরু। a = x4 + 2x3 + x2 + 2x + 2 আর b = x3 + 2x2 + 2x + 1, সহগ GF(3)-এ। মনে রাখুন −1 ≡ 2 আর −2 ≡ 1.
  2. প্রথম ভাগ। x4/x3 = x. x · b = x4 + 2x3 + 2x2 + x. a − x · b = (1 − 2)x2 + (2 − 1)x + 2 = 2x2 + x + 2. এটিই r1.
  3. দ্বিতীয় ভাগ। b-কে r1 দিয়ে। x3/(2x2) = 2−1x = 2x. 2x · r1 = 4x3 + 2x2 + 4x ≡ x3 + 2x2 + x. b থেকে বিয়োগ: (2x − x) + 1 = x + 1.
  4. তৃতীয় ভাগ। r1-কে x + 1 দিয়ে: (2x + 2)(x + 1) = 2x2 + 4x + 2 ≡ 2x2 + x + 2 = r1. ভাগশেষ 0, তাই Euclid থামে।
  5. উত্তর আর যাচাই। শেষ অশূন্য ভাগশেষ x + 1, যা আগে থেকেই monic, তাই gcd = x + 1. যাচাই: x + 1-এর root x = −1 = 2. a(2) = 16 + 16 + 4 + 4 + 2 = 42 ≡ 0 আর b(2) = 8 + 8 + 4 + 1 = 21 ≡ 0 (mod 3). দুটিই মেলে।

নিচের ব্লক GF(p)[x]-এর জন্য ভাগ আর gcd লেখে, দুই stepper-এর উত্তর মেলায়, আর পরের অংশের একটি চমক আগে দেখিয়ে রাখে। Polynomial রাখা হয়েছে সহগের list-এ, ছোট ঘাত আগে: [1, 1, 0, 1] মানে 1 + x + x3. Python-এর pow(b, -1, p) সরাসরি mod p-এর inverse দেয়। প্রথমবার চালালে ব্রাউজারে Python (Pyodide) নামতে কয়েক সেকেন্ড লাগে।

def trim(a):                              # coefficients, lowest degree first
    while a and a[-1] == 0: a = a[:-1]
    return a
def pdivmod(a, b, p):                     # division algorithm in GF(p)[x]
    a, q = trim([c % p for c in a]), [0] * len(a)
    inv = pow(b[-1], -1, p)               # leading coefficient must be a unit
    while len(a) >= len(b):
        s, c = len(a) - len(b), a[-1] * inv % p
        q[s] = c
        a = trim([(x - c * b[i - s]) % p if 0 <= i - s < len(b) else x
                  for i, x in enumerate(a)])
    return trim(q), a
def pgcd(a, b, p):                        # Euclid, then make it monic
    while trim(b):
        a, b = b, pdivmod(a, b, p)[1]
    return [c * pow(a[-1], -1, p) % p for c in a]
def mul(a, b, p):
    r = [0] * (len(a) + len(b) - 1)
    for i, x in enumerate(a):
        for j, y in enumerate(b): r[i + j] = (r[i + j] + x * y) % p
    return trim(r)
def add(a, b, p):
    n = max(len(a), len(b)); a, b = a + [0]*(n - len(a)), b + [0]*(n - len(b))
    return trim([(x + y) % p for x, y in zip(a, b)])
def show(a):                              # [1, 0, 2] -> "2x^2 + 1"
    t = [(str(c) if c > 1 or i == 0 else "") + ("x^%d" % i if i > 1 else "x" * i)
         for i, c in reversed(list(enumerate(a))) if c]
    return " + ".join(t) or "0"
f, g = [1, 1, 0, 0, 1, 0, 1, 1], [1, 1, 0, 1]   # x^7+x^6+x^4+x+1, x^3+x+1
q, r = pdivmod(f, g, 2); ok = add(mul(q, g, 2), r, 2) == f
print("GF(2): q =", show(q), "| r =", show(r), "| q*g + r == f:", ok)
a, b = [2, 2, 1, 2, 1], [1, 2, 2, 1]             # over GF(3)
print("GF(3): gcd(", show(a), ",", show(b), ") =", show(pgcd(a, b, 3)))
for n in (7, 8, 15):                             # roots of x^2 - 1 in Z_n
    print(f"x^2 - 1 in Z_{n}: roots", [x for x in range(n) if (x * x - 1) % n == 0])

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

GF(2): q = x^4 + x^3 + x^2 + x | r = 1 | q*g + r == f: True
GF(3): gcd( x^4 + 2x^3 + x^2 + 2x + 2 , x^3 + 2x^2 + 2x + 1 ) = x + 1
x^2 - 1 in Z_7: roots [1, 6]
x^2 - 1 in Z_8: roots [1, 3, 5, 7]
x^2 - 1 in Z_15: roots [1, 4, 11, 14]

প্রথম লাইন প্রথম stepper: ভাগফল x4 + x3 + x2 + x, ভাগশেষ 1, আর q · g + r আবার f দেয়। দ্বিতীয় লাইন দ্বিতীয় stepper-এর gcd = x + 1. pdivmod-এ pow(b[-1], -1, p) লাইনটিই উপপাদ্য ৩.১-এর ধাপ ২: ভাজকের leading coefficient-এর inverse. শেষ তিন লাইন দেখার মতো। ℤ7-এ x2 − 1-এর root দুটি (1 আর 6 = −1), যা 2 ঘাতের polynomial-এর কাছে প্রত্যাশিত। কিন্তু ℤ8-এ চারটি, ℤ15-এও চারটি। পরের অংশে দেখবেন কেন field-এ এমন হতে পারে না।

৫ · Root, factor আর irreducible polynomial

c ∈ F হলো f-এর root, যদি f(c) = 0. ভাগের উপপাদ্যের প্রথম ফল:

উপপাদ্য ৫.১ (Factor theorem)

f ∈ F[x] আর c ∈ F. f(c) = 0 ⇔ (x − c) ∣ f.

প্রমাণ: f-কে x − c দিয়ে ভাগ করুন: f = q · (x − c) + r, যেখানে r = 0 বা deg r < 1, অর্থাৎ r একটি ধ্রুবক। x = c বসালে f(c) = r. তাই f(c) = 0 ⇔ r = 0 ⇔ (x − c) ∣ f. ∎

উপপাদ্য ৫.২ (root-এর সংখ্যা)

F একটি field (আসলে integral domain হলেই চলে), আর f ∈ F[x] একটি d ঘাতের অশূন্য polynomial. তাহলে F-এ f-এর বড়জোর d-টি আলাদা root আছে।

  1. d-এর ওপর induction. d = 0: f একটি অশূন্য ধ্রুবক, কোনো root নেই। — ভিত্তি
  2. d ≥ 1 আর f-এর কোনো root না থাকলে কিছু প্রমাণের নেই। নইলে একটি root c নিন; factor theorem থেকে f = (x − c)g, আর deg g = d − 1. — উপপাদ্য ৫.১
  3. c′ ≠ c আরেকটি root হলে 0 = f(c′) = (c′ − c) · g(c′). c′ − c ≠ 0, আর zero divisor নেই, তাই g(c′) = 0. — integral domain
  4. তাই f-এর root-এর সেট ⊆ {c} ∪ (g-এর root), আর hypothesis থেকে g-এর root বড়জোর d − 1টি। মোট বড়জোর 1 + (d − 1) = d. ∎

ধাপ ৩-ই সব। ℤ8-এ x2 − 1 = (x − 1)(x + 1), আর x = 3 বসালে (3 − 1)(3 + 1) = 2 · 4 = 8 ≡ 0, অথচ কোনো উৎপাদকই 0 নয়। ℤ8-এর zero divisor 2 আর 4 ধাপ ৩-কে ভেঙে দেয়, ফলে চারটি root: 1, 3, 5, 7. আরেকটি অদ্ভুত ফল: ℤ8[x]-এ x2 − 1 = (x − 1)(x + 1) = (x − 3)(x + 3), অর্থাৎ উৎপাদকে ভাঙা আর অনন্য নয়। একটি সতর্কতা: উপপাদ্যটি ভিন্ন root গোনে; GF(2)-এ x2 + 1 = (x + 1)2-এর root একটিই (1), তবু ঘাত 2.

সংজ্ঞা ৫.৩ আর উপপাদ্য ৫.৪

ঘাত ≥ 1-এর f ∈ F[x] irreducible, যদি f = uv হলে u বা v ধ্রুবক হয়, অর্থাৎ f-কে দুটি ছোট ঘাতের polynomial-এর গুণফলে ভাঙা যায় না। উপপাদ্য: ঘাত 2 বা 3-এর f irreducible ⇔ F-এ f-এর কোনো root নেই।

প্রমাণ: f = uv, দুটিরই ঘাত ≥ 1 হলে ঘাতের যোগ 2 বা 3, তাই একটির ঘাত ঠিক 1, ধরুন u = ax + b, a ≠ 0. তখন c = −b · a−1 হলো u-এর, তাই f-এর root. উল্টোভাবে root c থাকলে (x − c) ∣ f, আর f ভেঙে যায়। ∎ ঘাত 4-এ এই সহজ পরীক্ষা ভুল: GF(2)-এ x4 + x2 + 1-এর কোনো root নেই (x = 0 আর x = 1-এ মান 1), অথচ এটি (x2 + x + 1)2. Irreducible polynomial ℤ-এর মৌলিক সংখ্যার ভূমিকা নেয়: F[x]-এ প্রতিটি monic polynomial monic irreducible-দের গুণফলে অনন্যভাবে ভাঙে, ঠিক পূর্ণসংখ্যার মতো।

৬ · Ideal আর quotient ring — ℤ/nℤ থেকে F[x]/(f)

ℤn আসলে কোথা থেকে আসে? পর্ব ৫৫-এ দেখেছেন, “a ≡ b (mod n)” একটি equivalence relation, আর ℤn-এর প্রতিটি উপাদান একটি equivalence class, যেমন [3] = {…, −9, 3, 15, …}. এই class-গুলোর মধ্যে যোগ-গুণ চলে, কারণ যে সেট দিয়ে আমরা “ভাগ” করছি, সেই nℤ = {…, −n, 0, n, 2n, …}-এর একটি বিশেষ গুণ আছে।

সংজ্ঞা ৬.১ (Ideal আর quotient ring)

Commutative ring R-এর একটি উপসেট I একটি ideal, যদি (ক) 0 ∈ I, আর a, b ∈ I হলে a − b ∈ I; (খ) a ∈ I আর r ∈ R হলে ra ∈ I (ভেতরের উপাদানকে বাইরের যেকোনো কিছু দিয়ে গুণ করলেও ভেতরে থাকে)। তখন a ~ b ⇔ a − b ∈ I একটি equivalence relation, আর class-গুলোর সেট R/I-এ [a] + [b] = [a + b], [a][b] = [ab] দিয়ে একটি ring পাওয়া যায়: quotient ring.

গুণ কেন well-defined, অর্থাৎ class-এর প্রতিনিধি বদলালে ফল বদলায় না? a ~ a′ আর b ~ b′ হলে a′b′ − ab = a′(b′ − b) + (a′ − a)b, আর (খ) অনুযায়ী দুটি পদই I-এ, তাই যোগফলও I-এ। এই এক লাইনের জন্যই ideal-এর সংজ্ঞায় (খ) রাখা হয়েছে। ℤ-এ nℤ একটি ideal, আর ℤ/nℤ ঠিক ℤn. আসলে ℤ-এর প্রতিটি ideal এমনই: I ≠ {0} হলে I-এর সবচেয়ে ছোট ধনাত্মক উপাদান n নিন; যেকোনো a ∈ I-কে a = qn + r লিখলে r = a − qn ∈ I আর 0 ≤ r < n, তাই r = 0, অর্থাৎ I = nℤ. হুবহু একই যুক্তিতে F[x]-এর প্রতিটি ideal হলো একটি polynomial-এর সব গুণিতক, (f) = {gf : g ∈ F[x]}, যেখানে f হলো I-এর সবচেয়ে ছোট ঘাতের উপাদান।

F[x]/(f)-এর প্রতিটি class-এ ঠিক একটি প্রতিনিধি আছে যার ঘাত deg f-এর কম (division algorithm-এর ভাগশেষ)। তাই f-এর ঘাত n আর F = GF(p) হলে F[x]/(f)-এর উপাদান সংখ্যা pn: n-টি সহগ, প্রতিটির p রকম মান। এখন মূল উপপাদ্য, যা ℤn-এর গল্পের হুবহু অনুবাদ।

উপপাদ্য ৬.২ (কখন F[x]/(f) একটি field)

F একটি field আর deg f ≥ 1. F[x]/(f) একটি field ⇔ f irreducible.

  1. (⇐) [g] ≠ 0, অর্থাৎ f ∤ g. gcd(f, g) হলো f-এর একটি monic ভাজক; f irreducible বলে তা 1 অথবা f-এর monic রূপ, আর দ্বিতীয়টি হলে f ∣ g হতো। তাই gcd = 1. — irreducible-এর সংজ্ঞা
  2. উপপাদ্য ৪.১-এর Bézout: sg + tf = 1. Class নিলে [s][g] = [1], কারণ tf ∈ (f). তাই [g]-এর inverse [s]. — Bézout
  3. (⇒) f irreducible না হলে f = uv, যেখানে 1 ≤ deg u, deg v < deg f. তখন [u] ≠ 0, [v] ≠ 0, কিন্তু [u][v] = [f] = 0: zero divisor, তাই field নয়। ∎ — উপপাদ্য ২.২-এর প্রমাণের মতো

তাই GF(pn) বানাতে একটি n ঘাতের irreducible polynomial দরকার। এমন কি সবসময় আছে, আর কয়টি? GF(2)-এ ছোট ঘাতে brute force করা যায়: n ঘাতের প্রতিটি polynomial-কে 1 থেকে ⌊n/2⌋ ঘাতের সব polynomial দিয়ে ভাগ করে দেখা (কোনো উৎপাদক থাকলে অন্তত একটির ঘাত ≤ n/2). ফলাফল একটি সুন্দর সূত্রের সঙ্গে মেলে, যা Möbius function μ ব্যবহার করে (μ(1) = 1; d যদি k-টি আলাদা মৌলিকের গুণফল হয় তবে μ(d) = (−1)k; কোনো মৌলিকের বর্গ d-কে ভাগ করলে μ(d) = 0).

উপপাদ্য ৬.৩ (Gauss-এর গণনা; বিবৃতি)

GF(q)-এর ওপর n ঘাতের monic irreducible polynomial-এর সংখ্যা

Nq(n) = (1/n) ∑d ∣ n μ(d) qn/d.

সূত্রটি Gauss-এর নামে পরিচিত; তাঁর জীবদ্দশায় অপ্রকাশিত লেখায় এটি ছিল বলে উল্লেখ করা হয়। যেমন N2(4) = (24 − 22)/4 = 3 আর N3(2) = (9 − 3)/2 = 3. সূত্রের উৎস একটি অভেদ: xqn − x হলো সেই সব monic irreducible-এর গুণফল, যাদের ঘাত n-কে ভাগ করে; ঘাত তুলনা করলে ∑d ∣ n d · Nq(d) = qn, আর Möbius inversion বাকিটা দেয়। এর পূর্ণ প্রমাণ এখানে বাদ। একটি সহজ ফল: মোটামুটি Nq(n) ≈ qn/n, তাই এলোমেলো একটি monic polynomial প্রায় 1/n সম্ভাবনায় irreducible, যেমন এলোমেলো একটি সংখ্যা N মোটামুটি 1/ln N সম্ভাবনায় মৌলিক। সূত্রটি ধনাত্মক, তাই প্রতিটি n-এ irreducible আছে, আর GF(pn) সবসময় বানানো যায়।

def pmod(f, g):                  # GF(2)[x] as int bits: 0b1011 = x^3 + x + 1
    while f.bit_length() >= g.bit_length():
        f ^= g << (f.bit_length() - g.bit_length())
    return f
def irreducible(f):              # no factor of degree 1 .. deg(f)//2
    d = f.bit_length() - 1
    return all(pmod(f, g) for g in range(2, 1 << (d // 2 + 1)))
def mobius(n):
    r, k = 1, 2
    while k * k <= n:
        if n % k == 0:
            n //= k
            if n % k == 0: return 0
            r = -r
        k += 1
    return -r if n > 1 else r
def gauss(n, q=2):               # number of monic irreducibles of degree n
    return sum(mobius(d) * q ** (n // d) for d in range(1, n + 1) if n % d == 0) // n
for n in range(1, 7):
    found = [f for f in range(1 << n, 1 << (n + 1)) if irreducible(f)]
    show = [bin(f)[2:] for f in found] if n <= 4 else "..."
    print(f"degree {n}: brute force {len(found)}, Gauss {gauss(n)}  {show}")
sq = 0b111 ^ (0b111 << 1) ^ (0b111 << 2)   # (x^2+x+1)*(x^2+x+1), XOR shifts
f = 0b10101                      # x^4 + x^2 + 1
print("x^4+x^2+1: roots in GF(2):", [x for x in (0, 1) if pmod(f, 0b10 | x) == 0],
      "| irreducible:", irreducible(f), "| equals (x^2+x+1)^2:", f == sq)
print("degree 8 by Gauss:", gauss(8), "  over GF(3), degree 2:", gauss(2, 3))

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

degree 1: brute force 2, Gauss 2  ['10', '11']
degree 2: brute force 1, Gauss 1  ['111']
degree 3: brute force 2, Gauss 2  ['1011', '1101']
degree 4: brute force 3, Gauss 3  ['10011', '11001', '11111']
degree 5: brute force 6, Gauss 6  ...
degree 6: brute force 9, Gauss 9  ...
x^4+x^2+1: roots in GF(2): [] | irreducible: False | equals (x^2+x+1)^2: True
degree 8 by Gauss: 30   over GF(3), degree 2: 3

এখানে polynomial একটি পূর্ণসংখ্যার bit, যেমন 0b1011 = x3 + x + 1, আর pmod শুধু XOR আর shift দিয়ে ভাগশেষ নেয়। ঘাত 1 থেকে 6 পর্যন্ত brute force আর Gauss-এর সূত্র ছয়বারই মেলে: 2, 1, 2, 3, 6, 9. ঘাত 4-এর তিনটি: 10011 (x4 + x + 1), 11001 আর 11111; এদের প্রথমটি দিয়ে §৭-এ GF(16) বানাব। পরের লাইন উপপাদ্য ৫.৪-এর সীমা দেখায়: x4 + x2 + 1-এর কোনো root নেই, তবু irreducible নয়, কারণ এটি (x2 + x + 1)2. শেষ লাইন: AES-এর ঘাত 8-এ 30টি irreducible থেকে একটি বেছে নেওয়া হয়েছে, আর GF(3)-এ ঘাত 2-এর irreducible তিনটি (x2 + 1, x2 + x + 2, x2 + 2x + 2). Brute force-এ ঘাত n-এ প্রায় 2n · 2n/2 ভাগ লাগে, তাই বড় ঘাতে বাস্তবে Rabin-এর মতো দ্রুত পরীক্ষা চলে।

৭ · GF(16) নির্মাণ — আর গুণের group কেন cyclic

F = GF(2), f = x4 + x + 1 (irreducible, উপরের তালিকা)। উপপাদ্য ৬.২ অনুযায়ী GF(2)[x]/(f) একটি field, যার উপাদান ঘাত 3 পর্যন্ত সব polynomial, অর্থাৎ 4 bit-এর ১৬টি string: এটিই GF(16) = GF(24). যোগ মানে XOR. গুণের নিয়ম: সাধারণভাবে গুণ করুন, তারপর f দিয়ে ভাগশেষ নিন। হাতে করার কৌশল হলো f(x) = 0 থেকে পাওয়া সম্পর্ক x4 = x + 1 (mod 2-এ −1 = 1). পর্ব ৩০-এ AES-এর GF(28)-এ ঠিক এভাবেই {57} · {83} গুণ করেছেন; এখানে ছোট field-এ পুরো গঠনটি দেখব।

1a = 1101, b = 101121101 ⊕ 1 1010 ⊕ 110 10003= 111 1111 (ঘাত 6)4⊕ x²·f = 100 11005⊕ x·f  = 10 01106⊕ f    = 1 0011 → 0110
চলতি মান
মান
সর্বোচ্চ ঘাত
  1. উপাদান। a = x3 + x2 + 1 = 1101 আর b = x3 + x + 1 = 1011. Modulus f = x4 + x + 1 = 1 0011.
  2. আংশিক গুণফল। b-এর 1-bit তিনটি ঘাতে: 0, 1, 3. তাই a · 1 = 1101, a · x = 1 1010, a · x3 = 110 1000.
  3. XOR-এ যোগ। 000 1101 ⊕ 001 1010 ⊕ 110 1000 = 111 1111, অর্থাৎ x6 + x5 + x4 + x3 + x2 + x + 1. ঘাত 6, চার bit-এ ধরে না।
  4. x6 মোছা। x2 · f = 100 1100 XOR করুন: 111 1111 ⊕ 100 1100 = 011 0011 = x5 + x4 + x + 1.
  5. x5 মোছা। x · f = 10 0110: 11 0011 ⊕ 10 0110 = 01 0101 = x4 + x2 + 1.
  6. x4 মোছা। f = 1 0011: 1 0101 ⊕ 1 0011 = 0 0110 = x2 + x. যাচাইয়ের আরেক পথ: নিচের কোডের ঘাতের তালিকায় 1101 = x13 আর 1011 = x7, তাই গুণফল x20 = x15 · x5 = x5 = 0110. দুই পথ মেলে।

শেষ ধাপের “ঘাতের তালিকা” কৌশলটি কাজ করে, কারণ GF(16)-এর প্রতিটি অশূন্য উপাদান x-এর কোনো ঘাত। এটি একটি সাধারণ উপপাদ্যের বিশেষ রূপ। F* দিয়ে F-এর অশূন্য উপাদানের সেট বোঝাই; গুণের সাপেক্ষে এটি একটি group, যাকে multiplicative group বলে।

উপপাদ্য ৭.১ (finite field-এর গুণের group cyclic)

F একটি finite field, |F| = q. তাহলে F* একটি cyclic group: এমন g আছে যার ঘাত g, g2, …, gq−1 = 1 ঠিক সব অশূন্য উপাদান। এমন g-কে primitive element বা generator বলে, আর এদের সংখ্যা φ(q − 1).

প্রমাণের রূপরেখা (পর্ব ৭০-এর Lagrange আর উপপাদ্য ৫.২ মিলিয়ে):

  1. প্রতিটি a ∈ F*-এর order q − 1-কে ভাগ করে (Lagrange). d ∣ q − 1-এর জন্য ψ(d) = order ঠিক d এমন উপাদানের সংখ্যা। তাহলে ∑d ∣ q−1 ψ(d) = q − 1. — প্রতিটি উপাদান একবার গোনা
  2. order d-এর একটি a থাকলে 1, a, …, ad−1 হলো xd − 1-এর d-টি আলাদা root; উপপাদ্য ৫.২ অনুযায়ী আর কোনো root নেই। তাই order d-এর প্রতিটি উপাদান a-এর কোনো ঘাত ak, আর ak-এর order d ⇔ gcd(k, d) = 1. ফলে ψ(d) = 0 অথবা φ(d). — field-এ root-এর সীমা
  3. পরিচিত অভেদ ∑d ∣ m φ(d) = m (m = q − 1). ধাপ ১ আর ২ মিলিয়ে q − 1 = ∑ ψ(d) ≤ ∑ φ(d) = q − 1, তাই প্রতিটি d-তে ψ(d) = φ(d). বিশেষ করে ψ(q − 1) = φ(q − 1) ≥ 1. ∎ — সমতা জোর করে আসে

ধাপ ২-এ field ছাড়া প্রমাণ চলত না, তাই ℤ8-এর unit-group {1, 3, 5, 7} cyclic নয় (প্রতিটির বর্গ 1, ঠিক §৫-এর চার root). q = p মৌলিক হলে এটিই পর্ব ২৪-এর primitive root-এর অস্তিত্ব। নিচের কোড GF(16)-এ সব দাবি পরীক্ষা করে।

M = 0b10011                       # x^4 + x + 1, irreducible over GF(2)
def mul(a, b, m=M):               # multiply two polynomials mod m
    r, top = 0, 1 << (m.bit_length() - 1)
    while b:
        if b & 1: r ^= a
        b >>= 1; a <<= 1
        if a & top: a ^= m        # degree of m appeared: subtract (XOR) m
    return r
def order(a, m=M):                # smallest k >= 1 with a^k = 1
    x, k = a, 1
    while x != 1: x, k = mul(x, a, m), k + 1
    return k
print("1101 * 1011 =", format(mul(0b1101, 0b1011), "04b"))
powers, x = [], 1
for k in range(15):               # powers of x = 0b0010
    powers.append(format(x, "04b")); x = mul(x, 0b10)
print("x^0..x^14:", " ".join(powers))
print("all 15 nonzero elements appear:", len(set(powers)) == 15)
orders = {a: order(a) for a in range(1, 16)}
print("element orders:", sorted(orders.values()))
gens = [format(a, "04b") for a in orders if orders[a] == 15]
print("generators:", len(gens), gens)
inv = {a: b for a in range(1, 16) for b in range(1, 16) if mul(a, b) == 1}
print("every nonzero element has an inverse:", len(inv) == 15,
      "| inverse of 0100:", format(inv[0b100], "04b"))
M2 = 0b11111                      # x^4+x^3+x^2+x+1: also irreducible
print("mod x^4+x^3+x^2+x+1: order of x =", order(0b10, M2))
print("AES field (mod 0x11B): order of 02 =", order(2, 0x11B),
      "| order of 03 =", order(3, 0x11B))

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

1101 * 1011 = 0110
x^0..x^14: 0001 0010 0100 1000 0011 0110 1100 1011 0101 1010 0111 1110 1111 1101 1001
all 15 nonzero elements appear: True
element orders: [1, 3, 3, 5, 5, 5, 5, 15, 15, 15, 15, 15, 15, 15, 15]
generators: 8 ['0010', '0011', '0100', '0101', '1001', '1011', '1101', '1110']
every nonzero element has an inverse: True | inverse of 0100: 1101
mod x^4+x^3+x^2+x+1: order of x = 5
AES field (mod 0x11B): order of 02 = 51 | order of 03 = 255

প্রথম লাইন stepper-এর ফল 0110. দ্বিতীয় লাইন x0 থেকে x14: ১৫টি আলাদা 4-bit string, অর্থাৎ x একটি primitive element, আর x4 = 0011 = x + 1 ঠিক আমাদের নিয়ম। Order-এর তালিকা প্রমাণের ধাপ ৩ হাতে-কলমে দেখায়: order 1-এর 1টি, 3-এর 2টি, 5-এর 4টি, 15-এর 8টি, অর্থাৎ φ(1), φ(3), φ(5), φ(15), যোগ 15. Generator আটটি = φ(15). প্রতিটি অশূন্য উপাদানের inverse আছে; 0100 = x2-এর inverse 1101 = x13, কারণ x2 · x13 = x15 = 1. শেষ দুই লাইন একটি সূক্ষ্ম পার্থক্য দেখায়। x4 + x3 + x2 + x + 1-ও irreducible, তাই তা দিয়েও GF(16) হয়, কিন্তু সেখানে x-এর order মাত্র 5: x তখন generator নয়। যে irreducible polynomial-এর root x নিজেই generator, তাকে primitive polynomial বলে; x4 + x + 1 primitive, দ্বিতীয়টি নয়। AES-এর modulus-ও primitive নয়: সেখানে {02}-এর order 51, আর {03}-এর order 255, তাই AES-এর হিসাবে generator হিসেবে {03} ব্যবহৃত হয়।

এই ঘাতের তালিকা বাস্তবেও কাজে লাগে। একবার “log table” (উপাদান থেকে তার ঘাত) আর “antilog table” (ঘাত থেকে উপাদান) বানিয়ে রাখলে দুটি অশূন্য উপাদানের গুণ মানে দুটি log যোগ করে mod 15 নেওয়া, আর inverse মানে 15 থেকে log বিয়োগ। বাজারের হিসাবে logarithm table দিয়ে গুণকে যোগে বদলানোর পুরোনো কৌশলের এটি সসীম রূপ, তবে এখানে কোনো আসন্ন মান নেই, সব নির্ভুল। অনেক error-correcting code-এর সফটওয়্যার GF(28)-এ এমন ২৫৬ ঘরের টেবিল ব্যবহার করে বলে বর্ণিত। Cryptography-তে অবশ্য টেবিল-দেখা গোপন ডেটার ওপর নির্ভর করলে cache-এর সময় থেকে তথ্য ফাঁস হতে পারে, তাই সেখানে সতর্ক বাস্তবায়ন লাগে।

৮ · প্রয়োগ — CRC, AES, Reed–Solomon আর Shamir

CRC. পর্ব ২৬-এ দেখেছেন, CRC বার্তা M(x)-কে xr দিয়ে গুণ করে r ঘাতের generator G(x) দিয়ে ভাগ করে, আর ভাগশেষ জুড়ে দেয়, যাতে পাঠানো polynomial T(x) হয় G-এর গুণিতক। এখন ভাষাটি পরিষ্কার: T হলো GF(2)[x]-এর ideal (G)-এর সদস্য, আর ভুল E(x) ধরা পড়ে না ঠিক তখন, যখন E ∈ (G). একটি bit উল্টালে E = xi. xi-এর ভাজক শুধু xj ধরনের একক পদ (অনন্য উৎপাদকে ভাঙা থেকে), তাই G-তে অন্তত দুটি পদ থাকলে G ∤ xi, আর সব একক ভুল ধরা পড়ে। বাস্তব CRC-32 আর Ethernet-এর হিসাব Computer Networks কোর্সের পর্ব ০৯-এ।

AES. AES-এর প্রতিটি byte GF(28) = GF(2)[x]/(x8 + x4 + x3 + x + 1)-এর একটি উপাদান, আর S-box-এর মূল ধাপ এই field-এর inverse (তার পরে একটি affine রূপান্তর). গুণের হিসাব পর্ব ৩০-এ, আর AES নিরাপদে কীভাবে ব্যবহার করতে হয় তা Cybersecurity কোর্সের পর্ব ০৮-এ।

Reed–Solomon. Irving Reed আর Gustave Solomon ১৯৬০ সালে প্রকাশিত একটি প্রবন্ধে k-টি তথ্য-প্রতীককে GF(q)-এর ওপর একটি k − 1 ঘাতের polynomial-এর সহগ ধরে, তাকে n > k-টি বিন্দুতে মূল্যায়ন করে পাঠানোর প্রস্তাব দেন বলে পরিচিত। দুটি আলাদা এমন polynomial-এর পার্থক্যের ঘাত ≤ k − 1, তাই উপপাদ্য ৫.২ অনুযায়ী তারা বড়জোর k − 1 বিন্দুতে মেলে, অর্থাৎ অন্তত n − k + 1 বিন্দুতে আলাদা। এই “দূরত্ব” থেকেই ভুল সারানোর ক্ষমতা আসে; CD, QR code আর অনেক সংরক্ষণ-ব্যবস্থায় Reed–Solomon-এর রূপ ব্যবহৃত হয় বলে বর্ণিত। Code-এর দূরত্বের সাধারণ তত্ত্ব পর্ব ৭২ “Error-correcting code — parity, Hamming code আর Hamming distance”-এ।

Shamir secret sharing. বাজারঘরের মূল ভল্টের একটি গোপন সংখ্যা s আছে। পাঁচজন ম্যানেজারের যেকোনো তিনজন মিলে তা খুলতে পারবেন, কিন্তু দুজন পারবেন না, এমনকি s সম্পর্কে কিছু জানতেও পারবেন না। Adi Shamir ১৯৭৯ সালে “How to Share a Secret” প্রবন্ধে (Communications of the ACM) এর একটি polynomial-ভিত্তিক সমাধান দেন: একটি মৌলিক p নিয়ে GF(p)-এ এলোমেলো f(x) = s + c1x + c2x2 বানান, আর ম্যানেজার i-কে দিন (i, f(i)). একই বছরে George Blakley জ্যামিতিক ভাবনা থেকে স্বাধীনভাবে একটি পদ্ধতি দেন।

উপপাদ্য ৮.১ (Lagrange interpolation)

F একটি field, x1, …, xk আলাদা, আর y1, …, yk যেকোনো। তাহলে ঠিক একটি f ∈ F[x] আছে যার ঘাত ≤ k − 1 (বা f = 0) আর f(xi) = yi:

f(x) = ∑j yj ∏m ≠ j (x − xm)/(xj − xm).

  1. অস্তিত্ব: j-তম গুণফল x = xj-এ 1 আর অন্য xm-এ 0; ভাগ চলে কারণ xj − xm ≠ 0 আর F field. — সূত্র যাচাই
  2. অনন্যতা: দুটি এমন f আর h থাকলে f − h-এর ঘাত ≤ k − 1 কিন্তু root k-টি। উপপাদ্য ৫.২ অনুযায়ী f − h = 0. ∎ — root-এর সীমা

এখন threshold-এর যুক্তি: তিনজনের তিনটি বিন্দু ঘাত ≤ 2-এর f-কে অনন্যভাবে ঠিক করে, তাই s = f(0) বেরিয়ে আসে। দুজনের দুটি বিন্দুর সঙ্গে যেকোনো সম্ভাব্য গোপন সংখ্যা t-এর বিন্দু (0, t) যোগ করলে আবার তিনটি বিন্দু, তাই প্রতিটি t-এর জন্য ঠিক একটি সামঞ্জস্যপূর্ণ polynomial আছে। c1, c2 সমসম্ভাব্যভাবে বাছা হলে দুটি share দেখে প্রতিটি t সমান সম্ভাব্য থাকে: দুজন কিছুই শেখেন না। এই নিরাপত্তা আক্রমণকারীর কম্পিউটারের শক্তির ওপর নির্ভর করে না।

একটি সুন্দর সংযোগ এখানে লুকিয়ে আছে। পর্ব ২৩-এর Chinese Remainder Theorem ring-এর ভাষায় বলে: gcd(m, n) = 1 হলে ℤmn আর ℤm × ℤn একই ring, শুধু নাম আলাদা। ℤ6-এর 0, 1, 2, 3, 4, 5 হয়ে যায় (0, 0), (1, 1), (0, 2), (1, 0), (0, 1), (1, 2), আর যোগ-গুণ দুই অংশে আলাদা আলাদা চলে। Polynomial-এ একই উপপাদ্য আছে: f-কে x − xi দিয়ে ভাগ করলে ভাগশেষ f(xi) (factor theorem-এর প্রমাণ), তাই “x1, …, xk-এ f-এর মান জানা” মানে আলাদা আলাদা x − xi-এর সাপেক্ষে f-এর ভাগশেষ জানা। Lagrange interpolation আসলে polynomial-এর CRT, আর তার সূত্রের প্রতিটি গুণফল CRT-এর সেই সংখ্যাগুলোর মতো, যা একটি modulus-এ 1 আর বাকিগুলোতে 0. একই কাঠামো দুই জগতে, ঠিক যেমন §৪-এ Euclid দেখেছেন।

সতর্কতা: নিচের কোড গণিত বোঝার জন্য একটি খেলনা। ছোট p, Python-এর random (যা cryptography-র জন্য নিরাপদ নয়), আর share বিলি ও যাচাইয়ের কোনো সুরক্ষা নেই। বাস্তবে পরীক্ষিত library আর নিরাপদ random উৎস লাগে; Cybersecurity কোর্সের পর্ব ০৭ দেখুন।

from itertools import combinations
import random
p = 2027                                  # a small prime: toy only, never real use
secret, k, n = 1234, 3, 5                 # any 3 of 5 managers can open
random.seed(71)
coef = [secret] + [random.randrange(p) for _ in range(k - 1)]
f = lambda x: sum(c * pow(x, i, p) for i, c in enumerate(coef)) % p
shares = [(x, f(x)) for x in range(1, n + 1)]
print("polynomial coefficients:", coef)
print("shares:", shares)
def interp(pts, x0=0):                    # Lagrange interpolation, value at x0
    total = 0
    for j, (xj, yj) in enumerate(pts):
        num = den = 1
        for m, (xm, _) in enumerate(pts):
            if m != j:
                num = num * (x0 - xm) % p
                den = den * (xj - xm) % p
        total += yj * num * pow(den, -1, p)   # division = multiply by inverse
    return total % p
ok = all(interp(list(c)) == secret for c in combinations(shares, 3))
print("every 3 of 5 shares give", secret, ":", ok)
two = shares[:2]                          # only 2 shares: try every secret s
guess3 = {interp([(0, s)] + two, 3) for s in range(p)}
print("2 shares fit a different polynomial for each of", len(guess3), "secrets")

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

polynomial coefficients: [1234, 663, 1041]
shares: [(1, 911), (2, 643), (3, 430), (4, 272), (5, 169)]
every 3 of 5 shares give 1234 : True
2 shares fit a different polynomial for each of 2027 secrets

p = 2027 একটি মৌলিক, তাই GF(2027)-এ প্রতিটি অশূন্য সংখ্যার inverse আছে; interp-এর pow(den, -1, p) সেটিই নেয়, আর সূত্রে x0 = 0 বসালে সরাসরি s আসে। Polynomial 1234 + 663x + 1041x2, পাঁচটি share (1, 911) থেকে (5, 169). যেকোনো তিনটির C(5, 3) = 10টি সমন্বয়ের প্রতিটি 1234 ফেরত দেয়। শেষ লাইন দুটি share-এর দুর্বলতা দেখায় না, শক্তি দেখায়: 2027টি সম্ভাব্য গোপন সংখ্যার প্রতিটির জন্য দুটি share-এর সঙ্গে মেলে এমন আলাদা একটি polynomial আছে (প্রতিটি x = 3-এ আলাদা মান দেয়), তাই দুটি share কোনো সম্ভাবনা বাদ দিতে পারে না।

৯ · পরীক্ষার অঙ্ক আর একটি ভুল প্রমাণ

অঙ্ক ১: ℤ12-এর unit আর zero divisor

ℤ12-এর সব unit আর তাদের inverse, আর সব zero divisor বের করুন।

  1. Unit = gcd(a, 12) = 1: 1, 5, 7, 11; সংখ্যা φ(12) = 4. প্রতিটি নিজের inverse: 5 · 5 = 25, 7 · 7 = 49, 11 · 11 = 121, সবই ≡ 1.
  2. Zero divisor: বাকি অশূন্য 2, 3, 4, 6, 8, 9, 10; প্রতিটির জন্য b = 12/gcd(a, 12): 2 · 6, 3 · 4, 4 · 3, 6 · 2, 8 · 3, 9 · 4, 10 · 6, সবই ≡ 0 (scratch-এ মেলানো)।

অঙ্ক ২: GF(3)-এ উৎপাদকে ভাঙা

x3 + x + 1 GF(2)-এ irreducible, কিন্তু GF(3)-এ? উৎপাদকে ভাঙুন।

  1. GF(2)-এ x = 0 আর 1-এ মান 1, root নেই, ঘাত 3, তাই irreducible (উপপাদ্য ৫.৪)।
  2. GF(3)-এ x = 1-এ 1 + 1 + 1 = 3 ≡ 0, তাই x − 1 = x + 2 একটি উৎপাদক। ভাগ করলে x3 + x + 1 = (x + 2)(x2 + x + 2); যাচাই: x3 + 3x2 + 4x + 4 ≡ x3 + x + 1.
  3. x2 + x + 2-এর x = 0, 1, 2-এ মান 2, 1, 2: root নেই, তাই আর ভাঙে না। Irreducibility তাই field-এর ওপর নির্ভর করে।

অঙ্ক ৩: GF(16)-এ inverse

x4 + x + 1 দিয়ে বানানো GF(16)-এ x3 + 1-এর inverse বের করুন।

  1. ঘাতের তালিকায় 1001 = x14. তাই inverse x15−14 = x = 0010.
  2. সরাসরি যাচাই: x(x3 + 1) = x4 + x = (x + 1) + x = 1. ✓ (Extended Euclid দিয়েও একই উত্তর আসে, কারণ x4 + x + 1 = x · (x3 + 1) + 1.)

অঙ্ক ৪: গণনা

GF(2)-এর ওপর 5 ঘাতের কয়টি monic irreducible polynomial? N2(5) = (25 − 2)/5 = 6, কারণ 5-এর ভাজক 1 আর 5, μ(5) = −1. (উপরের brute force-এও 6.) তাহলে 25 = 32টি monic 5 ঘাতের polynomial-এর মাত্র 6টি irreducible, প্রায় 1/5 অংশ।

অঙ্ক ৫: Extended Euclid দিয়ে GF(8)-এ inverse

GF(8) = GF(2)[x]/(x3 + x + 1)-এ x2 + x + 1-এর inverse extended Euclid দিয়ে বের করুন।

  1. f = x3 + x + 1-কে g = x2 + x + 1 দিয়ে ভাগ: (x + 1)g = x3 + 1, তাই f = (x + 1)g + x. ভাগশেষ x.
  2. g-কে x দিয়ে ভাগ: g = (x + 1) · x + 1. ভাগশেষ 1, তাই gcd = 1 আর inverse আছে (f irreducible হওয়ায় এটি প্রত্যাশিত)।
  3. পেছনে হাঁটা (GF(2)-এ বিয়োগ = যোগ): 1 = g + (x + 1)x = g + (x + 1)(f + (x + 1)g) = (x + 1)f + (1 + (x + 1)2)g. আর 1 + (x + 1)2 = 1 + x2 + 1 = x2.
  4. mod f নিলে x2 · g ≡ 1, তাই (x2 + x + 1)−1 = x2. যাচাই: x2(x2 + x + 1) = x4 + x3 + x2, আর x3 = x + 1, x4 = x2 + x বসালে (x2 + x) + (x + 1) + x2 = 1 (scratch-এ সব সাতটি inverse brute force-এ মেলানো)।

প্রমাণের ভুল ধরুন: “irreducible, তাই x generator”

একজন লিখলেন: “f = x4 + x3 + x2 + x + 1 GF(2)-এ irreducible, তাই GF(2)[x]/(f) একটি field, যার গুণের group cyclic এবং 15 উপাদানের। x একটি অশূন্য উপাদান, তাই x-এর ঘাতগুলো সব ১৫টি উপাদান দেয়।”

ভুল কোথায়: প্রথম দুটি দাবি ঠিক: field হয় (উপপাদ্য ৬.২), আর F* cyclic (উপপাদ্য ৭.১)। কিন্তু “cyclic” মানে কোনো একটি generator আছে, প্রতিটি অশূন্য উপাদান generator নয়। এখানে (x − 1)f = x5 − 1, তাই x5 = 1: x-এর order 5, আর তার ঘাত মাত্র পাঁচটি উপাদান দেয় (উপরের কোডেও order 5). Generator φ(15) = 8টি, বাকি ৭টি অশূন্য উপাদান generator নয়। অস্তিত্বের উপপাদ্য থেকে নির্দিষ্ট একটি উপাদান সম্পর্কে সিদ্ধান্ত টানাই ভুল।

আরও গভীরে: প্রতিটি integral domain-এর একটি characteristic আছে: 1 + 1 + ⋯ + 1 প্রথম কতবারে 0 হয় (কখনো না হলে 0); এটি 0 অথবা মৌলিক, আর এ থেকেই প্রমাণ হয় finite field-এর আকার pn. Commutative নয় কিন্তু প্রতিটি অশূন্য উপাদানে inverse আছে এমন ring-কে division ring বলে; Hamilton-এর ১৮৪৩ সালের quaternion তার উদাহরণ, আর Wedderburn-এর ১৯০৫ সালের উপপাদ্য বলে প্রতিটি সসীম division ring আসলে commutative, অর্থাৎ field. আধুনিক cryptography-তে lattice-ভিত্তিক post-quantum পদ্ধতিগুলো ℤq[x]/(xn + 1)-এর মতো quotient ring-এ হিসাব করে।

পরীক্ষা ও ইন্টারভিউতে: বিশ্ববিদ্যালয়, চাকরি বা ইন্টারভিউর পরীক্ষায় এই ধরনের প্রশ্ন প্রায়ই আসে:

  • ℤn কখন field? n মৌলিক হলে; নইলে gcd(a, n) > 1 এমন a একটি zero divisor.
  • সসীম integral domain কেন field? x ↦ ax one-to-one (cancellation), সসীম সেটে তাই onto, ফলে ab = 1.
  • ℤ8-এ x2 − 1-এর কয়টি root? চারটি (1, 3, 5, 7); ℤ8 integral domain নয় বলে “d ঘাতে বড়জোর d root” খাটে না।
  • GF(2n) কীভাবে বানাবেন? n ঘাতের একটি irreducible f নিয়ে GF(2)[x]/(f); উপাদান n-bit, যোগ XOR, গুণ mod f.
  • GF(2)-এর ওপর 4 ঘাতের কয়টি irreducible? তিনটি: x4 + x + 1, x4 + x3 + 1, x4 + x3 + x2 + x + 1.

১০ · AI-এর যুগে — ring আর field-এর হিসাব যাচাই

AI সহকারী সংজ্ঞা ভালো বলে, কিন্তু mod p-এর হিসাবে, শর্ত বাদ দেওয়ায় আর “অস্তিত্ব” ও “এটিই সেটি” গুলিয়ে ফেলায় ভুল করে। কয়েকটি নিয়মিত ভুল আর ধরার উপায়:

AI-এর ভুলকীভাবে ধরবেন
“d ঘাতের polynomial-এর বড়জোর d root” যেকোনো ℤn-এ প্রয়োগℤ8-এ x2 − 1-এর সব root brute force-এ গুনুন
“root নেই, তাই irreducible” ঘাত 4 বা বেশিতেx4 + x2 + 1 = (x2 + x + 1)2-এর মতো পাল্টা-উদাহরণ; সব ছোট ঘাতের উৎপাদক দিয়ে ভাগ করুন
GF(4) আর ℤ4 একই বলা, বা ℤ2n-কে field ধরাℤ4-এ 2 · 2 = 0 দেখান; field-এ zero divisor থাকে না
GF(2)-এ বিয়োগ বা গুণে carry নিয়ে সাধারণ binary গণিত করাযোগ XOR কি না, আর q · g + r = f মেলে কি না পরীক্ষা করুন
“irreducible হলে x generator” বা generator-এর সংখ্যা ভুলx-এর order গুনুন; generator ঠিক φ(q − 1)টি কি না দেখুন

AI-এর কাছে ring বা finite field-এর উত্তর চাইলে এমন কাঠামো দিন, যাতে প্রতিটি ধাপ আলাদা করে যাচাই করা যায়:

নিচের বীজগণিতের প্রশ্নের উত্তর ধাপে ধাপে দাও: প্রশ্ন: [যেমন "GF(2)[x]/(x^4 + x^3 + 1)-এ x^2 + 1-এর inverse"] ১. কোন ring বা field-এ কাজ করছ, সহগ কোন mod-এ, আর modulus polynomial irreducible কি না, তা প্রমাণসহ লেখো। ২. প্রতিটি polynomial ভাগে ভাগফল আর ভাগশেষ লেখো, আর q·g + r = f মিলিয়ে দেখাও। ৩. কোনো উপপাদ্য (root-এর সীমা, Bézout, cyclic group, Lagrange interpolation) ব্যবহার করলে তার শর্ত লেখো: field না integral domain, ঘাত কত, বিন্দুগুলো আলাদা কি না। ৪. "অস্তিত্ব আছে" আর "এই নির্দিষ্ট উপাদানটিই সেটি" আলাদা করে বলো। ৫. উত্তর যাচাইয়ের একটি ছোট Python কোড দাও (শুধু standard library), যা brute force-এ সব উপাদান পরীক্ষা করে। ৬. কোনো নাম, সাল বা মানদণ্ডের তথ্য নিয়ে নিশ্চিত না হলে তা স্পষ্ট বলো।

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

Finite field-এর উত্তর যাচাই সহজ, কারণ সব কিছু সসীম: কয়েকশো উপাদানের field-এ প্রতিটি দাবি কম্পিউটারে এক মুহূর্তে পরীক্ষা করা যায়। AI-এর প্রমাণ বিশ্বাস করার আগে ছোট উদাহরণে তার প্রতিটি দাবি চালিয়ে দেখুন।

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

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

প্র ০১“Ring” আর “ideal” নাম কোথা থেকে এল? Fermat-এর শেষ উপপাদ্যের ব্যর্থ প্রমাণ থেকে আধুনিক বীজগণিতের গল্প

উনিশ শতকে গণিতবিদরা পূর্ণসংখ্যার বাইরে “নতুন পূর্ণসংখ্যা” নিয়ে কাজ শুরু করেন, যেমন a + b√−5 ধরনের সংখ্যা, যেখানে a, b পূর্ণসংখ্যা। প্রচলিত বিবরণ অনুযায়ী ১৮৪৭ সালে Gabriel Lamé Fermat-এর শেষ উপপাদ্যের একটি প্রমাণ প্যারিসের একাডেমিতে উপস্থাপন করেন, যা নীরবে ধরে নিয়েছিল যে এমন সংখ্যাতেও মৌলিক উৎপাদকে ভাঙা অনন্য। Ernst Kummer আগেই লক্ষ করেছিলেন যে এই অনুমান সবসময় সত্য নয় বলে উল্লেখ করা হয়।

সমস্যাটি সহজ উদাহরণে দেখা যায়: a + b√−5-এর জগতে 6 = 2 · 3 = (1 + √−5)(1 − √−5), আর এই চারটি সংখ্যার কোনোটিকে আর ছোট উৎপাদকে ভাঙা যায় না। অর্থাৎ দুটি আলাদা “মৌলিক” উৎপাদকে ভাঙা। Kummer এর প্রতিকার হিসেবে “ideal number” নামের কাল্পনিক উৎপাদকের ধারণা দেন, যাতে অনন্যতা ফিরে আসে। পরে Richard Dedekind (১৮৭০-এর দশকে) এই কাল্পনিক সংখ্যাকে একটি বাস্তব বস্তু দিয়ে বদলান: সংখ্যার একটি উপসেট, যা যোগ আর বাইরের গুণে বন্ধ। নামটি থেকে গেল “ideal”, আর এই পর্বের সংজ্ঞা ৬.১ ঠিক সেটিই।

“Ring” শব্দটি David Hilbert-এর ১৮৯৭ সালের সংখ্যাতত্ত্বের প্রতিবেদনে “Zahlring” হিসেবে আসে বলে উল্লেখ করা হয়; একটি ব্যাখ্যা হলো, কিছু উপাদানের ঘাত বারবার নিলে চক্রের মতো ঘুরে আগের উপাদানের সমন্বয়ে ফিরে আসে। বিমূর্ত axiom-এর সংজ্ঞা আসে বিশ শতকের শুরুতে (Abraham Fraenkel, ১৯১৪ সালের দিকে), আর Emmy Noether-এর ১৯২১ সালের ideal-তত্ত্বের কাজ এই বিমূর্ত দৃষ্টিকে আধুনিক বীজগণিতের কেন্দ্রে নিয়ে আসে।

আমাদের জন্য শিক্ষাটি দুটি। প্রথমত, “অনন্য উৎপাদকে ভাঙা” স্বতঃসিদ্ধ নয়, প্রমাণ করতে হয়; ℤ আর F[x]-এ তা division algorithm-এর ফল। দ্বিতীয়ত, ব্যর্থ প্রমাণ প্রায়ই নতুন তত্ত্বের জন্ম দেয়, যদি কেউ বুঝতে চান ঠিক কোন ধাপটি ভাঙল।

মূল উপলব্ধি: Ideal-এর ধারণা এসেছে অনন্য উৎপাদকে ভাঙার ব্যর্থতা সারাতে; ring আর ideal-এর বিমূর্ত ভাষা সেই সংকট থেকে জন্ম নেওয়া একটি সাধারণ হাতিয়ার।

প্র ০২Finite field-এর আকার কেন সবসময় মৌলিক সংখ্যার ঘাত? 6 উপাদানের field কেন নেই?

পর্ব ৩০-এ উপপাদ্যটি বিবৃতি হিসেবে দেখেছেন: প্রতিটি finite field-এর আকার pn. এর প্রমাণ এই পর্বের যন্ত্রপাতি দিয়েই হয়। ধরুন F একটি finite field. 1, 1 + 1, 1 + 1 + 1, … এই ক্রম সসীম সেটে থাকে, তাই কোনো এক সময় পুনরাবৃত্তি হয়, আর তা থেকে কোনো ধনাত্মক m-এর জন্য m · 1 = 0. সবচেয়ে ছোট এমন m হলো F-এর characteristic.

এই characteristic মৌলিক হতেই হবে। m = ab, 1 < a, b < m হলে (a · 1)(b · 1) = m · 1 = 0, কিন্তু a · 1 আর b · 1 দুটিই অশূন্য (m সবচেয়ে ছোট বলে)। Field-এ zero divisor থাকে না, তাই এটি অসম্ভব। ফলে characteristic একটি মৌলিক p, আর {0, 1, 2 · 1, …, (p − 1) · 1} হুবহু ℤp-এর মতো আচরণ করে: F-এর ভেতরে একটি GF(p) বসে আছে।

এবার F-কে GF(p)-এর ওপর একটি vector space হিসেবে দেখুন: F-এর উপাদান যোগ করা যায় আর GF(p)-এর সংখ্যা দিয়ে গুণ করা যায়। সসীম বলে একটি basis আছে, ধরুন n-টি উপাদানের। তখন F-এর প্রতিটি উপাদান c1e1 + ⋯ + cnen হিসেবে অনন্যভাবে লেখা যায়, প্রতিটি ci-এর p রকম মান: মোট pn. তাই 6, 10, 12 আকারের field নেই। GF(16)-এ ঠিক এটাই দেখেছেন: 4 bit মানে GF(2)-এর ওপর 4-মাত্রা।

উল্টো দিক, অর্থাৎ প্রতিটি pn-এর জন্য field আছে, আসে irreducible polynomial-এর অস্তিত্ব থেকে (Gauss-এর গণনা ধনাত্মক), আর একই আকারের দুটি field যে মূলত এক, তা আসে xpn − x-এর root-এর বিশ্লেষণ থেকে। ইতিহাসে Évariste Galois ১৮৩০ সালের দিকে এমন field নিয়ে লেখেন, আর সম্পূর্ণ শ্রেণিবিভাগ সাধারণত E. H. Moore-এর ১৮৯৩ সালের কাজের সঙ্গে যুক্ত করা হয়।

মূল উপলব্ধি: Zero divisor না থাকা characteristic-কে মৌলিক p বানায়, আর vector space-এর গণনা আকারকে pn; তাই finite field-এর আকার শুধু মৌলিকের ঘাত।

প্র ০৩পূর্ণসংখ্যা আর polynomial এত মেলে কেন? Euclidean domain-এর ধারণা আর তার সীমা

এই পর্বের প্রায় প্রতিটি উপপাদ্য পূর্ণসংখ্যার একটি পরিচিত উপপাদ্যের অনুবাদ: division algorithm, Euclid, Bézout, মৌলিক ⇔ irreducible, ℤ/pℤ field ⇔ F[x]/(f) field, আর ℤ-এর প্রতিটি ideal nℤ ⇔ F[x]-এর প্রতিটি ideal (f). এই মিলের মূল কারণ একটিই: দুই জগতেই একটি “আকার” আছে (পূর্ণসংখ্যায় পরম মান, polynomial-এ ঘাত), আর ভাগশেষ সবসময় ভাজকের চেয়ে “ছোট” করা যায়।

এমন ring-কে Euclidean domain বলে। সংজ্ঞাটি পেলেই বাকি সব আপনা থেকে আসে: Euclid থামে কারণ আকার কমে, প্রতিটি ideal একটি উপাদান দিয়ে তৈরি (principal ideal) কারণ সবচেয়ে ছোট উপাদান নিয়ে ভাগ করা যায়, আর তা থেকে Euclid-এর lemma ও অনন্য উৎপাদকে ভাঙা আসে। তাই এক জায়গায় প্রমাণ লিখলে অনেক জগতে তা সত্য হয়, বিমূর্ত বীজগণিতের এটাই লাভ।

আরেকটি পরিচিত Euclidean domain হলো Gaussian integer ℤ[i] = {a + bi}, যেখানে আকার a2 + b2. এর সাহায্যে কোন মৌলিক সংখ্যা দুটি বর্গের যোগফল, সেই পুরোনো প্রশ্নের সুন্দর উত্তর পাওয়া যায়। কিন্তু সব ring এমন নয়। প্র ০১-এর ℤ[√−5]-এ 6-এর দুটি আলাদা ভাঙন আছে, তাই সেখানে কোনো Euclidean আকার থাকতে পারে না। ℤ[x]-ও Euclidean নয়: 2 আর x দিয়ে তৈরি ideal কোনো একটি polynomial-এর গুণিতক নয়, যদিও ℤ[x]-এ উৎপাদকে ভাঙা অনন্য। অর্থাৎ ধর্মগুলো একটি সিঁড়ির মতো: Euclidean ⇒ principal ideal ⇒ অনন্য উৎপাদক, কিন্তু উল্টো দিকে সবসময় নয়।

কম্পিউটার বিজ্ঞানে এই মিলের ব্যবহারিক রূপ হলো একই কোড দুই জগতে চালানো। Euclid, extended Euclid, CRT সবই সংখ্যা আর polynomial দুটোতেই চলে; Reed–Solomon decoding-এর একটি পরিচিত পদ্ধতি আসলে polynomial-এর extended Euclid.

মূল উপলব্ধি: “ভাগশেষ ছোট করা যায়” এই একটি ধর্ম থেকে Euclid, Bézout আর অনন্য উৎপাদক আসে; তাই ℤ আর F[x] একই ছাঁচের দুই রূপ, আর যেখানে এই ধর্ম নেই সেখানে অনন্যতাও ভাঙতে পারে।

প্র ০৪Reed–Solomon code-এ polynomial-এর root-এর সীমা কীভাবে আঁচড় লাগা CD বা ময়লা QR code-কে পড়ার যোগ্য রাখে?

Reed–Solomon-এর মূল ধারণা এই পর্বের উপপাদ্য ৫.২ আর ৮.১-এর সরাসরি প্রয়োগ। k-টি তথ্য-প্রতীক (প্রতিটি GF(q)-এর একটি উপাদান, প্রায়ই GF(28)-এর একটি byte) নিন, আর তাদের একটি ঘাত ≤ k − 1-এর polynomial m(x)-এর সহগ ধরুন। পাঠান n-টি আলাদা বিন্দুতে মান: m(α1), …, m(αn), যেখানে n > k. তাই q-এর আকার অন্তত n হতে হয়, এজন্যই বড় finite field লাগে।

দুটি আলাদা বার্তা m আর m′-এর পার্থক্য একটি অশূন্য polynomial, যার ঘাত ≤ k − 1, তাই তার root বড়জোর k − 1টি। অর্থাৎ দুটি codeword বড়জোর k − 1টি অবস্থানে মেলে, অন্তত n − k + 1টি অবস্থানে আলাদা। এই সংখ্যাকে code-এর minimum distance বলে, আর এটি পর্ব ৭২-এ আসা Singleton bound-এর সমান, অর্থাৎ এই অর্থে সর্বোত্তম। ফলে n − k-টি অবস্থান পুরো মুছে গেলেও (ঠিক কোনগুলো হারিয়েছে জানা থাকলে) বাকি k-টি থেকে Lagrange interpolation দিয়ে m ফিরে আসে; আর অবস্থান না জানা ভুল হলে প্রায় এর অর্ধেক সারানো যায়।

বাস্তবে এর ব্যবহার ব্যাপক বলে বর্ণিত: CD-র ফরম্যাটে দুই স্তরের Reed–Solomon code ব্যবহৃত হয়, যাতে আঁচড়ে টানা অনেক bit হারালেও শব্দ ঠিক থাকে; QR code-এ চার স্তরের error correction বেছে নেওয়া যায়, যাতে লোগো বসানো বা ময়লা পড়া অংশ সত্ত্বেও পড়া যায়; আর অনেক ডেটা-সংরক্ষণ ব্যবস্থায় একই ধারণা থেকে erasure code আসে। এসব প্রয়োগের সূক্ষ্ম বিবরণ মানদণ্ডভেদে আলাদা, তাই নির্দিষ্ট সংখ্যার জন্য মূল নির্দেশিকা দেখা উচিত।

প্রকৌশলের দিক থেকে কঠিন অংশ decoding: কোন অবস্থানে ভুল তা না জেনে m খুঁজে বের করা। Berlekamp–Massey বা polynomial-এর extended Euclid এই কাজ দক্ষভাবে করে বলে পরিচিত, আর পরে Sudan ও Guruswami “list decoding” দিয়ে আরও বেশি ভুল সামলানোর পথ দেখান।

মূল উপলব্ধি: “ঘাত ≤ k − 1-এর অশূন্য polynomial-এর বড়জোর k − 1 root” সরাসরি codeword-এর মধ্যে বড় দূরত্ব দেয়; Reed–Solomon সেই দূরত্বকে আঁচড় আর ময়লা সহ্য করার ক্ষমতায় বদলায়।

প্র ০৫Shamir secret sharing-এর নিরাপত্তা RSA-এর নিরাপত্তা থেকে মৌলিকভাবে আলাদা কেন?

RSA-এর নিরাপত্তা একটি অনুমানের ওপর দাঁড়ানো: বড় সংখ্যা factor করা কঠিন (পর্ব ২৮)। পর্যাপ্ত গণনা-ক্ষমতা থাকলে, বা কেউ দ্রুত factoring পদ্ধতি পেলে (যেমন বড় quantum computer-এ Shor-এর algorithm), গোপন key বের হয়ে যেতে পারে। একে computational security বলে: আক্রমণ অসম্ভব নয়, শুধু ব্যয়বহুল।

Shamir-এর পদ্ধতিতে k − 1-টি share-এর আক্রমণকারীর অবস্থা আলাদা। §৮-এর যুক্তি অনুযায়ী প্রতিটি সম্ভাব্য গোপন সংখ্যা t-এর জন্য ঠিক একটি polynomial আছে যা দেখা share-গুলোর সঙ্গে মেলে, আর সহগগুলো সমসম্ভাব্যভাবে বাছা হলে প্রতিটি t সমান সম্ভাব্য। অসীম গণনা-ক্ষমতা থাকলেও কিছু শেখা যায় না, কারণ শেখার মতো তথ্যই share-গুলোতে নেই। একে information-theoretic security বলে, Shannon-এর one-time pad-এর নিরাপত্তার মতো। প্রমাণটি পুরোপুরি এই পর্বের: Lagrange interpolation-এর অনন্যতা, যা আবার root-এর সীমা থেকে আসে।

Adi Shamir (RSA-এর “S”) ১৯৭৯ সালে Communications of the ACM-এ “How to Share a Secret” প্রকাশ করেন; একই বছরে George Blakley স্বাধীনভাবে hyperplane-এর ছেদবিন্দু দিয়ে একটি পদ্ধতি দেন। ধারণাটি আজ বিভিন্ন প্রতিষ্ঠানে গুরুত্বপূর্ণ master key ভাগ করে রাখা, ক্রিপ্টো-ওয়ালেটের backup আর threshold signature-এর মতো ব্যবস্থার ভিত্তি বলে বর্ণিত।

তবে information-theoretic নিরাপত্তা শুধু গাণিতিক অংশের। বাস্তবে দুর্বলতা আসে অন্য পথে: share বানাতে দুর্বল random উৎস (আমাদের খেলনা কোডের random-এর মতো), একজন অসৎ dealer যিনি ভুল share দেন, বা share জোড়া দেওয়ার মুহূর্তে গোপন সংখ্যা এক জায়গায় জড়ো হওয়া। এগুলো সামলাতে verifiable secret sharing-এর মতো বাড়তি কৌশল লাগে, আর লাগে পরীক্ষিত বাস্তবায়ন।

মূল উপলব্ধি: RSA ভাঙা “কঠিন”, কিন্তু k − 1টি Shamir share থেকে গোপন সংখ্যা বের করা “অসম্ভব”, কারণ প্রতিটি সম্ভাব্য উত্তর সমানভাবে সামঞ্জস্যপূর্ণ; তবু বাস্তব নিরাপত্তা নির্ভর করে random উৎস আর বাস্তবায়নের ওপর।

অনুশীলন

আগে খাতায় করুন, তারপর উত্তর খুলে মেলান।

  1. প্রমাণ: একটি integral domain-এ a2 = a হলে প্রমাণ করুন a = 0 অথবা a = 1. তারপর দেখান ℤ6-এ এটি ভাঙে।
    1. a2 = a থেকে a2 − a = 0, অর্থাৎ a(a − 1) = 0. — বণ্টন বিধি
    2. Integral domain-এ zero divisor নেই, তাই a = 0 অথবা a − 1 = 0. — সংজ্ঞা ২.১
    3. অতএব a = 0 বা a = 1. ∎

    ℤ6-এ 32 = 9 ≡ 3 আর 42 = 16 ≡ 4: 0 আর 1 ছাড়াও দুটি সমাধান, কারণ 3 · 2 ≡ 0 আর 4 · 3 ≡ 0, অর্থাৎ ℤ6-এ zero divisor আছে (scratch-এ মেলানো)।

  2. গণনা: (ক) GF(3)-এর ওপর 2 ঘাতের monic polynomial কয়টি, আর তাদের কয়টি irreducible? সবগুলো লিখুন। (খ) Gauss-এর সূত্রে মেলান। (গ) এদের একটি দিয়ে বানানো field-এ কয়টি উপাদান?

    (ক) x2 + bx + c, b, c ∈ {0, 1, 2}: মোট 9টি। ঘাত 2, তাই irreducible ⇔ root নেই (উপপাদ্য ৫.৪)। তিনটি মানে পরীক্ষা করলে irreducible ঠিক তিনটি: x2 + 1, x2 + x + 2, x2 + 2x + 2. (খ) N3(2) = (32 − 3)/2 = 3, মেলে। বাকি ছয়টি দুটি monic রৈখিক উৎপাদকের গুণফল: (x − a)(x − b)-এ {a, b} বাছার উপায় C(3, 2) + 3 = 6. 6 + 3 = 9, হিসাব পূর্ণ। (গ) GF(3)[x]/(x2 + 1)-এ উপাদান a + bx, মোট 32 = 9: এটিই GF(9) (scratch-এ brute force দিয়ে মেলানো)।

  3. আউটপুট অনুমান: কোড না চালিয়ে বলুন কী ছাপা হবে, আর প্রতিটি লাইন ring সম্পর্কে কী বলে। তারপর যেকোনো Python-এ চালিয়ে মেলান।
    for n in (6, 7, 9):
        zd = [a for a in range(1, n)
              if any(a * b % n == 0 for b in range(1, n))]
        print(n, zd)
    6 [2, 3, 4]
    7 []
    9 [3, 6]

    প্রতিটি লাইন ℤn-এর zero divisor দেয়। n = 6: gcd(a, 6) > 1 এমন 2, 3, 4 (উপপাদ্য ২.২)। n = 7 মৌলিক: কোনো zero divisor নেই, ℤ7 field. n = 9: শুধু 3-এর গুণিতক 3 আর 6 (3 · 3 = 9 ≡ 0, 6 · 3 = 18 ≡ 0). বাকি অশূন্য উপাদানগুলোই unit, যার সংখ্যা φ(6) = 2 আর φ(9) = 6 (CPython 3.14-এ চালিয়ে মেলানো)।

  4. প্রমাণের ভুল ধরুন: দাবি: “ℤn-এ d ঘাতের অশূন্য polynomial-এর বড়জোর d root.” প্রমাণ: “c একটি root হলে factor theorem দিয়ে f = (x − c)g. আরেকটি root c′-এ (c′ − c)g(c′) = 0, আর c′ − c ≠ 0, তাই g(c′) = 0. Induction দিয়ে বাকিটা। ∎” ভুল কোথায়? একটি পাল্টা-উদাহরণ দিন।
    • ভুল ধাপ: “(c′ − c)g(c′) = 0 আর c′ − c ≠ 0, তাই g(c′) = 0” শুধু integral domain-এ সত্য। ℤn-এ n যৌগিক হলে c′ − c একটি zero divisor হতে পারে। (Factor theorem-এর অংশটি ঠিক আছে, কারণ x − c monic.)
    • পাল্টা-উদাহরণ: ℤ8-এ x2 − 1-এর root 1, 3, 5, 7: চারটি, যা 2-এর বেশি। c = 1, c′ = 3 নিলে c′ − c = 2 আর g(3) = 3 + 1 = 4, অথচ 2 · 4 = 8 ≡ 0.
    • সঠিক কথা: উপপাদ্য ৫.২ field বা integral domain-এর জন্য; ℤn-এ তা খাটে ঠিক তখন, যখন n মৌলিক।

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

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

ক্রম“প্রতিটি সসীম integral domain একটি field” প্রমাণের ধাপগুলো সঠিক ক্রমে সাজান (▲▼ চেপে সরান)

  1. একটি অশূন্য a নিয়ে map x ↦ ax সংজ্ঞায়িত করুন
  2. ax = ay হলে a(x − y) = 0, zero divisor নেই বলে x = y: map one-to-one
  3. সসীম সেট থেকে নিজের ভেতরে one-to-one map onto-ও
  4. তাই কোনো b-এর জন্য ab = 1, অর্থাৎ a একটি unit
  5. সব অশূন্য a unit, তাই ring-টি একটি field

নিচের কোনটি একটি field?

  • ℤ12
  • ℤ
  • ℤ11
  • বাস্তব সংখ্যার সব 2 × 2 matrix

ℤ8-এ x2 ≡ 1 (mod 8) সমীকরণের কয়টি সমাধান?

  • 1টি
  • 2টি
  • 3টি
  • 4টি

GF(2)-এর ওপর x4 + x2 + 1 সম্পর্কে কোন কথাটি সত্য?

  • GF(2)-এ কোনো root নেই, তাই irreducible
  • Root নেই, কিন্তু irreducible নয়
  • x = 1 এর একটি root
  • এ দিয়ে GF(16) বানানো যায়

GF(16)-এর অশূন্য উপাদানের গুণের group-এ কয়টি generator (primitive element)?

  • 15
  • 1
  • 8
  • 4

মৌলিক p নিয়ে GF(p)-এ 3-of-5 Shamir secret sharing-এ (polynomial-এর ঘাত 2, সহগ সমসম্ভাব্য) দুজনের দুটি share গোপন সংখ্যা সম্পর্কে কী জানায়?

  • গোপন সংখ্যাটি পুরোপুরি
  • কিছুই না: প্রতিটি সম্ভাব্য মান সমানভাবে সম্ভব
  • সম্ভাব্য মানের অর্ধেক বাদ দেয়
  • p ছোট হলে brute force-এ গোপন সংখ্যাটি

F[x]/(f) (F একটি field, deg f ≥ 1) একটি field হওয়ার শর্ত কী?

  • f monic
  • f-এর ঘাত মৌলিক সংখ্যা
  • F-এ f-এর কোনো root নেই
  • f irreducible

শব্দকোষ

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

মনে রাখুন

  1. Ring: যোগে abelian group, গুণ associative, বণ্টন বিধি; ℤ, ℤn, F[x], matrix. a · 0 = 0-ও axiom থেকে প্রমাণ করতে হয়।
  2. Unit বনাম zero divisor: ℤn-এ gcd(a, n) = 1 হলে unit, নইলে zero divisor; zero divisor না থাকলে integral domain, আর সসীম integral domain মানেই field.
  3. F[x] পূর্ণসংখ্যার মতো: ভাগশেষসহ ভাগ, Euclid, Bézout; d ঘাতে বড়জোর d root, কিন্তু শুধু integral domain-এ (ℤ8-এ x2 − 1-এর চার root).
  4. GF(pn) = GF(p)[x]/(f): f irreducible হলেই field; ঘাত 2–3-এ irreducible ⇔ root নেই; সংখ্যা Gauss-এর সূত্রে।
  5. Cyclic গুণ: finite field-এর F* cyclic, generator φ(q − 1)টি; তবে প্রতিটি irreducible-এর x generator নয়। Lagrange interpolation-এর অনন্যতা Reed–Solomon আর Shamir-এর ভিত্তি।

পরের পর্বে: পর্ব ৭২ “Error-correcting code — parity, Hamming code আর Hamming distance”: শব্দের মধ্যে দূরত্ব মেপে কীভাবে ভুল ধরা ও সারানো যায়, Hamming(7,4) code-এর নির্মাণ আর কোনো code কত ভালো হতে পারে তার সীমা আসবে।

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

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