Python で Luhn アルゴリズムを使用して数値を検証する

Jay Shaw 2023年10月10日
  1. Python で Luhn アルゴリズムを使用して数値を検証する
  2. 関数を使用して Luhn アルゴリズムを介して数値を検証する
  3. ネストされたループを使用して、Luhn アルゴリズムを通じて数値を検証する
  4. 関数型プログラミングを使用して、Luhn アルゴリズムを介して数値を検証する
  5. まとめ
Python で Luhn アルゴリズムを使用して数値を検証する

ドイツのコンピューター科学者であるハンス ピーター ルーンは、1960 年代にルーン アルゴリズムの公式を開発しました。 これは、Visa や Master Card などの主要な国際金融電子送金組織がオンライン決済と取引を高速化するために使用するチェックサム アルゴリズムです。

この記事では、Luhn アルゴリズムを Python で記述し、アルゴリズムに従って数値を検証する方法について説明します。

Python で Luhn アルゴリズムを使用して数値を検証する

Luhn アルゴリズム バリデーターは、不正またはスペルミスのある入力から正当な数値を調べて分離するのに役立ちます。 詳細については、この リンク を確認してください。

Python で Luhn アルゴリズムを使用して数値を検証するプログラムを作成する方法を理解しましょう。

関数を使用して Luhn アルゴリズムを介して数値を検証する

このプログラムは数値を受け取り、Python の Luhn アルゴリズムを使用して検証します。 このプログラムには、separate_digits()luhn_algo()、および check_if_valid の 3つのメソッドがあります。

ステップバイステップの説明:

  1. コードの最初の行は、パラメータ num を持つメソッド luhn_algo を作成します。

  2. メソッド内で、別のネストされたメソッド separate_digits() が作成されます。 この入れ子になったメソッドは、渡された数字の桁を区切り、区切られた数字を Python リストとして返します。

    このメソッドは、for ループを使用して、リスト内の数字を繰り返します。

    def luhn_algo(num):
        def separate_digits(n):
            return [int(d) for d in str(n)]
    
  3. 新しい変数 digitsseparate_digits メソッドを使用して num 内の値を数字のリストに変換します。

    digits = separate_digits(num)
    
  4. 数字が Python リストに格納されたら、リストを逆にし、偶数と奇数の数字を分離する必要があります。 これは、スライス演算子 :: を使用して実現されます。

    たとえば、odd_digits = digits[-1::-2] という構文では、-1:: はリストを逆にして最初のインデックスを取ります。

    ::-2 は、1 番目のインデックスから始まるすべての要素を取得します。 これにより、奇数桁のみの新しいリストが作成されます。

    同様に、偶数桁のリストは、演算子 -2::-2 を使用して作成されます。

    digits = separate_digits(num)
    odd_digits = digits[-1::-2]
    even_digits = digits[-2::-2]
    
  5. Luhn アルゴリズムは奇数の数字を加算し、偶数の数字は 2 を掛けて加算します。

    偶数桁の積が 9 より大きい場合は、それらの桁の合計が加算されます。 最後に、すべての奇数と偶数の数字が合計されます。

    すべての桁を合計する変数 checksum が作成されます。 奇数桁の合計は、次の構文を使用して計算されます。

    checksum += sum(odd_digits)
    

    偶数の数字のリストを反復するために for ループが作成されます。 このようにして、各桁は 2 で乗算され、メソッド separate_digits が積の桁を分離し、それらの合計が計算されます。

    最後に、変数 checksum に追加されます。

    for d in even_digits:
        checksum += sum(separate_digits(d * 2))
    
  6. Luhn アルゴリズムによって検証される数値。その最終積は 10 で割り切れる必要があります。結果の値はメソッドの最後に返されます。

    return checksum % 10
    
  7. Luhn アルゴリズムの結果を検証するために、メソッド check_if_valid がパラメーター num で作成されます。 このメソッドは、メソッド luhn_algo から返された結果が等値演算子を使用してゼロに等しいかどうかをチェックし、結果を返します。

    def check_if_valid(num):
        return luhn_algo(num) == 0
    
  8. 結果を出力するために、番号が check_if_valid メソッドに渡され、結果が出力されます。

コード:

def luhn_algo(num):
    print("Number = ", num)

    def separate_digits(n):
        # Separates digits of num and stores them in a python list
        return [int(d) for d in str(n)]

    digits = separate_digits(num)
    # Creates a new reversed list with just odd digits
    odd_digits = digits[-1::-2]
    # Creates another reversed list with even digits
    even_digits = digits[-2::-2]

    checksum = 0
    checksum += sum(odd_digits)  # Finds sum of odd digits

    for d in even_digits:
        checksum += sum(
            separate_digits(d * 2)
        )  # Multiplies even digits with 2 and sums digits > 9

    return checksum % 10


def check_if_valid(num):
    return luhn_algo(num) == 0


result = check_if_valid(4532015112830366)
print("Correct:" + str(result))
result = check_if_valid(6011514433546201)
print("Correct:" + str(result))
result = check_if_valid(6771549495586802)
print("Correct:" + str(result))

出力:

Number =  4532015112830366
Correct:True
Number =  6011514433546201
Correct:True
Number =  6771549495586802
Correct:True

