# 4. Компьютерные системы и сети 2021
## Плотность и кумулятивная функция вероятности совместного распределения для дискретного канала
Плотность совместного распределения дискретных случайных величин $X$ и $Y$ (в нашем случае - входные и выходные символы канала):
$$
p_{x,y} = P(X=x, Y=y)
$$
Кумулятивная функция вероятности совместного распределения:
$$
P_{x,y} = P(X \le x, Y \le y)
$$
Примем (без ограничения общности), что для дискретного канала $x,y \in \bf N$, где $\bf N$ - множество натуральных чисел, и что размеры алафитов $x$ и $y$ равны $n$. Тогда $p_{x,y}$ и $P_{x,y}$ - это матрицы размером $n\times n$
Уважаемые коллеги - ответьте, пожалуйста (с именем и фамилией), на вопросы -
1. Как из матрицы $p_{x,y}$ получить матрицу $P_{x,y}$ ?
2. Как из матрицы $P_{x,y}$ получить матрицу $p_{x,y}$ ?
### Формула условной вероятности
$$
p(x,y) = p(y|x) p(x) = p(x|y) p(y)
$$
### Формула Скляра
$$
p(x,y) = p(x) \cdot c(x,y) \cdot p(y)
$$
Величина c(x,y) -- имеет название -- связь, копула, "матрица канала"
### Прошлое задание на лабораторную работу
Взять свое имя и фамилию и две даты рождения - свою и своего друга (в формате 1 лаб.раб.) и породить две последовательности, каждая длиной 10000 символов
Первая последовательность - входная последовательность в канале, а вторая - выходная.
1. По этим двум строкам нужно подсчитать матрицу p(x,y)
2. Подсчитать взаимную информацию $I$
3. Получить матрицу c(x,y) из матрицы p(x,y) и двух векторов: p(x) и p(y)
## Как получить "эмпирическую копулу" - ?
Во-первых, надо рассмотреть интегральную копулу $C(u,\;v)$ - двухмерную функцию распределения, определённую на квадрате $[0,\;1]\times [0,\;1]$, такую, что все (два) её маргинальных распределения **равномерны** на интервале ${\displaystyle [0,\;1]}$.
Вот некоторые ее свойства:
$$
C(u,\;0)=C(0,\;v)=0, \quad
C(u,\;1)=u;\quad
C(1,\;v)=v.
$$
При анализе данных с неизвестным распределением, можно построить «эмпирическую копулу» путём такой свёртки, чтобы маргинальные распределения получились равномерными. Математически это можно записать так:
$$
{\displaystyle C_{n}\left({\frac {i}{n}},{\frac {j}{n}}\right)={\frac {1}{n^2}}\cdot } \underline{NumberOfPairs(x,y)}
$$
таких что
$$
{\displaystyle x\leq x_{(i)}{\text{ и }}y\leq y_{(j)}\,,1\leq i\leq n,1\leq j\leq n}$$
где $x(i)$ —представляет i-ую порядковую статистику $x$ (порядковая статистика находится путем сортировки ).
Во-вторых, из матрицы $C_{i,j}$ надо получить матрицу $с_{i,j}$ (см. задание 2 в начале лекции)
## Текущее задание на лабораторную работу
Разработать и реализовать свой алгоритм синхронизации клиента и сервера
### Пример простого алгоритма синхронизации:
1) Клиент отмечает текущее местное время (желательно все отметки времени брать по Гринвичу - UTC формат без сдвига по часовым поясам ) в пакете «запроса времени» и отправляет запрос на сервер
2) При получении запроса сервер ставит отметку серверного времени и возвращает ее
3) После получения отметки серверного времени клиент вычитает текущее время из времени отправки и делит на два для вычисления задержки.
Текущее время вычитается из времени сервера, чтобы определить дельту времени между клиентом и сервером и добавляется половинная задержка, для получения уточненной дельты часов клиента относительно сервера. (Пока этот алгоритм очень похож на SNTP)
Клиент повторяет шаги 1) 2) и 3) несколько раз (пять или более), каждый раз делая паузу на несколько секунд. В это время может быть разрешен другой трафик, но его следует минимизировать для достижения наилучших результатов.
Результаты приема пакетов накапливаются и сортируются в порядке от наименьшей задержки до наибольшей. Средняя задержка определяется путем выбора выборки средней точки (медианы) из этого упорядоченного списка.
Все результаты, отклоняющиеся примерно на одно *стандартное отклонение?* от медианы, отбрасываются, а оставшиеся образцы усредняются.
Этот алгоритм предполагает синхронизацию нескольких клиентов с одним сервером.
### Ссылка на готовую javascript реализацию -
https://npm.runkit.com/timesync
### Ссылка на историю и один из алгоритмов синхронизации в сети -
https://www.wikiwand.com/en/Network_Time_Protocol