लुहन कलन विधि

**लुहन कलन विधि** या **लुहन सूत्र** (अंग्रेज़ी: Luhn algorithm; रचनाकार: आईबीएम वैज्ञानिक हान्स पीटर लुहन), जिसे "मॉड्यूलस १०" या "मॉड १०" एल्गोरिदम के नाम से भी जाना जाता है, एक सरल जाँच अंक सूत्र है जिसका उपयोग विभिन्न प्रकार की पहचान संख्याओं को मान्य करने के लिए किया जाता है।

यह कलन विधि सार्वजनिक डोमेन में है और आज व्यापक रूप से उपयोग में है। इसका विनिर्देशन आईएसओ/आईईसी ७८१२-१ में किया गया है। यह क्रिप्टोग्राफ़िक रूप से सुरक्षित हैश फंक्शन बनने के लिए अभिप्रेत नहीं है; इसको दुर्घटनावश होने वाली त्रुटियों से सुरक्षा प्रदान करने के लिए डिज़ाइन किया गया था, दुर्भावनापूर्ण हमलों के लिए नहीं। अधिकांश क्रेडिट कार्ड संख्या और कई सरकारी पहचान संख्याएँ वैध संख्याों को गलत टाइप किए गए या अन्यथा गलत संख्याों से अलग करने के एक सरल तरीके के रूप में इस कलन विधि का उपयोग करते हैं।

## विवरण
जाँच अंक की गणना निम्नानुसार की जाती है:

१. संख्या से जाँच अंक को हटा दें (यदि यह पहले से मौजूद है)। इससे पेलोड शेष रह जाता है।

२. पेलोड अंकों से शुरुआत करें। दाएँ से बाएँ की ओर बढ़ते हुए, अंतिम अंक से शुरू करके हर दूसरे अंक को दोगुना करें। यदि किसी अंक को दोगुना करने पर प्राप्त मान > ९ होता है, तो उसमें से ९ घटा दें (या उसके अंकों का योग करें)।

३. परिणामी सभी अंकों (उन अंकों सहित जिन्हें दोगुना नहीं किया गया था) का योग करें।

४. जाँच अंक की गणना (१० - (s मॉड १०)) मॉड १० द्वारा की जाती है, जहाँ s चरण ३ का योग है। यह वह सबसे छोटी संख्या (संभवतः शून्य) है जिसे s में जोड़ा जाना चाहिए ताकि यह १० का गुणज बन जाए। समान मान देने वाले अन्य वैध सूत्र हैं: ९ - ((s + ९) मॉड १०), (१० - s) मॉड १०, और १०⌈s/१०⌉ - s। ध्यान दें कि (१० - s) मॉड १० सूत्र मॉड्यूलो ऑपरेशन द्वारा ऋणात्मक संख्याओं को संभालने के तरीके में अंतर के कारण सभी वातावरणों में काम नहीं करेगा।

### जाँच अंक की गणना का उदाहरण
एक उदाहरण मान लें: एक खाता संख्या १७८९३७२९९७ (सिर्फ़ "पेलोड", जाँच अंक अभी शामिल नहीं है):

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

जाँच अंक (१० - (५६ मॉड १०)) मॉड १० = ४ के बराबर है।

यह पूरी खाता संख्या को १७८९३७२९९७४ बनाता है।

### जाँच अंक को मान्य करने का उदाहरण
१. मान्य करने के लिए संख्या से जाँच अंक (अंतिम अंक) हटा दें। (उदाहरण के लिए १७८९३७२९९७४ → १७८९३७२९९७)

२. जाँच अंक की गणना करें (ऊपर देखें)

३. अपने परिणाम की मूल जाँच अंक से तुलना करें। यदि दोनों संख्या मेल खाते हैं, तो परिणाम वैध है। (उदाहरण के लिए (दिया गया जाँच अंक = गणना किया गया जाँच अंक) ⇔ (वैध जाँच अंक है))।

## शक्तियाँ तथा दुर्बलताएँ
लुहन कलन विधि सभी एकल-अंकीय त्रुटियों का, साथ ही आसन्न अंकों के लगभग सभी स्थानांतरणों का पता लगाएगी। हालाँकि, यह दो-अंकीय अनुक्रम ०९ से ९० (या इसके विपरीत) के स्थानांतरण का पता नहीं लगाएगी। यह अधिकांश संभावित जुड़वाँ त्रुटियों का पता लगाएगी (यह २२ ↔ ५५, ३३ ↔ ६६ या ४४ ↔ ७७ का पता नहीं लगाएगी)।

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

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

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

## छद्मकोड कार्यान्वयन
निम्नलिखित अंग्रेज़ी फ़ंक्शन कार्ड संख्या को, जाँच अंक सहित, पूर्णांकों की एक सरणी के रूप में लेता है और जाँच अंक सही होने पर सही आउटपुट देता है, अन्यथा गलत।
 **function** isValid(cardNumber[1..length])
     sum := 0
     parity := length mod 2
     **for** i from 1 to (length - 1) **do**
         **if** i mod 2 == parity **then**
             sum := sum + cardNumber[i]
         **elseif** cardNumber[i] > 4 **then**
             sum := sum + 2 * cardNumber[i] - 9
         **else**
             sum := sum + 2 * cardNumber[i]
         **end if**
     **end for**
     **return** cardNumber[length] == ((10 - (sum mod 10)) mod 10)
 **end function**

**हिन्दी संस्करण**

## उपयोग
लुहन कलन विधि का उपयोग विभिन्न प्रणालियों में किया जाता है, जिनमें शामिल हैं:

* क्रेडिट कार्ड संख्या
* अंतर्राष्ट्रीय मोबाइल उपकरण पहचान
* उत्तर अमेरिकी वित्तीय साधनों के लिए क्यूएसआईपी संख्या
* संयुक्त राज्य अमेरिका में राष्ट्रीय प्रदाता पहचानकर्ता संख्या
* कनाडाई सामाजिक बीमा संख्या
* इज़राइली पहचान संख्याएँ
* दक्षिण अफ्रीकी पहचान संख्याएँ
* दक्षिण अफ़्रीकी कर संदर्भ संख्याएँ
* स्वीडिश व्यक्तिगत पहचान संख्याएँ
* स्वीडिश कॉर्पोरेट पहचान संख्या (ऑर्गनर) 
* ग्रीक सामाजिक सुरक्षा संख्या (ΑΜΚΑ) 
* सिम कार्ड के आईसीसीआईडी
* यूरोपीय पेटेंट आवेदन संख्या
* मैकडॉनल्ड्स, टैको बेल और ट्रैक्टर सप्लाई कंपनी की रसीदों पर दिखाई देने वाले सर्वेक्षण कोड
* संयुक्त राज्य डाक सेवा पैकेज ट्रैकिंग संख्या एक संशोधित लुहन एल्गोरिदम का उपयोग करते हैं
* इतालवी वैट संख्याएँ (पार्टीटा इवा) 

## सन्दर्भ