python

Математическое расследование, как подделывали выборы губернатора в Приморье 16 сентября 2018 года

  • среда, 24 июля 2019 г. в 00:19:32
https://habr.com/ru/post/440092/
  • Python
  • Big Data
  • Открытые данные


Во втором туре выборов губернатора Приморского края 16 сентября 2018 года встречались действующий и.о. губернатора Андрей Тарасенко и занявший второе место в первом туре коммунист Андрей Ищенко. В ходе подсчета голосов на сайте ЦИК РФ отображалась информационная панель с растущим числом обработанных протоколов и голосов за кандидатов.

Публикация подробных данных по участкам на официальном сайте ЦИК www.izbirkom.ru замерла после ввода 1484 (95.74%) протоколов и не возобновлялась до самого конца. Поэтому когда в трансляции лидер голосования вдруг поменялся с Ищенко на Тарасенко, было неясно, как именно это могло произойти. В СМИ просто писали «после обработки 99,03% протоколов лидер сменился».

Однако, располагая промежуточными суммарными данными из информационной панели, с помощью простой математики и программирования можно подробно установить, что именно происходило с протоколами в ночь после выборов. Используем Python, Colab от Google и Z3 theorem prover от Microsoft Research. Ну и добьём всё обычной дедукцией.



Предпосылки расследования и предварительные оценки


Число протоколов — целочисленный параметр


В СМИ часто можно видеть "Таковы данные ЦИК после обработки 90 процентов избирательных бюллетеней, передает агентство «Интерфакс»" или "Обработано 0,45 процентов бюллетеней в Приморье: лидирует Тарасенко". Конечно, журналистов сбивает с толку представление прогресса целочисленного параметра в виде процентов, и вместо "обработано 0.45% бюллетеней" (никто до конца подсчёта не знает, сколько же всего бюллетеней), нужно писать просто и ясно — в систему ввели 7 протоколов из 1550.

Доступные открытые данные


  1. Несколько десятков участков показали неадекватную явку в последние 2 часа выборов, что статистически маловероятно, это сразу же привлекло внимание и был создан сайт со списком этих подозрительных комиссий.

    Распределение числа голосующих по часам, источник — ГАС Выборы
  2. Известно, как изменялись числа голосов за кандидатов и процент обработанных протоколов, в том числе в промежутке, когда сайт ЦИК с детальными данными перестал обновляться, а именно с 95.74% до финальных 99.16%, данные публиковались в трансляции ЦИК и перепечатывались в СМИ
  3. Опубликовано как минимум 29 бумажных протоколов от наблюдателей с данными, отличающимися от финальных данных на сайте системы ГАС Выборы.
  4. В системе ГАС Выборы по ссылкам вида ...&version=1 доступны первоначальные версии протоколов для 19 участков. Этот перечень частично пересекается с упомянутым выше списком из 29 бумажных протоколов: отличаются 13 участков, которые были изменены и в ГАС. То есть всего вовлечённых в изменения — 29 + 19 — 13 = 35 участков
  5. В ГАС также найдены скрытыми 13 протоколов по участкам, где отменили выборы из-за визита пожарных в территориальную избирательную комиссию Советского района Владивостока.
  6. Перед отменой выборов ссылки на первичные результаты были прикрыты на уровне сервера, теперь по ссылке, содержащей параметр version, всегда видна ошибка сервера(пример), для всех выборов, но протоколы всё равно доступны по слегка модифицированной ссылке с заменой v на %76 (пример)
  7. В 07:46 понедельника 17 сентября (везде в статье время местное, GMT+10) специалист по электоральной статистике С. Шпилькин начал сохранять данные с сайта ЦИК каждые 5 минут, и в этих данных видно, как в 13:45 были выгружены единовременно последние 53 протокола

Что можно увидеть в открытых данных


Сменим запутывающие проценты на целочисленное количество протоколов и взглянем на таблицу известных данных, которые публиковались на сайте и в видео-трансляции ЦИК.


Официальные данные (с фальсификациями)

Самое простое, что видно - на каких этапах что было с протоколами, бумажные версии которых отличаются от официальных


Поскольку номера отличающихся протоколов известны, то посмотрев на данные на отметках 95.74% и 99.16%, можно понять, что случилось с каждым из 29 протоколов, отличающихся от ГАС. Получается, что 16 протоколов внесли в ГАС сразу с неверными цифрами и потом не трогали, а 13 внесли верно, и лишь затем отредактировали. Из 19 исправленных в ГАС протоколов для 13 в паблике есть сканы бумажных версий, так что мы имеем двойное доказательство редактирования результатов. Остальные 6 редактирований присутствуют только в ГАС.

