コンテンツにスキップ

Luhnアルゴリズム

def check_luhn(card_number: str) -> bool:
"""
Luhnアルゴリズムに従って、数字列が有効であるかをチェックする。
Args:
card_number: チェックする数字列(クレジットカード番号など)。
Returns:
bool: 合計が10で割り切れるかどうか
"""
digits = [int(d) for d in card_number[::-1]]
total = 0
for i, digit in enumerate(digits):
if i % 2 == 0:
num = digit
else:
num = digit * 2
# 各位の和を求める(15なら1 + 5 = 6)
if num >= 10:
num -= 9
total += num
return total % 10 == 0

Luhnアルゴリズムは、クレジットカード番号やISBNなど、多くの識別番号の有効性を簡易的に検証するために使われるチェックサムの計算方法だ。これは、番号の入力ミスを高い確率で検出することを目的としている。

このアルゴリズムは、最後の桁(チェックディジット)を含むすべての桁を使い、特定の計算手順に従って最終的な合計値を算出する。合計値が10で割り切れる場合、その番号は形式的には有効と見なされる。

アルゴリズム

  • 逆順の処理: 数字列を右端から処理を開始する。
  • 2倍の処理: 右端から数えて偶数番目(1-indexed)の数字を2倍する。
  • 各位の和: 2倍した結果が2桁(10以上)になった場合、その数字の各位の数字を合計する(例: 14→1+4=5)。これは、計算効率のために「元の数字から9を引く」ことで代用できる(例: 14−9=5)。
  • 総和: 2倍しなかった数字と、処理後の2倍した数字をすべて合計する。
  • 検証: 総和が10で割り切れれば有効、割り切れなければ無効。