Suma lub cyfra kontrolna - cd.

Dla numeru oddziału banku
Numery oddziałów banków w Polsce składają się z 8 cyfr, z których ostatnia jest cyfrą kontrolną - mamy więc 7 wag
do obliczenia cyfry kontrolnej wagi wynoszą kolejno 7,1,3,9,7,1,3
sumę dzielimy Modulo 10
Przykład dla numeru konta bankowego nr 11401010 (Bank Rozwoju Eksportu S.A. O/W-wa)

           7 1 3 9 7 1 3           -> wagi
         * 1 1 4 0 1 0 1           -> nr konta bez cyfry kontr.
        -------------------------
suma= (7*1+1*1+3*4+9*0+7*1+1*0+3*1)=
    = (  7+  1+ 12+  0+  7+  0+  3)=  30
 
           30 mod 10 = 0 ----> cyfra kontrolna

Do weryfikacji cyfry kontrolnej wagi wynoszą kolejno 3,9,7,1,3,9,7,1.
Jeśli ostatnia cyfra sumy iloczynów wynosi 0 to numer jest poprawny
Przykład dla numeru konta bankowego nr 11602202 (Bank Millenium Gdańsk)

           3 9 7 1 3 9 7 1         -> wagi
         * 1 1 6 0 2 2 0 2         -> nr konta z cyfrą kontr.
        -------------------------
suma= (3*1+9*1+7*6+1*0+3*2+9*2+7*0+1*2)=
    = (  3+  9+ 42+  0+  6+ 18+  0+  2)=  80

ponieważ ostatnia cyfra sumy iloczynów równa się 0 to numer jest poprawny.

Do weryfikacji cyfry kontrolnej można też użyć czterech różnych zestawów: (7,1,3,9,7,1,3,9), (1,3,9,7,1,3,9,7), (3,9,7,1,3,9,7,1), (9,7,1,3,9,7,1,3).

Dla numeru rachunku bankowego NRB - IBAN
Nowe oznakowanie NRB rachunków bankowych jest już prawie zgodne z systemem IBAN. Dwie początkowe cyferki to właśnie cyfry kontrolne.
65 1060 0076 0000 3200 0005 7153
Aby uzyskać pełną zgodność NRB z IBAN należy dodać przed numerem litery PL.
PL65 1060 0076 0000 3200 0005 7153

Numery systemu IBAN (International Bank Account Number) zostały wprowadzone normą ISO-13616 w celu weryfikacji numerów kont bankowych w międzynarodowym przepływie pieniędzy. Numer IBAN składa się z dwuliterowego kodu kraju według normy ISO-3166 (dla Polski są to litery PL), dwucyfrowej liczby kontrolnej oraz numeru konta bankowego BBAN według systemu wybranego w danym kraju i danym banku. Numer konta BBAN może być dowolnej długości (do 30 znaków) ale długość musi być stała dla danego kraju. Numer konta może zawierać cyfry 0-9 i wielkie litery alfabetu łacińskiego A-Z. Do celów prezentacyjnych np. na wydrukach można numer IBAN dzielić na grupy 4-ro znakowe oddzielając je znakiem spacji.
Przyjęty przy weryfikacji system cyfr kontrolnych zgodny z ISO-7064 nie posługuje się wagami, ale traktuje numer IBAN jako liczbę całkowitą, która powstaje przez przesunięcie 4 początkowych znaków na koniec (kod kraju i dwucyfrowa liczba kontrolna), zamianę liter łacińskich A-Z na liczby całkowite od 10 do 35.

Weryfikacja składa się z następujących kroków:
krok wstępny : usuń niealfanumeryczne znaki - np. spacje, myślniki itd.
krok 1 : przesuń 4 pierwsze znaki na koniec,
krok 2 : zamień litery na dwucyfrowe liczby; A=10, B=11, ... Y=34, Z=35
krok 3 : podziel całkowicie liczbę powstałą w kroku 2 przez 97,
krok 4 : jeśli reszta z dzielenia wyniosła 1 to numer IBAN jest prawidłowy.

Wyliczanie cyfr kontrolnych
Wyliczenie składa się z następujących kroków:
krok wstępny : utwórz numer IBAN wraz z kodem kraju, a w miejscu cyfr kontrolnych wstaw 00
krok 1 : przesuń 4 pierwsze znaki na koniec,
krok 2 : zamień litery na dwucyfrowe liczby; A=10, B=11, ... Y=34, Z=35
krok 3 : podziel całkowicie liczbę z kroku 2 przez 97 i resztę z dzielenia odejmij od 98,
krok 4 : jeśli reszta z dzielenia jest jednocyfrowa to dopisz 0 przed tą cyfrą.

Przykład 
krok wstępny:
 BE62 5100 0754 7061  staje się BE62510007547061 
krok 1 
 BE62510007547061     staje się 510007547061BE62 
krok 2 
literę B zamieniamy na 11, literę E zamieniamy na 14
 510007547061BE62     staje sie 510007547061111462 
krok 3 
Obliczamy resztę z dzielenia; 
  jeśli reszta =1 to numer jest dobry
krok 4
 510007547061111462 MOD 97 = 1  czyli dobry

