Небольшое расхождение

http://bit-player.org/2011/a-slight-discrepancy
  • Перевод


На этом снимке запечатлена сетчатая столешница стола в патио, сфотографированная после сильного дождя. В некоторых отверстиях сетки задержались капли воды. Что можно сказать о распределении этих капель? Разбросаны ли они случайно по поверхности? Процесс падения дождя, расположивший их, кажется достаточно случайным, но на мой взгляд, паттерн занятых в сетке мест выглядит подозрительно ровным и однообразным.

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

positions of 394 raindrops on a tabletop


Повторю вопрос: выглядит ли этот паттерн как результат случайного процесса?

Я пришёл к этому вопросу после написания статьи для American Scientist, в которой изучаются два варианта симулируемой случайности: псевдо и квази. Псевдослучайность в представлении не нуждается. Псевдослучайный алгоритм выбора точек в квадрате стремится гарантировать, что все точки имеют одинаковую вероятность выбора, и что все выборы независимы друг от друга. Вот массив из 394 псевдослучайных точек, ограниченных принадлежностью скошенной и повёрнутой сетке, похожей на сетчатую столешницу:

394 pseudorandom dots on a skewed 60-by-60 grid


Квазислучайность — это менее известная концепция. При выборе квазислучайных точек целью является не равновероятность или независимость, а равномерность распределения: как можно более равномерный разброс точек по поверхности квадрата. Однако не слишком очевидно, как достичь этой цели. Для 394 показанных ниже квазислучайных точек координаты x образуют простую арифметическую прогрессию, но координаты y изменены процессом перемешивания цифр. (Соответствующий алгоритм изобретён в 1930-х голландским математиком Йоханнесом ван дер Корпутом, работавшим над одномерными рядами, и в 1950-х был перенесён в два измерения Клаусом Фридрихом Ротом. Подробнее см. в моей статье для American Scientist на странице 286 или в потрясающей книге Иржи Матусека.)

394 dots scattered over a square by the Vandercorput algorithm


Какое из этих множеств точек, псевдо или квази, лучше соответствует каплям дождя? Мы можем сравнить все три паттерна в уменьшенном виде:

pseudorandom, quasirandom and raindrop patterns


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

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

В концепции расхождения есть множество вариаций, но я хочу рассмотреть только одну схему измерения. Идея заключается в наложении на паттерн прямоугольников различной формы и размеров, стороны которых параллельны осям x и y. Вот три примера прямоугольников, наложенных на паттерн капель:

raindrop pattern with three axis-parallel rectangles


Теперь посчитаем количество точек, заключённых в каждый прямоугольник, и сравним их с числом точек, которые должны быть заключены в него при соответствующей площади, если бы распределение точек было идеально равномерным по всему квадрату. Абсолютное значение разности является расхождением $D(R)$, связанным с прямоугольником $R$:

$D\left ( R \right )=\left | N\cdot area(R)-\# \left ( P\cap R \right ) \right |$


где $N$ — общее количество точек, а $\# \left ( P\cap R \right )$ — количество точек $P$ в прямоугольнике $R$. Например, прямоугольник в левом верхнем углу закрывает 10 процентов площади квадрата, то есть его «справедливая» доля точек должна быть 0,1 × 394 = 39,4 точек. На самом деле в прямоугольнике содержится всего 37 точек, то есть связанное с прямоугольником расхождение равно |39,4 — 37| = 2,4. Плотность точек в прямоугольнике может быть больше или меньше общего среднего; в обоих случаях абсолютное значение будет давать нам положительное расхождение.

Для паттерна в целом мы можем задать общее расхождение D как наихудшее значение его изменения, или, другими словами, максимальное расхождение, взятое для всех возможных прямоугольников, наложенных на квадрат. Ван дер Корпут задавался вопросом, могут ли множества точек быть созданы с произвольно низким расхождением, так что при $N$, стремящемся к бесконечности, $D$ всегда была ниже какой-то фиксированной границы. Ответом будет «нет», по крайней мере, в одном и двух измерениях; минимальная скорость роста равна $O\left ( \log N \right )$. Псевдослучайные паттерны в общем случае имеют более высокое расхождение $O\left ( \sqrt{N} \right )$.