Видно, кто победил на выборах

Официально победил Тарасенко. В ГАС и в протоколах — Ищенко. plot.ly

С результатом 249 845 (51.1%) против 226 637(46.4%) голосов победил Ищенко. Переписыванием протоколов голоса Ищенко уменьшили на 402, голоса Тарасенко увеличили на 15 077. Правками протоколов в ГАС голоса И. уменьшили на 954, Т. — увеличили на 14 894. Общее влияние двух типов фальсификаций на разницу голосов — 31 327. Влияние сокрытия 13 участков Владивостока на сумму голосов совсем небольшое, в этих протоколах их суммарные результаты близки — 2 939 у коммуниста против 3 408 у единоросса.

Если считать по участкам, на 908 участках изначально победил коммунист, на 628 — единоросс и на 14 участках ничья. То есть по числу участков, конечно, коммунист победил значительно. Из 35 отредактированных-переписанных на 9 участках редактирование привело к тому, что победитель сменился на единоросса, в остальных 26 и без того единоросс побеждал. То есть фейковая победа единоросса была одержана на 637 участках против 899 у коммуниста.

Также интересно заметить, что протоколы, которые редактировали в ГАС, изначально были введены в соответствии с бумажным протоколом. Впрочем, судя по аномальным цифрам (особенно для участков 2812 и 2863), почти все комиссии Уссурийска, результаты которых правили в ГАС, изначально тоже выдали сфальсифицированный протокол, просто это не зафиксировано. Это логично, на второе преступление обычно идут те, кто и с первым справился. Но учёт подобных участков и попытка статистически ещё точнее оценить результат в данной статье не приведена, поскольку даже строгие методы позволяют увидеть победу коммуниста, а статистические оценки хотя и увеличат отрыв коммуниста, менее убедительны ввиду их вероятностного характера.

Как выглядит переписывание протокола и правка его в ГАС
Переписывание протокола обнаруживается по отличию протокола наблюдателя от протокола в ГАС.



А правка видна просто как 2 версии в ГАС с разными цифрами.

Интересно, что процент за кандидата рассчитывается от числа голосовавших в последней версии протокола

Участки со 100% за кандидатов
Также из финальных данных видно, что имеется 8 мелких участков с результатом 100% за Ищенко и 45 со 100% за Тарасенко, 42 из которых корабельные, а 3 — сёла под Уссурийском.

Участки со 100% результатом кандидатов: 122 голоса за коммуниста и 1874 за единоросса. «Игра в одни ворота»

Статистические опасения подтверждаются документы
Абсолютно все участки, подозрительные по статистике (неправдоподобные цифры явки в последние 2 часа), впоследствии оказались документально доказанными; также с помощью документов нашлось несколько дополнительных участков. Ни одного ложно-положительного результата в детектировании фальсификаторов статистическими методами не было. Правда по УИК 2809 документом является не сам протокол, а заявление в полицию об отказе выдать протокол.

Расследование


Меня заинтересовало то, что каждого из указанных выше методов фальсификаций — переписывания протоколов и правки в ГАС — было недостаточно по отдельности для воровства победы. Я задался вопросом — как применялись методы, одновременно или последовательно? Дальнейший текст посвящён подробному исследованию этого вопроса.

Собственно, идея такова — есть набор целочисленных данных (количество голосов за кандидатов на участках) и их промежуточных сумм (данные с инфопанели ЦИК). Это даёт возможность простым комбинаторным перебором всех вариантов выяснить, какие же именно участки были введены или изменены в какой момент. Например, введён 1 протокол, число голосов коммуниста увеличилось на X, число голосов единоросса — на Y. Перебираем все протоколы и ищем, где же у нас 1 протокол с X за коммуниста, а Y за единоросса. Конечно же, простого перебора по финальным цифрам протоколов не хватит, мы не сможем найти такие 4 протокола, которые бы уменьшили голоса за коммуниста на 5, так что нужно смотреть на все версии протоколов в ГАС, т.к. их редактировали.

Постановка SAT-задачи


У нас есть крайние точки с детальными данными, 4 промежуточные и несколько десятков булевых переменных, которые нужно подобрать под эти условия. Это типичная SAT-задача, о которой Дональд Кнут в одной из лучших монографий прошлого столетия писал:
The SAT problem is evidently a killer app, because it is key to the solution of so many other problems

Стадии ввода протоколов


