# Luhn Algorithm

May 12th, 2022
969
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
1. from copy import deepcopy
2.
3. # Function 1 - Break intergers into his digits
4. def break_digits(n):
5.     temp = [str(element) for element in str(n)]
6.     card = [int(element) for element in temp]
7.     return card
8.
9.
10. # Function 2 - Reversing and doubling
11. def double(card):
12.     LEN = len(card)
13.     card.reverse()
14.     # 1. Doubling the elements from the second-to-last-digit and moving to the left
15.     # 2. Checking if it is 2-digit number: If yes, add the digits (or % 9)
16.     for i in range(1, LEN, 2):
17.         card[i] = 2*card[i] % 9
18.     card.reverse()
19.     return card
20.
21.
22. # Function 3 - Checking if it is valid
23. def check_valid(card):
24.     S = sum(card) % 10
25.     if S == 0:
26.         return True, S
27.     else:
28.         return False, S
29.
30.
31. # Function 4 - Propose solution
32. def propose_correct(card, S):
33.     last = card[len(card) - 1]
34.     extra = 10 - S
35.     correct_last = (last + extra) % 10
36.     print("If the last digit is changed from " + str(last) + " to " + str(correct_last) + ", we will have a valid card number.")
37.     return correct_last
38.
39.
40. # Function 5 - Simulate
41. def Luhn(CARD):
42.     card = break_digits(CARD)
43.     initial_card = deepcopy(card)
44.     # print("Initial card = " + str(initial_card))
45.     new_card = double(card)
46.     # print("New card = " + str(new_card))
47.     flag, S = check_valid(new_card)
48.     if flag:
49.         print(str(initial_card) + " = VALID")
50.     else:
51.         print(str(initial_card) + " = INVALID")
52.         correct_last = propose_correct(new_card, S)
53.         correct = deepcopy(initial_card)
54.         correct[len(card) - 1] = correct_last
55.         print(str(correct) + " =  VALID")
56.
57.
58. # MAIN FUNCTION
59. CARD1 = 5146713835430
60. Luhn(CARD1)
61. print()
62. CARD2 = 5146713835435
63. Luhn(CARD2)
64.
65.