लुहान एल्गोरिथ्म

लुहान कलन विधि या लुहान फॉर्मूला, जिसे मॉड्यूलर अंकगणित 10 या मॉड 10 एल्गोरिदम के रूप में भी जाना जाता है, इसका नाम इसके निर्माता, आईबीएम वैज्ञानिक उनके पीटर लुहान के नाम पर रखा गया है, एक सरल संख्या जांचें  फॉर्मूला है जिसका उपयोग विभिन्न प्रकार की पहचान संख्याओं को मान्य करने के लिए किया जाता है, जैसे भुगतान कार्ड नंबर, अंतर्राष्ट्रीय मोबाइल उपकरण पहचान, संयुक्त राज्य अमेरिका में राष्ट्रीय प्रदाता पहचानकर्ता, कनाडा सामाजिक बीमा संख्या, इज़राइली पहचान पत्र आईडी संख्या, दक्षिण अफ्रीका आईडी संख्या, स्वीडन राष्ट्रीय पहचान संख्या, स्वीडन कॉर्पोरेट पहचान संख्या (ऑर्गएनआर),  यूनान  Social Security Numbers (ΑΜΚΑ), SIM card numbers, European patent application number and survey codes appearing on मैकडॉनल्ड्स, [[:File:Taco Bell Receipt Luhn Algorithm.png|टाको बेल, and [[:File:Tractor Supply Receipt Luhn Algorithm.png|ट्रैक्टर सप्लाई कंपनी की रसीदें। इसका वर्णन 23 अगस्त 1960 को दिए गए अमेरिकी पेटेंट संख्या 2,950,048 में किया गया है। एल्गोरिदम सार्वजनिक डोमेन में है और आज व्यापक उपयोग में है। यह ISO/IEC 7812-1 में निर्दिष्ट है। इसका उद्देश्य [[क्रिप्टोग्राफ़िक हैश फ़ंक्शन होना नहीं है; इसे दुर्भावनापूर्ण हमलों से नहीं, बल्कि आकस्मिक त्रुटियों से बचाने के लिए डिज़ाइन किया गया था। अधिकांश क्रेडिट कार्ड और कई सरकारी पहचान संख्याएं वैध संख्याओं को गलत टाइप की गई या अन्यथा गलत संख्याओं से अलग करने की एक सरल विधि के रूप में एल्गोरिदम का उपयोग करती हैं।

विवरण
चेक अंक की गणना इस प्रकार की जाती है:
 * 1) यदि संख्या में पहले से ही चेक अंक है, तो पेलोड बनाने के लिए उस अंक को छोड़ दें। चेक अंक प्रायः अंतिम अंक होता है।
 * 2) पेलोड के साथ, सबसे दाएँ अंक से प्रारंभ करें। बाईं ओर बढ़ते हुए, प्रत्येक दूसरे अंक (सबसे दाएँ अंक सहित) का मान दोगुना करें।
 * 3) परिणामी अंकों के मानों का योग करें.
 * 4) चेक अंक की गणना किसके द्वारा की जाती है $$10 - (s\operatorname{mod} 10)$$. यह वह न्यूनतम संख्या (संभवतः शून्य) है जिसे जोड़ा जाना चाहिए $$s$$ 10 का गुणज बनाने के लिए। समान मान देने वाले अन्य मान्य सूत्र हैं $$(10 - s)\operatorname{mod} 10$$ और $$10\lceil s/10\rceil - s$$.

चेक अंक की गणना के लिए उदाहरण
खाता संख्या 7992739871 का एक उदाहरण मानें (सिर्फ पेलोड, चेक अंक अभी तक शामिल नहीं है):

परिणामी अंकों का योग 67 है।

चेक अंक के बराबर है $$10 - (67\operatorname{mod} 10) = 3$$.

इससे पूरा खाता नंबर 79927398713 पढ़ जाता है।

चेक अंक को मान्य करने के लिए उदाहरण

 * 1) सत्यापित करने के लिए नंबर का चेक अंक (अंतिम अंक) छोड़ें। (उदा. 79927398713 -> 7992739871)
 * 2) चेक अंक की गणना करें (ऊपर देखें)
 * 3) अपने परिणाम की तुलना मूल चेक अंक से करें। यदि दोनों संख्याएँ मेल खाती हैं, तो परिणाम मान्य है। (उदा.$$(givenCheckDigit = calculatedCheckDigit) \Leftrightarrow (isValidCheckDigit)$$).