Сразу оговорюсь, что 13 участков Советского района Владивостока, где выборы позднее были признаны недействительными, мы временно отложим в сторону. Эти участки в подсчёте голосов не участвовали, отображение результатов выборов остановилось на введённых 1537 из 1550 протоколов, их мы и будем рассматривать. Итак, в 4 утра (начальная точка нашего анализа) оставалось ввести 53 участка, и они вводились партиями: вначале 33 протокола, затем 14, 4, 1 и 1 последний. Для удобства придумаем этим контрольным точкам имена. Этими же именами можно называть и стадии, после контрольных точек: silence (33 протокола до 4 утра), prepare (14), fantastic(4), kill(1) и final(1).



Граничные условия: известно, что в точках 95.74% и 99.16% все версии протоколов первые и последние соответственно. Известно, что из 19 изменённых протоколов 16 уже были добавлены в ГАС до точки 95.74% (old), а 3 были добавлены во время последних изменений (new). Также известны суммы голосов в промежуточных точках. Данные на точку с процентом обработки, например, 95.74% будем обозначать r9574.

Распределим все протоколы, которые или вносили, или изменяли на последнем этапе, на 3 массива: old, new и common. 19 отредактированных в ГАС протоколов — это 16 old (это те, которые были добавлены до скрытой фазе и затем в скрытой фазе редактировали) и 3 new (которые внесли уже после точки 95.74% и в скрытой фазе отредактировали). Для всех 19 нам известно, на сколько смена протокола меняет число голосов за каждого кандидата, обозначим эти известные величины как increase. Число в последнем протоколе назовём last, в первом — first, индекс для числа голосов за коммуниста Ищенко — com, за Тарасенко — er. Остальные 50 добавленных на последнем этапе протоколов составляют массив common.

Булевы переменные


Для версий протокола определим 19 переменных v_%d_%s, где %d — число от 0 до 18, первые 16 для версий старых протоколов, последние 3 — для внесённых и затем изменённых, %s — это стадия, на которой рассматриваем версию, и значение True для первой версии и False для подменённой.

Для наличия протокола в системе определим булевы переменнные a_%d_%s, где %d — число от 0 до 52, первые 3 переменные относятся к протоколам, которые добавили в скрытой фазе в ГАС, и затем поменяли, а остальные 50 — к тем, которые просто добавляли в скрытой фазе, а в ГАС не меняли (впрочем, среди них 14 переписанных комиссиями протоколов). Эти переменные имеют значение True, если протокол есть в системе на заданной стадии %s, False — если ещё нет.


Схема пересечения списков отредактированных в скрытой фазе и внесённых

Решение SAT-задачи


Поскольку на последних стадиях количество добавленных протоколов невелико, SAT-задачу удобно решать с конца — от финального состояния к начальному. Например, для самой последней стадии SAT-условие для промежуточной точки 99.10% будет следующим:

$r_{9916}^{com} = r_{9910}^{com} + \Sigma_{i = 0}^{18}(v^{kill}_i ? increase_i^{com} : 0) + \Sigma_{i = 0}^{52}(a^{kill}_i ? 0 : first_i^{com}) $


$r_{9916}^{er} = r_{9910}^{er} + \Sigma_{i = 0}^{18}(v^{kill}_i ? increase_i^{er} : 0) + \Sigma_{i = 0}^{52}(a^{kill}_i ? 0 : first_i^{er}) $



Условие, что поменялся лишь 1 протокол за стадию — это условие, что на момент final число False версий = 1.

$\Sigma_{i = 0}^{52}(a^{final}_i ? 0 : 1) = 1 $



Также задаём условие, что протокол нельзя «родить обратно», то есть сделать введённый на какой-то стадии протокол в следующей стадии невведённым, и условие, что если ввели вторую версию протокола, её аналогично нельзя просто удалить, оставив первую. Именно затем и сделаны в ГАС версии, чтобы ошибочные данные можно было задокументированно менять, а не удалять.

$ \forall i \in [0; 53) a^{final}_i \geq a^{kill}_i $


$ \forall j \in [0; 19) v^{final}_j \leq v^{kill}_j $



Переводим математическую запись в код python для работы с z3, получается что-то вроде:

Часть кода на python
# constraints on communist's or zhulik's votes
def findVariants(s, aim, cnt, suffix):
    s.add((r9916['com'] - aim['com'] == \
      Sum([If(Bool('v_%d_%s' % (i, suffix)), rewritten_pecs[i]['increase']['com'], 0) for i in range(19)]) + \
      Sum([If(Bool('a_%d_%s' % (k, suffix)), 0, approved_pecs[k]['first']['com']) for k in range(53)])))

    s.add((r9916['er'] - aim['er'] == \
      Sum([If(Bool('v_%d_%s' % (i, suffix)), rewritten_pecs[i]['increase']['er'], 0) for i in range(19)]) + \
      Sum([If(Bool('a_%d_%s' % (k, suffix)), 0, approved_pecs[k]['first']['er']) for k in range(53)])))


