Калькулятор алгоритма Луна
Калькулятор алгоритма Луна
Введение
Алгоритм Луна, также известный как алгоритм "модуль 10" или "mod 10", является простой формулой контрольной суммы, используемой для проверки различных идентификационных номеров, таких как номера кредитных карт, канадские номера социального страхования, номера IMEI и номера идентификаторов поставщиков в Соединенных Штатах. Этот калькулятор позволяет вам проверять номера с помощью алгоритма Луна и генерировать действительные номера, которые проходят проверку по алгоритму Луна.
Как работает алгоритм Луна
Алгоритм Луна работает следующим образом:
- Начиная с правого края (исключая контрольную цифру) и двигаясь влево, удвойте значение каждой второй цифры.
- Если результат этого удвоения больше 9, вычтите 9 из результата.
- Сложите все цифры в полученной последовательности.
- Если сумма по модулю 10 равна 0 (если сумма оканчивается на ноль), то номер действителен согласно формуле Луна; в противном случае он недействителен.
Вот визуальное представление алгоритма Луна:
Формула
Алгоритм Луна можно выразить математически следующим образом:
Пусть — это -я цифра, начиная с правой цифры (исключая контрольную цифру) и двигаясь влево. Тогда контрольная цифра выбирается так, чтобы:
Где — это операция модуля.
Случаи использования
Алгоритм Луна имеет различные применения в разных областях:
- Проверка кредитных карт: Большинство номеров кредитных карт проверяются с помощью алгоритма Луна.
- Канадские номера социального страхования: Алгоритм Луна используется для проверки действительности этих идентификационных номеров.
- Номера IMEI: Номера IMEI мобильных телефонов включают контрольную цифру, проверяемую по алгоритму Луна.
- Номера идентификаторов поставщиков (NPI): Используемые в системе здравоохранения США, эти номера проверяются с помощью алгоритма Луна.
- ISBN: Некоторые номера ISBN-10 используют вариант алгоритма Луна для проверки.
Альтернативы
Хотя алгоритм Луна широко используется, существуют и другие алгоритмы контрольной суммы для различных целей:
- Алгоритм Дамма: Другой алгоритм контрольной цифры, который обнаруживает все ошибки с одной цифрой и все ошибки соседней транспозиции.
- Алгоритм Верхоффа: Более сложный алгоритм контрольной суммы, который ловит все ошибки с одной цифрой и большинство ошибок транспозиции.
- Контрольная цифра ISBN-13: Использует другой алгоритм, чем ISBN-10, который основан на алгоритме Луна.
История
Алгоритм Луна был создан Гансом Петером Луном, компьютерным ученым IBM, в 1954 году. Лун был пионером в области информационных наук и является автором нескольких новшеств, включая систему индексирования KWIC (Key Word In Context).
Алгоритм изначально был разработан для защиты от случайных ошибок, а не злонамеренных атак. Важно отметить, что хотя алгоритм Луна может обнаружить многие распространенные ошибки, он не является безопасной формой шифрования и не должен использоваться для целей безопасности данных.
Несмотря на свой возраст, алгоритм Луна остается широко используемым благодаря своей простоте и эффективности в выявлении распространенных ошибок транскрипции.
Примеры реализации
Вот несколько примеров кода для реализации алгоритма Луна на различных языках программирования:
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-значный номер
Граничные случаи и особые соображения
При реализации алгоритма Луна учитывайте следующие граничные случаи и особые соображения:
-
Проверка входных данных: Убедитесь, что входные данные представляют собой допустимую строку числа. Неподходящие символы должны обрабатываться соответствующим образом (либо удаляться, либо рассматриваться как недопустимый ввод).
-
Ведущие нули: Алгоритм должен корректно работать с номерами, имеющими ведущие нули.
-
Большие числа: Будьте готовы обрабатывать очень длинные числа, которые могут превышать емкость стандартных типов целых чисел в некоторых языках программирования.
-
Пустой ввод: Определите, как ваша реализация должна обрабатывать пустые строки или нулевые входные данные.
-
Нестандартные наборы символов: В некоторых приложениях вы можете столкнуться с номерами, представленными символами вне стандартного диапазона 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: Семинумерные алгоритмы". Addison-Wesley, 1997.