Algorithme de Luhn — Validation de carte bancaire
L'algorithme de Luhn est une formule de somme de contrôle (checksum) utilisée pour vérifier la validité de divers numéros d'identification, notamment les numéros de cartes bancaires (Mastercard, Visa, etc.), les numéros de sécurité sociale ou les codes IMEI des téléphones portables.
Conçu en 1954 par Hans Peter Luhn, ingénieur chez IBM, cet algorithme permet de détecter les erreurs de saisie courantes (comme un chiffre erroné ou l'inversion de deux chiffres consécutifs).
Fonctionnement de l'algorithme
Considérons le numéro de carte bancaire suivant à \(16\) chiffres :
\[\mathbf{4137 \quad 8947 \quad 1175 \quad 5904}\]
En Python, on peut représenter ce numéro sous la forme d'une liste de \(16\) entiers :
Script Pythonchiffres = [4, 1, 3, 7, 8, 9, 4, 7, 1, 1, 7, 5, 5, 9, 0, 4]
Le calcul s'effectue en quatre étapes :
| Étape |
Description |
Résultat pour la carte exemple |
| Liste initiale |
Les \(16\) chiffres de la carte |
4137894711755904 |
| Étape 1 |
Doubler la valeur un élément sur deux (les indices pairs \(0, 2, 4\dots\)) |
8167169872114510904 |
| Étape 2 |
Si le résultat dépasse \(9\), additionner les chiffres du produit (par ex. \(16 \implies 1 + 6 = 7\)) |
8167798721551904 |
| Étape 3 |
Faire la somme de tous les éléments obtenus |
\(8 + 1 + 6 + 7 + 7 + 9 + 8 + 7 + 2 + 1 + 5 + 5 + 1 + 9 + 0 + 4 = \mathbf{80}\) |
| Étape 4 |
Vérifier si le total se termine par zéro |
\(80\) se termine par \(0\) : le numéro est valide ! |
Astuce pour l'étape 2
Lorsqu'on double un chiffre entre \(0\) et \(9\), le résultat vaut au maximum \(18\). Si ce résultat est supérieur à \(9\), additionner ses chiffres revient tout simplement à lui soustraire \(9\) (ou à calculer (double // 10) + (double % 10)).
Exemple : \(16 \implies 1 + 6 = 7\) et \(16 - 9 = 7\).
Organigramme de l'algorithme (à compléter)
Pour vous aider à concevoir votre programme, voici l'organigramme de fonctionnement. Plusieurs conditions et calculs contiennent des pointillés ... : à vous de les identifier avant de coder !
flowchart LR
Start("Début de la fonction") --> Init["Initialisation :<br>total = ..."]
Init --> LoopCheck{"Reste-t-il des chiffres<br>à analyser dans la liste ?"}
LoopCheck -- "Non (Fin de la boucle)" --> CheckModulo{"Le total se termine-t-il par 0 ?"}
LoopCheck -- "Oui (Chiffre à l'indice i)" --> CheckParite{"Faut-il doubler ce chiffre ?<br>Indice i pair ?"}
CheckParite -- "Non" --> SetSimple["Conserver le chiffre."]
CheckParite -- "Oui" --> CalcDouble["Calculer le double."]
CalcDouble --> CheckNeuf{"Le double dépasse-t-il 9 ?"}
CheckNeuf -- "Non" --> SetDouble["Conserver le double"]
CheckNeuf -- "Oui" --> SetSomme["Additionner les deux chiffres"]
%% Nœud de convergence pour l'ajout au total
AddTotal["Ajouter au total"]
SetSimple --> AddTotal
SetDouble --> AddTotal
SetSomme --> AddTotal
%% Nœud pour passer au chiffre suivant
NextChar(("Passer au<br>chiffre suivant"))
AddTotal --> NextChar
NextChar --> LoopCheck
CheckModulo -- "Oui" --> RetTrue([Retourner True : Valide])
CheckModulo -- "Non" --> RetFalse([Retourner False : Invalide])
Travail demandé
- Compléter la fonction
est_valide(numero) qui prend en paramètre un numéro de carte bancaire (sous forme de chaîne de caractères, d'entier, ou de liste d'entiers) et renvoie True si le numéro est valide selon l'algorithme de Luhn, ou False sinon.
- Sous la fonction, utiliser la fonction
input() pour demander à l'utilisateur de saisir son numéro de carte, puis afficher un message indiquant si la carte est valide ou non.
Exemples
>>> est_valide("4137 8947 1175 5904")
True
>>> est_valide([4, 1, 3, 7, 8, 9, 4, 7, 1, 1, 7, 5, 5, 9, 0, 4])
True
>>> est_valide("5159 5674 0995 7111")
True
>>> est_valide("6499 8024 5027 3568")
False
>>> est_valide("8504 1721 9127 3888")
True
>>> est_valide("0043 6687 8348 5480")
False
.128013)s0epVg4lfPà ih+LAtdayé.-v6R:or}mbCz(E7x,qTn*;/3_k18uD]!j5F%cS[Uw={29050u0e0t0v0o0j0c0n0-0j0v0c0c0=010t0o0f010406050c0#0H0H0v0F0w040.0E0j0#190E0S0n020v0H0f0U0n0C0e1j0F0Q0#0e0c050V1g1i1k1m1e0f04051R1K1U0V1R1e0u0o0A111315170p0o0h0p0j1,0p0t1c050|0I0j0e1%1416011+1-1/1-0t1^1`1?0t0F1S0t0p1|1)010k0~0e0S1x0e01111p0c0f0v0S170@1?2p2r2d1~2g1`2j0H2l040a0n0l0F0E0f0E0c0o1s1u0`2n0F0F0e0-2P1K2w0S1S0V2b2#282a291@0u2y171/0S2i2M1?1!1$121}2/0o2;0S0E2^1?0f2U1S2Z2#361f2q1u2`2e2 0F1j0j1c0n0Z2Y3a1d392x3c1~3e3g3i0@3l2r3n2Z2.013s0v3h040n0W3w2!1e3z3q173C3E0n0i3I3y3a3A3O3i0*3S3K3U3M3B0E3f3D3i0B3Z3o3b1(3r3(3t3F0N3-3L3:3N3=3*3F0!3_3#3{3%3)3P0^413p433W040Z0d483/2{443?0Z3k1L3m3!494h4b0Z3v4m3x4o4g3d3}3E0Z3H4u3J3.3V4z1c0Z3R4D3T4p4y454I3Y4L4w4G4P4c3,4S4F3$4r3^4Y3`4q4H4c404%424)4V0Z474-4N3;4V0@4e4?4x4^3?0@4l364T4!4*0@4t524Z4a554C584(4O4 4K5d4.5f3~0@4R5i4@3|4_4X381X341K2^2(0u2a2-3$0-302E0_1#1S330e353m3S055D0`5L5p010Y1c0`0k5N5e1~0;3i5Y5j3r0k1c1I0t0X0A3D0o0`5%5S1b040L5?4}3N1c0S1h0e2J5{3A5^0b0D3Z0n690n594h0-0Z1c030n0J1t0A612N1t0n2i0n1/0c0t1{0u002i196m686a6c2e5U040o5X4L6b5Z3N0I1c0o2N0S6t2r0-0e633$5^5`4L6D3r5~60626!6L015^0P3S6K5(6M1c6s0t6W4365674S6a6~6:5S0S1c0-1+0k0k2U1J6J6#170E1c0=6/7b6,1c0/6_4q6N6G0S6^6*6;7i5_7l3d1c0O7v1~657g6+6F0k3(7C7s72047y7a6+0E5#7o7H716%2D6)386+5^0%6B697h6F0e0 6V7r5@1c6|526 6C6+7J2;240E0w7*36705|017d047f7M7I7n6t0F7z176Y883B7T610E8b7B7+7~800y8b7J2U0f136U8g1c6Z7W7s0c2u042m018s046.835S8x1c018B8i641c0b7!6 7$6O6I7|7h7O5~0E7q8U7=5~0{0t7_7{5M7N1c8l8L4!6O0c1!0h2O8C0L668P7:7#7D1c2U0t0#0F0S7R7~0Y0-1c0+3D0c8*4v8}7}3V7375771I963A80828!7s5^7k8/4a7n2}8Z8+9s8t8m738C8O8F971c7F879H9i040-9n3$8W7Q9M8:047@8(7`8C7Z4S066~8R6G8T3m9h4!7n2B8_9D9O9k789F9Q43800(9q9,7h0H0o4I5s9A7,047.4n9g9)9193959U43989a9c9e3J9%7;7I1c8(0|0j9`4h9pat2ea11c4{7/an5S7E7Gaf4q6Oaw1~9S2}aJ6=040F2r0hak5R7~8a9v4hay4W9Fa89f8}7h7J746H9laN7 7ea.a*9@9maX2e9t9=0o9!8|aC9I9*a;aIaG2e800,a.aZ579 8,819~3x9-43aZaAa5aV7-a~7:a)5V0E0#1_aTbgaua:b46$9?a,2Ua.800Tb8a204baa%9g8~7s6F6Hb2040ubrbtbD1c020h0t0UbG1c4=8va6a$3JbLa(8#04aq3DbV040qbe2!bv7wbRbT1`b=0zb#04b%a9b,b`1~7%7)8Cb*1dc58Qb.b:asby7c1cb@bQbSbsb~6}b-bN5+c9a^7Abmcqb,bpb/8Yb;cia/b?b^3FcAa+76bC9$9(8 aP0{adbQcgb=b7cEaZ4db=0=cHc617bi3-0V5P5K1V5v0V5x1K0t5zc=2+2$0vbt2#5x1QaU3A2U0H0X0k0v0Y0e0X0p0W1c1C1E1G1I0ncb1V3n0p0@0n5;170e0O8p0o0-0v2P0c0z0`0|0~1`1Idy0e0z130z5D2T2V2P1c0Mdr1/dudw0n0u0xdA0j0j0xdg2R132S2U2W0o1t1Kdl3n1R0r003D0h3(2O0p2DdT1{0r0#0p1u0f612D0td{0n0A0x0F6H0o616r009y0x0he90t0xdT000#1u5 0He80Ee5du0F6u0n0I6T0}2U0n0m3j0B11a?106q1GdveBdV0ve1100Ieb2Q6P190S2W1I8.1Y1T040$2r101`110v0ueB0u0#0n280v5/0~0n1g0F6rdg1f281t0h046@dg6q0l0w2bd+1Le 0Sf10P0n6oe11r0n8o0F0x9d7pec1`10cK9l10d#0ve+ev1{0cbre)fw9Kd`6wen1{f3el6yeb0F0ceZdk0F0Vdk0Wdn0u170Z0z2qeidF0`dx2}1!6Udx0{dIeH0z0vdyb}614I0y2H1k2Oekf%dn0Sf*f4e4fs78eCdTf?9Ldad.e$e(0nfH6reU6v1{0ZeFg4dgf)dqdZe57hf{2b1j6u0O1c090L0d099G7|eDgseid_dvdqgy0L0Z0*gC6/0D060z0n0rdggm10eDcnbte{0Le*0Z61fee*0W0eg+1{0*0e0yg?0be_1te42N92fm0n0v0#0O6Kfbf1f)dtdg2q0ofN2Yh43F0D6bc,040dfe0@fe0ife0Bfe0!fe4dhshl3j4Khh0ygS0n0M1uf6f80Sfe2L93e;5,ec2Nge1ufLec5O5E6G1Khh6p6t0nh90Ffe6o1r0~6PfI002Ke8gJhJ0H300#0jeshfhS2R3$201.1:1=d09Va|cEb6c1bJb_8V7ec$a0bHbj3xhVhTfP1e0pfRfTfV2tf:0u1!2P2;0FdGdDgX1c0@f_0siq2Od*0Site|freHd,0Wgb0r3(0c1Gh,2Qf?hOeGbB1{gGd^gvgK04gz0-0n092}i)0?hj3jfe09bS0t0cfe0^090GgP4Lg/fjfmh?0|e4iYgugJgxi$0L0@0-i|7|5,g e:1j0O0o0H1h0neg3Dg6j4gIgwgL0Z0!jc3miie#0.0oc%01gtjri#gzja1vbY1Ai_gD3mi~fl1g0jj2hXe4en0n2 0H0IeBgZ0eh1iVcLd!g`e|hZd2fMj)9l0ng%d!0o0K0}2;0cg^5/fie~2JfccB0#0)brfN3jhck2f1dhdj1eh?3n1/i143jEi!j7gz4di)jjdsdg0Z0n0q0n0d0n0=3jjwif0Vki1ekijqkmjtdmi*1y1/ktkv0ndmkA0WkC2!1KkF05kH6+klj6jt0ikqkNeb10kukwk)kAgOjNkDkYk!7sk$jsj8gkk*ksk-kQeFkA0NkV2#k^0okj4hk{jGgM0!k kOl1kwlfkAjM5NkEl91e0VkgijilijfUdo010W0z6u6t610z2N0zen0zjYj!dF9dlAe22}dFf!0z0d1c0Wf_0RhLe{hNjWlJeB9dhK3flPhZ1kkxiKgb0:eo0EjZl%1{6ul*2;l,e{kyhN0{e_j%1`2D7pe_ee0jjUiUjkjS1ae*2R4df_hC2Hf70p1tfe6Ud$l(e=e/2Oe_krm46yl}dh1Z1#3Ah}221;2v7s2A2i2k1c0.0-e90fe4hEmmae385JaU375MhhcAcUi41ccW9r5ScYiei8bcc#c1m-3nc+hTc.c-c:5H060J8%1{dq5J15iEex0E1pdZiFfz000x5/1q6vhadL1DmygFc,mD1:mFi07$99040R0F1HlnhWbrhg5Enm21h mHaDnr9bcu5thyke05ikfSlvin010idI5EnTkNf-0`0z2U0k612i6Uf:6l0-dGghdEf.iW0c1c0if_6jh{l?8pm12Rfl0ke8n%1{0Le?2VgglCeteH9GgamB2_43mEnDla2emJ2C2EmNmPmRmlf9mV5v5t38m!cP5W8b7P6bcv3N5*045,5.5:5=oB7t8ubk9Nep8ea#8P7h6e6g0n0ge8eadRn4fv6rf01H93oRcPbPcE0S9/2i9;oJa=n:9_m%049}c1gkcabnjC6Fac94a.ah04nH9d3ZambM7ScBarc!m;o*cs049KbQi3m*8j7PaMo-7naQfcaT7haWb(7~cYa4if7X8NcbpaceaobAj*pfo-9jo@oJa`o=b3py8M049#aBboo+9+bfcApmbb7si5cXbHi7cIm/ib6+c)pPcxpXbLcAg!cppn9obxp}9Vgmb=bFp+iyo cOpio,q04abqcobui904bXbZc1c3pC9Ba7q7crpcm$qbbwcGcmf?b qkqppbb07(p8p?qocycdjC7Jqsp(5S80clpMb|qeo 9)qDpvpDqGp^aacfcCchqtb5ckp:pIq2cNa 3Ap1cRp3qQqLp#bcm)qMpzbHcZo_m:q5hic*m!5um`c~5w0{0}0 04.
# Tests(insensible à la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)