Решение задачи


Решаем задачу с конца, по-стадийно, вначале находя решение для final, затем для kill, затем для fantastic, затем для prepare. Если в какой-то из более ранних стадий решение не будет найдено, значит вся найденная ранее ветка решения для последующих стадий будет отменена. Впрочем, такого не случилось. Весь python-код в виде Colab-ноутбука с расчётом последних трёх стадий.

Последний протокол, стадия final


Запускаем в Colab первый подсчёт:

 final  get_models final max=10
 final 1. solution found:
 final  enabled: 648 with 0 of fake paper
 final  changed:  delta increased by 0 (0 protocols)

Решение SAT-задачи существует только одно, и оно гласит, что ни один протокол в ГАС не был изменён, а был добавлен протокол участка 648. Обычный честный участок, прямо как подлинная купюра на пачке из фальшивых.

Предпоследний протокол, стадия kill


У SAT-задачи находится 4 решения.

Вывод скрипта
 final  get_models final max=10
 final 1. solution found:
 final  enabled: 648 with 0 of fake paper
 final  changed:  delta increased by 0(0 protocols)
 final  --- dive deeper to kill  --- at 2019-03-13 13:56:40.543990
   kill  get_models kill max=10
   kill 1. solution found:
   kill  enabled: P2829 with 1 of fake paper
   kill  changed: 303, 304, 318, 328, 2812, 2826 delta increased by 3751(6 protocols)
   kill 2. solution found:
   kill  enabled: P2829 with 1 of fake paper
   kill  changed: 303, 304, 318, 328, 347, 354, 2812 delta increased by 3751(7 protocols)
   kill 3. solution found:
   kill  enabled: P2829 with 1 of fake paper
   kill  changed: 304, 318, 328, 347, 2812, 2826 delta increased by 3751(6 protocols)
   kill 4. solution found:
   kill  enabled: P2829 with 1 of fake paper
   kill  changed: 304, 318, 328, 354, 2812, 2826 delta increased by 3751(6 protocols)
   kill  end kill at 2019-03-13 13:56:42.284371
 final  end final at 2019-03-13 13:56:42.415697


Общее у всех решений то, что был добавлен протокол участка 2829, причём отличающийся от бумажной версии: у коммуниста на 291 голосов меньше, у единоросса на 1184 больше, то есть единороссу было добавлено 1475 голосов преимущества. Кроме того, в ГАС изменены минимум 6 протоколов. Заведомо изменены участки 304, 318, 328, 2812 плюс 4 варианта комбинаций из 2 или 3 участков: (347, 2826) | (303, 2826) | (354, 2826) | 303, 347, 354).

Изменения в ГАС добавили кандидату Тарасенко 3751 голосов преимущества, таким образом двумя видами фальсификаций при добавлении предпоследнего протокола единороссу подарили 5226 голосов перевеса. Согласитесь, это объяснение куда понятнее и прозрачнее, чем слова … и стал недосягаем после обработки 99.10% протоколов. Интересно, что именно во время ввода этого протокола наблюдалась самая большая производная у процента за Тарасенко. Это естественно, ведь в его пользу перерисовали в 7 раз больше, чем ввели.

Решающая четвёрка протоколов, стадия fantastic four


Во время ввода 4 протоколов на стадии fantastic four поменялся лидер голосования, поэтому было особенно любопытно посмотреть на внутреннюю кухню. Для каждого из четырёх решений предыдущей стадии находим решение SAT-задачи таким же комбинаторным поиском. Перебором примерно 7 миллиардов комбинаций находим 14 возможных решений (а именно 4+4+2+4 ветвей соответственно для четырёх решений предыдущей стадии).

