Whiz Tools

লুন অ্যালগরিদম ক্যালকুলেটর

লুন অ্যালগরিদম ক্যালকুলেটর

পরিচিতি

লুন অ্যালগরিদম, যা "মডুলাস 10" বা "মড 10" অ্যালগরিদম হিসাবেও পরিচিত, এটি একটি সহজ চেকসাম সূত্র যা বিভিন্ন পরিচয় নম্বর যাচাই করতে ব্যবহৃত হয়, যেমন ক্রেডিট কার্ড নম্বর, কানাডিয়ান সোশ্যাল ইনস্যুরেন্স নম্বর, IMEI নম্বর এবং যুক্তরাষ্ট্রের জাতীয় প্রদানকারী শনাক্তকারী নম্বর। এই ক্যালকুলেটর আপনাকে লুন অ্যালগরিদম ব্যবহার করে নম্বর যাচাই করতে এবং লুন চেক পাস করা বৈধ নম্বর তৈরি করতে দেয়।

লুন অ্যালগরিদম কিভাবে কাজ করে

লুন অ্যালগরিদম নিম্নলিখিতভাবে কাজ করে:

  1. ডান দিকের শেষ ডিজিট (চেক ডিজিট বাদে) থেকে শুরু করে বাম দিকে গিয়ে, প্রতি দ্বিতীয় ডিজিটের মান দ্বিগুণ করুন।
  2. যদি এই দ্বিগুণ অপারেশনের ফলাফল 9 এর বেশি হয়, তবে ফলাফল থেকে 9 বিয়োগ করুন।
  3. ফলস্বরূপ সিকোয়েন্সের সমস্ত ডিজিটের যোগফল বের করুন।
  4. যদি মোটের মডুলো 10 শূন্যের সমান হয় (যদি মোট শূন্যে শেষ হয়), তবে সংখ্যা লুন সূত্র অনুযায়ী বৈধ; অন্যথায়, এটি বৈধ নয়।

লুন অ্যালগরিদমের একটি ভিজ্যুয়াল উপস্থাপনা এখানে:

1. প্রতি দ্বিতীয় ডিজিট দ্বিগুণ করুন 2. ডিজিটের যোগফল (9 এর জন্য দ্বিগুণ > 9) 3. মোট যোগফল বের করুন 4. চেক করুন যে মোট % 10 == 0

সূত্র

লুন অ্যালগরিদমটি গণিতের ভাষায় নিম্নরূপ প্রকাশ করা যেতে পারে:

ধরি did_i হল ii-তম ডিজিট, ডান দিকের শেষ ডিজিট (চেক ডিজিট বাদে) থেকে গণনা করে এবং বাম দিকে গিয়ে। তাহলে চেক ডিজিট d0d_0 এমনভাবে নির্বাচন করা হয় যে:

(2d2nmod9+d2n1+2d2n2mod9+d2n3++2d2mod9+d1+d0)mod10=0(2d_{2n} \bmod 9 + d_{2n-1} + 2d_{2n-2} \bmod 9 + d_{2n-3} + \cdots + 2d_2 \bmod 9 + d_1 + d_0) \bmod 10 = 0

যেখানে mod\bmod হল মডুলো অপারেশন।

ব্যবহার ক্ষেত্র

লুন অ্যালগরিদমের বিভিন্ন ক্ষেত্রে ব্যবহার রয়েছে:

  1. ক্রেডিট কার্ড যাচাইকরণ: বেশিরভাগ ক্রেডিট কার্ড নম্বর লুন অ্যালগরিদম ব্যবহার করে যাচাই করা হয়।
  2. কানাডিয়ান সোশ্যাল ইনস্যুরেন্স নম্বর: এই পরিচয় নম্বরগুলির বৈধতা যাচাই করতে লুন অ্যালগরিদম ব্যবহার করা হয়।
  3. IMEI নম্বর: মোবাইল ফোনের IMEI নম্বরগুলিতে একটি চেক ডিজিট রয়েছে যা লুন অ্যালগরিদম দ্বারা যাচাই করা হয়।
  4. জাতীয় প্রদানকারী শনাক্তকারী (NPI) নম্বর: যুক্তরাষ্ট্রের স্বাস্থ্যসেবা ব্যবস্থায় ব্যবহৃত, এই নম্বরগুলি লুন অ্যালগরিদম ব্যবহার করে যাচাই করা হয়।
  5. ISBNs: কিছু ISBN-10 নম্বর বৈধতা যাচাইয়ের জন্য লুন অ্যালগরিদমের একটি পরিবর্তন ব্যবহার করে।

বিকল্প

যদিও লুন অ্যালগরিদম ব্যাপকভাবে ব্যবহৃত হয়, তবে বিভিন্ন উদ্দেশ্যের জন্য অন্যান্য চেকসাম অ্যালগরিদমও রয়েছে:

  1. ডাম অ্যালগরিদম: একটি অন্য চেক ডিজিট অ্যালগরিদম যা সমস্ত একক ডিজিটের ত্রুটি এবং সমস্ত পার্শ্ববর্তী স্থানান্তর ত্রুটি সনাক্ত করে।
  2. ভারহফ অ্যালগরিদম: একটি আরও জটিল চেকসাম অ্যালগরিদম যা সমস্ত একক ডিজিটের ত্রুটি এবং বেশিরভাগ স্থানান্তর ত্রুটি ধরতে পারে।
  3. ISBN-13 চেক ডিজিট: ISBN-10 এর চেয়ে ভিন্ন অ্যালগরিদম ব্যবহার করে, যা লুন অ্যালগরিদমের উপর ভিত্তি করে।

