लुहान एल्गोरिथ्म: Difference between revisions
No edit summary |
No edit summary |
||
Line 1: | Line 1: | ||
{{Short description|Simple checksum formula}} | {{Short description|Simple checksum formula}} | ||
लुहान [[कलन विधि|एल्गोरिथ्म]] या लुहान सूत्र, जिसे [[मॉड्यूलर अंकगणित]] 10 या मॉड 10 एल्गोरिदम के रूप में भी जाना जाता है, इसका नाम इसके निर्माता, [[आईबीएम]] वैज्ञानिक [[उनके पीटर लुहान]] के नाम पर रखा गया है, एक सरल [[ संख्या जांचें ]] सूत्र है जिसका उपयोग विभिन्न प्रकार की पहचान संख्याओं को मान्य करने के लिए किया जाता है, जैसे भुगतान कार्ड नंबर, [[अंतर्राष्ट्रीय मोबाइल उपकरण पहचान]], संयुक्त राज्य अमेरिका में [[राष्ट्रीय प्रदाता पहचानकर्ता]], [[कनाडा]] [[सामाजिक बीमा संख्या]], इज़राइली पहचान पत्र आईडी संख्या, [[दक्षिण अफ्रीका]] आईडी संख्या, [[स्वीडन]] [[राष्ट्रीय पहचान संख्या]], स्वीडन कॉर्पोरेट पहचान संख्या (ऑर्गएनआर), [[ यूनान ]]ट्रैक्टर सप्लाई कंपनी की | '''लुहान [[कलन विधि|एल्गोरिथ्म]]''' या लुहान सूत्र, जिसे [[मॉड्यूलर अंकगणित]] 10 या मॉड 10 एल्गोरिदम के रूप में भी जाना जाता है, इसका नाम इसके निर्माता, [[आईबीएम]] वैज्ञानिक [[उनके पीटर लुहान]] के नाम पर रखा गया है, एक सरल [[ संख्या जांचें ]] सूत्र है जिसका उपयोग विभिन्न प्रकार की पहचान संख्याओं को मान्य करने के लिए किया जाता है, जैसे भुगतान कार्ड नंबर, [[अंतर्राष्ट्रीय मोबाइल उपकरण पहचान]], संयुक्त राज्य अमेरिका में [[राष्ट्रीय प्रदाता पहचानकर्ता]], [[कनाडा]] [[सामाजिक बीमा संख्या]], इज़राइली पहचान पत्र आईडी संख्या, [[दक्षिण अफ्रीका]] आईडी संख्या, [[स्वीडन]] [[राष्ट्रीय पहचान संख्या]], स्वीडन कॉर्पोरेट पहचान संख्या (ऑर्गएनआर), [[ यूनान ]]ट्रैक्टर सप्लाई कंपनी की रसीदें है। इसका वर्णन 23 अगस्त 1960 को दिए गए अमेरिकी पेटेंट संख्या 2,950,048 में किया गया है।<ref name="patent">{{cite patent |country=US |number=2950048A |status=patent |title=संख्याओं के सत्यापन के लिए कंप्यूटर|pubdate=1960-08-23 |fdate=1954-01-06 |inventor1-first=Hans P. |inventor1-last=Luhn |inventorlink=Hans Peter Luhn}}</ref> | ||
एल्गोरिदम सार्वजनिक डोमेन में है और आज व्यापक उपयोग में है। यह | एल्गोरिदम सार्वजनिक डोमेन में है और आज व्यापक उपयोग में है। यह आईएसओ/आईईसी 7812-1 में निर्दिष्ट है।<ref>{{cite tech report |title=Identification cards — Identification of issuers — Part 1: Numbering system |number=[[ISO/IEC 7812]]-1:2017 |institution=[[International Organization for Standardization]], [[International Electrotechnical Commission]] |date=January 2017 |type=Standard |url=https://www.iso.org/standard/70484.html |chapter=Annex B: Luhn formula for computing modulus-10 “double-add-double” check digits}}</ref> इसका उद्देश्य [[क्रिप्टोग्राफ़िक हैश फ़ंक्शन]] होना नहीं है; इसे दुर्भावनापूर्ण आक्रमण से नहीं, किन्तु आकस्मिक त्रुटियों से बचाने के लिए डिज़ाइन किया गया था। अधिकांश क्रेडिट कार्ड और विभिन्न सरकारी पहचान संख्याएं वैध संख्याओं को गलत टाइप की गई या अन्यथा गलत संख्याओं से पृथक करने की एक सरल विधि के रूप में एल्गोरिदम का उपयोग करती हैं। | ||
==विवरण== | ==विवरण== | ||
Line 9: | Line 9: | ||
# पेलोड के साथ, सबसे दाएँ अंक से प्रारंभ करें। बाईं ओर बढ़ते हुए, प्रत्येक दूसरे अंक (सबसे दाएँ अंक सहित) का मान दोगुना करें। | # पेलोड के साथ, सबसे दाएँ अंक से प्रारंभ करें। बाईं ओर बढ़ते हुए, प्रत्येक दूसरे अंक (सबसे दाएँ अंक सहित) का मान दोगुना करें। | ||
# परिणामी अंकों के मानों का योग करें. | # परिणामी अंकों के मानों का योग करें. | ||
# चेक अंक की गणना | # चेक अंक की गणना <math>10 - (s\operatorname{mod} 10)</math> द्वारा की जाती है . यह वह न्यूनतम संख्या (संभवतः शून्य) है जिसे 10 का गुणज बनाने के लिए <math>s</math> में जोड़ा जाना चाहिए समान मान देने वाले अन्य मान्य सूत्र हैं <math>(10 - s)\operatorname{mod} 10</math> और <math>10\lceil s/10\rceil - s</math>. | ||
# | |||
=== चेक अंक की गणना के लिए उदाहरण === | === चेक अंक की गणना के लिए उदाहरण === | ||
खाता संख्या 7992739871 का एक उदाहरण मानें (सिर्फ पेलोड, चेक अंक अभी तक | खाता संख्या 7992739871 का एक उदाहरण मानें (सिर्फ पेलोड, चेक अंक अभी तक सम्मिलित नहीं है): | ||
{| class="wikitable" style="text-align:center;border:none;background:transparent;"4353464434047422| style="width:1.5em" | 4283039836977353| style="width:1.5em" | 9 | {| class="wikitable" style="text-align:center;border:none;background:transparent;"4353464434047422| style="width:1.5em" | 4283039836977353| style="width:1.5em" | 9 | ||
Line 28: | Line 29: | ||
| style="width:1.5em" | 1 | | style="width:1.5em" | 1 | ||
|- | |- | ||
! | ! मल्टीप्लायर | ||
| 1 | | 1 | ||
| 2 | | 2 | ||
Line 64: | Line 65: | ||
| style="background: #FFA;" | '''2''' | | style="background: #FFA;" | '''2''' | ||
|- | |- | ||
! | ! अंकों का योग | ||
|7 | |7 | ||
|'''9''' (1+8) | |'''9''' (1+8) | ||
Line 78: | Line 79: | ||
परिणामी अंकों का योग 67 है। | परिणामी अंकों का योग 67 है। | ||
चेक अंक | चेक अंक <math>10 - (67\operatorname{mod} 10) = 3</math> के बराबर है . | ||
इससे पूरा खाता नंबर 79927398713 पढ़ जाता है। | इससे पूरा खाता नंबर 79927398713 पढ़ जाता है। | ||
Line 88: | Line 89: | ||
# अपने परिणाम की तुलना मूल चेक अंक से करें। यदि दोनों संख्याएँ मेल खाती हैं, तो परिणाम मान्य है। (उदा.<math>(givenCheckDigit = calculatedCheckDigit) \Leftrightarrow (isValidCheckDigit)</math>). | # अपने परिणाम की तुलना मूल चेक अंक से करें। यदि दोनों संख्याएँ मेल खाती हैं, तो परिणाम मान्य है। (उदा.<math>(givenCheckDigit = calculatedCheckDigit) \Leftrightarrow (isValidCheckDigit)</math>). | ||
== | ==सशक्तता और अशक्तता== | ||
लुहान एल्गोरिथ्म सभी एकल-अंकीय त्रुटियों के साथ-साथ आसन्न अंकों के लगभग सभी स्थानान्तरण का पता लगाएगा। | लुहान एल्गोरिथ्म सभी एकल-अंकीय त्रुटियों के साथ-साथ आसन्न अंकों के लगभग सभी स्थानान्तरण का पता लगाएगा। चूँकि, यह दो अंकों के अनुक्रम 09 से 90 (या इसके विपरीत) के स्थानान्तरण का पता नहीं होता है। यह अधिकांश संभावित जुड़वां त्रुटियों का पता लगाएगा (यह 22 ↔ 55, 33 ↔ 66 या 44 ↔ 77 का पता नहीं लगाएगा)। | ||
अन्य, अधिक | अन्य, अधिक सम्मिश्र चेक-डिजिट एल्गोरिदम (जैसे [[वेरहॉफ एल्गोरिथम]] और [[धूल एल्गोरिथ्म|डैम एल्गोरिथ्म]]) अधिक ट्रांसक्रिप्शन त्रुटियों का पता लगा सकते हैं। [[लुहान मॉड एन एल्गोरिदम]] एक एक्सटेंशन है जो गैर-संख्यात्मक स्ट्रिंग का समर्थन करता है। | ||
क्योंकि एल्गोरिदम अंकों पर दाएं से बाएं | क्योंकि एल्गोरिदम अंकों पर दाएं से बाएं विधि से कार्य करता है और शून्य अंक परिणाम को केवल तभी प्रभावित करते हैं जब वे स्थिति में परिवर्तन का कारण बनते हैं, संख्याओं की एक स्ट्रिंग की प्रारंभ में शून्य-पैडिंग गणना को प्रभावित नहीं करती है। इसलिए, सिस्टम जो अंकों की एक विशिष्ट संख्या को पैड करते हैं (उदाहरण के लिए 1234 को 0001234 में परिवर्तित करके) पैडिंग से पहले या पश्चात् में लुहान सत्यापन कर सकते हैं और समान परिणाम प्राप्त कर सकते हैं। | ||
एल्गोरिदम संयुक्त राज्य अमेरिका के पेटेंट में दिखाई दिया<ref name="patent" />चेकसम की गणना के लिए एक सरल, हाथ से पकड़े जाने वाले, यांत्रिक उपकरण के | एल्गोरिदम संयुक्त राज्य अमेरिका के पेटेंट में दिखाई दिया था <ref name="patent" /> चेकसम की गणना के लिए एक सरल, हाथ से पकड़े जाने वाले, यांत्रिक उपकरण के लिए डिवाइस ने यांत्रिक विधियों से मॉड 10 योग लिया था। प्रतिस्थापन अंक, अर्थात, डबल और कम प्रक्रिया के परिणाम, यांत्रिक रूप से उत्पादित नहीं किए गए थे। किन्तु, मशीन की बॉडी पर अंकों को उनके क्रमबद्ध क्रम में अंकित किया गया था। | ||
== स्यूडोकोड कार्यान्वयन == | == स्यूडोकोड कार्यान्वयन == | ||
निम्नलिखित फ़ंक्शन चेक अंक सहित एक कार्ड नंबर को पूर्णांकों की एक सरणी के रूप में लेता है और यदि चेक अंक सही है तो सही आउटपुट देता है, अन्यथा गलत आउटपुट देता है। | निम्नलिखित फ़ंक्शन चेक अंक सहित एक कार्ड नंबर को पूर्णांकों की एक सरणी के रूप में लेता है और यदि चेक अंक सही है तो सही आउटपुट देता है, अन्यथा गलत आउटपुट देता है।<syntaxhighlight lang="abl"> | ||
function isValid(cardNumber[1..length]) | |||
sum := 0 | |||
parity := length mod 2 | |||
for i from 1 to length 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)) | |||
end function | |||
</syntaxhighlight> | |||
== कोड कार्यान्वयन == | == कोड कार्यान्वयन == | ||
=== | === C# === | ||
< | <syntaxhighlight> | ||
bool IsValidLuhn(in int[] digits) | |||
{ | { | ||
int check_digit = 0; | int check_digit = 0; | ||
(int i = | for (int i = digits.Length - 2; i >= 0; --i) | ||
check_digit += ((i | check_digit += ((i & 1) is 0) switch | ||
{ | { | ||
true => digits[i] > 4 ? digits[i] * 2 - 9 : digits[i] * 2, | |||
false => digits[i] | |||
}; | }; | ||
return 10 - (check_digit % 10) == digits.Last(); | |||
} | } | ||
</ | </syntaxhighlight> | ||
==संदर्भ== | ==संदर्भ== | ||
<references/> | <references/> |
Revision as of 15:47, 9 August 2023
लुहान एल्गोरिथ्म या लुहान सूत्र, जिसे मॉड्यूलर अंकगणित 10 या मॉड 10 एल्गोरिदम के रूप में भी जाना जाता है, इसका नाम इसके निर्माता, आईबीएम वैज्ञानिक उनके पीटर लुहान के नाम पर रखा गया है, एक सरल संख्या जांचें सूत्र है जिसका उपयोग विभिन्न प्रकार की पहचान संख्याओं को मान्य करने के लिए किया जाता है, जैसे भुगतान कार्ड नंबर, अंतर्राष्ट्रीय मोबाइल उपकरण पहचान, संयुक्त राज्य अमेरिका में राष्ट्रीय प्रदाता पहचानकर्ता, कनाडा सामाजिक बीमा संख्या, इज़राइली पहचान पत्र आईडी संख्या, दक्षिण अफ्रीका आईडी संख्या, स्वीडन राष्ट्रीय पहचान संख्या, स्वीडन कॉर्पोरेट पहचान संख्या (ऑर्गएनआर), यूनान ट्रैक्टर सप्लाई कंपनी की रसीदें है। इसका वर्णन 23 अगस्त 1960 को दिए गए अमेरिकी पेटेंट संख्या 2,950,048 में किया गया है।[1]
एल्गोरिदम सार्वजनिक डोमेन में है और आज व्यापक उपयोग में है। यह आईएसओ/आईईसी 7812-1 में निर्दिष्ट है।[2] इसका उद्देश्य क्रिप्टोग्राफ़िक हैश फ़ंक्शन होना नहीं है; इसे दुर्भावनापूर्ण आक्रमण से नहीं, किन्तु आकस्मिक त्रुटियों से बचाने के लिए डिज़ाइन किया गया था। अधिकांश क्रेडिट कार्ड और विभिन्न सरकारी पहचान संख्याएं वैध संख्याओं को गलत टाइप की गई या अन्यथा गलत संख्याओं से पृथक करने की एक सरल विधि के रूप में एल्गोरिदम का उपयोग करती हैं।
विवरण
चेक अंक की गणना इस प्रकार की जाती है:
- यदि संख्या में पहले से ही चेक अंक है, तो पेलोड बनाने के लिए उस अंक को छोड़ दें। चेक अंक प्रायः अंतिम अंक होता है।
- पेलोड के साथ, सबसे दाएँ अंक से प्रारंभ करें। बाईं ओर बढ़ते हुए, प्रत्येक दूसरे अंक (सबसे दाएँ अंक सहित) का मान दोगुना करें।
- परिणामी अंकों के मानों का योग करें.
- चेक अंक की गणना द्वारा की जाती है . यह वह न्यूनतम संख्या (संभवतः शून्य) है जिसे 10 का गुणज बनाने के लिए में जोड़ा जाना चाहिए समान मान देने वाले अन्य मान्य सूत्र हैं और .
चेक अंक की गणना के लिए उदाहरण
खाता संख्या 7992739871 का एक उदाहरण मानें (सिर्फ पेलोड, चेक अंक अभी तक सम्मिलित नहीं है):
7 | 9 | 9 | 2 | 7 | 3 | 9 | 8 | 7 | 1 | |
मल्टीप्लायर | 1 | 2 | 1 | 2 | 1 | 2 | 1 | 2 | 1 | 2 |
---|---|---|---|---|---|---|---|---|---|---|
= | = | = | = | = | = | = | = | = | = | |
7 | 18 | 9 | 4 | 7 | 6 | 9 | 16 | 7 | 2 | |
अंकों का योग | 7 | 9 (1+8) | 9 | 4 | 7 | 6 | 9 | 7 (1+6) | 7 | 2 |
परिणामी अंकों का योग 67 है।
चेक अंक के बराबर है .
इससे पूरा खाता नंबर 79927398713 पढ़ जाता है।
चेक अंक को मान्य करने के लिए उदाहरण
- सत्यापित करने के लिए नंबर का चेक अंक (अंतिम अंक) छोड़ें। (उदा. 79927398713 -> 7992739871)
- चेक अंक की गणना करें (ऊपर देखें)
- अपने परिणाम की तुलना मूल चेक अंक से करें। यदि दोनों संख्याएँ मेल खाती हैं, तो परिणाम मान्य है। (उदा.).
सशक्तता और अशक्तता
लुहान एल्गोरिथ्म सभी एकल-अंकीय त्रुटियों के साथ-साथ आसन्न अंकों के लगभग सभी स्थानान्तरण का पता लगाएगा। चूँकि, यह दो अंकों के अनुक्रम 09 से 90 (या इसके विपरीत) के स्थानान्तरण का पता नहीं होता है। यह अधिकांश संभावित जुड़वां त्रुटियों का पता लगाएगा (यह 22 ↔ 55, 33 ↔ 66 या 44 ↔ 77 का पता नहीं लगाएगा)।
अन्य, अधिक सम्मिश्र चेक-डिजिट एल्गोरिदम (जैसे वेरहॉफ एल्गोरिथम और डैम एल्गोरिथ्म) अधिक ट्रांसक्रिप्शन त्रुटियों का पता लगा सकते हैं। लुहान मॉड एन एल्गोरिदम एक एक्सटेंशन है जो गैर-संख्यात्मक स्ट्रिंग का समर्थन करता है।
क्योंकि एल्गोरिदम अंकों पर दाएं से बाएं विधि से कार्य करता है और शून्य अंक परिणाम को केवल तभी प्रभावित करते हैं जब वे स्थिति में परिवर्तन का कारण बनते हैं, संख्याओं की एक स्ट्रिंग की प्रारंभ में शून्य-पैडिंग गणना को प्रभावित नहीं करती है। इसलिए, सिस्टम जो अंकों की एक विशिष्ट संख्या को पैड करते हैं (उदाहरण के लिए 1234 को 0001234 में परिवर्तित करके) पैडिंग से पहले या पश्चात् में लुहान सत्यापन कर सकते हैं और समान परिणाम प्राप्त कर सकते हैं।
एल्गोरिदम संयुक्त राज्य अमेरिका के पेटेंट में दिखाई दिया था [1] चेकसम की गणना के लिए एक सरल, हाथ से पकड़े जाने वाले, यांत्रिक उपकरण के लिए डिवाइस ने यांत्रिक विधियों से मॉड 10 योग लिया था। प्रतिस्थापन अंक, अर्थात, डबल और कम प्रक्रिया के परिणाम, यांत्रिक रूप से उत्पादित नहीं किए गए थे। किन्तु, मशीन की बॉडी पर अंकों को उनके क्रमबद्ध क्रम में अंकित किया गया था।
स्यूडोकोड कार्यान्वयन
निम्नलिखित फ़ंक्शन चेक अंक सहित एक कार्ड नंबर को पूर्णांकों की एक सरणी के रूप में लेता है और यदि चेक अंक सही है तो सही आउटपुट देता है, अन्यथा गलत आउटपुट देता है।
function isValid(cardNumber[1..length])
sum := 0
parity := length mod 2
for i from 1 to length 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))
end function
कोड कार्यान्वयन
C#
bool IsValidLuhn(in int[] digits)
{
int check_digit = 0;
for (int i = digits.Length - 2; i >= 0; --i)
check_digit += ((i & 1) is 0) switch
{
true => digits[i] > 4 ? digits[i] * 2 - 9 : digits[i] * 2,
false => digits[i]
};
return 10 - (check_digit % 10) == digits.Last();
}
संदर्भ
- ↑ 1.0 1.1 US patent 2950048A, Luhn, Hans P., "संख्याओं के सत्यापन के लिए कंप्यूटर", published 1960-08-23
- ↑ "Annex B: Luhn formula for computing modulus-10 "double-add-double" check digits". Identification cards — Identification of issuers — Part 1: Numbering system (Standard). International Organization for Standardization, International Electrotechnical Commission. January 2017. ISO/IEC 7812-1:2017.