Длинный вывод скрипта: 14 возможных решений, каждое из 4 решений kill разветвляется
 final  get_models final max=10
 final 1. solution found:
 final  enabled: 648 with 0 of fake paper
 final  changed:  delta increased by 0(0 protocols)
 final  --- dive deeper to kill  --- at 2019-03-13 13:56:42.669368
   kill  get_models kill max=10
   kill 1. solution found:
   kill  enabled: P2829 with 1 of fake paper
   kill  changed: 303, 304, 318, 328, 347, 354, 2812 delta increased by 3751(7 protocols)
   kill  --- dive deeper to fantastic  --- at 2019-03-13 13:56:43.153626
       fantastic  get_models fantastic max=10
       fantastic 1. solution found:
       fantastic  enabled: 2802, P2828, 2840, 2866 with 1 of fake paper
       fantastic  changed: 2801, 2805, 2818, 2820, 2826, 2834, 2844, 2850, 2854, 2856, 2863, 2867 delta increased by 12097(12 protocols)
       fantastic 2. solution found:
       fantastic  enabled: 1912, 1916, P2838, P2847 with 2 of fake paper
       fantastic  changed: 2801, 2820, 2826, 2834, 2844, 2850, 2854, 2856, 2863, 2867 delta increased by 10707(10 protocols)
       fantastic  end fantastic at 2019-03-13 14:47:16.016131
   kill 2. solution found:
   kill  enabled: P2829 with 1 of fake paper
   kill  changed: 304, 318, 328, 347, 2812, 2826 delta increased by 3751(6 protocols)
   kill  --- dive deeper to fantastic  --- at 2019-03-13 14:47:24.146367
       fantastic  get_models fantastic max=10
       fantastic 1. solution found:
       fantastic  enabled: 1917, 1932, 2812, P2819 with 1 of fake paper
       fantastic  changed: 303, 2801, 2805, 2818, 2820, 2834, 2844, 2850, 2854, 2856, 2863, 2867 delta increased by 11597(12 protocols)
       fantastic 2. solution found:
       fantastic  enabled: 2802, P2828, 2840, 2866 with 1 of fake paper
       fantastic  changed: 303, 354, 2801, 2805, 2818, 2820, 2834, 2844, 2850, 2854, 2856, 2863, 2867 delta increased by 12097(13 protocols)
       fantastic 3. solution found:
       fantastic  enabled: 1912, 1916, P2838, P2847 with 2 of fake paper
       fantastic  changed: 303, 354, 2801, 2820, 2834, 2844, 2850, 2854, 2856, 2863, 2867 delta increased by 10707(11 protocols)
       fantastic 4. solution found:
       fantastic  enabled: 1917, 1932, 2812, P2819 with 1 of fake paper
       fantastic  changed: 354, 2801, 2805, 2818, 2820, 2834, 2844, 2850, 2854, 2856, 2863, 2867 delta increased by 11597(12 protocols)
       fantastic  end fantastic at 2019-03-13 16:06:58.112487
   kill 3. solution found:
   kill  enabled: P2829 with 1 of fake paper
   kill  changed: 303, 304, 318, 328, 2812, 2826 delta increased by 3751(6 protocols)
   kill  --- dive deeper to fantastic  --- at 2019-03-13 16:06:59.007196
       fantastic  get_models fantastic max=10
       fantastic 1. solution found:
       fantastic  enabled: 1912, 1916, P2838, P2847 with 2 of fake paper
       fantastic  changed: 347, 354, 2801, 2820, 2834, 2844, 2850, 2854, 2856, 2863, 2867 delta increased by 10707(11 protocols)
       fantastic 2. solution found:
       fantastic  enabled: 1917, 1932, 2812, P2819 with 1 of fake paper
       fantastic  changed: 354, 2801, 2805, 2818, 2820, 2834, 2844, 2850, 2854, 2856, 2863, 2867 delta increased by 11597(12 protocols)
       fantastic 3. solution found:
       fantastic  enabled: 1917, 1932, 2812, P2819 with 1 of fake paper
       fantastic  changed: 347, 2801, 2805, 2818, 2820, 2834, 2844, 2850, 2854, 2856, 2863, 2867 delta increased by 11597(12 protocols)
       fantastic 4. solution found:
       fantastic  enabled: 2802, P2828, 2840, 2866 with 1 of fake paper
       fantastic  changed: 347, 354, 2801, 2805, 2818, 2820, 2834, 2844, 2850, 2854, 2856, 2863, 2867 delta increased by 12097(13 protocols)
       fantastic  end fantastic at 2019-03-13 16:55:17.161744
   kill 4. solution found:
   kill  enabled: P2829 with 1 of fake paper
   kill  changed: 304, 318, 328, 354, 2812, 2826 delta increased by 3751(6 protocols)
   kill  --- dive deeper to fantastic  --- at 2019-03-13 16:55:18.475100
       fantastic  get_models fantastic max=10
       fantastic 1. solution found:
       fantastic  enabled: 1917, 1932, 2812, P2819 with 1 of fake paper
       fantastic  changed: 303, 2801, 2805, 2818, 2820, 2834, 2844, 2850, 2854, 2856, 2863, 2867 delta increased by 11597(12 protocols)
       fantastic 2. solution found:
       fantastic  enabled: 1912, 1916, P2838, P2847 with 2 of fake paper
       fantastic  changed: 303, 347, 2801, 2820, 2834, 2844, 2850, 2854, 2856, 2863, 2867 delta increased by 10707(11 protocols)
       fantastic 3. solution found:
       fantastic  enabled: 1917, 1932, 2812, P2819 with 1 of fake paper
       fantastic  changed: 347, 2801, 2805, 2818, 2820, 2834, 2844, 2850, 2854, 2856, 2863, 2867 delta increased by 11597(12 protocols)
       fantastic 4. solution found:
       fantastic  enabled: 2802, P2828, 2840, 2866 with 1 of fake paper
       fantastic  changed: 303, 347, 2801, 2805, 2818, 2820, 2834, 2844, 2850, 2854, 2856, 2863, 2867 delta increased by 12097(13 protocols)
       fantastic  end fantastic at 2019-03-13 17:58:13.976612
   kill  end kill at 2019-03-13 17:58:17.370820
 final  end final at 2019-03-13 17:58:17.511852
