algorytm.org

PESEL



Baza Wiedzy
wersja offline serwisu przeznaczona na urządzenia z systemem Android
Darowizny
darowiznaWspomóż rozwój serwisu
Nagłówki RSS
Artykuły
Implementacje
Komentarze
Forum
Bookmarki






Sonda
Implementacji w jakim języku programowania poszukujesz?

PESEL
Ocena użytkowników:***** / 115
SłabyŚwietny 
Wpisany przez Tomasz Lubiński, 06 października 2005 18:46

Zgodnie z informacją zamieszczoną na stronach rządowych Rejestr PESEL – Powszechny Elektroniczny System Ewidencji Ludności prowadzony jest od 1979 roku i zawiera dane osób przebywających stale na terytorium RP, zameldowanych na pobyt stały lub czasowy trwający ponad 2 miesiące a także osób ubiegających się o wydanie dowodu osobistego lub osób, dla których odrębne przepisy przewidują potrzebę posiadania numeru PESEL.

Budowa numeru PESEL jest następująca:
  • cyfry 1-2 to ostatnie dwie cyfry roku urodzenia
  • cyfry 3-4 to dwie cyfry miesiąca urodzenia
  • cyfry 5-6 to dwie cyfry dnia urodzenia
  • cyfry 7-10 liczba porządkowa z oznaczeniem płci (liczba parzysta - kobieta, liczba nieparzysta - mężczyzna)
  • cyfra 11 suma kontrolna

Jak zapewne zauważyłeś zapis taki nie pozwoliłby na rozróżnienie osób urodzonych w latach np. 1999 i 1899. Dlatego też dla odróżnienia do numeru miesiąca dodawane są następujące wartości:
  • dla lat 1800 - 1899 - 80
  • dla lat 1900 - 1999 - 0
  • dla lat 2000 - 2099 - 20
  • dla lat 2100 - 2199 - 40
  • dla lat 2200 - 2299 - 60

Tak więc początek numeru PESEL osoby urodzonej 10 lutego 1899 roku będzie wyglądał tak: 998210... a osoby urodzonej 10 lutego 1999 roku tak: 990210...
Teraz została nam jeszcze sprawa obliczania sumy kontrolnej. Każdą pozycję numeru ewidencyjnego mnoży się przez odpowiednią wagę, są to kolejno: 1 3 7 9 1 3 7 9 1 3. Następnie utworzone iloczyny dodaje się i wynik dzieli się modulo 10. Wynik ten należy odjąć od 10 i znów podzielić przez modulo 10 (to zabezpieczenie gdybyśmy w poprzednim kroku otrzymali 10).

Przykład:

Rozważmy PESEL osoby urodzonej 8 lipca 1902 roku, płci żeńskiej (parzysta końcówka numeru z serii – 0362). Czyli mamy wówczas 0207080362. Teraz kolejne cyfry należy przemnożyć przez odpowiednie wagi i dodać do siebie.
0*1 + 2*3 + 0*7 + 7*9 + 0*1 + 8*3 + 0*7 + 3*9 + 6*1 + 2*3 = 0 + 6 + 0 + 63 + 0 + 24 + 0 + 27 + 6 + 6 = 132
Wynik dzielimy modulo przez 10.
132 mod 10 = 2
A następnie odejmujemy od 10
10 - 2 = 8.
I wynik dzielimy znów modulo 10
8 mod 10 = 8
Cyfra kontrolna to 8, zatem nasz prawidłowy numer PESEL to: 02070803628

Implementacje
AutorJęzyk
programowania
KomentarzOtwórzPobierzOcena
Tomasz LubińskiC/C++
.cpp
.cpp
***** / 22
Tomasz LubińskiDelphi/Pascal
.pas
.pas
***** / 6
Tomasz LubińskiJava
.java
.java
***** / 31
 
Dodaj własną implementację tego algorytmu
  • Zaloguj się na stronie
Plik:
Język
programowania:
Komentarz:
  By móc dodać implementacje zaloguj się na stronie