このようにして、Python で Luhn アルゴリズムを使用して数値を検証するプログラムを簡単に作成できます。

ネストされたループを使用して、Luhn アルゴリズムを通じて数値を検証する

Python で Luhn アルゴリズムを使用して数値を検証する別の方法は、ネストされたループを使用することです。 このプログラムは、単一の関数を使用して、Python の Luhn アルゴリズムを使用して数値を検証します。

コードの仕組みを理解しましょう。

  1. コードの最初の行は、パラメータ num を持つメソッド luhn_algo を作成します。

  2. 変数 check_sum はゼロで初期化されます。

    def luhn_algo(num):
        check_sum = 0
    
  3. 変数 num_parity は、指定された数値の長さを検出し、偶数か奇数かのパリティをチェックします。

    num_parity = len(num) % 2
    
  4. 0 番目の位置からその長さまで逆方向に実行される for ループが作成されます。 l 番目のインデックスの値は、変数 j にコピー初期化されます。

    for l in range(len(num) - 1, -1, -1):
        j = int(num[l])
    
  5. 変数 num_parity はこの時点で来ます。 num_parity がゼロの場合、これは num が偶数であることを意味し、奇数の場合はその逆です。

    すべての偶数桁に 2 を掛ける必要があるため、プログラムは l+1 番目のインデックスのパリティをチェックします。 パリティが 0 であり、l + 1 % 2 がパリティに等しいと仮定すると、l 番目のインデックスが奇数であることを意味します。

    同様に、パリティが 0l + 1 % 2 と等しくない場合、それは偶数の数字です。 このロジックを使用すると、すべての偶数桁が 2 で乗算され、積が 9 より大きい場合は、9 が除算されます。

    check_sum 変数は、j の値で自身をインクリメントします。 ループ反復の終わりに、check_sum は偶数桁と奇数桁の最終合計を計算します。

    if (l + 1) % 2 != num_parity:
        j = j * 2
        if j > 9:
            j = j - 9
        check_sum = check_sum + j
    
  6. Python で Luhn アルゴリズムを使用して検証するには、最終的な合計が 10 で割り切れる必要があることがわかっているため、関数は check_sum % 10 == 0 を返します。

コード:

def luhn_algo(num):
    check_sum = 0
    num_parity = len(num) % 2
    for l in range(len(num) - 1, -1, -1):
        j = int(num[l])
        if (l + 1) % 2 != num_parity:
            j = j * 2
        if j > 9:
            j = j - 9
        check_sum = check_sum + j
    print("value calculated = ", str(check_sum))
    return check_sum % 10 == 0


for n in (49927398716, 49927398717, 1234567812345678, 1234567812345670):
    print(str(n) + " =>", luhn_algo(str(n)))

出力:

value calculated =  70
49927398716 => True
value calculated =  71
49927398717 => False
value calculated =  68
1234567812345678 => False
value calculated =  60
1234567812345670 => True

関数型プログラミングを使用して、Luhn アルゴリズムを介して数値を検証する

最初の 2つの例では、手続き型の方法を使用して、Python の Luhn アルゴリズムを使用して数値を検証しました。 この例では、関数型プログラミングを使用して、Python の Luhn アルゴリズムを使用して数値を検証します。

関数型プログラミング手法を使用すると、プログラマーの時間と労力を節約できます。 以下の Python プログラムは、より少ないコード行で数値を検証します。

  1. メソッド luhn_algo がパラメーター num で作成されます。

  2. 新しい変数 rev には、パラメーター num の数字がリストに格納されます。 この目的のために、num の桁数だけ反復する for ループが使用されます。

    スライス演算子 ::-1 は、リスト内の数字を逆にします。

  3. return ステートメントは、操作全体を一度に計算します。

    奇数桁の合計は、構文 (sum(rev[0::2]) を使用して計算されます。偶数桁は for ループで実行されます (for d in r[1::2])。

    各桁は 2 で乗算され、積の桁は divmod() 関数を使用して加算されます。

    divmod() 関数は、分子と分母の 2つのパラメーターを取り、商と剰余の 2つの値を返します。

    divmod(d * 2, 10) 構文は、d*2 を分子として、10 を分母として受け取ります。 結果は、数字の合計を取得するために追加されます。

    最後に、関数は最終的な合計が 10 で割り切れるかどうかをチェックし、結果を返します。

  4. for ループを使用して、4つの数値が入力として提供され、結果が出力されます。

コード:

def luhn_algo(num):
    rev = [int(ch) for ch in str(num)][::-1]
    return (sum(rev[0::2]) + sum(sum(divmod(d * 2, 10)) for d in rev[1::2])) % 10 == 0


for num2 in (49927398716, 49927398717, 1234567812345678, 1234567812345670):
    print(num2, luhn_algo(num2))

出力:

49927398716 True
49927398717 False
1234567812345678 False
1234567812345670 True

まとめ

この記事では、読者が Python で Luhn アルゴリズムを使用して数値を検証する方法を理解するための 3つのプログラムを提供します。

読者は記事を読み、自分でコードを書き、ヒントを求めて戻ってくることをお勧めします。 このようにして、リーダーは Luhn アルゴリズムを使用して数値を検証するプログラムを作成できます。