কম্পিউটার টিউটোরিয়াল

C#-এ Math.BigMul() মেথড: দুটি ৩২-বিট ইন্টিজারের পূর্ণ গুণফল


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 স্পষ্ট ইন্টেনশন প্রকাশ করে এবং ওভারফ্লো-প্রুফ।

  1. C#-এ Math.Floor() মেথড

  2. C#-এ Math.Exp() মেথড

  3. C#-এ Math.DivRem() মেথড

  4. C#-এ Math.BigMul() মেথড: ৩২-বিট সংখ্যা দুটির গুণফল (৬৪-বিট)