C#-এ Math.BigMul() মেথডটি দুটি ৩২-বিট সাইনড ইন্টিজার (int) গুণ করে এবং পূর্ণ গুণফলকে ৬৪-বিট সাইনড ইন্টিজার (long) হিসেবে ফেরত দেয়। সাধারণ গুণনে ওভারফ্লো হলে এই মেথড সঠিক ফলাফল দেয়।
সিনট্যাক্স (Syntax)
public static long BigMul(int a, int b);
প্যারামিটার:
a- প্রথম ৩২-বিট ইন্টিজারb- দ্বিতীয় ৩২-বিট ইন্টিজার
উদাহরণ ১: Int32.MaxValue এর বর্গ
using System;
public class Demo
{
public static void Main()
{
int val1 = Int32.MaxValue; // 2,147,483,647
int val2 = Int32.MaxValue; // 2,147,483,647
Console.WriteLine("Product of two numbers = " + Math.BigMul(val1, val2));
}
}
আউটপুট
Product of two numbers = 4611686014132420609
এই মান long.MaxValue (9,223,372,036,854,775,807) এর আধায়কত।
উদাহরণ ২: দুটি বড় সংখ্যা গুণ
using System;
public class Demo
{
public static void Main()
{
int val1 = 139897778;
int val2 = 217878786;
Console.WriteLine("Product of two numbers = " + Math.BigMul(val1, val2));
}
}
আউটপুট
Product of two numbers = 30480758034737508
কেন BigMul প্রয়োজন? (ওভারফ্লো সমস্যা)
সাধারণ int গুণনে ওভারফ্লো হয়:
int a = 1000000; int b = 1000000; // সাধারণ গুণ (ওভারফ্লো!) int normal = a * b; // -727379968 (ভুল ফলাফল - wrapped around) // BigMul (সঠিক ফলাফল) long big = Math.BigMul(a, b); // 1000000000000 (সঠিক)
বিট-স্তরে ব্যাখ্যা
int (32-bit): 00000000 00001111 01000010 01000000 (1,000,000) int (32-bit): 00000000 00001111 01000010 01000000 (1,000,000) ───────────────────────────────────────────────────── long (64-bit): 00000000 00000000 00000011 01000110 10111100 10000000000000 (1,000,000,000,000)
প্রয়োগিক ব্যবহার ক্ষেত্র
- ক্রিপ্টোগ্রাফি: বড় 소수 গুণফল
- ফিনান্সিয়াল ক্যালকুলেশন: বড় টাকার হিসাব (পয়সা পর্যন্ত)
- গেম ডেভেলপমেন্ট: হাই-প্রিসিশন পজিশন গণনা
- সাইєн্টিফিক কম্পিউটিং: বড় পূর্ণসংখ্যা গাণিতিক
বেন্চমার্ক: BigMul vs Manual Cast
using System;
using System.Diagnostics;
public class Benchmark
{
public static void Main()
{
int a = 50000000;
int b = 50000000;
int iterations = 10_000_000;
// BigMul
var sw1 = Stopwatch.StartNew();
for (int i = 0; i < iterations; i++)
Math.BigMul(a, b);
sw1.Stop();
// Manual cast to long
var sw2 = Stopwatch.StartNew();
for (int i = 0; i < iterations; i++)
(long)a * b;
sw2.Stop();
Console.WriteLine($"BigMul: {sw1.ElapsedMilliseconds} ms");
Console.WriteLine($"Cast: {sw2.ElapsedMilliseconds} ms");
}
}
নোট: আধুনিক JIT কম্পাইলার (long)a * b-কে অপ্টিমাইজ করে দিতে পারে, তাই পারফরম্যান্স প্রায় একই হতে পারে। কিন্তু BigMul স্পষ্ট ইন্টেনশন প্রকাশ করে এবং ওভারফ্লো-প্রুফ।