Algorytm Luhna
Z Wikipedii
Algorytm Luhna – jeden z najczęściej wykorzystywanych algorytmów służących do sprawdzania poprawności wpisania danej liczby. Jest on używany m.in. do walidacji numerów kart kredytowych, ciągów liczbowych itd.. Nazwa algorytmu pochodzi od nazwiska niemieckiego naukowca Hansa Petera Luhna (1896-1964).
Na końcu liczby doklejana jest cyfra kontrolna określająca, czy poprzedzający ją ciąg cyfr jest wpisany poprawnie.
Spis treści |
[edytuj] Dane podstawowe
Algorytm ten wygląda następująco:
- Dla każdej pozycji cyfry określone zostają wagi (mnożniki). Najczęściej jest to 2 dla pozycji nieparzystych, 1 dla parzystych.
- Każdą cyfrę liczby mnożymy przez odpowiadającą jej wagę.
- Jeśli w wyniku mnożenia otrzymamy liczbę dwucyfrową, dodajemy cyfry do siebie otrzymując liczbę jednocyfrową.
- Dodajemy wszystkie otrzymane liczby do siebie.
- Wykonujemy operację mod 10 na otrzymanej sumie (pozostawiamy jedynie cyfrę jedności).
- Następnie, jeśli otrzymana cyfra nie równa się 0, odejmujemy ją od 10. Otrzymujemy cyfrę kontrolną, która jest "doklejana" do liczby.
[edytuj] Przykład
- Mamy liczbÄ™ 92480.
- Wykonujemy mnożenie przez odpowiednie wagi:
- 9•2 = 18
- 2•1 = 2
- 4•2 = 8
- 8•1 = 8
- 0•2 = 0
- Cyfry liczby 18 (jako dwucyfrowej) dodajemy do siebie otrzymujÄ…c 9.
- Otrzymane liczby dodajemy do siebie: 9 + 2 + 8 + 8 + 0 =27.
- Wykonujemy operacjÄ™ mod 10: 27 mod 10 = 7.
- 7<>0, więc wykonujemy operację 10 - 7 = 3.
- CyfrÄ™ kontrolnÄ… 3 "doklejamy" do liczby otrzymujÄ…c 924803.
[edytuj] Implementacja
Następująca funkcja C# przedstawia algorytm opisany wyżej, zwracając true jeśli dana tablica cyfr jest prawidłową cyfrą Luhna, a false jeśli nie.
bool CheckNumber(int[] digits) { int sum = 0; bool alt = false; for(int i = digits.Length - 1; i >= 0; i--) { if(alt) { digits[i] *= 2; if(digits[i] > 9) { digits[i] -= 9; // equivalent to adding the value of digits } } sum += digits[i]; alt = !alt; } return sum % 10 == 0; }
Następnie widzimy program (w C#), który generuje liczbę zdająca egzamin algorytmu Luhna. Wypełnia tablicę liczbami losowymi, oblicza sumę tych liczb i wpisuje różnicę 10-sum (modulo 10) w ostatnim elemencie tablicy.
int[] CreateNumber(int length) { Random random = new Random(); int[] digits = new int[length]; // For loop keeps default value of zero for last slot in array for(int i = 0; i < length - 1; i++) { digits[i] = random.Next(10); } int sum = 0; bool alt = true; for(int i = length - 2; i >= 0; i--) { if(alt) { int temp = digits[i]; temp *= 2; if(temp > 9) { temp -= 9; } sum += temp; } else { sum += digits[i]; } alt = !alt; } int modulo = sum % 10; if(modulo > 0) { digits[length-1] = 10 - modulo; } // No else req'd - keep default value of zero for digits[length-1] return digits; }
[edytuj] Linki zewnętrzne
- Patent Luhna Nr. 2950048 Computer for Verifying Numbers, Hans P. Luhn, August 23, 1960.
| Prezydent Kaczyński nazwany homofobem |
Prezydent Kaczyński został napiętnowany przez Human Rights Watch, organizację broniącą praw człowieka, "za odmawianie ludziom szacunku dla ich rodzin". Bezpośrednim powodem było słynne orędzie z gejowską parą małżeńską.
|
| Nowe wstrzÄ…sy w Chinach |
O nowych wstrząsach w południowo zachodnich Chinach poinformowało w sobotę amerykańskie centrum geologiczne (USGS). Trzęsienie o sile 6,1 w skali Richtera nastąpiło na granicy prowincji Syczuan i Gansu.
|
| Pijany rosyjski statek na mieliźnie |
Na mieliznę lub na podwodne skały wpłynął na Bałtyku koło Bornholmu rosyjski statek do transportu odpadów atomowych. Kapitana jednostki zatrzymano; policja podejrzewa, że był pod wpływem alkoholu, podobnie jak inni członkowie załogi.
|
| ÅšWIAT 24/7 |
Tragiczne trzęsienie ziemi w Chinach, wybory parlamentarne w Serbii i 60. lecie Państwa Izrael, to najważniejsze tematy, o których pisaliśmy w zeszłym tygodniu w tvn24.pl
|
| Ostatni Kennedy trafił do szpitala |
Senator Edward Kennedy z objawami udaru trafił w sobotę do szpitala w Bostonie w stanie Massachusetts - poinformowała agencja Reutera powołując się na doniesienia telewizji CNN.
|
Prezydent Kaczyński został napiętnowany przez Human Rights Watch, organizację broniącą praw człowieka, "za odmawianie ludziom szacunku dla ich rodzin". Bezpośrednim powodem było słynne orędzie z gejowską parą małżeńską.
O nowych wstrząsach w południowo zachodnich Chinach poinformowało w sobotę amerykańskie centrum geologiczne (USGS). Trzęsienie o sile 6,1 w skali Richtera nastąpiło na granicy prowincji Syczuan i Gansu.
Na mieliznę lub na podwodne skały wpłynął na Bałtyku koło Bornholmu rosyjski statek do transportu odpadów atomowych. Kapitana jednostki zatrzymano; policja podejrzewa, że był pod wpływem alkoholu, podobnie jak inni członkowie załogi.
Tragiczne trzęsienie ziemi w Chinach, wybory parlamentarne w Serbii i 60. lecie Państwa Izrael, to najważniejsze tematy, o których pisaliśmy w zeszłym tygodniu w tvn24.pl
Senator Edward Kennedy z objawami udaru trafił w sobotę do szpitala w Bostonie w stanie Massachusetts - poinformowała agencja Reutera powołując się na doniesienia telewizji CNN.