Changed before fantastic stage 0 []
Enabled before fantastic stage 39 ['2856', '2863', '201', '202', '204', '205', '206', '207', '208', '209', '211', '212', '213', '214', '216', '217', '218', '219', '220', '221', '222', 'P1904', 'P1915', '1918', '1919', 'P1923', 'P1944', '1947', '1961', 'P1966', 'P1968', '2809', '2813', '2823', 'P2846', '2849', 'P2858', '2859', 'P2862']


Решения можно представить следующим образом:

Добавлены протоколы участков: (1917, 1932, 2812, P2819) или (2802, P2828, 2840, 2866) или (1912, 1916, P2838, P2847), то есть 1 или 2 протокола добавлены с переписыванием данных.
Изменены протоколы участков: 2801, 2820, 2834, 2844, 2850, 2854, 2856, 2863, 2867 и ещё 14 вариантов комбинаций из остальных 1-4 изменённых. Изменено минимум 10 протоколов в ГАС (а именно от 10 до 13). Если просуммировать последние 3 стадии, выходит, что за время ввода последних 6 протоколов было отредактировано в ГАС от 17 до 19 протоколов (из 19 всего), а из введённых за эти 3 стадии 6 протокола переписанными были всего 2 или 3 (из общего числа в 18 переписанных).

Первые 47 протоколов, стадии silence и prepare


Для последней стадии решения важно не найти все решения, а установить наличие хотя бы одного, чтобы подтвердить дальнейшую ветку вариантов, или же доказать отсутствие (перебрав все), чтобы отсечь последующую ветку.

Подобрать 14 протоколов из оставшихся 47 для каждого из 14 решений стадии fantastic довольно трудоёмко. Это требует перебора ~11 триллионов комбинаций, то есть на 3 порядка сложнее, чем предыдущая стадия. Если 3 стадии считаются 4 часа на одном ядре, то это уже займёт почти 2 месяца на моих 4 ядрах. Я через multiprocessing.Pool запустил выполнение с ограничением поиском лишь 1 решения, и для всех 14 из 14 решений стадии fantastic было показано существование как минимум 1 дальнейшего решения для prepare, то есть все найденные ранее ветки решения задачи подтвердились. Определение решения в точке prepare автоматически решает всю задачу, так как состояние в точке silence известно, и если из 47 участков выбрать 14, это автоматом определяет и остальные 33 участка, внесённые в стадии silence. Множество всех вариантов решений, как именно вводились первые 47 протоколов, искать не требуется, достаточно посмотреть общие части всех решений.

Как всё было


Даже не зная точно, какой из вычисленных возможных вариантов ввода протоколов имел место в реальности, мы однако, можем точно определить границы, в которых реальность лежит. Просто смотрим конъюнкцию всех решений — получаем однозначную часть. Смотрим на оставшееся — получаем границы.



Результаты анализа


1. Два разных метода фальсификаций — последовательны


Просматривая спектр решений, мы можем сделать вывод — в скрытой фазе во время ввода первых 47 протоколов было изменено в ГАС от 0 до 2 протоколов и введено переписанных 11 или 12 (т.к. переписанных во время final+kill+fantastic введено 2 или 3, а всего введено 16). Таким образом, до 07:03 утра (98.77% введённых) было введено большинство из переписанных протоколов (13-14 из 16), а после, на последних 6 протоколах, было сделано большинство из правок в ГАС (17-19 из 19).


Распределение двух типов фальсификации по стадиям ввода

Ответ на главный вопрос исследования получен — методы фальсификаций применяли последовательно, а не параллельно. И логика подсказывает, что править протоколы в ГАС начали именно потому, что одного переписывания просто не хватило, чтобы сменить лидера.

2. Восстановим неискажённый результат хода обработки протоколов


Поскольку для трёх последних точек мы точно знаем, что происходило, достаточно просто сложить соответствующие первичные данные по найденным выше участкам, и мы точно узнаем данные, какие были бы промежуточные и итоговые результаты, если бы не было упомянутых двух типов фальсификаций. 13 аннулированных участков Владивостока поместим в конец, чтобы можно было сравнивать отклонение реальных кривых от официальных на участке до отметки 99.16% (к тому же их действительно утверждали последними).