ताकतें और कमजोरियाँ
लुहान एल्गोरिथ्म सभी एकल-अंकीय त्रुटियों के साथ-साथ आसन्न अंकों के लगभग सभी स्थानान्तरण का पता लगाएगा। हालाँकि, यह दो अंकों के अनुक्रम 09 से 90 (या इसके विपरीत) के स्थानान्तरण का पता नहीं लगाएगा। यह अधिकांश संभावित जुड़वां त्रुटियों का पता लगाएगा (यह 22 ↔ 55, 33 ↔ 66 या 44 ↔ 77 का पता नहीं लगाएगा)।

अन्य, अधिक जटिल चेक-डिजिट एल्गोरिदम (जैसे वेरहॉफ एल्गोरिथम और धूल एल्गोरिथ्म) अधिक ट्रांसक्रिप्शन त्रुटियों का पता लगा सकते हैं। लुहान मॉड एन एल्गोरिदम एक एक्सटेंशन है जो गैर-संख्यात्मक स्ट्रिंग का समर्थन करता है।

क्योंकि एल्गोरिदम अंकों पर दाएं से बाएं तरीके से काम करता है और शून्य अंक परिणाम को केवल तभी प्रभावित करते हैं जब वे स्थिति में बदलाव का कारण बनते हैं, संख्याओं की एक स्ट्रिंग की शुरुआत में शून्य-पैडिंग गणना को प्रभावित नहीं करती है। इसलिए, सिस्टम जो अंकों की एक विशिष्ट संख्या को पैड करते हैं (उदाहरण के लिए 1234 को 0001234 में परिवर्तित करके) पैडिंग से पहले या बाद में लुहान सत्यापन कर सकते हैं और समान परिणाम प्राप्त कर सकते हैं।

एल्गोरिदम संयुक्त राज्य अमेरिका के पेटेंट में दिखाई दिया चेकसम की गणना के लिए एक सरल, हाथ से पकड़े जाने वाले, यांत्रिक उपकरण के लिए। डिवाइस ने यांत्रिक तरीकों से मॉड 10 योग लिया। प्रतिस्थापन अंक, यानी, डबल और कम प्रक्रिया के परिणाम, यांत्रिक रूप से उत्पादित नहीं किए गए थे। बल्कि, मशीन की बॉडी पर अंकों को उनके क्रमबद्ध क्रम में अंकित किया गया था।

स्यूडोकोड कार्यान्वयन
निम्नलिखित फ़ंक्शन चेक अंक सहित एक कार्ड नंबर को पूर्णांकों की एक सरणी के रूप में लेता है और यदि चेक अंक सही है तो सही आउटपुट देता है, अन्यथा गलत आउटपुट देता है।

फ़ंक्शन मान्य है(कार्डनंबर[1..लंबाई]) योग := 0 समता := लंबाई मॉड 2 मेरे लिए 1 से लंबाई तक करें यदि मैं 2 != समता को मॉडिफाई करता हूँ तो योग := योग + कार्डनंबर[i] अन्यथा यदि कार्डनंबर[i] > 4 तो योग := योग + 2 * कार्डनंबर[i] - 9 अन्य योग := योग + 2 * कार्डनंबर[i] अगर अंत के लिए समाप्त रिटर्न कार्डनंबर[लंबाई] == (10 - (कुल योग 10)) अंत समारोह

सी शार्प (प्रोग्रामिंग भाषा)|सी#
 बूल IsValidLuhn(int[] अंकों में) {   int check_digit = 0; (int i = अंक. लंबाई - 2; i >= 0; --i) के लिए check_digit += ((i और 1) 0 है) स्विच {           सत्य => अंक[i] > 4? अंक[i] * 2 - 9 : अंक[i] * 2, गलत => अंक[i] };

वापसी 10 - (check_digit % 10) == अंक.अंतिम; } 

बाहरी संबंध

 * Implementation in 150 languages on the Rosetta Code project