Как найти прямоугольник с максимальным расхождением для заданного множества точек? Когда я впервые прочитал определение расхождения, я подумал, что вычислить его точно будет невозможно, потому что существует бесконечное множество рассматриваемых прямоугольников. Но поразмышляв, я осознал, что существует только конечное множество прямоугольников-кандидатов, имеющих возможность максимизировать расхождение. Это прямоугольники, в которых каждая из четырёх сторон проходит хотя бы через одну точку. (Исключение: прямоугольники-кандидаты также могут иметь стороны, лежащие на границах квадрата.)

Допустим, мы встретили следующий прямоугольник:

reactangle with three sides anchored by points


Левая, верхняя и нижняя стороны проходят через точку,, но правая сторона лежит в «пустом пространстве». Такая конфигурация не может быть прямоугольником с максимальным расхождением. Мы можем сдвигать правое ребро влево, пока оно не пересечётся с точкой:

ractangle reshaped to maximize density of points


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

rectangle stretched to maximize area


Теперь мы увеличили площадь, снова не изменив количество заключённых в неё точек, а значит, снизили плотность. Как минимум одно из этих действий увеличит $D(R)$, по сравнению с исходной конфигурацией. Следовательно, каждый прямоугольник, все четыре стороны которого касаются точек или рёбер квадрата, является локальным максимумом функции расхождения; перечислив все прямоугольники в этом конечном множестве, мы можем найти глобальный максимум.

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

Рассматривая только экстремумы функции расхождения, мы делаем задачу подсчёта конечной — но всё не так просто! Сколько прямоугольников нужно рассматривать в квадрате с $N$ точками (у каждой из которых есть собственные отличающиеся координаты $x$ и $y$)? Это оказывается очень интересной небольшой задачей с простым комбинаторным решением. Я не буду объяснять здесь ответ, но если вы не считаете, что можете справиться сами, то можете посмотреть его в OEIS или прочитать короткую статью Бенджамина, Квинна и Вуртца. Что я могу сказать, так это то, что для N = 394 количество прямоугольников равно 6 055 174 225 — или два раза больше, если отдельно учитывать открытые и замкнутые прямоугольники. Для каждого прямоугольника необходимо выяснить, какое количество из 394 точек находится внутри, и сколько снаружи. Довольно большая работа.

Один из способов снизить вычислительные затраты — вернуться к более простому измерению расхождения. В разной литературе по квазислучайным паттернам в двух и более измерениях используется качество, называемое «расхождением-звезда» (star discrepancy), или D*. Идея заключается в том, чтобы рассматривать только прямоугольники, «прикреплённые» к левому нижнему углу квадрата (который удачно совпадает с точкой начала координат плоскости xy). В этом случае количество прямоугольников равно всего $N^{2}$, или около 150 000 для N = 394.

Вот прямоугольник, определяющий глобальное расхождение-звезда паттерна дождевых капель:

maximal star-discrepancy rectangle for the raindrop pattern


Тёмно-зелёный прямоугольник внизу закрывает примерно 55 процентов квадрата и должен содержать при совершенно равномерном распределении 216,9 точек. На самом деле в него входит (считая, что это «замкнутый» прямоугольник) 238 точек, то есть расхождение равно 21,1. Ни один другой прямоугольник, привязанный к углу (0,0), не будет иметь большего расхождения. (Примечание: из-за ограничений графического разрешения кажется, что прямоугольник D* растянут до границ квадрата, на самом деле правое ребро лежит на x = 0,999395.)

Что говорит нам этот результат о природе паттерна капель дождя? Ну, для начала, расхождение довольно близко к $\sqrt {N}$ (что равно 19,8 при N = 394) и не особо близко к $\log N$ (что равно 6,0 для натуральных логарифмов). То есть мы не находим подтверждения того, что паттерн капель более квазислучайный, чем псевдослучайный. Значения D* для других показанных выше паттернов находятся в ожидаемом интервале: 25,9 для псевдослучайного и 4,4 для квазислучайного. В противоположность внешнему впечатлению, распределение капель дождя, похоже, имеет больше общего с псевдослучайным множеством точек, чем с квазислучайным — по крайней мере, по критерию D*.

А как насчёт вычисления неограниченного расхождения D, то есть изучения всех прямоугольников, а не только закреплённых прямоугольников D*? Поразмыслив, можно прийти к выводу, что всеобъемлющее перечисление прямоугольников не сможет в этом случае изменить основной вывод; D никогда не может быть меньше D*, и поэтому мы не можем надеяться приблизиться от $\sqrt {N}$ к $\log N$. Но мне всё равно были интересны вычисления. Какой из всех этих шести миллиардов прямоугольников будет иметь наибольшее расхождение? Возможно ли ответить на этот вопрос без героических подвигов?

