الگوریتم لان: تفاوت میان نسخه‌ها

محتوای حذف‌شده محتوای افزوده‌شده
FreshmanBot (بحث | مشارکت‌ها)
جز اصلاح فاصله مجازی + اصلاح نویسه با ویرایشگر خودکار فارسی
Fatemibot (بحث | مشارکت‌ها)
خط ۱:
'''الگوریتم لان''' یا '''فرمول لان'''، که به الگوریتم "[[هم‌نهشتی (نظریه اعداد)|پیمانه]] ۱۰" نیز مشهور است، یک فرمول ساده برای [[درستی یابی]] تعداد زیادی شماره شناسایی است، مانند شماره کارت‌های اعتباری، شماره‌های IMEI و [[شماره ملی]]. این روش توسط Hans Peter Luhn ابداع شد و در [http://www.google.com/patents?id=Y7leAAAAEBAJ U.S. Patent No. ۲،۹۵۰،۰۴۸] توصیف شده.
این الگوریتم به وفور استفاده می‌شود و به منظور یک [[تابع درهم‌ساز رمزنگارانه]] استفاده نمی‌شود. در واقع این روش برای حفاظت در برابر خطاهای تصادفی می‌باشد نه حملات عمدی. بسیاری از شماره‌های کارت‌های اعتباری و شناسه‌های دولتی از این روش برای متمایز کردن شماره‌های معتبر از هر جایگشت نا معتبری از اعداد استفاده می‌شود.
 
== نقاط قوت و ضعف ==
خط ۹:
== توضیح غیر رسمی ==
این فرمول یک عدد را در برابر رقم تطبیق آن درستی یابی می‌کند، که عموماً به بک شماره حساب پاره ای به منظور تولید شماره حساب کامل اضافه می‌شود. این شماره حساب باید تست زیر را پاس کند:
# با شروع از اولین رقم سمت راست و حرکت به سمت چپ، یکی در میان رقم‌های شماره زوج را دو برابر کند.
# ارقام اعداد دو برابر شده را با اعدادی که دو برابر نشده‌اند جمع کند.
# اگر جواب جمع در پیمانهٔ ۱۰ صفر شود، این شماره حساب درست می‌باشد ، در غیر این صورت اعتبار ندارد.
خط ۵۷:
 
رقم تطبیق (x) بوسیلهٔ محاسبهٔ ضرب جمع ارقام در ۹ در پیمانه ۱۰ بدست می آید. به بیان Layman:
# مجموع ارقام ۶۷ را محاسبه کن(۶۷).
# در ۹ ضرب کن (۶۰۳).
# رقم آخر را بگیر(۳).
# نتیجه رقم تطبیق می‌باشد .
 
روش جایگزین: رقم تطبیق بوسیلهٔ محاسبه تفریق رقم اول مجموع ارقام از ۱۰ بدست می آید.
# مجموع ارقام ۶۷ را محاسبه کن(۶۷).
# رقم یکان آن را در نظر بگیر(۷).
# رقم یکان را از ۱۰ کم کن.
# نتیجه ۳ می‌شود که رقم تطبیق است.
 
همهٔ این اعداد ۷۹۹۲۷۳۹۸۷۱۰,۷۹۹۲۷۳۹۸۷۱۰، ۷۹۹۲۷۳۹۸۷۱۱,۷۹۹۲۷۳۹۸۷۱۱، ۷۹۹۲۷۳۹۸۷۱۲,۷۹۹۲۷۳۹۸۷۱۲، ۷۹۹۲۷۳۹۸۷۱۳,۷۹۹۲۷۳۹۸۷۱۳، ۷۹۹۲۷۳۹۸۷۱۴,۷۹۹۲۷۳۹۸۷۱۴، ۷۹۹۲۷۳۹۸۷۱۵,۷۹۹۲۷۳۹۸۷۱۵، ۷۹۹۲۷۳۹۸۷۱۶,۷۹۹۲۷۳۹۸۷۱۶، ۷۹۹۲۷۳۹۸۷۱۷,۷۹۹۲۷۳۹۸۷۱۷، ۷۹۹۲۷۳۹۸۷۱۸,۷۹۹۲۷۳۹۸۷۱۸، ۷۹۹۲۷۳۹۸۷۱۹ به صورت زیر درستی یابی می‌شوند.
# همه ارقام را یکی در میان از سمت راست دو برابر کن: (1×2) = 2, (8×2) = 16, (3×2) = 6, (2×2) = 4, (9×2) = ۱۸
# مجموع همی ارقام را محاسبه کن (ارقام داخل پرانتز جواب ضرب‌های مرحله ۱ هستند): + x(رقم تطبیق) + (2) + 7 + (1+6) + 9 + (6) + 7 + (4) + 9 + (1+8) + 7 = x + 67.
# اگر مجموع مضربی از ۱۰ بود، شماره حساب احتمالاً معتبر می‌باشد . ۳ تنها رقم معتبر است که مجموع ۷۰ را تولید می‌کند که مضربی از ۱۰ می‌باشد .
# بنابراین همه شماره حساب‌ها نا معتبر هستند بجز ۷۹۹۲۷۳۹۸۷۱۳ که دارای رقم تطبیق درست می‌باشد .
 
== پیاده سازی درستی یابی رقم تطبیق ==
خط ۸۵:
== محاسبه رقم تطبیق ==
پیاده سازی بالا درستی یک شماره ورودی را با یک شماره تطبیق چک می‌کند. برای محاسبه رقم تطبیق تغییر کوچکی در پیاده‌سازی نیاز است:
# سوییج کردن بین ضرب فرد و زوج.
# اگر مجموع به پیمانه ۱۰ صفر شد آنگاه رقم تطبیق صفر است.
# در غیر این صورت رقم تطبیق برابر رقم اول مجموع - ۱۰ می‌باشد .
در [[پایتون (زبان برنامه‌نویسی)|پایتون]]:
 
خط ۹۹:
=== پیاده سازی های دیگر ===
{{چپ‌چین}}
* [http://sites.google.com/site/abapexamples/javascript/luhn-validation Luhn implementations in Javascript]
* [http://www.phpclasses.org/browse/file/34590.html Luhn generation and validation in php]
* [https://gist.github.com/1287893 Validation of Luhn in PHP]
* [http://www.webfan.de/Convert.html#weLuhn Implementation of the above php class regarding alphanumerics]
* Ruby: [https://gist.github.com/1182499 Luhn validation], [https://gist.github.com/1409815 Luhn generation]
{{پایان چپ‌چین}}
خط ۱۰۸:
 
{{چپ‌چین}}
* [//en.wikipedia.org/w/index.php?title=Bank_card_number&oldid=467587726 شماره کارت بانکی]
* [http://www.brainjar.com/js/validation/default2.asp Luhn checking bank card numbers]
 
{{پایان چپ‌چین}}
خط ۱۱۶:
{{چپ‌چین}}
{{پانویس}}
* {{US patent|۲۹۵۰۰۴۸}},، ''Computer for Verifying Numbers'', Hans P. Luhn, August 23, 1960.
 
{{پایان چپ‌چین}}
 
[[رده:الگوریتم‌های چکسام]]
[[رده:معرفی‌شده‌های ۱۹۵۴ (میلادی)]]
[[رده:هم‌نهشتی در نظریه اعداد]]