Сравнение официального ввода протоколов и реального, сделано в plot.ly

На последних этапах решения найдены однозначные, так что последние 3 точки на графике определены точно. У четвёртой точки (этап fantastic) 3 варианта решения, у коммуниста разброс цифр от 51.22% и до 51.28%, то есть разброс возможностей даже меньше размеров точки. Пятую точку я взял для примера из одного из вероятных решений, она совершенно не ключевая, поэтому для иллюстрации подойдёт.

Подробности расчета и дополнительные замечания


Объём перебора


Простой расчёт, сколько перебирается комбинаций
19 УИКов в ГАС имеют по 2 версии протокола, значит чтобы подобрать, скажем, последний введённый, потребовалось перебрать 53*2^19 комбинаций, то есть 28 млн. Этот протокол оказался обычным (не переписанным), значит, чтобы выяснить введённый предпоследним, потребовался перебор 52*2^19 комбинаций, то есть 27млн. Для подбора предшествующей предпоследнему четвёрки введённых протоколов потребовался перебор числа комбинаций, рассчитываемого по формуле

$C^{4}_{51} \cdot (2^{12} + 2^{13} + 2^{13} + 2^{13}) = C^{4}_{51} \cdot 2^{12} \cdot 7 = \frac{51! \cdot 2^{12}}{4! (51-4)!} \cdot 7 \approx 7 \space миллиардов $



Последний шаг перебора — это выборка 14 протоколов из оставшихся 47; часть из этих 14 вариантов содержала также перебор версий протоколов. Легко подсчитать, что для полного решения требуется перебрать порядка 11 триллионов комбинаций:

$C^{14}_{47} \cdot 32 = \frac{47!}{14! (47-14)!} \cdot 32 \approx 11 \space триллионов$



Участки Арсеньева


Учитывая, что представитель ЦИК Шевченко заявлял, что смена лидера голосования была обусловлена вводом протоколов из далёкого Арсеньева, интересно отметить, что ни одного из 19 участков Арсеньева, вводимых в последние часы, нет в числе финальной шестёрки. То есть вводились они на первых скрытых этапах, в числе 47 участков. Более того — на каждом из этих 19 участков победил коммунист, так что результаты из Арсеньева никак не могли привести к смене лидера. В общем, это были слова для телезрителей.

Фальсифицированная отмена выборов на 13 участков Владивостока


На самом деле данные всех 13 участков Советского района были введены в ГАС Выборы уже в 04:30 утра, что подтверждается протоколом ввода данных. Также есть видеосъёмка из ТИК, где данные этих участков уже внесены в сводную таблицу на стене, и кандидат Ищенко ругается по телефону с председателем, что тот не утверждает данные. Затем появляется МЧС. Затем протокол повторного ввода. Тут всё просто, достаточно аристотелевой логики. До 4:30 утра все 13 ввели (например, 813), но не поменяли статус на «одобрено». Затем через день ввели для них второй протокол, пустой, и тогда сразу у всех 13 одобрили статус, выгрузив тем самым в паблик пустой протокол.

Кто прикрывал


Официально объявлено и ЦИК, и Крайизбиркомом, что причина отмены выборов — невозможность установить волю избирателей на 13 участках Советского района Владивостока, хотя эта воля известна и даже внесена в ГАС Выборы. За несколько часов до отмены выборов с сайта ЦИК была перекрыта возможность просматривать первичные данные (по специальным ссылкам) в том числе по этим 13 участкам (ссылки выдают ошибку 404). По закону ГАС относится именно к ЦИК и ФЦИ при нём, вероятно, именно ЦИК и прикрыла доступ.