ইতিহাস

লুন অ্যালগরিদমটি 1954 সালে আইবিএমের কম্পিউটার বিজ্ঞানী হান্স পিটার লুন দ্বারা তৈরি করা হয়েছিল। লুন তথ্য বিজ্ঞান ক্ষেত্রে একজন পথিকৃৎ ছিলেন এবং KWIC (কী ওয়ার্ড ইন কনটেক্সট) ইনডেক্সিং সিস্টেম সহ বেশ কয়েকটি উদ্ভাবনের জন্য পরিচিত।

অ্যালগরিদমটি মূলত দুর্ঘটনাবশত ত্রুটির বিরুদ্ধে সুরক্ষা দেওয়ার জন্য ডিজাইন করা হয়েছিল, ক্ষতিকারক আক্রমণের জন্য নয়। এটি লক্ষ্য করা গুরুত্বপূর্ণ যে যদিও লুন অ্যালগরিদম অনেক সাধারণ ত্রুটি সনাক্ত করতে পারে, এটি একটি নিরাপদ এনক্রিপশন ফর্ম নয় এবং ডেটা সুরক্ষার উদ্দেশ্যে নির্ভর করা উচিত নয়।

এর বয়স সত্ত্বেও, লুন অ্যালগরিদম তার সরলতা এবং সাধারণ লেখার ত্রুটি ধরার কার্যকারিতার কারণে ব্যাপকভাবে ব্যবহৃত হচ্ছে।

বাস্তবায়ন উদাহরণ

বিভিন্ন প্রোগ্রামিং ভাষায় লুন অ্যালগরিদম বাস্তবায়নের কিছু কোড উদাহরণ এখানে রয়েছে:

import random

def luhn_validate(number):
    digits = [int(d) for d in str(number)]
    checksum = 0
    for i in range(len(digits) - 1, -1, -1):
        d = digits[i]
        if (len(digits) - i) % 2 == 0:
            d = d * 2
            if d > 9:
                d -= 9
        checksum += d
    return checksum % 10 == 0

def generate_valid_number(length):
    digits = [random.randint(0, 9) for _ in range(length - 1)]
    checksum = sum(digits[::2]) + sum(sum(divmod(d * 2, 10)) for d in digits[-2::-2])
    check_digit = (10 - (checksum % 10)) % 10
    return int(''.join(map(str, digits + [check_digit])))

## উদাহরণ ব্যবহার:
print(luhn_validate(4532015112830366))  # সত্য
print(luhn_validate(4532015112830367))  # মিথ্যা
print(generate_valid_number(16))  # একটি বৈধ 16-অঙ্কের নম্বর তৈরি করে
function luhnValidate(number) {
    const digits = number.toString().split('').map(Number);
    let checksum = 0;
    for (let i = digits.length - 1; i >= 0; i--) {
        let d = digits[i];
        if ((digits.length - i) % 2 === 0) {
            d *= 2;
            if (d > 9) d -= 9;
        }
        checksum += d;
    }
    return checksum % 10 === 0;
}

function generateValidNumber(length) {
    const digits = Array.from({length: length - 1}, () => Math.floor(Math.random() * 10));
    const checksum = digits.reduce((sum, digit, index) => {
        if ((length - 1 - index) % 2 === 0) {
            digit *= 2;
            if (digit > 9) digit -= 9;
        }
        return sum + digit;
    }, 0);
    const checkDigit = (10 - (checksum % 10)) % 10;
    return parseInt(digits.join('') + checkDigit);
}

// উদাহরণ ব্যবহার:
console.log(luhnValidate(4532015112830366));  // সত্য
console.log(luhnValidate(4532015112830367));  // মিথ্যা
console.log(generateValidNumber(16));  // একটি বৈধ 16-অঙ্কের নম্বর তৈরি করে
import java.util.Random;

public class LuhnValidator {
    public static boolean luhnValidate(long number) {
        String digits = String.valueOf(number);
        int checksum = 0;
        boolean isEven = true;
        for (int i = digits.length() - 1; i >= 0; i--) {
            int digit = Character.getNumericValue(digits.charAt(i));
            if (isEven) {
                digit *= 2;
                if (digit > 9) digit -= 9;
            }
            checksum += digit;
            isEven = !isEven;
        }
        return checksum % 10 == 0;
    }

