Ze všech vtipů komentujících součtový
výklad zákona o přímé volbě presidenta, které jsem na sociálních sítích četl, se mi asi nejvíc líbí tento: Víte, že úředníci na ministerstvu vnitra mají průměrné IQ 160? Samozřejmě! Polovina 70 a polovina 90.
Právníkovi počítač do rukou nepatří, to je zjištění, které jsem učinil již dávno a o jehož správnosti se opakovaně přesvědčuji. Díky Janu Petrovovi jsem, utopena uprostřed rozhodnutí o registraci nebo odmítnutí kandidátky, objevil algorithmus, pro účely výběru vzorku petičních archů ministerstvem vytvořený, a zhrozil se.
Především je tam zřejmá písařská chyba. V algorithmu generátoru pseudonáhodných čísel se nepoužívá konstanta a = 11035115245, nýbrž 1103515245; 11035115245 je větší než 233 a zjistit součin a . rn–1 vyžaduje nejméně 65-bitovou arithmetiku, což je v řadě implementací problém.
Zkusme se zeptat kompilátoru gcc, kolik je a . (231 – 1):echo -e "main() { printf(\"%lu\\\n\", 11035115245 * 0x7fffffff); }\n" | gcc -x c - && ./a.out
Prý 5250985457688346899; ovšem, do 64 bitů se víc nevejde.
Python arci ví, že je to 23697729531397898515, stejně jako kalkulátor bc, jemuž lze pro tento účel důvěřovat.
Druhá nejasnost vzniká u prvního a posledního archu. Popsaný algorithmus generuje pořadová čísla v rozsahu 0 až N – 1, nikoli 1 až N. To znamená, že poslední arch nikdy nemůže být do vzorku zařazen, přestože se podpisy na něm do součtu započítávají, ledaže by bylo číslováno od nuly: tomu ale nic nenasvědčuje.
Za třetí není jasné, co se stane v případě, že by měl být jeden podpisový arch do výsledku zařazen vícekrát. Ministerští informatici evidentně neumějí napsat algorithmus tak, aby tato situace nemohla nastat, a i když by se dalo logicky předpokládat, že jeden a ten samý arch by neměl být kontrolován dvakrát, z popisu algorithmu to jednoznačně nevyplývá.
Za čtvrté, a to mám za největší problém, výběr podpisových archů se mi nepodařilo rekonstruovat.
Vzal jsem si pro jednoduchost rozhodnutí týkající se Jany Bobošíkové a extrahoval z něj pořadová čísla aspoň jednu chybu obsahujících petičních archů v prvním a druhém vzorku. To se dá udělat např. takto:pdftotext -f 21 -l 41 Jana_Bobošíková.pdf - | grep ^1400 | sort | uniq > jb1.txt
pdftotext -f 42 -l 73 Jana_Bobošíková.pdf - | grep ^1400 | sort | uniq > jb2.txt
Výsledné soubory si můžete stáhnout z mého webu (jb1.txt, jb2.txt). K tomu jsem si napsal program, který simuluje ministerstvem popsaný výběr, a zkoumal, kdy přijdou jednotlivé archy na řadu
:
Už první řádky výstupu ukazují, že zde něco nesouhlasí:
[tompecina@desktop President 2013]$ ./volby.py 4963 jb1.txt | head
N = 4963
file = jb1.txt
p[2516] = 20
p[1134] = 32
p[3744] = 41
p[1563] = 67
p[916] = 81
p[1946] = 82
p[1737] = 85
Evidentně: kontrolovat se mohla zhruba třetina petičních archů, a tak např. arch s pořadovým číslem 41 se nikdy ani do prvního, ani do druhého zkušebního vzorku nemohl dostat.
Nepomůže, ani když proti textu rozhodnutí opravím konstantu a, výsledek, který by odpovídal tomu ministerskému, prostě nedostanu. Kde je tedy chyba, dokáže ji někdo odhalit?
Aktualisováno.
Další studijní materiál k experimentování:
Jana Bobošíková | link | 14 | 4963 | jb1.txt | jb2.txt |
Vladimír Dlouhý | link | 13 | 6678 | vd1.txt | vd2.txt |
Jan Fischer | link | 10 | 19558 | jf1.txt | jf2.txt |
Taťana Fischerová | link | 17 | 9219 | tf1.txt | tf2.txt |
Vladimír Franz | link | 15 | 7194 | vf1.txt | vf2.txt |
Tomio Okamura | link | 16 | 8619 | to1.txt | to2.txt |
Zuzana Roithová | link | 11 | 8837 | zr1.txt | zr2.txt |
Miloš Zeman | link | 12 | 26795 | mz1.txt | mz2.txt |
Kandidát | Rozhodnutí | Prefix | N | Vzorek 1 | Vzorek 2 |
---|
Aktualisováno.
Žádost o informace. Snad pomůže záhadu vyjasnit.
Aktualisováno.
V analyse jsem zatím dospěl k tomuto výsledku, v jehož správné interpretaci, resp. rekonstrukci skutečně použitého algorithmu, arci tápu (u ostatních kandidátů dostávám pouze šum):
JB Sample 1 Sample 2
Iteration -1 0 +1 -1 0 +1
-----------------------------------------
000001-000050 8 13 20 2 4 2
000051-000100 7 9 17 3 7 2
000101-000150 1 12 18 6 2 2
000151-000200 7 9 18 4 2 0
000201-000250 2 10 12 5 3 1
000251-000300 2 12 15 7 4 2
000301-000350 3 11 21 5 3 0
000351-000400 5 17 22 3 2 1
000401-000450 3 15 18 6 4 1
000451-000500 5 16 20 10 6 1
000501-000550 1 14 19 3 3 4
000551-000600 5 11 11 3 4 4
000601-000650 2 8 21 3 4 0
000651-000700 5 13 14 7 2 1
000701-000750 4 13 13 9 6 2
000751-000800 3 12 15 5 6 6
000801-000850 2 3 7 7 12 15
000851-000900 4 5 4 3 7 20
000901-000950 2 3 3 7 13 18
000951-001000 2 6 3 4 12 19
001001-001050 7 4 5 1 14 20
001051-001100 10 5 5 6 13 16
001101-001150 8 4 3 6 14 17
001151-001200 2 3 1 4 14 17
001201-001250 2 1 4 2 15 17
001251-001300 7 2 6 9 13 20
001301-001350 5 4 2 8 8 15
001351-001400 6 5 1 3 10 23
001401-001450 5 5 1 7 3 25
001451-001500 2 8 6 8 9 17
001501-001550 5 7 2 7 12 20
001551-001600 3 3 6 6 11 14
001601-001650 3 6 1 4 9 16
001651-001700 4 5 4 3 9 17
001701-001750 3 3 3 4 18 15
001751-001800 1 7 1 5 5 13
001801-001850 4 5 4 2 6 2
001851-001900 4 4 2 2 5 2
001901-001950 4 2 4 7 2 6
001951-002000 4 2 2 4 8 6
002001-002050 1 4 3 4 4 3
002051-002100 4 7 2 3 3 3
002101-002150 6 2 3 4 3 6
002151-002200 7 9 5 4 5 5
002201-002250 4 7 1 4 5 8
002251-002300 6 4 3 5 8 6
002301-002350 4 1 5 5 6 6
002351-002400 0 1 4 5 8 8
002401-002450 3 4 3 2 5 3
002451-002500 3 3 1 4 6 0
Na druhé straně, i šifru Enigmy se nakonec podařilo prolomit, tak přece toto nemůže odolat…
Komentáře
Zatím nejplauzibilnější podobou, ke které jsem se propracoval, je: ponechat původní „podivnou“ variantu konstanty a (BTW: 65bitovou aritmetiku samozřejmě nepotřebujete, když se to celé počítá v Z_m, můžete si i z konstanty a na počátku vzít jen její zbytek), ale celé to jakoby „indexovat od jedničky“, tzn. místo N nebrat 4963, ale 4964, a k výsledkům toho PRNG vždycky přičíst jedna. Výsledná posloupnost testovaných čísel archů 14002483 (bez chyby), 14004158 (2 chyby), 14001088 (bez chyby), 14001779 (1 chyba), …), resp. váš test pořadových čísel (269, 177, 480, 619, …) vypadají velmi uvěřitelně. Jenže u několika chybových položek v seznamu to pořadí vychází hodně vysoko (p[10726] = 14000514), což by skoro naznačovalo, že jeli podle PRNG, ale přihodili si tam pár chybných podpisů, které nepocházely z PRNG (třeba jim náhodou padl zrak na nějakého Kačera Donalda…).
Jenže… u ostatních kandidátů tahle metoda opět nikam nevede, zdá se…
To můžu, ale musím mít jistotu, že se hw nebo sw násobička při přetečení zachová tak, jak čekám. Což u řady systémů není vůbec garantováno.
(p[10726] = 14000514)
Jak můžete mít tak vysoký index? Patrně vám ušel řádek 19.
vypadají velmi uvěřitelně
To se zdá být správný postřeh, vychází to mnohem lépe, ale stále ne tak, jak má. Zkusím se ještě podívat, zda se tam nějak nestandardně neřeší situace, kdy vyjde strana nula.
Ha! Máte v podstatě pravdu, vy (pochopitelně) počítáte jen ty neduplicitní; já je sice ignoroval, ale do pořadového čísla jsem je započítával. Opraveno, výsledky už mám stejné.
Tím pádem se samozřejmě sníží i pořadí v té poupravené verzi, ale jakkoli to na první pohled vypadá skoro krásně, pořád je tam spousta indexů nesmyslně vysoko. O ostatních kandidátech nemluvě. Skoro se mi začíná zdát, že to je jen náhoda a skutečný rozdíl je v něčem jiném (nejspíš v nějaké hloupé chybě toho jejich programátora, že nějaký mezivýsledek počítal v intech místo longů nebo tak něco). Tak nevím.
> Za třetí není jasné, co se stane v případě,
> že by měl být jeden podpisový arch do výsledku zařazen vícekrát.
To je jednoduché. Vzhledem k tomu, jakým způsobem pracuje ten algoritmus (rekurence, následujicí člen závisí jen a pouze na předchozím členu a konstatntách), jakmile se zopakuje jedno číslo, budou všechna další duplicitami, lépe řečeno generátor nám začne cyklit. To je obecně vlastnost pseudonáhodných generátorů. A nejde tomu zabránit. Jedno hledisko na kvalitu pseudonáhodného generátoru je proto délka jeho cyklu, čím delší tím lepší. (zdroj en.wikipedia.org/.../Linear_congruential_generator)
Ještě jedna citace z té stránky na wiki "While LCGs are capable of producing decent pseudorandom numbers, this is extremely sensitive to the choice of the parameters c, m, and a."
to by se dalo interpretovat tak, že pokud vybereme "špatné" konstanty, generátor nebude ani "decent".
Pokud si zkusím googlit, www.google.com/search?q=11035115245 , ukazuje se, že to číslo pro jejich konstantu a se na webu vyskytuje jen a pouze v tomto článku.
~Jerzy
Poctivě jsem si načetl rozhodnutí i stránky na Wikipedii, ale u programu už jsem se nechytal (až jsem za mlada dováděl s Pascalem a bavilo mě to, už se mi nechtělo dohledávat si, co znamenají ty příkazy v Pythonu). Takže u věty "Už první řádky výstupu ukazují, že zde něco nesouhlasí:" už jsem se absolutně nechytal, co z toho výstupu plyne.
Zkusil jsem i zpětné inženýrství bez znalosti Pythonu, ale když jsem viděl že výstup z Vašeho programu ukazuje jakési %d, přičemž %d není nikde definované, tak jsem to vzdal. Nemůžete spravedlivě chtít po čtenářích, aby se naučili programovací jazyk kvůli Vašenu článku.
No a když netuším, jaký výstup to vlatně generuje, tak nepoznám, co je na těch číslech špatně. Mohl byste prosím napsat nějak blbuvzdorně i pro právníky, jak jste dospěl k závěru, že to nesedí?
P.S. Z žertíku typu Sokalova aféra Vás samozřejmě nepodezřívám.
Špatně je na tom, že se do kontrolního vzorku dostaly petiční archy, které se tam podle algorithmu vůbec dostat neměly, protože jejich čísla algorithmus tak brzy nevygeneroval.
Nejzajímavější na tom je, že modifikací algorithmu se nám s Mormegilem podařilo, a to pouze u jediného kandidáta, JB, dostat výsledky, které sice obsahují chyby, ale je jich řádově méně než u ostatních kandidátů, jejichž soubory *.txt vypadají, jako kdyby ministerstvo používalo úplně jiný algorithmus, nebo výběr provádělo zcela náhodně. Proč, zatím nikdo netušíme.
Tomáši, hotline Microsoftu je proti Vám učiněný pramen moudrosti!
To vím taky, že Vám to nevyšlo. A pokládám to za potenciální megaprůser, vedle kterého bledne to, jestli nějaký ředitel odboru MV ze sebe chce dělat hlupáka na veřejnosti nebo ne. Ale jde ten problém upřesnit, aby to nebohý čtenář pochopil, aniž by si musel stahovat a instalovat nějaký open source kompilátor a měnit na chvíli svou profesi?
(jak říkám, za mlada mi to s Pascalem šlo, ale za mlada už v mém případě znamená něco jako za císaře pána)
Netuším absolutně, co to je "tupl" a nevidím, že by se k kódu někde definovala proměnná d, takže nevím, co znamená výstup:
p[2516] = 20
p[1134] = 32
p[3744] = 41
p[1563] = 67
p[916] = 81
p[1946] = 82
p[1737] = 85
Z toho nepoznám, jestli to souhlasí nebo nesouhlasí. No comprendo, jasné?
V tuto chvíli jsem ochoten Vám věřit, že to není Sokalova aféra po česku, ale nějaké srozumitelné vysvětlení toho, co vlastně píšete, si jistě Vaši čtenáři zaslouží.
Jan Fischer 105481 podpisů na 19558 arších (průměr 5,4), ale v prvním vzorku průměr 16,7 (odhadem 8500 podpisů, 508 archů).
Počty archů jsem vzal jako počet řádků v Tomášových souborech **1.txt.
Proč se tak moc liší průměrné počty podpisů na arch mezi celkem a vzorkem???
Je neděle po ránu a ještě jsem neměl svou kávu, takže možná mi někde unikl nějaký detail.
Jak prosté, milý Watsone. Můj pokročilý věk snad omlouvá, že v neděli po ránu ještě moc nefunguji.
nevychází to ani statisticky - viz t.co/Cxnja6wy
l = []
q = list(range(N))
n = N
while n:
r = ((a * r) + c) % m
p = floor(n / m * r)
l.append(q[p])
del q[p]
n -= 1
Už možná vím, proč data sedí (z cca 80 %) jen u Bobošíkové: protože je první v abecedě. U dalších programátor upravil N, ale zapomněl inicialisovat p0 a/nebo r0 (řádky 12 a 13 programu).
A nějaký právník by třeba mohl říci, zda je v souladu se zákonem prohlásit, že kandidát nemá dost platných piodpisů, když zjištěníém je pouze fakt, že určitý odhad relatiovní četnosti nedovolí vyloučit hypotézu, že pravděpodobnost, že těch podpisů není dost je větší než nula.
Ale mě v mezičase napadl ještě jeden důvod, proč je celej ten zákon o kontrole archů vadnej, a zformuloval jsem na to jine strategii kterou sem s dovolením napastuju v původnim znění. Pletu se někde, nebo je to opravdu schůdnej "obchodní model"?
Prostě necháte lidi (30 tis. úplně stačí) podepsat "pro jistotu" každýho dvakrát, na dva různý sčítací archy, to by mohlo fungovat dobře .. pravděpodobnost že se do kontrolního vzorku náhodnym výběrem dostanou oba podpisy a budou tudíž vyřazený na duplicitu je jen 4%, proti 50% skutečný chybovosti souboru a 96% "zisku" je zaručeno jak jistota desetinásobku .. někdy prostě ani sčítání chybovostí nestačí, akorát je třeba stanovit podnikatelskej záměr v souladu s platnou legislativou ..
A.J.
Nicmene pri realnych a ne takto nastrcenych datech to nebude velky rozdil, navic bude ve prospech tech kandidatu. Cela skoda ktera muze vzniknout je cena za vytisteni volebnich listku, takto protlaceny kandidat stejne nema sanci.
A.J.
Pro kednoduchost počtu předpokládejme že kontrolní vzorek čítá 8000 podpisů. Při kontrole se mi do vzorku dostane jen 6250 podpisů z těch opravdu nasbíraných a 1750 z replikovaných. Při 3,5 procentní chybovosti bude vyřazeno cca 220 podpisů z původního souboru a 220 dalších kvůli duplicitě. Jsem zhruba na 7% chybovosti. V druhém kole bude vyřazeno dalších 220 podpisů z původního souboru a 660 dalších kvůli duplicitě. Jsem zhruba na 11% chybovosti.
Při správném postupu se mi odečte 9 % hlasů a já jdu s 58000 platných hlasů kandidaovat na prezidenta.
Čísla jsozu u Bobošíkové malinko jiná ( dla by se určitě doladir), princip je stejný.
JM
20 je v pořadí 231.
41 77.
32 374.
etc., čili odpovídají vcelku MV. V programu vypadá všechno podobně, jen používám int místo floor.
Zkoušel jsem leccos, např. program v C, který protočí celý PRNG a hledá shody (trvá to necelých 10 sekund), ale zatím bezúspěšně. Shoda je jen částečná a jen u JB.
A na závěr posílám analýzu toho PDFka tomu matematickému vzorci nerozumím a asi je to tak zvoleno právě kvůli tomu. Aby tomu člověk nerozuměl a vybrali archy, které se jim zrovna nehodí. Prošel jsem vzorek č.1 a vypsal všechny petice co měly všech 8 podpisů na listině neplatných(vymyšlených).
"Dobrý den zpracoval jsem Váš kontrolovaný 1 vzorek v kandidatuře na prezidenta. Prošel jsem všechny petice, které měli 8 chybných podpisů, tak pokud v tom nemáte prsty tak toto by se dalo napadnout. Teď jsem si ještě jednou procházel tu zprávu na www.mvcr.cz/clanek/rozhodnuti.aspx má 177 stran. Celkem bylo odevzdáno cca 8600petic a v 1. vzorku(od str. 51) z těch 8500 kontrolovaných tam bylo cca 1500 lidí, kteří nebyli v evidenci, ale zajímavé je, že je tam několik petic v tom vzorku, kde je všech 8 jmen vymyšlených.(nebo prostě nejsou v evidenci viz petice s číslem-627,629-str 53; 873-str.55;1193-str.56; 1579,1596-str. 58; 1607-str. 59..a tak dále můžete si takto projít oba kontrolované vzorky) Chtěl jsem si ty petice psát všechny, ale je takových petic více než 50.. Takže buďto to bylo záměrně- někdo z protistrany o tom věděl a využil toho, nebo někdo z brigádníků, kdo údajně dostával 10kč za podpis si chtěl lehce přivydělat( ale proč by si všech 8 podpisů vymýšlel-daly se ty jména dohledat na justici.cz a doplnit jen podpis).. Nebo to taky mohl udělat někdo komu ležel Okamura v žaludku a vytisknout pár petic a po večerech si hrát a vymýšlet jména.. Toť ode mě vše pan Okamura by si teď měl všechny petice takto s 8 podpisy projít vyžádat si jejich naskenovanou formu a nalézt jak on říkal na 2hé straně by měl být uveden zodpovědný pracovník kdo za to odpovídá. Ten by měl být příslušně POTRESTÁN. Zbytek pošlu v dalších 2 zprávách."
"Ideální by bylo zkontrolovat všechny petice ne jen ty 2 vzorky(2x 8500) nevím zda by to šlo udělat za ty 2 týdny co na to má ten Nejvyšší správní soud. Taky výběr těchto vzorků s 8 chybnými nemusel být vybrán náhodně.. Mohu použít vzorec, který se mi hodí (metodou pokus omyl, až vypadne ten koho chci nechat vypadnout) O vzorci v zákonu není řeč. Také je řešení všechny petice všech kandidátů zveřejnit naskenované na internetu a byl by KLID!!! Díky všem. Komentář č.2:
Dále píši jen petice s 8 vymyšlenými jmény- petice s číslem ve vzorku 1: 1980,1990-strana 60; 3013- str. 63/64; 3014(zvláštní náhoda tomu chtěla a kontrolovaly se 2 petice po sobě..ale tady to zrovna někdo HODNĚ Sabotoval, 3021, 3033-str. 64; 3041,3054, 3068-str. 65; 3071, 3080- str. 66; 3767- str. 68; 4106, 4111-str. 70; 5735-str.77; 5779,5780,5781(zase kontrola 3 petic po sobě!-ale zase evidentní sabotáž-str.78; 6680-str.82; 6703,6707-str.83; 6881-str.83/84; 7313-str.84; 7329,7330(zase 2 petice po sobě),7334-str.85; 7348,7361,7369-str.86; 7406,7418,7426.7427(zase 4 kontrolované petice po sobě a všechny úplně špatně- str.87; 7437,(7456-zde i 5 jiných chyb než vymyšlené jméno-ale celkem je jich 8),(zde také i jiné chyby -7461,7463)-str.88; 7918,7920,7921,7922(zase bere náhoda? petice hodně u sebe, ale zase evidentně sabotáž?-str.91; 7926,7938,7952-str.92; 7966,7992-str.93; 8114,8115(zase kontrola 2 petic po sobě)-str.94; 8134, 8144,8158,8160-str.95; 8163,8166,8167(zase více petic po sobě?)-str.96;Zbytek pošlu"
"8168,8172,8176,8177(zase 2 po sobě?)-str.97; 8183,8217,8219-str.98; 8231-str.99; 8267-str.100; 8437,8450,8451(zase 2 po sobě?)-str.101; 8455,8457,8467-str.102; 8469,8480,8482,8490-str.103; 8500,8509,8514-str.104;
Nevím proč neudělali třeba algoritmus bereme každou 15 petici (v případě TO by to bylo z 8600kusu petic celkem/15=cca 570 petic po berme 6kusech= 3400podpisů)podle čísel petic od začátku(pokud dojedeme na konec začnem zase od začátku a bereme každou 11. pak od začátku a každou 9. pak každou 4. nebo vymyslet nějakou posloupnost kde by v případě toho, že pojedu zase od začátku, tak nenarazím na žádnou petici, která už byla vybrána. Stačila by posloupnost max. 10 takových čísel.. a to kvůli tomu, že každý kandidát má jiný počet podpisů na dané petici Okamura měl max. 8 a Franz třeba 15.. tak by ta posloupnost u Franze nebyla potřeba tak dlouhá..
RSS kanál komentářů k tomuto článku