Poprawiony: 29 sierpnia 2012 20:05
Komentarze
photo
-10 # Barti 2009-09-03 13:21
"cyfry 7-10 liczba porządkowa z oznaczeniem płci (liczba parzysta - kobieta, liczba nieparzysta - mężczyzna)"
Niestety to chyba nie do końca się sprawdza, moja dziewczyna ma w dowodzie \"081\" w przedziale 7-10 cyfra...
Odpowiedz | Odpowiedz z cytatem | Cytować
photo
0 # Matma+ 2014-01-07 13:13
Cytuję Barti:
"cyfry 7-10 liczba porządkowa z oznaczeniem płci (liczba parzysta - kobieta, liczba nieparzysta - mężczyzna)"
Niestety to chyba nie do końca się sprawdza, moja dziewczyna ma w dowodzie \"081\" w przedziale 7-10 cyfra...


A od kiedy to 7-10 cyfra to tylko 3 cyfry?
Odpowiedz | Odpowiedz z cytatem | Cytować
photo
0 # Tomek 2009-09-03 18:46
Oj chyba coś pokręciłeś bo cyfr na pozycjach 7-10 jest cztery, a Ty wypisałeś trzy.
Odpowiedz | Odpowiedz z cytatem | Cytować
photo
-13 # Joanna 2010-03-12 21:06
Tu chodzi o cyfrę 7 i 10
Odpowiedz | Odpowiedz z cytatem | Cytować
photo
-2 # sho 2013-04-09 18:53
nie... od 7 do 10 i tak naprawde wystarzy sama 10 liczba...
Odpowiedz | Odpowiedz z cytatem | Cytować
photo
0 # Tomek29kce 2016-05-11 07:18
Oczywiście każda cyfra jest również liczbą, ale bardziej poprawnie byłoby napisać 10-ta cyfra, a nie liczba.
Odpowiedz | Odpowiedz z cytatem | Cytować
photo
-6 # Ali 2010-04-02 13:40
W na stronie MF jest informacja o modulo 11 - to by się bardziej zgadzało z odejmowaniem od 10. Poza tym wyniku odejmowania 10 - modulo nie trzeba nie trzeba dzielić modulo.
Odpowiedz | Odpowiedz z cytatem | Cytować
photo
-2 # Tomasz Lubiński 2010-04-02 14:08
Eeee pokręciłeś chyba z numerem NIP, tam faktycznie wynik sumy ważonej dzieli się modulo 11. W PESEL dzieli się modulo 10, zresztą policz sobie swój numer PESEL jeżeli użyjesz dzielenia modulo 11 wyliczysz złą cyfrę kontrolną.
Odpowiedz | Odpowiedz z cytatem | Cytować
photo
0 # Inka 2011-05-29 00:09
Mam problem z obliczeniem. Wydaje mi się, że wszystko dobrze liczę, ale wynik - trzy, nie chce wyjść. Pesel na 100% prawidłowy. Po pomnożeniu przez wagi wychodzi 144. Co dalej?
PESEL: 84040206943
Odpowiedz | Odpowiedz z cytatem | Cytować
photo
-3 # Romek 2011-09-24 00:51
Cytuję Inka:
Mam problem z obliczeniem. Wydaje mi się, że wszystko dobrze liczę, ale wynik - trzy, nie chce wyjść. Pesel na 100% prawidłowy. Po pomnożeniu przez wagi wychodzi 144. Co dalej?
PESEL: 84040206943

1*8 + 3*4 + 7*0 + 9*4 + 1*0 + 3*2 + 7*0 + 9*6 + 1*9 + 3*4 = 8 + 12 + 0 + 36 + 0 + 6 + 0 + 54 + 9 + 12 = 137
A mnie suma wychodzi 137, więc po odjęciu (137 mod 10 = 7) 10-7=3. Tak więc cyfra kontrolna się zgadza.
Odpowiedz | Odpowiedz z cytatem | Cytować
photo
-2 # Joe Chal 2012-10-27 13:12
Czy jest prawda aby w Peselu był lub mógłby być również wkomponowany tajny kod oznaczający pochodzenie?
Odpowiedz | Odpowiedz z cytatem | Cytować
photo
-1 # Tomasz Lubiński 2012-10-27 13:14
Teoretycznie w każdy numer identyfikacyjny możesz coś wkodować, chociażby w numer rejestracyjny auta, PESEL (ale tylko 4 cyfry bo pozostałe to data urodzenia i cyfra kontrolna), numer dowodu osobistego, itp...
Tyle, że moim zdaniem to tylko jedna z miejskich legend...
Odpowiedz | Odpowiedz z cytatem | Cytować
photo
-2 # sasiad252 2013-04-29 13:45
suma kontrolna sie nie zgadza.mam na koncu w peselku "5" a w/g obliczen kolegi wyszlo mi 4....
Odpowiedz | Odpowiedz z cytatem | Cytować
photo
-1 # Romek 2014-05-03 13:19
Więc według obliczeń kolegi jesteś kobietą