    public static long generateValidNumber(int length) {
        Random random = new Random();
        long[] digits = new long[length - 1];
        for (int i = 0; i < length - 1; i++) {
            digits[i] = random.nextInt(10);
        }
        long checksum = 0;
        for (int i = digits.length - 1; i >= 0; i--) {
            long digit = digits[i];
            if ((length - 1 - i) % 2 == 0) {
                digit *= 2;
                if (digit > 9) digit -= 9;
            }
            checksum += digit;
        }
        long checkDigit = (10 - (checksum % 10)) % 10;
        long result = 0;
        for (long digit : digits) {
            result = result * 10 + digit;
        }
        return result * 10 + checkDigit;
    }

    public static void main(String[] args) {
        System.out.println(luhnValidate(4532015112830366L));  // সত্য
        System.out.println(luhnValidate(4532015112830367L));  // মিথ্যা
        System.out.println(generateValidNumber(16));  // একটি বৈধ 16-অঙ্কের নম্বর তৈরি করে
    }
}

প্রান্তের কেস এবং বিশেষ বিবেচনা

লুন অ্যালগরিদম বাস্তবায়ন করার সময়, নিম্নলিখিত প্রান্তের কেস এবং বিশেষ বিবেচনাগুলি মনে রাখুন:

  1. ইনপুট যাচাইকরণ: নিশ্চিত করুন যে ইনপুটটি একটি বৈধ সংখ্যা স্ট্রিং। অ-ডিজিট অক্ষরগুলি যথাযথভাবে পরিচালনা করা উচিত (অথবা মুছে ফেলা বা অবৈধ ইনপুট হিসাবে বিবেচনা করা উচিত)।

  2. লিডিং জিরো: অ্যালগরিদমটি লিডিং জিরো সহ নম্বরগুলির সাথে সঠিকভাবে কাজ করা উচিত।

  3. বড় সংখ্যা: কিছু প্রোগ্রামিং ভাষার স্ট্যান্ডার্ড পূর্ণসংখ্যা টাইপের ক্ষমতা অতিক্রমকারী খুব দীর্ঘ সংখ্যাগুলিকে পরিচালনা করতে প্রস্তুত থাকুন।

  4. খালি ইনপুট: আপনার বাস্তবায়নটি খালি স্ট্রিং বা শূন্য ইনপুট কীভাবে পরিচালনা করবে তা সংজ্ঞায়িত করুন।

  5. অ-মানক অক্ষর সেট: কিছু অ্যাপ্লিকেশনে, আপনি এমন সংখ্যাগুলি দেখতে পারেন যা মানক 0-9 পরিসরের বাইরে অক্ষর দ্বারা উপস্থাপিত। এগুলি কীভাবে পরিচালনা করা উচিত তা সংজ্ঞায়িত করুন।

  6. পারফরম্যান্স বিবেচনা: এমন অ্যাপ্লিকেশনগুলির জন্য যা দ্রুত অনেক ইনপুট যাচাই করতে প্রয়োজন, অ্যালগরিদম বাস্তবায়ন অপ্টিমাইজ করার কথা বিবেচনা করুন।

সংখ্যাগত উদাহরণ

  1. বৈধ ক্রেডিট কার্ড নম্বর:

    • নম্বর: 4532015112830366
    • লুন চেক: বৈধ
  2. অবৈধ ক্রেডিট কার্ড নম্বর:

    • নম্বর: 4532015112830367
    • লুন চেক: অবৈধ
  3. বৈধ কানাডিয়ান সোশ্যাল ইনস্যুরেন্স নম্বর:

    • নম্বর: 046 454 286
    • লুন চেক: বৈধ
  4. অবৈধ IMEI নম্বর:

    • নম্বর: 490154203237518
    • লুন চেক: অবৈধ

পরীক্ষার কেস

লুন অ্যালগরিদমের বাস্তবায়ন যাচাই করতে, আপনি নিম্নলিখিত পরীক্ষার কেসগুলি ব্যবহার করতে পারেন:

def test_luhn_algorithm():
    assert luhn_validate(4532015112830366) == True
    assert luhn_validate(4532015112830367) == False
    assert luhn_validate(79927398713) == True
    assert luhn_validate(79927398714) == False
    
    # তৈরি করা নম্বর পরীক্ষা
    for _ in range(10):
        assert luhn_validate(generate_valid_number(16)) == True
    
    print("সব পরীক্ষায় সফল হয়েছে!")

test_luhn_algorithm()

রেফারেন্স

  1. লুন, এইচ. পি. (1960)। "নম্বর যাচাই করার জন্য কম্পিউটার"। মার্কিন পেটেন্ট 2,950,048।
  2. গ্যালিয়ান, জোসেফ। "পরিচয় নম্বরগুলির গণিত।" দ্য কলেজ ম্যাথমেটিক্স জার্নাল, খণ্ড 22, সংখ্যা 3, 1991, পৃষ্ঠা 194–202। JSTOR, www.jstor.org/stable/2686878।
  3. "ISO/IEC 7812-1:2017"। আন্তর্জাতিক মান সংস্থা। 2 আগস্ট, 2024 তারিখে প্রাপ্ত।
  4. কনথ, ডোনাল্ড। "কম্পিউটার প্রোগ্রামিংয়ের শিল্প, খণ্ড 2: সেমিনিউমেরিক্যাল অ্যালগরিদম"। অ্যাডিসন-ওয়েসলি, 1997।
Feedback