বাংলা

জাভাস্ক্রিপ্টের BigInt টাইপের একটি সম্পূর্ণ নির্দেশিকা। এর বৈশিষ্ট্য, ব্যবহার এবং বড় পূর্ণসংখ্যা নিয়ে কাজ করার পদ্ধতি জানুন। জাভাস্ক্রিপ্টের সীমাবদ্ধতা কাটিয়ে নির্ভুল গণনা করতে শিখুন।

জাভাস্ক্রিপ্ট BigInt: বড় সংখ্যার পাটিগণিতে দক্ষতা অর্জন

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

BigInt-এর প্রয়োজনীয়তা বোঝা

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

BigInt ভ্যালু তৈরি করা

জাভাস্ক্রিপ্টে BigInt ভ্যালু তৈরি করার দুটি প্রধান উপায় রয়েছে:

  1. `BigInt()` কনস্ট্রাক্টর ব্যবহার করে: এই কনস্ট্রাক্টর একটি সংখ্যা, স্ট্রিং বা বুলিয়ান ভ্যালুকে BigInt-এ রূপান্তর করতে পারে।
  2. `n` প্রত্যয় ব্যবহার করে: একটি পূর্ণসংখ্যা লিটারেলের শেষে `n` যোগ করে একটি BigInt তৈরি করা হয়।

উদাহরণ:

`BigInt()` কনস্ট্রাক্টর ব্যবহার করে:


const bigIntFromNumber = BigInt(12345678901234567890);
const bigIntFromString = BigInt("98765432109876543210");
const bigIntFromBoolean = BigInt(true); // ফলাফল 1n
const bigIntFromFalseBoolean = BigInt(false); // ফলাফল 0n

console.log(bigIntFromNumber); // আউটপুট: 12345678901234567890n
console.log(bigIntFromString); // আউটপুট: 98765432109876543210n
console.log(bigIntFromBoolean); // আউটপুট: 1n
console.log(bigIntFromFalseBoolean); // আউটপুট: 0n

`n` প্রত্যয় ব্যবহার করে:


const bigIntLiteral = 12345678901234567890n;
console.log(bigIntLiteral); // আউটপুট: 12345678901234567890n

গুরুত্বপূর্ণ নোট: আপনি গাণিতিক ক্রিয়াকলাপে সরাসরি BigInt এবং Number ভ্যালু মিশ্রিত করতে পারবেন না। গণনা করার আগে আপনাকে স্পষ্টভাবে সেগুলিকে একই টাইপে রূপান্তর করতে হবে। সরাসরি মিশ্রিত করার চেষ্টা করলে একটি `TypeError` দেখা দেবে।

BigInt গাণিতিক অপারেশন

BigInt বেশিরভাগ স্ট্যান্ডার্ড গাণিতিক অপারেটর সমর্থন করে, যার মধ্যে রয়েছে:

উদাহরণ:


const a = 12345678901234567890n;
const b = 98765432109876543210n;

const sum = a + b;
const difference = a - b;
const product = a * b;
const quotient = a / 2n; // দ্রষ্টব্য: ভাগফল শূন্যের দিকে ছোট হয়
const remainder = a % 7n;
const power = a ** 3n; // ঘাত প্রত্যাশা অনুযায়ী কাজ করে

console.log("যোগফল:", sum); // আউটপুট: Sum: 111111111011111111100n
console.log("পার্থক্য:", difference); // আউটপুট: Difference: -86419753208641975320n
console.log("গুণফল:", product); // আউটপুট: Product: 1219326311370217957951669538098765432100n
console.log("ভাগফল:", quotient); // আউটপুট: Quotient: 6172839450617283945n
console.log("ভাগশেষ:", remainder); // আউটপুট: Remainder: 5n
console.log("ঘাত:", power); // আউটপুট: Power: 187641281029182300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000n

গুরুত্বপূর্ণ বিবেচ্য বিষয়:

তুলনামূলক অপারেটর