Очевидный и простой алгоритм для D генерирует по очереди все прямоугольники-кандидаты, измеряет их площадь, считает точки внутри и отслеживает предельные расхождения, обнаруженные в процессе. Я выяснил, что программа, реализующая этот алгоритм, может определить точное расхождение 100 псевдослучайных или квазислучайных точек за несколько минут. Этот результат может мотивировать нас взять большие значения N; однако время выполнения почти удваивается каждый раз, когда N увеличивается на 10, и это намекает нам, что для N = 394 вычисления займут пару веков.

Я потратил несколько дней на попытки ускорить вычисления. БОльшая часть времени выполнения тратится на процедуру, считающую точки в каждом прямоугольнике. Определение того, находится ли заданная точка внутри, снаружи или на границе, занимает восемь арифметических сравнений; то есть при N = 394 выполняется более 3 000 для каждого из шести миллиардов прямоугольников. Наиболее эффективным обнаруженным мной способом экономии времени стало предварительное вычисление всех сравнений. Для каждой точки, которая может стать нижним левым углом прямоугольника я предварительно вычисляю список всех точек паттерна, находящихся выше и правее. Для каждого потенциального правого верхнего угла прямоугольника я собираю похожий список точек ниже и левее. Эти списки хранятся в хеш-таблице, индексированной по координатам угла. Для каждого треугольника я могу вычислить количество внутренних точек, просто взяв пересечение множеств двух списков.

Благодаря этому трюку ожидаемое время выполнения при N = 394 снижается с двух веков до примерно двух недель. Эта отличная оптимизация стимулировала меня потратить ещё один день на дальнейшие улучшения. Немного улучшила ситуацию замена хеш-таблицы на массив N × N. А затем я нашёл способ игнорировать все наименьшие треугольники, которые не могут вероятными прямоугольниками с максимальным D, потому что в них содержится слишком мало точек, или они имеют слишком малую площадь. Это улучшение наконец позволило снизить время выполнения до одной ночи. Для вычисления иллюстрации, показывающей прямоугольник с максимальным расхождением D для паттерна дождевых капель, потребовалось шесть часов.

rectangle yielding the largest exact discrepancy for the raindrop pattern


Прямоугольник с max-D очевидно стал небольшим уточнением прямоугольника D* для того же множества точек. Прямоугольник D «должен» содержать 204,3 точек, но на самом деле содержит 229, что даёт нам расхождение D = 24,7. Разумеется, знание того, что точное расхождение равно 24,7, а не 21,1, ничего не говорит нам о природе самого паттерна дождевых капель. На самом деле, мне кажется, что проводя всё больше и больше вычислений, я узнаю о нём всё меньше и меньше.

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

И эта мысль по-прежнему кажется мне очень хорошей. Единственная проблема заключается в том, что она объясняет явление, которого может и не существовать. Я не знаю, раскрыли ли мои вычисления расхождения что-то важное про эти три паттерна, но, по крайней мере, измерениями не удалось доказать, что распределение капель отличается от псевдослучайного. На самом деле, паттерны выглядят разными, но насколько мы можем доверять своим органам восприятия в таких случаях? Если попросить людей нарисовать точки случайным образом, большинство справится с этим плохо, обычно распределение будет оказываться слишком плавным и ровным. Возможно, мозг испытывает подобные же трудности при распознавании случайности.

Тем не менее, я полагаю, что существует какое-нибудь математическое свойство, позволяющее более эффективно разделить эти паттерны. Если кто-нибудь ещё решит потратить своё время на поиски, то координаты xy для трёх множеств точек лежат в текстовом файле.

