מחשבון אלגוריתם לון
מחשבון אלגוריתם לון
הקדמה
אלגוריתם לון, הידוע גם כ"מודולוס 10" או "מוד 10", הוא נוסחת בדיקה פשוטה המשמשת לאימות מגוון מספרי זיהוי, כגון מספרי כרטיסי אשראי, מספרי ביטוח לאומי קנדים, מספרי IMEI ומספרי ספק לאומי בארצות הברית. מחשבון זה מאפשר לך לאמת מספרים באמצעות אלגוריתם לון וליצור מספרים חוקיים שעוברים את בדיקת לון.
איך עובד אלגוריתם לון
אלגוריתם לון עובד כך:
- החל מהספרה הימנית ביותר (ללא ספרת הבדיקה) והזז שמאלה, הכפל את ערך כל ספרה שנייה ב-2.
- אם התוצאה של פעולת הכפל הזו גדולה מ-9, הפחת 9 מהתוצאה.
- סכום את כל הספרות בסדרה המתקבלת.
- אם הסכום במודולו 10 שווה ל-0 (אם הסכום מסתיים באפס), אז המספר חוקי לפי נוסחת לון; אחרת, הוא אינו חוקי.
הנה ייצוג חזותי של אלגוריתם לון:
נוסחה
אלגוריתם לון ניתן לביטוי מתמטי כך:
יהי הספרה ה--ית, סופרים מהספרה הימנית ביותר (ללא ספרת הבדיקה) והולכים שמאלה. אז ספרת הבדיקה נבחרת כך ש:
כאשר היא פעולה מודולו.
שימושים
לאלגוריתם לון יש יישומים שונים בתחומים שונים:
- אימות כרטיסי אשראי: רוב מספרי כרטיסי האשראי מאומתים באמצעות אלגוריתם לון.
- מספרי ביטוח לאומי קנדים: אלגוריתם לון משמש לאימות תקפות מספרים אלה.
- מספרי IMEI: מספרי IMEI של טלפונים ניידים כוללים ספרת בדיקה המאומתת על ידי אלגוריתם לון.
- מספרי ספק לאומי (NPI): בשירותי הבריאות בארצות הברית, מספרים אלה מאומתים באמצעות אלגוריתם לון.
- ISBNs: חלק ממספרי ISBN-10 משתמשים בגרסה של אלגוריתם לון לאימות.
חלופות
בעוד שאלגוריתם לון בשימוש נרחב, ישנם אלגוריתמים אחרים לבדיקה למטרות שונות:
- אלגוריתם דם: אלגוריתם ספרת בדיקה נוסף שמגלה את כל השגיאות עם ספרה אחת וכל השגיאות של החלפת סמוכים.
- אלגוריתם ורהוף: אלגוריתם בדיקה מורכב יותר שתופס את כל השגיאות עם ספרה אחת ורוב השגיאות של החלפת סמוכים.
- ספרת בדיקה ISBN-13: משתמשת באלגוריתם שונה מאשר ISBN-10, המבוסס על אלגוריתם לון.
היסטוריה
אלגוריתם לון נוצר על ידי האנס פטר לון, מדען מחשבים ב-IBM, בשנת 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)) # True
print(luhn_validate(4532015112830367)) # False
print(generate_valid_number(16)) # יוצר מספר חוקי בן 16 ספרות
מקרים קצה ושיקולים מיוחדים
בעת יישום אלגוריתם לון, שקול את המקרים הקצה והשיקולים המיוחדים הבאים:
-
אימות קלט: ודא שהקלט הוא מיתר מספר חוקי. יש לטפל באותיות שאינן ספרות כראוי (או להסיר אותן או להתייחס אליהן כקלט לא חוקי).
-
אפסי מובילים: האלגוריתם צריך לעבוד כראוי עם מספרים שיש להם אפסים מובילים.
-
מספרים גדולים: היה מוכן להתמודד עם מספרים מאוד ארוכים שעשויים לחרוג מהקיבולת של סוגי מספרים סטנדרטיים בחלק משפות התכנות.
-
קלט ריק: הגדר כיצד היישום שלך צריך להתמודד עם מיתרים ריקים או קלטים null.
-
קבוצות תווים לא סטנדרטיות: בחלק מהיישומים, ייתכן שתיתקל במספרים המיוצגים עם תווים מחוץ לטווח הסטנדרטי 0-9. הגדר כיצד יש לטפל בזה.
-
שיקולי ביצועים: עבור יישומים שצריכים לאמת מספרים רבים של קלטים במהירות, שקול לייעל את יישום האלגוריתם.
דוגמאות מספריות
-
מספר כרטיס אשראי חוקי:
- מספר: 4532015112830366
- בדיקת לון: חוקי
-
מספר כרטיס אשראי לא חוקי:
- מספר: 4532015112830367
- בדיקת לון: לא חוקי
-
מספר חוקי של ביטוח לאומי קנדי:
- מספר: 046 454 286
- בדיקת לון: חוקי
-
מספר 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()
מקורות
- לון, האנס פ. (1960). "מחשב לאימות מספרים". פטנט אמריקאי 2,950,048.
- גאליאן, ג'וזף. "המתמטיקה של מספרי זיהוי." כתב העת למתמטיקה במכללה, כרך 22, מס' 3, 1991, עמ' 194–202. JSTOR, www.jstor.org/stable/2686878.
- "ISO/IEC 7812-1:2017". ארגון התקנים הבינלאומי. נבדק ב-2 באוגוסט 2024.
- קנוט, דונלד. "האמנות של תכנות מחשבים, כרך 2: אלגוריתמים סמינומיים". אדיסון-ווסלי, 1997.