আপনি BigInt ভ্যালুকে অন্য BigInt ভ্যালু বা এমনকি Number ভ্যালুর সাথে তুলনা করতে স্ট্যান্ডার্ড তুলনামূলক অপারেটর (`==`, `!=`, `<`, `>`, `<=`, `>=`) ব্যবহার করতে পারেন। তবে, টাইপ কোয়ারশনের সম্ভাবনার বিষয়ে সচেতন থাকুন।

উদাহরণ:


const a = 10n;
const b = 20n;
const c = 10;

console.log(a == b);   // আউটপুট: false
console.log(a != b);   // আউটপুট: true
console.log(a < b);    // আউটপুট: true
console.log(a > b);    // আউটপুট: false
console.log(a <= b);   // আউটপুট: true
console.log(a >= b);   // আউটপুট: false

console.log(a == c);   // আউটপুট: true (টাইপ কোয়ারশন)
console.log(a === c);  // আউটপুট: false (কোনো টাইপ কোয়ারশন নেই)

সর্বোত্তম অভ্যাস: BigInt এবং Number ভ্যালুর তুলনা করার সময় অপ্রত্যাশিত টাইপ কোয়ারশন এড়াতে স্ট্রিক্ট ইকুয়ালিটি (`===`) এবং স্ট্রিক্ট ইনইকুয়ালিটি (`!==`) ব্যবহার করুন।

BigInt এবং Number-এর মধ্যে রূপান্তর

যদিও BigInt এবং Number-এর মধ্যে সরাসরি গাণিতিক ক্রিয়াকলাপ অনুমোদিত নয়, আপনি দুটি টাইপের মধ্যে রূপান্তর করতে পারেন। তবে, BigInt ভ্যালু `Number.MAX_SAFE_INTEGER`-কে অতিক্রম করলে একটি BigInt-কে Number-এ রূপান্তর করার সময় নির্ভুলতা হারানোর সম্ভাবনা সম্পর্কে সচেতন থাকুন।

উদাহরণ:


const bigIntValue = 9007199254740991n; // Number.MAX_SAFE_INTEGER
const numberValue = Number(bigIntValue); // BigInt-কে Number-এ রূপান্তর করা হচ্ছে
console.log(numberValue); // আউটপুট: 9007199254740991

const largerBigIntValue = 9007199254740992n; // Number.MAX_SAFE_INTEGER অতিক্রম করে
const largerNumberValue = Number(largerBigIntValue);
console.log(largerNumberValue); // আউটপুট: 9007199254740992 (অনির্ভুল হতে পারে)

const numberToBigInt = BigInt(12345); // Number-কে BigInt-এ রূপান্তর করা হচ্ছে
console.log(numberToBigInt); // আউটপুট: 12345n

ব্যবহারের ক্ষেত্র এবং উদাহরণ

ক্রিপ্টোগ্রাফি

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


// উদাহরণ: একটি সাধারণ (অনিরাপদ) কী পেয়ার তৈরি করা
function generateKeyPair() {
  const p = 281n; // একটি মৌলিক সংখ্যা
  const q = 283n; // আরেকটি মৌলিক সংখ্যা
  const n = p * q; // মডিউলাস
  const totient = (p - 1n) * (q - 1n); // অয়লারের টোশেন্ট ফাংশন

  // একটি e (পাবলিক এক্সপোনেন্ট) বেছে নিন যাতে 1 < e < totient এবং gcd(e, totient) = 1 হয়
  const e = 17n;

  // d (প্রাইভেট এক্সপোনেন্ট) গণনা করুন যাতে (d * e) % totient = 1 হয়
  let d = 0n;
  for (let i = 1n; i < totient; i++) {
    if ((i * e) % totient === 1n) {
      d = i;
      break;
    }
  }

  return {
    publicKey: { n, e },
    privateKey: { n, d },
  };
}

const keyPair = generateKeyPair();
console.log("পাবলিক কী:", keyPair.publicKey);
console.log("প্রাইভেট কী:", keyPair.privateKey);