Главные выводы


  1. По результатам исследования можно предположить, что в системе ГАС Выборы у протокола существует минимум 3 состояния. Это первичный ввод (публично не отображается нигде, так себя вели 13 участков Владивостока сразу после их ввода в ГАС), одобренный ввод (отображается как суммарные данные в трансляции ЦИК), и есть финальное одобрение, после которого протокол отображается на сайте izbirkom.ru.
  2. Во время ввода 4 ключевых протоколов, поменявших лидера, в системе ГАС Выборы было изменены данные участков : 2801, 2820, 2834, 2844, 2850, 2854, 2856, 2863, 2867 и ещё 1-4 уже введённых протоколов, а из 4 введённых 1 или 2 были переписанными. Переписыванием кандидату от коммунистов убавили больше голосов, чем добавили вводом 4 протоколов, поэтому на этой стадии количество голосов Ищенко уменьшилось на 5 голосов (что вызвало резкий отклик общественности).
  3. Предпоследним был введён УИК 2829 с переписыванием протокола в пользу единоросса.
  4. Одновременно с вводом этого предпоследнего протокола были изменены 6 или 7 ранее введённых в ГАС протоколов, а именно протоколы участков 304, 318, 328, 2812 и ещё 2 или 3 других.
  5. Последним одобренным участком стал УИК 648. Обычный участок с непереписанным протоколом.
  6. На момент ввода в систему 98.77% протоколов (т.е. всех, кроме 6 последних) было введено минимум 15 переписанных протоколов из 18 и не более 2 протоколов были изменены в ГАС.
  7. Во время ввода в ГАС последних 6 протоколов было изменено не менее 17 протоколов, то есть до этого использовали преимущественно переписывание, а после — преимущественно изменение уже введённых. Переписывания протоколов не хватило, чтобы сменить победителя, поэтому начали править в ГАС.
  8. В действительности на выборах победил коммунист с задокументированным результатом 51% против 46%

Прочие выводы

Прочие выводы


  1. Отмена выборов была тоже сфальсифицирована (инновация).
  2. Детальные данные на сайте ЦИК не обновлялись потому, что в момент ввода последних 53 (3.5%) протоколов избиркомы пытались скрыть от посторонних глаз свои преступные действия.

Кто именно это всё делал — установит суд, список участвующих комиссий уже давно определён, от множества врачей-учителей до Памфиловой, список подсудимых составить будет легко, нужно просто взять составы 54 комиссий (48 УИК, 4 ТИК, 1 КИК, 1 ЦИК) и вычеркнуть имена невиновных. Но это уже тема не для хабра.

Спасибо математике


То, что в России выборы подделывают массово, и это легко видеть с помощью простейшей математики, с которой справится даже школьник, уже давно не новость. Фальсификаторы при этом отлично умеют делать «многоходовочки», когда преступление реализуется в 2-3 шага, это делает неочевидным понимание для простых людей, что выборы подделаны.

Фальсификации легко видны образованным людям, потому что у преступников проблемы со знаниями математики и с координацией действий их армии, так что они постоянно совершают глупые ошибки, которые приоткрывают окно в этот удивительный преступный мир, рождая потоки открытых данных, которые затем интересно исследовать учёным и простым исследователям :) Например, предыдущая моя статья тоже касалась открытых данных с выборов.

Источники данных, пруфлинки на данные
Скриншоты промежуточных данных kireev.livejournal.com
Обработано 97.87% было в 04:10 newdaynews.ru
Обработано 98.77% было в 07:03 твиттер
Обработано 99.03% было в 07:07 твиттер
Обработано 99.10% было в 07:14 Meduza, у The Insider — время 07:20.
Обработано 99.16% было в 12:05 Ведомости, было ли ранее 12:05 объявлено об обработке 99.16%, мне неизвестно.
Канал Шпилькина — @RuElectionData, он начал сохранять данных с сайта ЦИК уже после того, как всё было определено, но до того, как 53 участка были выгружены, именно это помогло распутать клубок, за что большое спасибо.
Первая версия протоколов по УИКам 2801 2805 2812 2818 2820 2834 2844 2850 2863 2867 есть здесь.
По УИКам 318 328 1915 1923 1926 1944 1966 2801 2805 2812 2818 2819 2820 2826 2828 2829 2834 2838 2844 2845 2846 2847 2850 2858 2862 2863 2867 протоколы — на сайте Голоса.
Ещё источник уссурийских — тут

P.S. Понятно, что было ещё много незадокументированных случаев подделки результатов в пользу административного кандидата, например, УИК 3801 с 540 голосами за единоросса и 0 за коммуниста, или участки 2809, 2823, но прелесть ситуации в том, что всё ясно даже из задокументированных, открытых данных.
P.P.S. Огромное спасибо С. Шпилькину за собственно данные и за помощь в том, чтобы сделать этот текст понятнее читателю.

Минутка заботы от НЛО


Этот материал мог вызвать противоречивые чувства, поэтому перед написанием комментария освежите в памяти кое-что важное:

Как написать комментарий и выжить
  • Не пишите оскорбительных комментариев, не переходите на личности.
  • Воздержитесь от нецензурной лексики и токсичного поведения (даже в завуалированной форме).
  • Для сообщения о комментариях, нарушающих правила сайта, используйте кнопку «Пожаловаться» (если доступна) или форму обратной связи.

Что делать, если: минусуют карму | заблокировали аккаунт

Кодекс авторов Хабра и хабраэтикет
Полная версия правил сайта