Python で Luhn アルゴリズムを使用して数値を検証する
- Python で Luhn アルゴリズムを使用して数値を検証する
- 関数を使用して Luhn アルゴリズムを介して数値を検証する
- ネストされたループを使用して、Luhn アルゴリズムを通じて数値を検証する
- 関数型プログラミングを使用して、Luhn アルゴリズムを介して数値を検証する
- まとめ
 
ドイツのコンピューター科学者であるハンス ピーター ルーンは、1960 年代にルーン アルゴリズムの公式を開発しました。 これは、Visa や Master Card などの主要な国際金融電子送金組織がオンライン決済と取引を高速化するために使用するチェックサム アルゴリズムです。
この記事では、Luhn アルゴリズムを Python で記述し、アルゴリズムに従って数値を検証する方法について説明します。
Python で Luhn アルゴリズムを使用して数値を検証する
Luhn アルゴリズム バリデーターは、不正またはスペルミスのある入力から正当な数値を調べて分離するのに役立ちます。 詳細については、この リンク を確認してください。
Python で Luhn アルゴリズムを使用して数値を検証するプログラムを作成する方法を理解しましょう。
関数を使用して Luhn アルゴリズムを介して数値を検証する
このプログラムは数値を受け取り、Python の Luhn アルゴリズムを使用して検証します。 このプログラムには、separate_digits()、luhn_algo()、および check_if_valid の 3つのメソッドがあります。
ステップバイステップの説明:
- 
コードの最初の行は、パラメータ numを持つメソッドluhn_algoを作成します。
- 
メソッド内で、別のネストされたメソッド separate_digits()が作成されます。 この入れ子になったメソッドは、渡された数字の桁を区切り、区切られた数字を Python リストとして返します。このメソッドは、 forループを使用して、リスト内の数字を繰り返します。def luhn_algo(num): def separate_digits(n): return [int(d) for d in str(n)]
- 
新しい変数 digitsはseparate_digitsメソッドを使用してnum内の値を数字のリストに変換します。digits = separate_digits(num)
- 
数字が 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]
- 
Luhn アルゴリズムは奇数の数字を加算し、偶数の数字は 2 を掛けて加算します。 偶数桁の積が 9 より大きい場合は、それらの桁の合計が加算されます。 最後に、すべての奇数と偶数の数字が合計されます。 すべての桁を合計する変数 checksumが作成されます。 奇数桁の合計は、次の構文を使用して計算されます。checksum += sum(odd_digits)偶数の数字のリストを反復するために forループが作成されます。 このようにして、各桁は2で乗算され、メソッドseparate_digitsが積の桁を分離し、それらの合計が計算されます。最後に、変数 checksumに追加されます。
```python
for d in even_digits:
    checksum += sum(separate_digits(d * 2))
```
- 
Luhn アルゴリズムによって検証される数値。その最終積は 10 で割り切れる必要があります。結果の値はメソッドの最後に返されます。 return checksum % 10
- 
Luhn アルゴリズムの結果を検証するために、メソッド check_if_validがパラメーターnumで作成されます。 このメソッドは、メソッドluhn_algoから返された結果が等値演算子を使用してゼロに等しいかどうかをチェックし、結果を返します。def check_if_valid(num): return luhn_algo(num) == 0
- 
結果を出力するために、番号が 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 アルゴリズムを使用して数値を検証します。
コードの仕組みを理解しましょう。
- 
コードの最初の行は、パラメータ numを持つメソッドluhn_algoを作成します。
- 
変数 check_sumはゼロで初期化されます。def luhn_algo(num): check_sum = 0
- 
変数 num_parityは、指定された数値の長さを検出し、偶数か奇数かのパリティをチェックします。
```python
num_parity = len(num) % 2
```
- 
0 番目の位置からその長さまで逆方向に実行される forループが作成されます。l番目のインデックスの値は、変数jにコピー初期化されます。for l in range(len(num) - 1, -1, -1): j = int(num[l])
- 
変数 num_parityはこの時点で来ます。num_parityがゼロの場合、これはnumが偶数であることを意味し、奇数の場合はその逆です。すべての偶数桁に 2 を掛ける必要があるため、プログラムは l+1番目のインデックスのパリティをチェックします。 パリティが0であり、l + 1 % 2がパリティに等しいと仮定すると、l番目のインデックスが奇数であることを意味します。同様に、パリティが 0でl + 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
- 
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 プログラムは、より少ないコード行で数値を検証します。
- 
メソッド luhn_algoがパラメーターnumで作成されます。
- 
新しい変数 revには、パラメーターnumの数字がリストに格納されます。 この目的のために、numの桁数だけ反復するforループが使用されます。スライス演算子 ::-1は、リスト内の数字を逆にします。
- 
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 で割り切れるかどうかをチェックし、結果を返します。 
- 
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 アルゴリズムを使用して数値を検証するプログラムを作成できます。