দ্রষ্টব্য: এটি শুধুমাত্র প্রদর্শনের উদ্দেশ্যে একটি সরলীকৃত উদাহরণ। বাস্তব-বিশ্বের ক্রিপ্টোগ্রাফিতে অনেক বড় মৌলিক সংখ্যা এবং আরও অত্যাধুনিক অ্যালগরিদম ব্যবহার করা হয়।

আর্থিক গণনা

বড় অঙ্কের অর্থ নিয়ে কাজ করার সময়, বিশেষ করে আন্তর্জাতিক লেনদেনে, নির্ভুলতা অত্যন্ত গুরুত্বপূর্ণ। BigInt রাউন্ডিং ত্রুটি প্রতিরোধ করতে এবং সঠিক গণনা নিশ্চিত করতে পারে।


// উদাহরণ: চক্রবৃদ্ধি সুদ গণনা
function calculateCompoundInterest(principal, rate, time) {
  const principalBigInt = BigInt(principal * 100); // সেন্টে রূপান্তর করুন
  const rateBigInt = BigInt(rate * 10000);       // শতাংশের দশ-হাজার ভাগে রূপান্তর করুন
  const timeBigInt = BigInt(time);

  let amount = principalBigInt;
  for (let i = 0n; i < timeBigInt; i++) {
    amount = amount * (10000n + rateBigInt) / 10000n;
  }

  const amountInDollars = Number(amount) / 100;
  return amountInDollars;
}

const principal = 1000000; // $1,000,000
const rate = 0.05;    // 5% সুদের হার
const time = 10;     // ১০ বছর

const finalAmount = calculateCompoundInterest(principal, rate, time);
console.log("চূড়ান্ত পরিমাণ:", finalAmount); // আউটপুট: Final Amount: 1628894.6267774413 (আনুমানিক)

এই উদাহরণে, আমরা গণনা চলাকালীন রাউন্ডিং ত্রুটি এড়াতে মূলধন এবং হারকে BigInt ভ্যালুতে রূপান্তর করি। ফলাফলটি প্রদর্শনের জন্য আবার Number-এ রূপান্তর করা হয়।

বড় আইডি নিয়ে কাজ করা

ডিস্ট্রিবিউটেড সিস্টেমে, একাধিক সার্ভার জুড়ে অনন্য আইডি তৈরি করা চ্যালেঞ্জিং হতে পারে। BigInt ব্যবহার করে আপনি খুব বড় আইডি তৈরি করতে পারেন যা সংঘর্ষের সম্ভাবনা কমায়।


// উদাহরণ: টাইমস্ট্যাম্প এবং সার্ভার আইডির উপর ভিত্তি করে একটি অনন্য আইডি তৈরি করা
function generateUniqueId(serverId) {
  const timestamp = BigInt(Date.now());
  const serverIdBigInt = BigInt(serverId);
  const random = BigInt(Math.floor(Math.random() * 1000)); // সামান্য র‍্যান্ডমনেস যোগ করুন

  // একটি অনন্য আইডি তৈরি করতে ভ্যালুগুলো একত্রিত করুন
  const uniqueId = (timestamp << 20n) + (serverIdBigInt << 10n) + random;
  return uniqueId.toString(); // সহজে পরিচালনার জন্য স্ট্রিং হিসাবে রিটার্ন করুন
}

const serverId = 123; // উদাহরণ সার্ভার আইডি
const id1 = generateUniqueId(serverId);
const id2 = generateUniqueId(serverId);

console.log("অনন্য আইডি ১:", id1);
console.log("অনন্য আইডি ২:", id2);

BigInt এবং JSON

BigInt ভ্যালুগুলো JSON দ্বারা নেটিভভাবে সমর্থিত নয়। `JSON.stringify()` ব্যবহার করে একটি BigInt ধারণকারী জাভাস্ক্রিপ্ট অবজেক্টকে সিরিয়ালাইজ করার চেষ্টা করলে একটি `TypeError` দেখা দেবে। JSON নিয়ে কাজ করার সময় BigInt ভ্যালু পরিচালনা করার জন্য আপনার কাছে কয়েকটি বিকল্প রয়েছে:

  1. স্ট্রিং-এ রূপান্তর: সিরিয়ালাইজ করার আগে BigInt-কে একটি স্ট্রিং-এ রূপান্তর করুন। এটি সবচেয়ে সাধারণ এবং সহজ পদ্ধতি।
  2. কাস্টম সিরিয়ালাইজেশন/ডিসিরিয়ালাইজেশন: BigInt ভ্যালু পরিচালনা করতে একটি কাস্টম সিরিয়ালাইজেশন/ডিসিরিয়ালাইজেশন ফাংশন ব্যবহার করুন।