Licz sam i na siebie
Odpowiedz | Odpowiedz z cytatem | Cytować
photo
+1 # padamcz1 2014-02-24 10:50
Implementacja w Oracle bez tworzenia funkcji:

SELECT
mod(10-mod(SUBSTR(REGE XP_REPLACE( PESEL,'[^[:digit:]]',''),1,1)*1+
SUBSTR(REGEXP_R EPLACE( PESEL,'[^[:digit:]]',''),2,1)*3+
SUBSTR(REGEXP_R EPLACE( PESEL,'[^[:digit:]]',''),3,1)*7+
SUBSTR(REGEXP_R EPLACE( PESEL,'[^[:digit:]]',''),4,1)*9+
SUBSTR(REGEXP_R EPLACE( PESEL,'[^[:digit:]]',''),5,1)*1+
SUBSTR(REGEXP_R EPLACE( PESEL,'[^[:digit:]]',''),6,1)*3+
SUBSTR(REGEXP_R EPLACE( PESEL,'[^[:digit:]]',''),7,1)*7+
SUBSTR(REGEXP_R EPLACE( PESEL,'[^[:digit:]]',''),8,1)*9+
SUBSTR(REGEXP_R EPLACE( PESEL,'[^[:digit:]]',''),9,1)*1+
SUBSTR(REGEXP_R EPLACE( PESEL,'[^[:digit:]]',''),10,1)*3
,10),10) AS VAL, SUBSTR(REGEXP_R EPLACE( PESEL,'[^[:digit:]]',''),11,1) AS CHECK_SUM,
PESEL from table;
Odpowiedz | Odpowiedz z cytatem | Cytować
photo
-3 # sjd 2015-02-13 11:22
Jest bardzo duzo blednie wpisanych PESEL w dokumentach poniewaz dawniej urzednicy liczyli sumy kontrolne "na piechote" i czesto sie mylili zarowno w obliczeniach jak w interpretacji algorytmu. Stad ktos moze miec wpisany w dokumentach PESEL ktory nie przejdzie validacji.
Odpowiedz | Odpowiedz z cytatem | Cytować
photo
-2 # Yaroshi 2016-09-20 08:13
Witam.
A co w przypadku osob z data urodzenia djamy na to 1899.11.10 ? Czyli pesel 99811... ?? :)
Odpowiedz | Odpowiedz z cytatem | Cytować
photo
+1 # Tomasz Lubiński 2017-04-13 14:59
Nie, PESEL zaczynałby się 9991, bo do miesiąca 11 dodajemy 80, czyli mamy na pozycji miesiąca liczbę 91.
Odpowiedz | Odpowiedz z cytatem | Cytować
photo
-6 # BRW 2016-12-23 15:51
I tak coś tu w tym zapisie musi być nie halo, bo zapisali, że:
"Jak zapewne zauważyłeś zapis taki nie pozwoliłby na rozróżnienie osób urodzonych w latach np. 1999 i 1899. Dlatego też dla odróżnienia do numeru miesiąca dodawane są następujące wartości:
dla lat 1800 - 1899 - 80
dla lat 1900 - 1999 - 0
...
Tak więc początek numeru PESEL osoby urodzonej 10 lutego 1899 roku będzie wyglądał tak: 998210... a osoby urodzonej 10 lutego 1999 roku tak: 990210..."

A czemu jak jestem urodzony 10.11.1988, to mój PESEL zaczyna się od: 881110...?
Więc jakie "0" na trzeciej pozycji?
Odpowiedz | Odpowiedz z cytatem | Cytować
photo
-1 # Tomasz Lubiński 2017-04-13 14:58
Nie zero na trzeciej pozycji, tylko dodaje się 0 do numeru miesiąca. Urodziłeś się w listopadzie dlatego po 88 oznaczającym rok, jest 11. Gdybyś urodził się w roku 1888 to Twój PESEL zaczynałby się 8891... bo do 11 miesiąca dodalibyśmy 80.
Odpowiedz | Odpowiedz z cytatem | Cytować
photo
-2 # Krzysztof Pawlak 2017-05-25 14:57
Cytat:
Wynik dzielimy modulo przez 10. 132 mod 10 = 2 A następnie odejmujemy od 10 10 - 2 = 8. I wynik dzielimy znów modulo 10 8 mod 10 = 8