Uwaga: tak długie liczby całkowite nie dają się przedstawić dokładnie w typowym języku programowania (przepraszam za uproszczenie ;). W trakcie obliczeń należy podzielić długi ciąg cyfr na mniejsze porcje i na nich zrobić obliczenia w trybie tak jak to się robi na papierze. Liczba cyfr w podzielonych liczbach zależy od typu całkowitoliczbowego jaki wybierzemy do reprezentacji tych liczb.

  123456789012  dzielimy na dwie liczby:
  123456  i  789012
  123456 MOD 97 = 72  
resztę z dzielenia dopisujemy na początku drugiego kawałka 
72789012 MOD 97 = 18  to jest właśnie wynik dzielenia
całkowitego liczby 123456789012 przez 97

Dla dłuższego ciągu znaków dzielimy na większą ilość porcji:
    111023202 90043519 5001213 145 MOD 97 = 1

     111023202 MOD 97  = 9
             990043519 MOD 97  = 21
                    215001213 MOD 97  = 34
                           34145 MOD 97  = 1

Istnieje także metoda wielomianowa posługująca się wstępnie obliczonymi współczynnikami wagowymi zgodnie ze wzorem W[i]=10i-1 MOD 97.

  i   1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
W[i]  1 10  3 30  9 90 27 76 81 34 49  5 50 15 53

  i  16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
W[i] 45 62 38 89 17 73 51 25 56 75 71 31 19 93 57

Jedyną zaletą metody wielomianowej jest mniejsza liczba dzieleń

Dzielenie długich liczb całkowitych można także zrobić używając procedury rekurencyjnej. lub iteracyjnej.

Program js-pesel napisany w javaskrypcie weryfikuje numer konta bankowego według tego algorytmu.

Uwaga: najprostszy numer IBAN to PL04 0000 0000 0000 0000 0000 0000 !
Jest to numer nieprawdziwy bo nie odpowiada żadnemu polskiemu bankowi. Dokładniejsza procedura sprawdzająca prawidłowość numeru konta powinna także sprawdzać 8 cyfr (po kodzie PL04), które odpowiadają numerowi banku i oddziału banku. Odpowiedni algorytm jest na początku tej strony.

Dla numeru karty kredytowej
stosuje się zmodyfikowany algorytm zwany metodą Luhna.

Hans Peter Luhn (1 lipca 1896 - 19 sierpnia 1964) był informatykiem w IBM, i twórcą algorytmu Luhna i algorytmu indeksowania KWIC (Key Words In Context). Otrzymał ponad 80 patentów.
Zanim powstała informatyka pracował w drukarstwie i przemyśle tekstylnym gdzie wynalazł Lunometr - licznik nitek wątku - ciągle jeszcze używany. W tym okresie uzyskał wiele patentów. Pracę w IBM rozpoczął jako starszy inżynier badawczy w 1941 roku i wkrótce stał się kierownikiem działu badań wyszukiwania informacji.
Jego wejście w tematykę dokumentacji i informacji rozpoczęło się gdy rozwiązał problem wyszukiwania związków chemicznych zapisanych kodem. Problem rozwiązał z użyciem kart perforowanych.
Luhn wymyślił ideę cyfry kontrolnej i opatentował (zgłoszony w 1954, a przyznany w 1960) mechaniczny kalkulator do obliczenia lub sprawdzenia cyfry kontrolnej. Patrz patent Luhna.
Jeden z jego pomysłów, indeksowanie tekstów, stał się podstawą współczesnych metod wyszukiwania informacji. To co robi teraz Google było 50 lat temu wymyślone przez Luhna.

Poniżej podajemy zmodyfikowany dla celów kart kredytowych opis algorytmu Luhna:
jeśli numer karty jest krótszy od 16 cyfr to przed numerem dopisujemy zera,
kolejne cyfry numeru mnożymy przez współczynniki wagowe,
wagi wynoszą kolejno 2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,
sumujemy wszystkie cyfry otrzymanego wyniku,
numer karty jest prawidłowy jeśli ostatnia cyfra wyniku sumowania jest równa 0.

  2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1   -> wagi
* 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 2   -> nr karty 
---------------------------------
2*1 1*2 2*3 1*4 2*5 1*6 2*7 1*8 2*9 1*0 2*1 1*2 2*3 1*4 2*5 1*2  
 2   2   6   4  10   6  14   8  18   0   2   2   6   4  10   2 
 2 + 2 + 6 + 4+1+0 + 6+1+4 + 8+1+8 + 0 + 2 + 2 + 6 + 4+1+0 + 2=60
                     
           60 mod 10 = 0 ----> cyfra kontrolna prawidłowa

Indywidualne cechy kart z różnych banków podano w tabeli poniżej:

  • Organizacja Długosc numeru 1-sza cyfra 2-ga cyfra 4 pierwsze cyfry
    Visa 16, 13   4   -   -
    MasterCard   16   5 1,2,3,4,5   -
    American Express   15   3 4,7   -
    Diners Club
    Carte Blanche
      14   3 0,6,8   -
    JCB   16   -   - 3088,3096,3112,3158,3337,3528
  • Inne szczegóły można znaleźć w Internecie:


    ciąg dalszy


              Licznik = (od 2 stycznia 2001)
              ostatnie poprawki

    Valid HTML 4.01!