উদাহরণ:

স্ট্রিং-এ রূপান্তর:


const data = {
  id: 12345678901234567890n,
  name: "Example Data",
};

// সিরিয়ালাইজ করার আগে BigInt-কে স্ট্রিং-এ রূপান্তর করুন
data.id = data.id.toString();

const jsonData = JSON.stringify(data);
console.log(jsonData); // আউটপুট: {"id":"12345678901234567890","name":"Example Data"}

// ডিসিরিয়ালাইজ করার সময়, আপনাকে স্ট্রিংটিকে আবার BigInt-এ রূপান্তর করতে হবে
const parsedData = JSON.parse(jsonData, (key, value) => {
  if (key === "id") {
    return BigInt(value);
  }
  return value;
});

console.log(parsedData.id); // আউটপুট: 12345678901234567890n

কাস্টম সিরিয়ালাইজেশন/ডিসিরিয়ালাইজেশন (`replacer` এবং `reviver` ব্যবহার করে):


const data = {
  id: 12345678901234567890n,
  name: "Example Data",
};

// কাস্টম সিরিয়ালাইজেশন
const jsonData = JSON.stringify(data, (key, value) => {
  if (typeof value === 'bigint') {
    return value.toString();
  } else {
    return value;
  }
});

console.log(jsonData);

// কাস্টম ডিসিরিয়ালাইজেশন
const parsedData = JSON.parse(jsonData, (key, value) => {
    if (typeof value === 'string' && /^[0-9]+$/.test(value)) { // এটি একটি সংখ্যা এবং একটি স্ট্রিং কিনা তা পরীক্ষা করুন
      try {
        return BigInt(value);
      } catch(e) {
          return value;
      }
    }
    return value;
});

console.log(parsedData.id);

ব্রাউজার সামঞ্জস্যতা

BigInt আধুনিক ব্রাউজারগুলিতে ব্যাপকভাবে সমর্থিত। তবে, পুরনো ব্রাউজার বা পরিবেশের জন্য সামঞ্জস্যতা পরীক্ষা করা অপরিহার্য। আপনি ব্রাউজার সমর্থন যাচাই করতে Can I use এর মতো একটি টুল ব্যবহার করতে পারেন। যদি আপনাকে পুরনো ব্রাউজার সমর্থন করতে হয়, আপনি একটি পলিফিল ব্যবহার করার কথা ভাবতে পারেন, কিন্তু মনে রাখবেন যে পলিফিলগুলি পারফরম্যান্সকে প্রভাবিত করতে পারে।

পারফরম্যান্স বিবেচ্য বিষয়

যদিও BigInt বড় পূর্ণসংখ্যার সাথে কাজ করার একটি শক্তিশালী উপায় সরবরাহ করে, সম্ভাব্য পারফরম্যান্সের প্রভাব সম্পর্কে সচেতন থাকা গুরুত্বপূর্ণ।

অতএব, শুধুমাত্র যখন প্রয়োজন তখনই BigInt ব্যবহার করুন, এবং যদি আপনি большого সংখ্যক BigInt অপারেশন করেন তবে পারফরম্যান্সের জন্য আপনার কোড অপ্টিমাইজ করুন।

উপসংহার

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

আরও অন্বেষণ

এই গাইডটি জাভাস্ক্রিপ্টে BigInt-এর একটি সম্পূর্ণ সংক্ষিপ্ত বিবরণ প্রদান করে। আরও গভীর তথ্যের জন্য এবং উন্নত কৌশলের জন্য লিঙ্ক করা রিসোর্সগুলি অন্বেষণ করুন।