Дополнение: это просто краткая рекомендация — если вы дочитали досюда, то продолжите чтение комментариев. В них есть много ценного. Я хочу поблагодарить всех тех, кто потратил своё время, чтобы предложить альтернативные объяснения или алгоритмы и чтобы указать на слабые места в моём анализе. Особое спасибо themathsgeek, который через 40 минут после опубликования поста написал гораздо более качественную программу для вычисления расхождений. Также я благодарю Iain, который проверил мои импровизированные рассуждения о восприятии случайных паттернов настоящими экспериментами.
Поделиться публикацией
Комментарии 25
    0
    Какое из этих множеств точек, псевдо или квази, лучше соответствует каплям дождя?
    А где ответ?

    На «глазок» у квази заметен паттерн, образующий некие диагнональные последовательности, что совсем не похоже на исходную картинку. Ссылки на квази-метод тоже нет чтоли?
      0

      Про квази-случайность нашёл такую небольшую заметку. Там и ссылка на википедию есть.
      http://ushastyi.livejournal.com/220856.html


      А также код:
      http://people.sc.fsu.edu/~jburkardt/cpp_src/sobol/sobol.html

        +1
        образующий некие диагнональные последовательности


        Наверное это все-таки про псевдо-случайные точки. Их автор явно ставил в узлы гексагональной сетки (туда куда могли попасть капли), поэтому иногда получаются диагонали когда несколько соседних ячеек заполнено. А вот квази случайные точки похоже генерировали без привязки к гексагональной сетке.
        +5
        Все-таки зря не посмотрели на распределение расстояний. Из физических соображений получается, что малые расстояния менее вероятны, чем большие. Грубо говоря — прилетевшая «рядом» капля имеет шансы сбить каплю, застрявшую в ячейке сетки.
          +3
          Или действительно последний описанный в статье вариант — дождь был очень-очень мелкий и в каплю-ячейку «собрались» мелкие капли из нескольких соседних ячеек, каждой из которых не хватало что, бы заполнить ячейку целиком в одиночку (а где соседей не было — мелкие капельки высохли, исчезли) — т.е. имеет место быть вообще первый шаг некоего подобия игры «Жизнь» после первоначального истинно случайного распределения.
            0
            Тоже примерно так подумал. Рассуждения автора не учитывают время прошедшее с момента как закончился дождь. Было бы интересно понаблюдать камерой за поверхностью такого стола в процессе дождя.
              0
              +1
              А еще учитывать, что капли воды падают, когда меняют температуру. А значит, они обмениваются температурой со стором, что оказывает влияние и на соседние ячейки.
                +3
                Ну тогда еще не учли, что производство сетки — не идеально и одни ячейки более хорошо сохраняют капли чем другие.
          0

          Мне кажется, вас может заинтересовать ключевое слово "hyperuniformity" и научные статьи по этому поводу (особенно некоего Salvatore Torquato из принстона). Вот эта, к примеру (arXiv). Вот эта поновее (arXiv).

            –2
            Истина где-то рядом…
              0
              Как раз сегодня от бессонницы вспоминал историю (или байку) о том что на первых Айподах пользователи жаловались на воспроизведение песен в случайном порядке, реализованное как раз по псевдорандомному алгоритму — людям такой порядок казался не-случайным. Поэтому программисты сделали порядок менее случайным, но более равномерно распределённым — и жалобы пропали.
                0
                когда мы проходили алгоритмы сортировки в универе, я у руководителя по практическим занятиям спросил «а есть алгоритмы которые делают наоборот?», а мне ответили: " а зачем это нужно?"
              0
              1. Практически любое конкретное распределение может быть результатом абсолютно случайного процесса, просто вероятность этого крайне мала.
              2. Случайный процесс может иметь абсолютно разное распределение и не обязательно Нормальное.
              3. Мат. статистика раздел математики, который изучает, является ли «шум» случайным или закономерным процессом.
              4. Для рассуждений о случайности процесса, необходимо пользоваться критериями ( хи-квадрат) и необходимо несколько опытов.
                0
                Тоже кажется понятие квазислучайности как чего-то отличного от псевдослучайности лишней сущностью. Истинная случайность от псевдо отличается источником энтропии (внешний физический процесс, принципиально непредсказуемый изнутри определяемой системы, либо алгоритм), а характристики распределения событий и их зависимости друг от друга — уже перпендикулярные псевдо/непсевдослучайности аспекты. Подозреваю, что автор чего-то перемудрил.

                В его случае есть истинная случайность (дождь), характеристики которой (зависимость событий и распределения) дополнительно корректируются сеткой. Выдумывать для этого новое понятие (квазислучайность) нет совершенно никаких причин.
                  0
                  Истинная случайность от псевдо отличается источником энтропии
                  Энтропия пришла из физики, когда физики-практики проводили эксперименты реальные данные всегда отличались от закономерностей. Чтобы доказать, что процесс действительно случайный, а не ошибки формул, используются характеристики для определения «случайности» энтропии.
                  Поэтому в каждой серии экспериментов должно писаться, данный закон выполняется с вероятностью 99% или 90%, так как в физическом мире не удается избавится от «шумов».

                  P.S. Все это благодаря Центральной Теореме о сходимости распределений.
                    +1
                    Рассуждения автора напоминают, я что-то слышал о случайности и хочу это проверить. В одном прямоугольнике 100 точек, а втором 240. Похоже это случайные числа…
                  +1
                  Судя по рисунку, такую картинку можно получить таким способом — бросаем случайно точки, если выпало расстояние до соседней меньше 1 — вероятность сброса соседней точки — 100%, если до 5 — 50%, если до 7 — 10%. Ну может проценты по другому, но идея так же.
                  На вид отличается от случайной отсутвием близких точек.
                    +5
                    Это результат случайного процесса, только надо более точно смоделировать.



                    код
                    var desk = [];
                    var i, j;
                    
                    for (i = 0; i < 60; i++) {
                      desk[i] = [];
                      for (j = 0; j < 60; j++) {
                        desk[i][j] = ' ';
                      }
                    }
                    
                    for (i = 0; i < 1000; i++) {
                        var x = 1 + parseInt(Math.random() * (desk.length - 2));
                        var y = 1 + parseInt(Math.random() * (desk[x].length - 2));
                        var is_retained = (Math.random() > 1/4);
                        
                        desk[x][y] = (is_retained ? '*' : ' ');
                    
                        if (desk[x-1][y] == '*' || desk[x][y-1] == '*' ||
                            desk[x+1][y] == '*' || desk[x][y+1] == '*'
                        ) {
                            var is_inflow = (Math.random() > 1/2);
                            if (is_inflow) {
                                desk[x-1][y] = desk[x][y-1] = desk[x+1][y] = desk[x][y+1] = ' ';
                            } else {
                                desk[x][y] = ' ';
                            }
                        }
                    }
                    
                    var lines = [];
                    for (i = 0; i < desk.length; i++) {
                      var s = '';
                      lines.push(desk[i].join(' '));
                    }
                    document.body.innerHTML =
                        '<pre style="font-size: 8px; font-weight: bold; margin: 0">' +
                        lines.join('\n') +
                        '</pre>';
                    void(0);
                    

                      0
                      Что за гнусная манера молча гадить в карму, господа? Я кого-то унизил? Оскорбил? Сделал едкое замечание? Развел троллинг? Обесценил работу автора?
                      Захожу на Хабр. Вижу интересный заголовок: «Небольшое расхождение». Решаю прочитать. В первом же абзаце автор интригует:
                      Что можно сказать о распределении этих капель? Разбросаны ли они случайно по поверхности?

                      Читаю до самого конца. В конце статьи в качестве итога два абзаца размышлений. То ли капли выпали из решетки, то ли мозг нас обманывает, то ли просто несовершенный алгоритм.

                      Пишу «Истина где-то рядом» и ловлю два минуса. Ээй! У нас тут филиал Science? Тогда почему никто не критикует автора, что он не попытался воспроизвести эффект в лабораторных условиях, с водой разной мягкости, или не использовал метод наблюдения для получения более качественных исходных данных?
                      Автор ищет паттерн по одной фотографии, которая не отражает ни характеристик материала сетки, ни наклона поверхности, ни направления и силы ветра во время и после дождя, ни точную форму отверстий и их грани, которые могут влиять на перетекание воды. Автор упоминает о погрешностях в паттерне из-за силы гравитации и поверхностного натяжения воды. Однако, он не стал получать выборку данных и искать паттерн по ней, а сразу взялся за матан.
                      Он сделал эту работу, потому что ему интересно и он получает от этого удовольствие. Но работа алгоритма некорректна из-за скудных исходных данных без учета других факторов. Поэтому он и не нашел ответа.
                      Еще можно искать паттерн распределения звезд на небе по фотографии на телефон. Без учета тысяч различных факторов, искажающих картину. Но никто не обратил на это внимания.
                      Чем же в данной ситуации плох мой коммент «истина где-то рядом?». Объясните, пожалуйста.

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

                        Т.е. тут важен момент, когда мы посмотрим на столешницу и сфотографируем ее.
                          0
                          Перекликается с физикой идеального газа. Если в некотором объеме N частиц в среднем, то среднекватратичное отклонение равно корень из N.

                          По моему тут разбор есть: «Ландау Л.Д., Лифшиц Е.М. Теоретическая физика. Том V – М. 1976 – 584 с. „
                            0
                            Похоже на результат работы Floyd–Steinberg dithering на размытом псевдослучайном фоне, кстати.

                            image

                            Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                            Самое читаемое