Jaki jest sens ponownego dzielenia modulo 10?

Pierwsze dzielenie modulo 10 zapewnia na wynik 'x' < 10. Jeśli od 10 odejmiemy x, to nadal mamy liczbę < 10. A więc ostatnie działanie nie zmieni nigdy wyniku.

Czy coś przeoczyłem?
Odpowiedz | Odpowiedz z cytatem | Cytować
photo
-1 # Tomasz Lubiński 2019-10-02 12:35
A co gdy w wyniku pierwszego dzielenie otrzymamy 0?

Wówczas mamy 10 - 0 = 10.
Dlatego ten wynik znów dzielimy modulo 10 żeby otrzymać cyfrę kontrolną - w tym wypadku 0.
Odpowiedz | Odpowiedz z cytatem | Cytować
photo
-1 # MW 2018-10-25 11:49
Bez funkcji w MS SQL

declare @p as varchar(11)
set @p='tu wpisz pesel'

select
case when
((10-(((SUBSTRING(@p ,1,1)*1)+(SUBSTRING(@p ,2,1)*3)+(SUBSTRING(@p ,3,1)*7)+(SUBSTRING (@p ,4,1)*9)+(SUBSTRING (@p ,5,1)*1)
+(SUBSTRING(@p, 6,1)*3)+(SUBSTRING(@p ,7,1)*7)+(SUBSTRING (@p ,8,1)*9)+(SUBSTRING (@p ,9,1)*1)+(SUBSTRING(@p ,10,1)*3)) % 10)) % 10) =SUBSTRING(@p,11,1)
then 'PESEL poprawny' else 'ZŁY PESEL' end
Odpowiedz | Odpowiedz z cytatem | Cytować
photo
-2 # splon 2018-11-13 13:13
METODA z Wikipedii mój pesel wychodzi obiema ok
Cyfra kontrolna i sprawdzanie poprawności numeru[edytuj | edytuj kod]

Jedenasta cyfra jest cyfrą kontrolną, służącą do wychwytywania przekłamań numeru. Jest ona generowana na podstawie pierwszych dziesięciu cyfr. Aby sprawdzić czy dany numer PESEL jest prawidłowy, należy, zakładając, że litery a-j to kolejne cyfry numeru od lewej, obliczyć wyrażenie:
9×a + 7×b + 3×c + 1×d + 9×e + 7×f + 3×g + 1×h + 9×i + 7×j


Jeżeli ostatnia cyfra otrzymanego wyniku nie jest równa cyfrze kontrolnej, to znaczy, że numer zawiera błąd[18].

Przykład dla numeru PESEL 44051401358:
9×4 + 7×4 + 3×0 + 1×5 + 9×1 + 7×4 + 3×0 + 1×1 + 9×3 + 7×5 = 169
Wyznaczamy resztę z dzielenia sumy przez 10:
169:10 = 16 reszta = 9
Wynik 9 nie jest równy ostatniej cyfrze numeru PESEL, czyli 8, więc numer jest błędny.
Odpowiedz | Odpowiedz z cytatem | Cytować
photo
-2 # Arte 2019-08-09 10:41
Trochę nie ogarniam jednej rzeczy - już pierwsze działanie modulo zabezpiecza nas przed otrzymaniem wyniku 10. W końcu każda liczba modulo 10 daje nam wynik jednocyfrowy (0,1,2,3,4,5,6,7,8,9).
Rozumiem, że samo działanie jest niezbędne ze względu na algorytm, jednak uzasadnienie trochę błędne.
Odpowiedz | Odpowiedz z cytatem | Cytować
photo
-1 # Tomasz Lubiński 2019-10-02 12:36
A co gdy w wyniku pierwszego dzielenia otrzymamy 0?

Wówczas mamy 10 - 0 = 10.
Dlatego ten wynik znów dzielimy modulo 10 żeby otrzymać cyfrę kontrolną - w tym wypadku 0.
Odpowiedz | Odpowiedz z cytatem | Cytować
Dodaj komentarz