miller-robin
This commit is contained in:
parent
eda99760f3
commit
48f640b55d
10 changed files with 1291 additions and 1 deletions
|
|
@ -4,3 +4,8 @@ straightforward - ![[Pasted image 20251105170221.png]]
|
||||||
|
|
||||||
contiguous - смежный
|
contiguous - смежный
|
||||||
compassionate - сострадательный
|
compassionate - сострадательный
|
||||||
|
|
||||||
|
wise - мудрый
|
||||||
|
|
||||||
|
$(a \cdot b) \pmod m$.
|
||||||
|
|
||||||
|
|
|
||||||
9
10-linux/10-kernel/init_swap.sh
Normal file
9
10-linux/10-kernel/init_swap.sh
Normal file
|
|
@ -0,0 +1,9 @@
|
||||||
|
sudo rm /swapfile
|
||||||
|
sudo touch /swapfile
|
||||||
|
sudo chattr +C /swapfile
|
||||||
|
sudo fallocate -l 16G /swapfile
|
||||||
|
sudo chmod 600 /swapfile
|
||||||
|
sudo mkswap /swapfile
|
||||||
|
sudo swapon /swapfile
|
||||||
|
swapon --show
|
||||||
|
free -h
|
||||||
|
|
@ -0,0 +1,113 @@
|
||||||
|
Да, именно так! Вы абсолютно правы. Вся "магия" держится на сервере-посреднике, без него схема просто не сработает.
|
||||||
|
|
||||||
|
Однако, тут есть один нюанс: роль этого сервера меняется в зависимости от того, насколько удачно удалось "обмануть" систему.
|
||||||
|
|
||||||
|
У сервера-посредника есть две принципиально разные функции:
|
||||||
|
|
||||||
|
### 1. Роль "Свахи" (Брокер) — Работает всегда
|
||||||
|
Это основная и обязательная функция сервера.
|
||||||
|
* **Что делает:** Знакомит компьютеры друг с другом. Когда вы нажимаете "Включить" в Hamachi/Radmin, ваш компьютер стучится на центральный сервер и говорит: "Привет, я в сети, мой адрес такой-то". То же самое делает ваш друг.
|
||||||
|
* **Зачем нужен:** Ваши компьютеры сами по себе слепы. Они не знают IP-адреса друг друга и закрыты NAT-ом (роутером). Сервер-посредник сообщает им адреса друг друга и командует: "А теперь попробуйте соединиться напрямую!".
|
||||||
|
* **Итог:** Если всё прошло хорошо (UDP Hole Punching сработал), сервер отходит в сторону. Трафик идет напрямую от вас к другу. **Это идеальный сценарий.**
|
||||||
|
|
||||||
|
### 2. Роль "Переводчика" (Ретранслятор / Relay) — Работает, когда всё плохо
|
||||||
|
Это запасной вариант, если "пробить стены" (NAT) напрямую не удалось.
|
||||||
|
* **Что делает:** Если ваши роутеры слишком строгие (например, симметричный NAT или корпоративная сеть) и прямая связь невозможна, сервер начинает работать как труба. Весь ваш игровой трафик летит сначала на сервер Hamachi/Radmin, а оттуда — к другу.
|
||||||
|
* **Почему это плохо:**
|
||||||
|
* **Огромный пинг:** Сигнал делает крюк через дата-центр компании.
|
||||||
|
* **Медленная скорость:** Пропускная способность канала сервера ограничена.
|
||||||
|
* **Как это увидеть:**
|
||||||
|
* **В Hamachi:** Возле имени друга горит **синий кружок** (Relayed tunnel). Это значит, что вы идете через сервер. Если кружок **зеленый** — связь прямая (P2P).
|
||||||
|
* **В Radmin VPN:** Если связь идет через сервер, тип соединения обычно отображается как **Relay/TCP**.
|
||||||
|
|
||||||
|
### Резюме
|
||||||
|
Сервер-посредник есть **всегда** для координации (чтобы найти друг друга). Но для передачи самих данных (игры, файлов) программы стараются его избегать, создавая прямой туннель. Если вы играете с комфортным пингом — значит, сервер только "познакомил" вас и ушел. Если пинг высокий — вы гоняете данные через него.
|
||||||
|
|
||||||
|
[1](https://support.goto.com/hamachi/help/what-do-the-different-color-indicators-mean-in-logmein-hamachi-hamachi-c-hamachi-client-colors)
|
||||||
|
[2](https://help.rt-ms.com/portal/en/kb/articles/vpn-color-indicators)
|
||||||
|
[3](https://www.reddit.com/r/logmein/comments/ls247y/relayed_tunnel_issue_hamachi/)
|
||||||
|
[4](http://logmeinwiki.com/wiki/Hamachi:Indicators)
|
||||||
|
[5](https://forum.nhl94.com/index.php?%2Ftopic%2F18378-hamachi-relayed-connection%2F)
|
||||||
|
[6](https://radmin-club.com/radmin-vpn/relay-connection-vs-direct-connection/)
|
||||||
|
[7](https://dzen.ru/a/Z8wkcG12XFn0UX3o)
|
||||||
|
[8](https://support.goto.com/hamachi/help/que-significan-los-diferentes-indicadores-de-color-de-logmein-hamachi-hamachi-c-hamachi-client-colors)
|
||||||
|
[9](https://freevpnmentor.com/radmin-vpn-review-is-it-safe/)
|
||||||
|
[10](https://hamachi-pc.ru/instructions/ispravlyaem-tunnel-cherez-retranslyator-v-hamachi.html)
|
||||||
|
[11](https://retailedge.com/phpBB/viewtopic.php?t=3338)
|
||||||
|
[12](https://www.radmin-vpn.com/help/)
|
||||||
|
[13](https://coop-land.ru/forum/showtopic/73245-hamachi-tunnel-cherez-retranslyator/)
|
||||||
|
[14](https://www.youtube.com/watch?v=wiyj4WTZpWQ)
|
||||||
|
[15](https://helpdesk.radmin.com/kb/faq.php?id=275)
|
||||||
|
[16](https://www.youtube.com/watch?v=jQt4V9Y8kwo)
|
||||||
|
[17](https://steamcommunity.com/sharedfiles/filedetails/?id=2095729239)
|
||||||
|
[18](https://www.reddit.com/r/stronghold/comments/1hrs0iz/not_able_to_join_a_friend_using_radmin_vpn_not/)
|
||||||
|
[19](https://otvet.mail.ru/question/219881145)
|
||||||
|
[20](https://projectcrusade.forumotion.com/t4162-a-crusade-hamachi-online-play-guide-with-extras)
|
||||||
|
|
||||||
|
Чтобы создать видимость того, что компьютеры находятся в одной комнате (в локальной сети), хотя на самом деле их разделяют тысячи километров, Radmin VPN и Hamachi используют технологию виртуализации сети.
|
||||||
|
|
||||||
|
Весь процесс можно разделить на три ключевых этапа: обман операционной системы, упаковка данных в «конверт» и пробивание стен (NAT).
|
||||||
|
|
||||||
|
### 1. Виртуальный сетевой адаптер (Обман системы)
|
||||||
|
Когда вы устанавливаете Radmin VPN или Hamachi, они инсталлируют в Windows специальный драйвер — **виртуальный сетевой адаптер**.[1]
|
||||||
|
|
||||||
|
* **Как это видит Windows:** Система считает, что вы вставили в компьютер еще одну реальную сетевую карту и подключили к ней кабель.
|
||||||
|
* **Что происходит на самом деле:** Этот «кабель» никуда не ведет. Это программная эмуляция. Когда игра или программа пытается отправить данные в «локальную сеть» (например, найти сервер Minecraft), она отправляет их на этот виртуальный адаптер.
|
||||||
|
* **Присвоение адреса:** Программа выдает этому виртуальному адаптеру специальный IP-адрес (обычно в диапазоне 25.x.x.x или 26.x.x.x), который отличается от вашего реального интернет-адреса.[1]
|
||||||
|
|
||||||
|
### 2. Туннелирование (Упаковка в конверт)
|
||||||
|
Когда данные попадают на виртуальный адаптер, программа (Radmin/Hamachi) перехватывает их.
|
||||||
|
|
||||||
|
1. **Захват:** Игра отправляет пакет данных «Привет, я игрок А» на адрес 26.15.20.1 (адрес друга).
|
||||||
|
2. **Шифрование и инкапсуляция:** Программа берет этот пакет и шифрует его. Затем она кладет его внутрь обычного интернет-пакета (протокола UDP или TCP).[2][3]
|
||||||
|
* *Аналогия:* Вы берете письмо, адресованное «В соседнюю комнату», кладете его в большой почтовый конверт, пишете на нем реальный почтовый адрес друга в другом городе и отправляете по обычной почте.
|
||||||
|
3. **Передача:** Этот пакет летит через обычный интернет, проходя через провайдеров, как обычный трафик (просмотр YouTube или скачивание файлов).
|
||||||
|
4. **Распаковка:** Компьютер друга получает пакет. Программа Radmin/Hamachi на его стороне вскрывает «внешний конверт», расшифровывает данные и передает их своему виртуальному адаптеру.
|
||||||
|
5. **Результат:** Windows друга видит входящий пакет от «игрока А» через виртуальный кабель и думает, что друг сидит рядом.
|
||||||
|
|
||||||
|
### 3. UDP Hole Punching (Пробивание стен)
|
||||||
|
Самая сложная часть магии — как соединить два компьютера напрямую, если у обоих, скорее всего, есть роутеры и нет «белого» IP-адреса. Для этого используется технология **UDP Hole Punching**.[4][5]
|
||||||
|
|
||||||
|
* **Проблема:** Ваш роутер (NAT) по умолчанию блокирует все входящие соединения извне, если вы сами их не запросили. Если друг просто попытается отправить вам пакет, роутер его отбросит.
|
||||||
|
* **Решение:**
|
||||||
|
1. Оба компьютера сначала связываются с центральным сервером Radmin или Hamachi (сервер-посредник).[6][2]
|
||||||
|
2. Сервер сообщает им реальные IP-адреса друг друга.
|
||||||
|
3. Компьютеры начинают одновременно «бомбардировать» друг друга пустыми пакетами.
|
||||||
|
4. Когда ваш компьютер отправляет пакет другу, ваш роутер открывает «дырку» (запись в таблице NAT) для ответа. В этот же момент друг делает то же самое.
|
||||||
|
5. В какой-то момент пакеты проскакивают в открытые навстречу друг другу «дырки», и устанавливается прямое соединение (P2P).[7][6]
|
||||||
|
|
||||||
|
Если пробиться напрямую не удается (из-за строгого корпоративного фаервола), трафик идет через сервер-ретранслятор (Relay), что вызывает высокие задержки (пинг) в играх.[6]
|
||||||
|
|
||||||
|
### Итог: почему пространство изолированное?
|
||||||
|
«Изолированность» обеспечивается тем, что:
|
||||||
|
1. Виртуальные адаптеры имеют свои IP-адреса, которые не маршрутизируются в обычном интернете.[3]
|
||||||
|
2. Весь трафик между участниками шифруется (обычно AES-256), поэтому провайдер видит только поток случайных данных, но не видит, что внутри (файлы, игра, чат).[8][3]
|
||||||
|
|
||||||
|
Таким образом, создается **VPN (Virtual Private Network)** — защищенный туннель внутри незащищенной сети Интернет.
|
||||||
|
|
||||||
|
[1](https://www.white-windows.ru/sozdanie-virtualnoj-lokalnoj-seti-po-internetu-s-pomoshhyu-besplatnoj-programmy-radmin-vpn/)
|
||||||
|
[2](https://otvet.mail.ru/question/78812594)
|
||||||
|
[3](https://www.datahata.by/info/articles/virtualnaya-chastnaya-set-chto-eto-takoe.html)
|
||||||
|
[4](https://gmnet-engine.org/manual/punch/about/aboutpunching)
|
||||||
|
[5](https://www.infosecinstitute.com/resources/hacking/udp-hole-punching/)
|
||||||
|
[6](https://hobbycomp.ru/internet/hamachi-vsyo-o-programme/)
|
||||||
|
[7](https://www.dinhphu28.com/blog/2024/udp-hole-punching/)
|
||||||
|
[8](https://habr.com/ru/articles/534250/)
|
||||||
|
[9](https://qna.habr.com/q/900405)
|
||||||
|
[10](https://habr.com/ru/companies/ru_mts/articles/745996/)
|
||||||
|
[11](https://ru.wikipedia.org/wiki/LogMeIn_Hamachi)
|
||||||
|
[12](https://www.reddit.com/r/Terraria/comments/hrs2w/what_is_hamachi_and_how_does_it_work/?tl=ru)
|
||||||
|
[13](https://www.qsfptek.com/ru/qt-news/vpn-router-what-is-it.html)
|
||||||
|
[14](https://www.radmin-vpn.com/ru/help/)
|
||||||
|
[15](https://www.youtube.com/watch?v=9ImqBCt47JM)
|
||||||
|
[16](https://otvet.mail.ru/question/240481604)
|
||||||
|
[17](https://www.reddit.com/r/Terraria/comments/hrs2w/what_is_hamachi_and_how_does_it_work/)
|
||||||
|
[18](https://docs.usergate.com/vpn-dlya-udalennogo-dostupa-klientov-(remote-access-vpn)_925.html)
|
||||||
|
[19](https://www.youtube.com/watch?v=Hh_fG6ze5Aw)
|
||||||
|
[20](https://dev.to/dev-dhanushkumar/nat-traversal-a-visual-guide-to-udp-hole-punching-1936)
|
||||||
|
|
||||||
|
$a^{n-1} \equiv 1 \pmod n$
|
||||||
|
эквивалентно вот этому
|
||||||
|
```rust
|
||||||
|
a.pow(n-1) % n == 1
|
||||||
|
```
|
||||||
|
|
@ -3,9 +3,11 @@ methods:
|
||||||
.to_lowercase()
|
.to_lowercase()
|
||||||
.flat_map()
|
.flat_map()
|
||||||
.par_iter()
|
.par_iter()
|
||||||
|
.par_bridge()
|
||||||
.map()
|
.map()
|
||||||
.filter()
|
.filter()
|
||||||
.fold()
|
.fold()
|
||||||
|
.find()
|
||||||
.collect()
|
.collect()
|
||||||
.copied()
|
.copied()
|
||||||
.filter_map()
|
.filter_map()
|
||||||
|
|
@ -13,11 +15,22 @@ methods:
|
||||||
.any()
|
.any()
|
||||||
.all()
|
.all()
|
||||||
.position()
|
.position()
|
||||||
|
.fetch_add()
|
||||||
|
.load()
|
||||||
|
.ends_with()
|
||||||
|
.enumerate()
|
||||||
|
.saturating_sub()
|
||||||
|
.try_fold()
|
||||||
|
|
||||||
|
|
||||||
crates:
|
crates:
|
||||||
use memchr::memmem;
|
use memchr::memmem;
|
||||||
|
|
||||||
|
traits:
|
||||||
|
AsRef<str>
|
||||||
|
PartialEq
|
||||||
|
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|Префикс|Что делает (Технический смысл)|Пример|Стоимость (Cost)|
|
|Префикс|Что делает (Технический смысл)|Пример|Стоимость (Cost)|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
https://getcracked.io/questions
|
||||||
102
80-math/Untitled.md
Normal file
102
80-math/Untitled.md
Normal file
|
|
@ -0,0 +1,102 @@
|
||||||
|
**Великая (Последняя) теорема Ферма:** $a^n + b^n = c^n$ не имеет решений в целых числах для $n > 2$.
|
||||||
|
|
||||||
|
**Малая теорема Ферма:** Если $p$ — простое число, то для любого целого $a$: $a^p \equiv a \pmod p$.
|
||||||
|
|
||||||
|
Это отличный вопрос. В IT "математика" — понятие растяжимое. Кому-то нужно считать интегралы, а кому-то достаточно понимать, как работает остаток от деления.
|
||||||
|
|
||||||
|
Вот "дорожная карта" математических тем, отфильтрованная по реальным задачам, а не университетской программе.
|
||||||
|
|
||||||
|
***
|
||||||
|
|
||||||
|
### 1. Embedded-разработчик (Rust/C)
|
||||||
|
Здесь математика очень "железная". Вам нужно понимать, как числа живут в памяти и как физика переходит в цифру.
|
||||||
|
|
||||||
|
**Must Have (Обязательно):**
|
||||||
|
* **Булева алгебра и Битовая магия:**
|
||||||
|
* Операции `AND`, `OR`, `XOR`, `NOT`, сдвиги (`<<`, `>>`).
|
||||||
|
* Маскирование битов (установка/сброс конкретных флагов в регистрах).
|
||||||
|
* Понимание Little-endian vs Big-endian.
|
||||||
|
* **Системы счисления:**
|
||||||
|
* Свободное чтение Hex (0xFF) и Bin (0b1010).
|
||||||
|
* Представление отрицательных чисел (Two's complement).
|
||||||
|
* **Арифметика с фиксированной точкой (Fixed-point arithmetic):**
|
||||||
|
* Как считать дробные числа на процессорах без FPU (например, `Q15`, `Q31` форматы).
|
||||||
|
|
||||||
|
**Advanced (Для серьезных задач):**
|
||||||
|
* **Цифровая обработка сигналов (DSP):**
|
||||||
|
* Преобразование Фурье (FFT) — если работаете со звуком или радио.
|
||||||
|
* Цифровые фильтры (Калмана, PID-регуляторы) — если управляете дронами, моторами или температурой.
|
||||||
|
|
||||||
|
***
|
||||||
|
|
||||||
|
### 2. ML-инженер (Python — архитектура, Rust — инференс/оптимизация)
|
||||||
|
Тут математика — это основной рабочий инструмент. Без неё вы просто "импортер библиотек".
|
||||||
|
|
||||||
|
**Must Have (Фундамент):**
|
||||||
|
* **Линейная алгебра (Царица ML):**
|
||||||
|
* Матричное умножение, векторы, тензоры.
|
||||||
|
* Размерности пространств (понимание, почему `[3, 512] * [512, 10]` работает, а наоборот — нет).
|
||||||
|
* Собственные векторы и значения (Eigenvectors) — для PCA и сжатия данных.
|
||||||
|
* **Мат. анализ (Calculus):**
|
||||||
|
* Градиенты и частные производные (суть Backpropagation).
|
||||||
|
* Цепное правило (Chain rule).
|
||||||
|
* Понимание того, что такое локальный минимум и седловая точка.
|
||||||
|
* **Теория вероятностей и Статистика:**
|
||||||
|
* Распределения (Нормальное, Бернулли, Пуассона).
|
||||||
|
* Байесовская теорема.
|
||||||
|
* Метрики (Precision, Recall, F1-score, ROC-AUC).
|
||||||
|
|
||||||
|
**Rust Specific (Для оптимизации):**
|
||||||
|
* **Численные методы:** Как хранить `f32`/`f16` так, чтобы не потерять точность при миллионе сложений (проблемы float point arithmetic).
|
||||||
|
* **SIMD-математика:** Параллельные вычисления векторов на CPU.
|
||||||
|
|
||||||
|
***
|
||||||
|
|
||||||
|
### 3. Backend-разработчик
|
||||||
|
Здесь математика нужна для оценки нагрузки, защиты данных и правильной работы с деньгами.
|
||||||
|
|
||||||
|
**Must Have (Повседневность):**
|
||||||
|
* **Асимптотический анализ (Big O):**
|
||||||
|
* Понимать разницу между $O(N)$, $O(N \log N)$ и $O(N^2)$.
|
||||||
|
* Понимать Cost Model (почему чтение из RAM быстрее чтения с SSD в математических порядках).
|
||||||
|
* **Дискретная математика (Графы и Множества):**
|
||||||
|
* Теория множеств (Set theory) — это база SQL (`JOIN`, `UNION`, `INTERSECT`).
|
||||||
|
* Деревья (B-Tree, LSM-Tree) — чтобы понимать, как работают индексы в PostgreSQL.
|
||||||
|
* Графы — если пишете социальные сети, карты или системы зависимостей.
|
||||||
|
* **Модульная арифметика и Теория чисел:**
|
||||||
|
* То, что мы обсуждали выше (простые числа, остатки от деления).
|
||||||
|
* Основы криптографии (Хэширование, RSA, Эллиптические кривые).
|
||||||
|
|
||||||
|
**Ops/Highload:**
|
||||||
|
* **Статистика для мониторинга:**
|
||||||
|
* Перцентили (p50, p95, p99) — почему "среднее время ответа" лжет.
|
||||||
|
* Гистограммы распределения запросов.
|
||||||
|
|
||||||
|
***
|
||||||
|
|
||||||
|
### 4. Frontend (SSR) разработчик
|
||||||
|
Обычно математики тут меньше всего, если вы не делаете WebGL-игры или сложные дашборды.
|
||||||
|
|
||||||
|
**Must Have:**
|
||||||
|
* **Базовая геометрия:**
|
||||||
|
* Координаты (x, y), ширины, высоты.
|
||||||
|
* Box Model (сложение отступов).
|
||||||
|
* **Пропорции и проценты:**
|
||||||
|
* Aspect Ratio, расчет резиновой верстки (`flex-grow`).
|
||||||
|
|
||||||
|
**Advanced (Анимации и Графика):**
|
||||||
|
* **Тригонометрия:**
|
||||||
|
* `Sin`, `Cos`, `Atan2` — если нужно вращать элементы или рисовать на `<canvas>`.
|
||||||
|
* **Интерполяция:**
|
||||||
|
* Кривые Безье (как работают `ease-in-out` анимации).
|
||||||
|
* Линейная интерполяция (Lerp) для плавных переходов цветов или позиций.
|
||||||
|
* **Матрицы трансформаций (CSS transform):**
|
||||||
|
* Понимание, как работает `matrix3d()` для 3D-эффектов в браузере.
|
||||||
|
|
||||||
|
### Итог: Что учить в первую очередь?
|
||||||
|
|
||||||
|
Учитывая твой профиль (Rust, Backend, Systems):
|
||||||
|
1. **Bitwise operations** (для низкоуровневых оптимизаций).
|
||||||
|
2. **Big O & Data Structures** (деревья, хэш-мапы — база бэкенда).
|
||||||
|
3. **Модульная арифметика** (для понимания криптографии и алгоритмов типа того же Миллера-Рабина).
|
||||||
|
4. **Статистика (перцентили)** — чтобы грамотно делать дашборды мониторинга для своих сервисов.
|
||||||
362
80-math/miller-rabin.md
Normal file
362
80-math/miller-rabin.md
Normal file
|
|
@ -0,0 +1,362 @@
|
||||||
|
|
||||||
|
|
||||||
|
пример кода, близкого к эталонному:
|
||||||
|
```rust
|
||||||
|
pub fn nth(n: u32) -> u32 {
|
||||||
|
let mut num = 1;
|
||||||
|
for _ in 0..=n {
|
||||||
|
loop {
|
||||||
|
num += 1;
|
||||||
|
if miller_rabin(num as u64) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
num
|
||||||
|
}
|
||||||
|
|
||||||
|
fn miller_rabin(n: u64) -> bool {
|
||||||
|
const HINT: &[u64] = &[2];
|
||||||
|
|
||||||
|
// we have a strict upper bound, so we can just use the witness
|
||||||
|
// table of Pomerance, Selfridge & Wagstaff and Jeaschke to be as
|
||||||
|
// efficient as possible, without having to fall back to
|
||||||
|
// randomness. Additional limits from Feitsma and Galway complete
|
||||||
|
// the entire range of `u64`. See also:
|
||||||
|
// https://en.wikipedia.org/wiki/Miller%E2%80%93Rabin_primality_test#Testing_against_small_sets_of_bases
|
||||||
|
const WITNESSES: &[(u64, &[u64])] = &[
|
||||||
|
(2_046, HINT),
|
||||||
|
(1_373_652, &[2, 3]),
|
||||||
|
(9_080_190, &[31, 73]),
|
||||||
|
(25_326_000, &[2, 3, 5]),
|
||||||
|
(4_759_123_140, &[2, 7, 61]),
|
||||||
|
(1_112_004_669_632, &[2, 13, 23, 1662803]),
|
||||||
|
(2_152_302_898_746, &[2, 3, 5, 7, 11]),
|
||||||
|
(3_474_749_660_382, &[2, 3, 5, 7, 11, 13]),
|
||||||
|
(341_550_071_728_320, &[2, 3, 5, 7, 11, 13, 17]),
|
||||||
|
(3_825_123_056_546_413_050, &[2, 3, 5, 7, 11, 13, 17, 19, 23]),
|
||||||
|
(std::u64::MAX, &[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37]),
|
||||||
|
];
|
||||||
|
|
||||||
|
if n % 2 == 0 {
|
||||||
|
return n == 2;
|
||||||
|
}
|
||||||
|
if n == 1 {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut d = n - 1;
|
||||||
|
let mut s = 0;
|
||||||
|
while d % 2 == 0 {
|
||||||
|
d /= 2;
|
||||||
|
s += 1
|
||||||
|
}
|
||||||
|
|
||||||
|
let witnesses = WITNESSES
|
||||||
|
.iter()
|
||||||
|
.find(|&&(hi, _)| hi >= n)
|
||||||
|
.map(|&(_, wtnss)| wtnss)
|
||||||
|
.unwrap();
|
||||||
|
'next_witness: for &a in witnesses.iter() {
|
||||||
|
let mut power = mod_exp(a, d, n);
|
||||||
|
assert!(power < n);
|
||||||
|
if power == 1 || power == n - 1 {
|
||||||
|
continue 'next_witness;
|
||||||
|
}
|
||||||
|
|
||||||
|
for _r in 0..s {
|
||||||
|
power = mod_sqr(power, n);
|
||||||
|
assert!(power < n);
|
||||||
|
if power == 1 {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if power == n - 1 {
|
||||||
|
continue 'next_witness;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
true
|
||||||
|
}
|
||||||
|
|
||||||
|
fn mod_mul_(a: u64, b: u64, m: u64) -> u64 {
|
||||||
|
(u128::from(a) * u128::from(b) % u128::from(m)) as u64
|
||||||
|
}
|
||||||
|
|
||||||
|
fn mod_mul(a: u64, b: u64, m: u64) -> u64 {
|
||||||
|
match a.checked_mul(b) {
|
||||||
|
Some(r) => {
|
||||||
|
if r >= m {
|
||||||
|
r % m
|
||||||
|
} else {
|
||||||
|
r
|
||||||
|
}
|
||||||
|
}
|
||||||
|
None => mod_mul_(a, b, m),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn mod_sqr(a: u64, m: u64) -> u64 {
|
||||||
|
if a < (1 << 32) {
|
||||||
|
let r = a * a;
|
||||||
|
if r >= m { r % m } else { r }
|
||||||
|
} else {
|
||||||
|
mod_mul_(a, a, m)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn mod_exp(mut x: u64, mut d: u64, n: u64) -> u64 {
|
||||||
|
let mut ret: u64 = 1;
|
||||||
|
while d != 0 {
|
||||||
|
if d % 2 == 1 {
|
||||||
|
ret = mod_mul(ret, x, n)
|
||||||
|
}
|
||||||
|
d /= 2;
|
||||||
|
x = mod_sqr(x, n);
|
||||||
|
}
|
||||||
|
ret
|
||||||
|
}
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
## Что такое Miller-Rabin (с нуля, метафора "Судья и Лжецы")
|
||||||
|
|
||||||
|
Представь простое число как **честного судью**, а составное — как **лжеца**. У тебя есть **несколько свидетелей** (маленькие числа 2, 3, 7...), которые задают судье **сложные вопросы**.
|
||||||
|
|
||||||
|
**Правило игры:** Если судья честный (число простое), он всегда отвечает правильно. Если лжец (составное), то с высокой вероятностью **хотя бы один свидетель** поймает его на лжи.
|
||||||
|
|
||||||
|
Miller-Rabin — это **математический допрос**: мы заставляем число доказать свою честность, вычисляя сложные степени по модулю.
|
||||||
|
|
||||||
|
## Шаг 1: nth(n) — Простой перебор с MR-тестом
|
||||||
|
|
||||||
|
```rust
|
||||||
|
pub fn nth(n: u32) -> u32 {
|
||||||
|
let mut num = 1; // начинаем с 2 (1-е простое)
|
||||||
|
for _ in 0..=n { // ищем n+1 простое число
|
||||||
|
loop {
|
||||||
|
num += 1;
|
||||||
|
if miller_rabin(num as u64) { break; } // MR говорит "простое!"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
num
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**Логика:** "Ходи по числам, пока не найдешь n простых". Медленно (O(n log n)), но **корректно**. Для Exercism (n до 10k) работает мгновенно.
|
||||||
|
|
||||||
|
## Шаг 2: Подготовка MR-теста (d и s)
|
||||||
|
|
||||||
|
```rust
|
||||||
|
let mut d = n - 1;
|
||||||
|
let mut s = 0;
|
||||||
|
while d % 2 == 0 { d /= 2; s += 1 }
|
||||||
|
```
|
||||||
|
|
||||||
|
**Математика:** Каждое простое удовлетворяет **малой теореме Ферма**: \(a^{n-1} \equiv 1 \pmod n\).
|
||||||
|
|
||||||
|
Но вместо прямого вычисления \(a^{n-1}\) мы раскладываем показатель:
|
||||||
|
\[ n-1 = d \cdot 2^s \]
|
||||||
|
где \(d\) — нечетное. **Почему?** Чтобы проверять промежуточные квадраты.
|
||||||
|
|
||||||
|
**Метафора:** "Не спрашивай сразу 'ты честный?', а сначала проверь базовое свойство, потом возводи в квадрат шаг за шагом".
|
||||||
|
|
||||||
|
## Шаг 3: Witness Table (функциональный стиль)
|
||||||
|
|
||||||
|
```rust
|
||||||
|
let witnesses = WITNESSES.iter()
|
||||||
|
.find(|&&(hi, _)| hi >= n) // ищем нужный диапазон
|
||||||
|
.map(|&(_, wtnss)| wtnss) // извлекаем список свидетелей
|
||||||
|
.unwrap();
|
||||||
|
```
|
||||||
|
|
||||||
|
**Гениальность:** Для каждого диапазона известен **минимальный набор свидетелей**, гарантирующий 100% точность.
|
||||||
|
|
||||||
|
| Диапазон | Свидетели | Тестов |
|
||||||
|
| ---------- | --------------------- | ------ |
|
||||||
|
| < 2047 | | 1 |
|
||||||
|
| < 4.7e9 | [1] | 3 |
|
||||||
|
| < u64::MAX | [7][1][2][3][4][5][6] | 12 |
|
||||||
|
|
||||||
|
**Функциональный стиль:** `iter().find().map()` — чистый, без мутабельности, легко тестировать.
|
||||||
|
|
||||||
|
## Шаг 4: Основной цикл MR (сердце алгоритма)
|
||||||
|
|
||||||
|
```rust
|
||||||
|
for &a in witnesses.iter() { // для каждого свидетеля
|
||||||
|
let mut power = mod_exp(a, d, n); // x0 = a^d mod n
|
||||||
|
|
||||||
|
if power == 1 || power == n-1 { continue } // тест пройден
|
||||||
|
|
||||||
|
for _r in 0..s { // s раз возводим в квадрат
|
||||||
|
power = mod_sqr(power, n); // xr+1 = xr^2 mod n
|
||||||
|
if power == n-1 { continue 'next_witness } // тест пройден!
|
||||||
|
if power == 1 { return false } // составное!
|
||||||
|
}
|
||||||
|
return false; // все свидетели поймали на лжи
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**Логика теста:**
|
||||||
|
1. Вычисляем \(x_0 = a^d \mod n\)
|
||||||
|
2. Если \(x_0 = 1\) или \(x_0 = n-1\) → свидетель доволен
|
||||||
|
3. Иначе делаем \(s\) квадратов: \(x_{r+1} = x_r^2 \mod n\)
|
||||||
|
4. Если хоть раз получили \(n-1\) → свидетель доволен
|
||||||
|
5. Если дошли до конца → **лжец пойман!**
|
||||||
|
|
||||||
|
## Шаг 5: Быстрое возведение в степень (Binary Exponentiation)
|
||||||
|
|
||||||
|
```rust
|
||||||
|
fn mod_exp(mut x: u64, mut d: u64, n: u64) -> u64 {
|
||||||
|
let mut ret: u64 = 1;
|
||||||
|
while d != 0 {
|
||||||
|
if d % 2 == 1 { // если бит степени = 1
|
||||||
|
ret = mod_mul(ret, x, n); // ret *= x
|
||||||
|
}
|
||||||
|
d /= 2; // сдвиг степени
|
||||||
|
x = mod_sqr(x, n); // x = x^2 (для следующего бита)
|
||||||
|
}
|
||||||
|
ret
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**Метафора:** "Не умножай 2^1000 = 2×2×2... 1000 раз. Используй (2^2)^2 = 2^4, ((2^4)^2)^2 = 2^16 и т.д."
|
||||||
|
|
||||||
|
O(log d) умножений вместо O(d).
|
||||||
|
|
||||||
|
## Шаг 6: Безопасное умножение по модулю (u64 → u128)
|
||||||
|
|
||||||
|
```rust
|
||||||
|
fn mod_mul(a: u64, b: u64, m: u64) -> u64 {
|
||||||
|
match a.checked_mul(b) {
|
||||||
|
Some(r) => if r >= m { r % m } else { r },
|
||||||
|
None => mod_mul_(a, b, m), // fallback на u128
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**Проблема:** \(2^{64}-1 \times 2^{64}-1 = 2^{128}\), переполнение!
|
||||||
|
**Решение:** `checked_mul` + fallback на `u128::from(a) * u128::from(b) % u128::from(m)`.
|
||||||
|
|
||||||
|
**Оптимизация `mod_sqr`:** Для \(a < 2^{32}\) обычное `a*a` быстрее `u128`.
|
||||||
|
|
||||||
|
## Итог: Почему код Production-Ready
|
||||||
|
|
||||||
|
```
|
||||||
|
✅ Детерминированный (не вероятностный)
|
||||||
|
✅ O(√n) на свидетель (с log n на mod_exp)
|
||||||
|
✅ Безопасен от overflow (u128 fallback)
|
||||||
|
✅ Функциональный стиль (иммутабельные итераторы)
|
||||||
|
✅ Таблица свидетелей покрывает весь u64
|
||||||
|
✅ Микрооптимизации (mod_sqr для малых чисел)
|
||||||
|
```
|
||||||
|
|
||||||
|
**Когда использовать:** Проверка **конкретных** больших чисел (10^18 + 7?).
|
||||||
|
**Когда НЕ использовать:** Генерация последовательности простых — тут sieve в 1000x быстрее.
|
||||||
|
|
||||||
|
Этот код — **золотой стандарт** для криптографии и системного программирования.[4]
|
||||||
|
|
||||||
|
[1](https://github.com/SergioBenitez/Rocket/issues/1522)
|
||||||
|
[2](https://gliderkite.github.io/posts/sr-cache/)
|
||||||
|
[3](https://stackoverflow.com/questions/16761898/redis-as-write-back-view-count-cache-for-mysql)
|
||||||
|
[4](https://github.com/jedisct1/rust-sieve-cache)
|
||||||
|
[5](https://dev.to/artslob/32-rust-crates-you-better-know-about-4aa7)
|
||||||
|
[6](https://lib.rs/crates/staticvec)
|
||||||
|
[7](https://www.perplexity.ai/search/444a1554-6943-4987-9a27-5923865aea84)
|
||||||
|
|
||||||
|
|
||||||
|
## Малая теорема Ферма (шаг 2 MR)
|
||||||
|
|
||||||
|
**Формулировка:**
|
||||||
|
Если \( p \) — простое число и \( a \) не делится на \( p \), то:
|
||||||
|
\[ a^{p-1} \equiv 1 \pmod{p} \]
|
||||||
|
или эквивалентно:
|
||||||
|
\[ a^p \equiv a \pmod{p} \] [1]
|
||||||
|
|
||||||
|
### Метафора "Кольцо часов"
|
||||||
|
|
||||||
|
Представь \( p = 5 \) простое число как **циферблат с 5 делениями** (0,1,2,3,4). Умножение на \( a = 3 \) — это **поворот стрелки**:
|
||||||
|
|
||||||
|
```
|
||||||
|
Стрелка на 1 → ×3 = 3
|
||||||
|
Стрелка на 2 → ×3 = 6 ≡ 1 (mod 5)
|
||||||
|
Стрелка на 3 → ×3 = 9 ≡ 4 (mod 5)
|
||||||
|
Стрелка на 4 → ×3 = 12 ≡ 2 (mod 5)
|
||||||
|
```
|
||||||
|
|
||||||
|
**Важно:** Поворот на \( 1,2,3,4 \) дал **все возможные позиции** (1,3,4,2) — **полный цикл**! Умножение на 3 **проходится по всему кольцу**.
|
||||||
|
|
||||||
|
**Теорема говорит:** Если \( p \) простое, то любое \( a \) (не кратное \( p \)) за \( p-1 \) повортов **вернется в исходную точку**.
|
||||||
|
|
||||||
|
### Пример вычисления
|
||||||
|
|
||||||
|
```rust
|
||||||
|
// p = 13 (простое), a = 5
|
||||||
|
5^12 mod 13 = ? // малая теорема: должно быть 1
|
||||||
|
|
||||||
|
5^1 ≡ 5
|
||||||
|
5^2 ≡ 25 ≡ 12 ≡ -1
|
||||||
|
5^4 ≡ (-1)^2 ≡ 1
|
||||||
|
5^8 ≡ 1^2 ≡ 1
|
||||||
|
5^12 = 5^8 × 5^4 ≡ 1 × 1 ≡ 1 ✓
|
||||||
|
```
|
||||||
|
|
||||||
|
### Почему это работает (доказательство через перестановки)
|
||||||
|
|
||||||
|
**Ключевой инсайт:** Остатки \( 1, 2, ..., p-1 \) при умножении на \( a \) дают **перестановку** тех же чисел:
|
||||||
|
|
||||||
|
```rust
|
||||||
|
p = 7, a = 3
|
||||||
|
1×3 = 3
|
||||||
|
2×3 = 6
|
||||||
|
3×3 = 9 ≡ 2
|
||||||
|
4×3 = 12 ≡ 5
|
||||||
|
5×3 = 15 ≡ 1
|
||||||
|
6×3 = 18 ≡ 4
|
||||||
|
|
||||||
|
Получили: [3,6,2,5,1,4] — все числа 1..6 в другом порядке!
|
||||||
|
```
|
||||||
|
|
||||||
|
**Произведение всех элементов одинаково:**
|
||||||
|
\[ 1 \times 2 \times \dots \times (p-1) = a \times 2a \times \dots \times (p-1)a \pmod{p} \]
|
||||||
|
\[ (p-1)! \equiv a^{p-1} \times (p-1)! \pmod{p} \]
|
||||||
|
Сокращаем \( (p-1)! \) (оно не 0 mod p):
|
||||||
|
\[ 1 \equiv a^{p-1} \pmod{p} \]
|
||||||
|
|
||||||
|
### Почему MR использует именно эту теорему
|
||||||
|
|
||||||
|
**Прямая проверка \( a^{p-1} \mod p \) неэффективна** — показатель степени огромный (до \( 2^{64} \)).
|
||||||
|
|
||||||
|
**Хитрость MR:** Вместо \( a^{p-1} \) проверяем **промежуточные квадраты**:
|
||||||
|
\[ n-1 = d \times 2^s \]
|
||||||
|
\[ a^{n-1} = (a^d)^{2^s} \]
|
||||||
|
|
||||||
|
Если \( a^d \equiv 1 \) или хотя бы один квадрат дает \( n-1 \), то по свойствам степеней теорема выполняется.
|
||||||
|
|
||||||
|
**Метафора:** Вместо "сделай 1 трлн повортов стрелки" говорим "сделай 40 повортов, но проверяй промежуточные позиции".
|
||||||
|
|
||||||
|
### Проверка на практике
|
||||||
|
|
||||||
|
```rust
|
||||||
|
fn fermat_test(n: u64, a: u64) -> bool {
|
||||||
|
mod_exp(a, n-1, n) == 1 // прямая малая теорема
|
||||||
|
}
|
||||||
|
|
||||||
|
// Но! 561 — псевдопростое по основанию 2:
|
||||||
|
// 2^560 ≡ 1 mod 561, хотя 561 = 3×11×17
|
||||||
|
```
|
||||||
|
|
||||||
|
**Вывод:** Малая теорема — **необходимое** условие простоты, но **недостаточное** (есть "лжецы"). MR усиливает тест **структурированными промежуточными проверками** + **несколькими основаниями**.
|
||||||
|
|
||||||
|
Теперь понятен шаг 2? Идем к witness table? 🚀
|
||||||
|
|
||||||
|
[1](https://ru.wikipedia.org/wiki/%D0%9C%D0%B0%D0%BB%D0%B0%D1%8F_%D1%82%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0_%D0%A4%D0%B5%D1%80%D0%BC%D0%B0)
|
||||||
|
[2](https://math.mosolymp.ru/upload/files/2022/other/1568/8-1/Malaya_teorema_Ferma.pdf)
|
||||||
|
[3](https://foxford.ru/wiki/matematika/malaya-teorema-ferma)
|
||||||
|
[4](https://www.lirmm.fr/~ashen/mathclass/09fermat-prob.pdf)
|
||||||
|
[5](https://wiki.algocode.ru/index.php?title=%D0%9C%D0%B0%D0%BB%D0%B0%D1%8F_%D1%82%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0_%D0%A4%D0%B5%D1%80%D0%BC%D0%B0)
|
||||||
|
[6](https://kvant.mccme.ru/pdf/2000/04/kv0400ferm.pdf)
|
||||||
|
[7](https://ru.wikipedia.org/wiki/%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0_%D0%A4%D0%B5%D1%80%D0%BC%D0%B0_%E2%80%94_%D0%AD%D0%B9%D0%BB%D0%B5%D1%80%D0%B0)
|
||||||
|
[8](https://journalpro.ru/articles/malaya-teorema-ferma-i-ee-primenenie-v-kriptosistemakh/)
|
||||||
|
[9](https://www.reddit.com/r/math/comments/2v6db7/intuition_for_fermats_little_theorem/)
|
||||||
|
[10](https://math.fandom.com/ru/wiki/%D0%9C%D0%B0%D0%BB%D0%B0%D1%8F_%D1%82%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0_%D0%A4%D0%B5%D1%80%D0%BC%D0%B0)
|
||||||
165
90-history/about-calendar.md
Normal file
165
90-history/about-calendar.md
Normal file
|
|
@ -0,0 +1,165 @@
|
||||||
|
Объяснение сугубо астрономическое и математическое. Наша цель — подогнать длину календарного года под длину реального (солнечного) года, чтобы времена года не «уплывали» (чтобы весна всегда начиналась в марте).
|
||||||
|
|
||||||
|
Вся проблема в том, что Земля делает оборот вокруг Солнца **не ровно за 365.25 дней**.[1]
|
||||||
|
|
||||||
|
### Суть проблемы (математика)
|
||||||
|
1. **Тропический год** (реальный оборот вокруг Солнца) длится примерно **365.2422** суток.[2][3]
|
||||||
|
2. **Юлианский календарь** (старый, где високосный *каждые* 4 года) считал, что год длится **365.25** суток.
|
||||||
|
* Разница: $365.25 - 365.2422 = 0.0078$ суток в год.
|
||||||
|
* Это около **11 минут и 14 секунд** лишних каждый год.[4][5]
|
||||||
|
|
||||||
|
Кажется, что мелочь, но за **128 лет** набегают целые лишние сутки ошибки. К XVI веку (времена папы Григория XIII) календарь убежал вперед на 10 дней, и день весеннего равноденствия (важный для Пасхи) сместился.[4]
|
||||||
|
|
||||||
|
### Как это исправили (Григорианская реформа)
|
||||||
|
Нужно было сделать средний год чуть короче, чем 365.25. Решили выкинуть 3 високосных года каждые 400 лет.
|
||||||
|
|
||||||
|
Математика получилась такая:
|
||||||
|
* **База:** 365 дней + 1/4 дня (високосный каждые 4 года) = **365.25**.
|
||||||
|
* **Коррекция 1:** Вычитаем 1/100 дня (убираем високосность у вековых годов, типа 1700, 1800, 1900) = **365.24**.
|
||||||
|
* *Но это слишком много вычли! Реальный год 365.2422, а мы получили 365.2400.*
|
||||||
|
* **Коррекция 2:** Добавляем обратно 1/400 дня (возвращаем високосность годам, кратным 400, типа 1600, 2000) = **365.2425**.[6]
|
||||||
|
|
||||||
|
### Итог
|
||||||
|
Средняя длина года в нашем (Григорианском) календаре: **365.2425** суток.
|
||||||
|
Реальная длина года: **~365.2422** суток.
|
||||||
|
|
||||||
|
Ошибка теперь составляет всего **26 секунд** в год, что дает расхождение в одни сутки только через ~3300 лет. Это всех устроило.[6]
|
||||||
|
|
||||||
|
Именно поэтому **2000** год (делится на 400) был високосным, а **1900** (делится на 100, но не на 400) — нет.
|
||||||
|
|
||||||
|
[1](https://museumgagarin.ru/news/otkuda_vzyalsya_visokosnyy_god/)
|
||||||
|
[2](https://kosmokid.ru/zakony/skolko_dlitsya_tropicheskij_god.html)
|
||||||
|
[3](https://moe-online.ru/nn/zapisochki/483940)
|
||||||
|
[4](https://tass.ru/obschestvo/21715419)
|
||||||
|
[5](https://4glaza.ru/articles/tropicheskij-god/)
|
||||||
|
[6](https://www.ixbt.com/live/offtopic/zachem-nuzhen-visokosnyy-god.html)
|
||||||
|
[7](https://family.rambler.ru/shkolniki/55730082-kalendar-s-sekretom-pochemu-byvaet-visokosnyy-god/)
|
||||||
|
[8](https://www.forbes.ru/forbeslife/507081-vrema-neudac-cto-takoe-visokosnyj-god-i-pocemu-s-nim-svazano-stol-ko-sueverij)
|
||||||
|
[9](https://ya.ru/neurum/c/drugoe/q/pochemu_v_grigorianskom_kalendare_visokosnye_e4ba2a01)
|
||||||
|
[10](https://ru.wikipedia.org/wiki/%D0%92%D0%B8%D1%81%D0%BE%D0%BA%D0%BE%D1%81%D0%BD%D1%8B%D0%B9_%D0%B3%D0%BE%D0%B4)
|
||||||
|
[11](https://ru.wikipedia.org/wiki/%D0%A2%D1%80%D0%BE%D0%BF%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%B3%D0%BE%D0%B4)
|
||||||
|
[12](https://ria.ru/20210914/visokosnyy-1749921703.html)
|
||||||
|
[13](https://ru.ruwiki.ru/wiki/%D0%A2%D1%80%D0%BE%D0%BF%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%B3%D0%BE%D0%B4)
|
||||||
|
[14](https://book.etudes.ru/articles/chronology/)
|
||||||
|
[15](https://znanierussia.ru/articles/%D0%93%D0%BE%D0%B4)
|
||||||
|
[16](https://znanierussia.ru/articles/%D0%92%D0%B8%D1%81%D0%BE%D0%BA%D0%BE%D1%81%D0%BD%D1%8B%D0%B9_%D0%B3%D0%BE%D0%B4)
|
||||||
|
[17](https://nplus1.ru/material/2018/02/14/calendar-centenary)
|
||||||
|
[18](https://astronomy.ru/forum/index.php/topic,193366.20.html)
|
||||||
|
[19](https://ru.wikipedia.org/wiki/%D0%A1%D1%83%D1%82%D0%BA%D0%B8)
|
||||||
|
[20](https://de.ifmo.ru/bk_netra/page.php?dir=3&tutindex=12&index=9&layer=1)
|
||||||
|
|
||||||
|
|
||||||
|
Это действительно впечатляет, учитывая, что у них не было ни атомных часов, ни компьютеров, ни телескопов (телескоп изобрели только через 30 лет после введения григорианского календаря!).
|
||||||
|
|
||||||
|
Секрет их точности кроется не в **инструментах**, а в **«Big Data» того времени и терпении**. Они использовали два главных хитроумных приема.
|
||||||
|
|
||||||
|
### 1. Метод «Стопки бумаги» (Усреднение за столетия)
|
||||||
|
Представь, что тебе нужно измерить толщину одного листа бумаги линейкой, на которой есть только миллиметровые деления. Измерить один лист невозможно — точности не хватит.
|
||||||
|
Но если ты возьмешь пачку из **1000 листов**, измеришь её высоту (скажем, 10 см) и разделишь на 1000, ты получишь толщину одного листа с точностью до сотых долей миллиметра (0,1 мм).
|
||||||
|
|
||||||
|
Древние астрономы делали то же самое со временем:
|
||||||
|
1. Они брали наблюдение дня весеннего равноденствия, сделанное древним греком Гиппархом (II век до н.э.).
|
||||||
|
2. Сравнивали его со своим наблюдением (XVI век н.э.).
|
||||||
|
3. Разница между ними составляла около **1700 лет**.
|
||||||
|
4. Они считали точное количество дней, прошедших между этими событиями, и делили на 1700.
|
||||||
|
|
||||||
|
Любая мелкая ошибка измерения в конкретный день «размазывалась» на 1700 лет и становилась ничтожно малой. Так они получили среднюю длину года с потрясающей точностью.
|
||||||
|
|
||||||
|
### 2. «Баг» был виден невооруженным глазом
|
||||||
|
К 16 веку ошибка старого (Юлианского) календаря накопилась настолько, что её заметили бы даже обычные фермеры, а не только астрономы.
|
||||||
|
|
||||||
|
Юлианский календарь был введен в 45 году до н.э. К 1582 году (когда папа Григорий XIII затеял реформу) набежало **10 лишних дней**.
|
||||||
|
* По церковным правилам весеннее равноденствие должно было быть **21 марта** (чтобы считать дату Пасхи).
|
||||||
|
* Астрономы посмотрели на солнце/тени и увидели, что реальное равноденствие наступает **11 марта**.
|
||||||
|
|
||||||
|
**Математика была простой:**
|
||||||
|
1. Календарь убежал на 10 дней примерно за 1250 лет (с Никейского собора 325 года, когда утвердили дату Пасхи).
|
||||||
|
2. Делим 10 дней на 1250 лет = **0,008 суток**.
|
||||||
|
3. Значит, старый год (365,25) длиннее реального на 0,008 суток.
|
||||||
|
4. $365,25 - 0,008 = 365,242$.
|
||||||
|
|
||||||
|
Вот так, просто разделив 10 дней отставания на прошедшие века, **Алоизий Лилий** (автор реформы) вычислил, что год должен длиться примерно **365.2425** суток, и придумал систему, где мы выкидываем 3 дня каждые 400 лет.
|
||||||
|
|
||||||
|
### Инструменты (Гномон)
|
||||||
|
Для фиксации самого момента равноденствия они использовали гигантские соборы как инструменты. В куполе делали дырочку, и луч солнца падал на пол. На полу была нарисована линия (меридиан).
|
||||||
|
Когда в полдень солнечный зайчик пересекал линию в определенной точке — это означало равноденствие. Чем выше собор — тем длиннее «рычаг» луча и тем точнее измерение. Соборы Европы фактически были огромными солнечными обсерваториями.
|
||||||
|
|
||||||
|
### Fun Fact
|
||||||
|
Омар Хайям (персидский поэт и математик) еще в XI веке (за 500 лет до европейцев!) разработал календарь, который был **точнее григорианского**. Его календарь (иранский солнечный) накапливает ошибку в 1 день не за 3300 лет, как наш, а за **3,8 миллиона лет**. И всё это — просто наблюдая за тенями и звездами в пустыне.
|
||||||
|
|
||||||
|
Это отличный вопрос. Чтобы понять, как они это увидели, нужно перестать думать о датах в календаре и начать думать о **геометрии**.
|
||||||
|
|
||||||
|
Равноденствие — это не просто дата в телефоне. Это конкретное физическое положение Солнца на небе. Астрономы использовали гигантские соборы как **камеры-обскуры**.
|
||||||
|
|
||||||
|
Вот как именно это работало, по шагам:
|
||||||
|
|
||||||
|
### 1. Инструмент: Линия на полу (Меридиан)
|
||||||
|
Представь себе темный огромный собор (например, Санта-Мария-дель-Фьоре во Флоренции или Сан-Петронио в Болонье).
|
||||||
|
* Высоко в южной стене или в куполе пробито маленькое отверстие (оно называется **окулюс**).
|
||||||
|
* В полдень луч солнца проходит через дырочку и падает на пол.
|
||||||
|
* На полу начерчена длинная линия — **меридиан**.
|
||||||
|
|
||||||
|
### 2. Принцип «Солнечного ползунка»
|
||||||
|
В течение года Солнце меняет высоту над горизонтом:
|
||||||
|
* **Зимой** Солнце низко — луч падает **далеко** от стены (длинный угол).
|
||||||
|
* **Летом** Солнце высоко — луч падает **близко** к стене (почти под ноги).
|
||||||
|
* **Равноденствие** — это золотая середина. Геометрически это момент, когда Солнце находится ровно на небесном экваторе.
|
||||||
|
|
||||||
|
Астрономы заранее рассчитали и отметили на полу точкой место: **«Сюда должен упасть луч в момент равноденствия»**. Эту точку можно рассчитать чистой геометрией, зная широту города и высоту дырочки в потолке. Календарь для этого не нужен.
|
||||||
|
|
||||||
|
### 3. Момент истины (Наблюдение)
|
||||||
|
И вот наступает 1582 год (условно). Церковь говорит: «Равноденствие должно быть **21 марта** (как установил Никейский собор)».
|
||||||
|
|
||||||
|
Астроном приходит в собор, смотрит на пол и видит страшное:
|
||||||
|
1. **11 марта** (по старому календарю) солнечный зайчик **уже** попал ровно на отметку равноденствия!
|
||||||
|
2. А **21 марта**, когда по календарю «должно быть» равноденствие, солнечный зайчик уже уполз далеко в сторону лета.
|
||||||
|
|
||||||
|
### Что это означало?
|
||||||
|
Это означало, что **реальное небо обогнало календарь**.
|
||||||
|
Пока календарь медленно «тикал», отсчитывая свои длинные 365,25 дней, реальное Солнце уже успело сделать полный круг быстрее и вернулось в точку весы.
|
||||||
|
|
||||||
|
Разница составила ровно эти 10 дней. Солнце «пришло» в точку назначения 11-го числа, а календарь утверждал, что ждать нужно до 21-го.
|
||||||
|
|
||||||
|
### Почему это вообще кого-то волновало?
|
||||||
|
Дело было не в любви к науке, а в **Пасхе**.
|
||||||
|
Пасха вычисляется как «первое воскресенье после полнолуния, следующего за весенним равноденствием».
|
||||||
|
Из-за того, что равноденствие "уехало" на 10 дней, церковь рисковала начать праздновать Пасху не в тот день, нарушив божественный порядок. Это считалось серьезным грехом. Именно страх "неправильной Пасхи" заставил Папу Римского послушать астрономов и выкинуть 10 дней из жизни Европы, чтобы синхронизировать "зайчик на полу" с датой "21 марта".
|
||||||
|
|
||||||
|
|
||||||
|
Самая длинная (и самая радикальная) синхронизация произошла не при переходе на григорианский календарь, а гораздо раньше — при введении того самого **Юлианского календаря** (который потом пришлось исправлять Папе Григорию).
|
||||||
|
|
||||||
|
Этот рекорд принадлежит **46 году до нашей эры**. Его официально называют:
|
||||||
|
|
||||||
|
### **Ultimus Annus Confusionis** («Последний год неразберихи»)
|
||||||
|
|
||||||
|
Этот год длился **445 дней**!
|
||||||
|
|
||||||
|
### Предыстория хаоса
|
||||||
|
До Юлия Цезаря римский календарь был лунно-солнечным и совершенно безумным. Год длился 355 дней, а чтобы не отставать от сезонов, жрецы (понтифики) должны были вручную вставлять дополнительный месяц — *Мерцедоний*.
|
||||||
|
Но жрецы были коррумпированы. Они использовали календарь как политическое оружие:
|
||||||
|
* Если у власти «свой» консул — они удлиняли год, чтобы он дольше правил.
|
||||||
|
* Если «чужой» или нужно быстрее собрать налоги — они год сокращали.
|
||||||
|
* Из-за гражданских войн о календаре вообще забыли на несколько лет.
|
||||||
|
|
||||||
|
В итоге к моменту прихода Цезаря к власти календарь отстал от сезонов на **3 месяца**. Праздник жатвы (осень) приходился на календарное лето, а зимние праздники — на весну.
|
||||||
|
|
||||||
|
### Решение Цезаря (с помощью египетского астронома Созигена)
|
||||||
|
Цезарь решил раз и навсегда привязать календарь к Солнцу (взяв за основу египетский опыт, где год был 365.25 дней). Но сначала нужно было «вернуть» календарь в правильный сезон.
|
||||||
|
|
||||||
|
Для этого в 46 году до н. э. Цезарь добавил:
|
||||||
|
1. Обычный вставочный месяц Мерцедоний (23 дня) в феврале.
|
||||||
|
2. **И еще два специальных месяца** (суммарно 67 дней) между ноябрем и декабрем.
|
||||||
|
|
||||||
|
В сумме год растянулся до **15 месяцев** и **445 дней**.
|
||||||
|
|
||||||
|
### Каково было людям?
|
||||||
|
Это был самый длинный год в истории человечества.
|
||||||
|
* Официальные лица, назначенные на год, правили почти полтора года.
|
||||||
|
* Все контракты, аренды и сроки выплат сместились.
|
||||||
|
* Зато 1 января 45 года до н.э. наконец-то совпало с реальным началом солнечного года (в понимании римлян), и сезоны встали на свои места.
|
||||||
|
|
||||||
|
После этого 45 год до н.э. стал первым «нормальным» годом по юлианскому стилю, который просуществовал без изменений более 1600 лет, пока не накопил ту самую ошибку в 10 дней, которую исправлял Григорий XIII.
|
||||||
|
|
||||||
|
Так что «потерянные 10 дней» — это просто мелочь по сравнению с годом, который длился 445 дней
|
||||||
|
|
||||||
|
$1.3 \text{ МБ} / 8 \approx 160 \text{ КБ}$
|
||||||
153
lifestyle?/pantheon_phrases.txt
Normal file
153
lifestyle?/pantheon_phrases.txt
Normal file
|
|
@ -0,0 +1,153 @@
|
||||||
|
"The world moves as the heavens lie still."
|
||||||
|
"Мир меняется, а небеса остаются прежними "
|
||||||
|
|
||||||
|
"A clashing of steel, I have heard it all go silent."
|
||||||
|
"Oднажды я слышал как звон клинков затих!"
|
||||||
|
|
||||||
|
"There are no enemies, no allies, only those about to die."
|
||||||
|
"Нет врагов, нет союзников, только те, кто вот-вот умрёт."
|
||||||
|
|
||||||
|
"Glory fades into bloodstains. From the skies they see war, but on earth there is only carnage."
|
||||||
|
"Слава тускнеет под пятнами крови. Боги на небесах находят войну прекрасной. А для нас на земле это бессмысленная бойня."
|
||||||
|
|
||||||
|
"We cry out to the heavens, and they answer in wing and flame."
|
||||||
|
"Мы взываем к небесам, и они отвечают крылом и пламенем."
|
||||||
|
|
||||||
|
"There is no pity, no mercy. Life was always a war."
|
||||||
|
"Нет ни жалости, ни сострадания. Жизнь всегда была войной."
|
||||||
|
|
||||||
|
"We live our lives in the shadow caused by a mountain. We are caught between darken and aspect. But we will rise up in spite of them."
|
||||||
|
"Гора отбрасывает тень на наши жизни. Смертные оказались в ловушке между Сущностями и Даркинами, но мы одолеем и тех и других!"
|
||||||
|
|
||||||
|
"I sought power on Targon's peak, only to find it within."
|
||||||
|
"Я искал силу на вершине Таргона, но нашёл её в своём сердце."
|
||||||
|
|
||||||
|
"They are called gods, but when they die you cannot hear their howls above the wind."
|
||||||
|
"Они назвают себя богами! Но когда они умирают память о них уносит ветер! "
|
||||||
|
|
||||||
|
"The earth is beneath me. The power of these gods is but an echo of our own."
|
||||||
|
"Земля подо мной. Сила богов - всего лишь отражение нашей силы!"
|
||||||
|
|
||||||
|
"Pressing forward is not the same as running from your mistakes."
|
||||||
|
"Стремиться вперёд – не значит бежать от ошибок."
|
||||||
|
|
||||||
|
"We are what we overcome. Because we fall, the climb must be our destination."
|
||||||
|
"Мы — то, что мы преодолеваем. Жизнь это падение. Мы должны карабкаться вверх изо всех сил"
|
||||||
|
|
||||||
|
"The people cry out for strength that is already theirs."
|
||||||
|
"Смертные просят богов о силе, которая у них уже есть!"
|
||||||
|
|
||||||
|
"I cast my excuses into the dirt."
|
||||||
|
"Я выбросил свои оправдания в грязь."
|
||||||
|
|
||||||
|
"The art of war is healing your heart beating knowing you are alive. It is not why I fight, but who I fight for."
|
||||||
|
"Искусство войны — это исцелять своё сердце, зная, что ты жив. Это не причина, по которой я сражаюсь, а тот, за кого я сражаюсь."
|
||||||
|
|
||||||
|
"Unbroken until my spear does. I will not surrender."
|
||||||
|
"Несокрушимый, пока моё копьё не сломается. Я не сдамся!"
|
||||||
|
|
||||||
|
"I bury the regretting of brave along with my name."
|
||||||
|
"Я похоронил сожаления, вместе с моим именем."
|
||||||
|
|
||||||
|
"I wilt by faith as a weapon heavier than my spear is the weight of only one life behind me."
|
||||||
|
"Я держусь верой, ибо оружие веры тяжелее моего копья — это вес единственной жизни за моей спиной."
|
||||||
|
|
||||||
|
"Eliza farm I wonder if there is bread above the hearth and if I will ever return."
|
||||||
|
"Ферма Элизабет... Я задаюсь вопросом, есть ли хлеб над очагом, и вернусь ли я туда когда-нибудь."
|
||||||
|
|
||||||
|
"Willpower sets my spear alight. The past marches with me — a legion of one."
|
||||||
|
"Моя воля даёт силу копью! Прошлое идёт со мной — легион из одного."
|
||||||
|
|
||||||
|
"I wear a helmet so that I am only a soldier. Speared sheet a pantheon."
|
||||||
|
"Мне нужен шлем, ведь я обычный воин.. Копьё и щит — вот мой пантеон."
|
||||||
|
|
||||||
|
"If they kill me at least I die a man."
|
||||||
|
"Если они меня убьют, я хотя бы умру человеком."
|
||||||
|
|
||||||
|
"Brother — what is resting beneath? Wait. Son of battles a thousand times lost. I know who I am and I will show the gods what I can become."
|
||||||
|
"Я брат воинов спящих под пшеничным полем, Я сын сотни проигранных битв! Я покажу богам кто я! И кем могу стать!"
|
||||||
|
|
||||||
|
"I will carve my scars into the heads even impaled on a blade I will press forward."
|
||||||
|
"Я вырежу свои шрамы на их черепах. Даже пронзённый мечом, я не отступлю."
|
||||||
|
|
||||||
|
"I am the tip of the spear raised against surrender. The blows of gods cannot shatter the world if they strike me instead."
|
||||||
|
"Я – остриё копья, направленного против слабости! Удары богов не разрушат мир, если они попадут по мне."
|
||||||
|
|
||||||
|
"I do not set the pace my race against it. The beyond can have me when I am done."
|
||||||
|
"Я не задаю темп. Я стремлюсь обогнать его. Пусть потустороннее забирает меня, когда я закончу."
|
||||||
|
|
||||||
|
"We must all find our place — being cast down so I could rise once more. I have found my limit the thousand times and still I press further."
|
||||||
|
"У каждого своё предназначение. Мой удел – быть поверженным, чтобы подниматься вновь. Я тысячу раз доходил до предела и продолжал двигаться дальше."
|
||||||
|
|
||||||
|
"The stars are beyond my reach, and so I grasp my spear and take aim."
|
||||||
|
"Рукой до звёзд не достать, поэтому я целюсь в них копьём."
|
||||||
|
|
||||||
|
"When I look to the mountain's peak in my mind, I have already fallen. And so I climb."
|
||||||
|
"Когда я смотрю на вершину горы в своём уме, я уже упавший. И потому я восхожу."
|
||||||
|
|
||||||
|
"Shields defend hearts both yours and those beside you."
|
||||||
|
"Щит защищает твое сердце и сердца тех кто рядом"
|
||||||
|
|
||||||
|
"We are privileged to breathe to taste the air that is the last gasp of all who have died before us."
|
||||||
|
"Мы обладаем привилегией дышать, вкушая воздух, который был последним вздохом тех, кто умер до нас."
|
||||||
|
|
||||||
|
"If they bleed, I will call them sister or brother. We bleed into the same earth and bleed we must."
|
||||||
|
"Все смертные – мои братья и сёстры. Мы кровоточим в одну и ту же землю, и кровоточить нам нужно."
|
||||||
|
|
||||||
|
"I will remember your name and shout it at all the heavens."
|
||||||
|
"Я запомню твоё имя и прокричу его небесам."
|
||||||
|
|
||||||
|
"Epple for eons the best climbers know how to fall."
|
||||||
|
"На протяжении веков лучшие восходители знают, как падать."
|
||||||
|
|
||||||
|
"How much further could we merge if we were not forced to carry our fears?"
|
||||||
|
"Мы шагали бы куда быстрее, если б не тащили бремя страха."
|
||||||
|
|
||||||
|
"Outback's death is the only thing that ever embraced me."
|
||||||
|
"Смерть на дальней дороге — единственное, что когда-либо обнимало меня."
|
||||||
|
|
||||||
|
"After every defeat I ran around the mountain until even shame could not keep up. But from death comes life."
|
||||||
|
"После каждого поражения и оббежал вокруг горы, пока даже стыд не оставался позади. Но из смерти возникает жизнь."
|
||||||
|
|
||||||
|
"I am NOT the Pantheon you know. I am no more than a soldier and no less. the God died The man lives."
|
||||||
|
"Я НЕ тот Пантеон, которого вы знаете. Я – воин! Ни больше, ни меньше. Бог умер. Человек выжил."
|
||||||
|
|
||||||
|
"While you bow to the Sun, my spear finds your neck."
|
||||||
|
"Пока ты кланяешься солнцу, моё копьё пронзит твою шею!"
|
||||||
|
|
||||||
|
"Onward — the spear points in only one direction."
|
||||||
|
"Вперёд — копьё указывает только в одном направлении."
|
||||||
|
|
||||||
|
"Everything or nothing!"
|
||||||
|
"Всё или ничего!"
|
||||||
|
|
||||||
|
"Let this day be legend!"
|
||||||
|
"Пусть этот день станет легендой!"
|
||||||
|
|
||||||
|
"I will turn their travails' power against them. Drive it deep beneath scale this I promise here ends the age of dragons."
|
||||||
|
"Я обратлю их испытания против них. Загоню это глубоко под чешую. Обещаю — здесь заканчивается эра драконов."
|
||||||
|
|
||||||
|
"Let fear make you world. Do not give up — you will not fail if it is worth it."
|
||||||
|
"Пусть страх создаёт твой мир. Не сдавайся — ты не провалишься, если это того стоит."
|
||||||
|
|
||||||
|
"Battle is adults and the fortunate find their partner. Strike now, strike harder!"
|
||||||
|
"Битва — это для взрослых, и счастливцы находят своих партнёров. Бей сейчас, бей сильнее!"
|
||||||
|
|
||||||
|
"No mercy for a strong! Fight because you lost all things and keep fighting!"
|
||||||
|
"Никакой пощады сильному! Сражайся, потому что ты потерял всё, и продолжай сражаться!"
|
||||||
|
|
||||||
|
"Into legend! I fight until the blood takes the spear from my grasp until I can only crawl."
|
||||||
|
"В легенды! Я сражаюсь, пока кровь не вырвала копьё из моих рук, пока я не смогу только ползти."
|
||||||
|
|
||||||
|
"And David man you will not defeat me even then I will spit in your face!"
|
||||||
|
"И Дэвид, мужчина, ты не победишь меня даже тогда — я плевать буду тебе в лицо!"
|
||||||
|
|
||||||
|
"How many times must I die before I learn to live? How you die is who you are!"
|
||||||
|
"Сколько раз мне нужно умереть, чтобы научиться жить? Как ты умираешь — это кто ты есть!"
|
||||||
|
|
||||||
|
"I stand back up and never be defeated!"
|
||||||
|
"Я поднимаюсь и никогда не буду побеждён!"
|
||||||
|
|
||||||
|
"I call upon the Stars to bake my bountiful bread fresh from my bakery my secret dream."
|
||||||
|
"Я призываю звёзды испечь для меня пышный хлеб свежий из моей пекарни — мой тайный мечте."
|
||||||
|
|
||||||
367
lifestyle?/pantheon_phrases_ru.txt
Normal file
367
lifestyle?/pantheon_phrases_ru.txt
Normal file
|
|
@ -0,0 +1,367 @@
|
||||||
|
ДВИЖЕНИЕ:
|
||||||
|
Пока есть жизнь, будут и те кто ее защищает
|
||||||
|
|
||||||
|
ПЕРВАЯ ВСТРЕЧА ЛЮБОГО:
|
||||||
|
Мы все проливаем кровь, так велит долг
|
||||||
|
|
||||||
|
ДВИЖЕНИЕ:
|
||||||
|
Если меня убьют, я хотя бы умру человеком.
|
||||||
|
|
||||||
|
ВОЗВРАЩЕНИЕ:
|
||||||
|
На горной вершине, нельзя отступать иначе полетишь вниз
|
||||||
|
|
||||||
|
ПЕРВАЯ ВСТРЕЧА С ЗОИ:
|
||||||
|
Самозваное божество захватило тело ребенка? Как это низко!
|
||||||
|
|
||||||
|
ПЕРВАЯ ВСТРЕЧА С АУРЕЛИОНОМ СОЛОМ:
|
||||||
|
Я не тот Пантеон которого ты помнишь, твар, я смертный Атрей и я отрублю голову дракону!
|
||||||
|
|
||||||
|
АТАКА:
|
||||||
|
Копье и щит - вот мой пантеон!
|
||||||
|
|
||||||
|
ДВИЖЕНИЕ:
|
||||||
|
Сила богов - всего лишь отражение нашей силы!
|
||||||
|
|
||||||
|
ПЕРВАЯ ВСТРЕЧА С ААТРОКСОМ:
|
||||||
|
Аатрокс, губитель мира, ти знаешь, что смерть пораждает жизнь!
|
||||||
|
*Поднимает стакан*
|
||||||
|
|
||||||
|
ДВИЖЕНИЕ:
|
||||||
|
Мир меняется, а небеса остаются прежними
|
||||||
|
|
||||||
|
ДВИЖЕНИЕ ДАЛЕКО:
|
||||||
|
Смертные оказались в ловушке между Сущностями и Даркинами, но мы одолеем и тех и других!
|
||||||
|
|
||||||
|
УБИЙСТВО АСПЕКТА:
|
||||||
|
Все когда-нибудь заканчивается!
|
||||||
|
|
||||||
|
ДВИЖЕНИЕ ДАЛЕКО:
|
||||||
|
После каждого поражения и оббежал вокруг горы, пока даже стыд не оставался позади.
|
||||||
|
|
||||||
|
УБИЙСТВО АСПЕКТА:
|
||||||
|
Только острие копья развеет пелену смертности
|
||||||
|
|
||||||
|
ПЕРВАЯ ВСТРЕЧА С АСПЕКТОМ/ДАРКИНОМ
|
||||||
|
Божествам нужны рабы и они нашли тебя
|
||||||
|
|
||||||
|
ДВИЖЕНИЕ:
|
||||||
|
Прошлое сражается на моей стороне
|
||||||
|
|
||||||
|
АТАКА:
|
||||||
|
Войди в историю!
|
||||||
|
|
||||||
|
ДВИЖЕНИЕ:
|
||||||
|
Нет ни жалости, ни сострадания
|
||||||
|
|
||||||
|
ПЕРВАЯ ВСТРЕЧА С ИЛЛАОЙ
|
||||||
|
Ты проповедуешь движение, а сама вешаешь на души якорь!
|
||||||
|
|
||||||
|
ВОЗРОЖДЕНИЕ:
|
||||||
|
Я не сдамся!
|
||||||
|
|
||||||
|
ДВИЖЕНИЕ:
|
||||||
|
Смертные просят богов о силе, которая у них уже есть!
|
||||||
|
|
||||||
|
ПЕРВАЯ ВСТРЕЧА С АСПЕКТОМ/ДАРКИНОМ:
|
||||||
|
Паразит!
|
||||||
|
|
||||||
|
ПЕРВОЕ ДВИЖЕНИЕ В МАТЧЕ:
|
||||||
|
Они назвают себя богами! Но когда они умирают память о них уносит ветер!
|
||||||
|
|
||||||
|
ДВИЖЕНИЕ:
|
||||||
|
Oднажды я слышал как звон клинков затих!
|
||||||
|
|
||||||
|
АТАКА:
|
||||||
|
Не Сдавайся!
|
||||||
|
|
||||||
|
ПЕРВОЕ ДВИЖЕНИЕ В МАТЧЕ:
|
||||||
|
Я брат воинов спящих под пшеничным полем, Я сын
|
||||||
|
сотни проигранных бытв! Я покажу богам кто я! И кем могу стать!
|
||||||
|
|
||||||
|
УБИЙСТВО ЧЕМПИОНА:
|
||||||
|
Твоя смерть определяет тебя
|
||||||
|
|
||||||
|
|
||||||
|
ПЕРВАЯ ВСТРЕЧА С АСПЕКТОМ/ДАРКИНОМ:
|
||||||
|
Я - щит, укрывающей мир смертных от глупости богов и даркинов
|
||||||
|
|
||||||
|
ПЕРВАЯ ВСТРЕЧА С ЛЕОНОЙ:
|
||||||
|
Прячься за своей верой и за мантиями
|
||||||
|
жрецов, Солари.
|
||||||
|
|
||||||
|
ПЕРВОЕ ДВИЖЕНИЕ В МАТЧЕ (Аатрокс во вражеской команде):
|
||||||
|
Аатрокс убивал богов, а теперь пусть сразится с чебуреком!
|
||||||
|
|
||||||
|
АТАКА:
|
||||||
|
Страх придает храбрости!
|
||||||
|
|
||||||
|
ВОЗВРАЩЕНИЕ:
|
||||||
|
Кто умеет карабкаться - тот не боится падать
|
||||||
|
|
||||||
|
ВСТРЕЧА С ГАРЕНОМ ИЛИ КАТАРИНОЙ:
|
||||||
|
Битва - это танец. Если повезет, найдешь достойного
|
||||||
|
партнера
|
||||||
|
|
||||||
|
ДВИЖЕНИЕ:
|
||||||
|
Мы - то что мы преодолеваем
|
||||||
|
|
||||||
|
ПЕРВОЕ ДВИЖЕНИЕ В МАТЧЕ:
|
||||||
|
Небеса боятся меня не потому, что я божество. Они боятся меня, потому что я - человек!
|
||||||
|
|
||||||
|
ДВИЖЕНИЕ:
|
||||||
|
Жизнь это падение. Мы должны карабкаться вверх изо всех сил
|
||||||
|
|
||||||
|
ДВИЖЕНИЕ ДАЛЕКО:
|
||||||
|
Тот, кто вкусил яд богов, вкладывает всю горечь в слова
|
||||||
|
|
||||||
|
ПЕРВОЕ ДВИЖЕНИЕ В МАТЧЕ:
|
||||||
|
Щит защищает твое сердце и сердца тех кто рядом
|
||||||
|
|
||||||
|
ПЕРВАЯ ВСТРЕЧА С КАИНОМ:
|
||||||
|
Кто из вас лишний, Каин? Ты, или твоё оружие?
|
||||||
|
|
||||||
|
ДВИЖЕНИЕ:
|
||||||
|
Враждовать бессмысленно. Мы должны объединиться перед лицом смерти.
|
||||||
|
|
||||||
|
ПЕРВОЕ ДВИЖЕНИЕ В МАТЧЕ:
|
||||||
|
Я буду сражаться, пока не рухну на колени...пока скользкое от крови копьё не выпадет из рук! Но и тогда вам не одолеть меня. Я плюну вам в лицо.
|
||||||
|
|
||||||
|
ДВИЖЕНИЕ ДАЛЕКО:
|
||||||
|
Мы шагали бы куда быстрее, если б не тащили бремя страха.
|
||||||
|
|
||||||
|
ДВИЖЕНИЕ ДАЛЕКО:
|
||||||
|
Когда мы вдыхаем, мы должны помнить, что пьём предсмертные вздохи погибших до нас.
|
||||||
|
|
||||||
|
ПЕРВАЯ ВСТРЕЧА С ЛЕОНОЙ:
|
||||||
|
Не прячься под бронёй, Леона! Ты сильнее Сущности!
|
||||||
|
|
||||||
|
ДВИЖЕНИЕ:
|
||||||
|
*Плевок* Я не придумываю оправданий.
|
||||||
|
|
||||||
|
АТАКА:
|
||||||
|
Победить можно только себя.
|
||||||
|
|
||||||
|
ДВИЖЕНИЕ ДАЛЕКО:
|
||||||
|
Рукой до звёзд не достать, поэтому я целюсь в них копьём.
|
||||||
|
|
||||||
|
ВОЗВРАЩЕНИЕ:
|
||||||
|
Я искал силу на вершине Таргона, но нашёл её в своём сердце.
|
||||||
|
|
||||||
|
ДВИЖЕНИЕ:
|
||||||
|
Я похоронил сожаления, вместе с моим именем.
|
||||||
|
|
||||||
|
УБИЙСТВО ЧЕМПИОНА:
|
||||||
|
Слава тускнеет под пятнами крови.
|
||||||
|
|
||||||
|
УБИЙСТВО ЧЕМПИОНА:
|
||||||
|
Вставай и сразись со мной снова!
|
||||||
|
|
||||||
|
ДВИЖЕНИЕ ДАЛЕКО:
|
||||||
|
Сумерки богов приходят каждое утро, когда наш мир сияет ярче звёзд.
|
||||||
|
|
||||||
|
АТАКА:
|
||||||
|
За каждым ударом сердца – удар копья!
|
||||||
|
|
||||||
|
ДВИЖЕНИЕ:
|
||||||
|
Воин должен слушать биение собственного сердца, чтобы чувствовать, что он жив.
|
||||||
|
|
||||||
|
ПЕРВАЯ ВСТРЕЧА С АТРОКСОМ:
|
||||||
|
Сила, к которой ты стремился, сгубила тебя, Атрокс. Глупо было ждать иной участи!
|
||||||
|
|
||||||
|
ВОЗРОЖДЕНИЕ:
|
||||||
|
Бог умер. Человек выжил.
|
||||||
|
|
||||||
|
ПЕРВАЯ ВСТРЕЧА С ДАРКИНОМ/АСПЕКТОМ:
|
||||||
|
Мне плевать, Даркин ты или Сущность!
|
||||||
|
|
||||||
|
ДВИЖЕНИЕ ДАЛЕКО:
|
||||||
|
Моё копьё тяжело, но жизнь ещё тяжело.
|
||||||
|
|
||||||
|
ДВИЖЕНИЕ ДАЛЕКО:
|
||||||
|
У каждого своё предназначение. Мой удел – быть поверженным, чтобы подниматься вновь.
|
||||||
|
|
||||||
|
УБИЙСТВО АТРОКСА:
|
||||||
|
В предсмертном крике даркина боль всех погубленных смертных.
|
||||||
|
|
||||||
|
ДВИЖЕНИЕ:
|
||||||
|
Даже пронзённый мечом, я не отступлю.
|
||||||
|
|
||||||
|
ДВИЖЕНИЕ ДАЛЕКО:
|
||||||
|
Месть холодна, но на горной вершине она бесполезна.
|
||||||
|
|
||||||
|
АТАКА:
|
||||||
|
Где твой боевой клич?
|
||||||
|
|
||||||
|
АТАКА:
|
||||||
|
Я несокрушим!
|
||||||
|
|
||||||
|
АТАКА:
|
||||||
|
Я один стою армии!
|
||||||
|
|
||||||
|
ВОЗРОЖДЕНИЕ:
|
||||||
|
(смех) Сколько раз нужно умереть, чтобы научиться жить?
|
||||||
|
|
||||||
|
ШУТКА:
|
||||||
|
УААААА! С пылу, с жару. Мечтаю открыть пекарню!
|
||||||
|
|
||||||
|
ДВИЖЕНИЕ:
|
||||||
|
Гора отбрасывает тень на наши жизни.
|
||||||
|
|
||||||
|
ПЕРВОЕ ДВИЖЕНИЕ В МАТЧЕ:
|
||||||
|
Меня зовут Воин. Клянусь своим копьём, я покажу им, что такое война!
|
||||||
|
|
||||||
|
АТАКА:
|
||||||
|
Жизнь – это война!
|
||||||
|
|
||||||
|
ПЕРВАЯ ВСТРЕЧА С ЛЕОНОЙ:
|
||||||
|
Пока ты кланяешься солнцу, моё копьё пронзит твою шею!
|
||||||
|
|
||||||
|
ШУТКА:
|
||||||
|
Я призываю звёзды испечь для меня пышный хлеб!
|
||||||
|
|
||||||
|
ДВИЖЕНИЕ:
|
||||||
|
Мне нужен шлем, ведь я обычный воин.
|
||||||
|
|
||||||
|
ПЕРВАЯ ВСТРЕЧА ЛЮБОГО:
|
||||||
|
За что ты сражаешься?
|
||||||
|
|
||||||
|
АТАКА:
|
||||||
|
Сражайся, это твой долг!
|
||||||
|
|
||||||
|
АТАКА:
|
||||||
|
Моя воля даёт силу копью!
|
||||||
|
|
||||||
|
ПЕРВАЯ ВСТРЕЧА С АУРЕЛИОН СОЛОМ:
|
||||||
|
Когда-то я вручал свою судьбу звёздам, теперь я доверяю только стали
|
||||||
|
|
||||||
|
ДВИЖЕНИЕ:
|
||||||
|
Я сражаюсь не за идею, а за людей.
|
||||||
|
|
||||||
|
ПЕРВАЯ ВСТРЕЧА ЛЮБОГО:
|
||||||
|
Сразись со мной.
|
||||||
|
|
||||||
|
ДВИЖЕНИЕ:
|
||||||
|
Только смерть приняла меня с распростёртыми объятиями.
|
||||||
|
|
||||||
|
АТАКА:
|
||||||
|
Ещё раз!
|
||||||
|
|
||||||
|
ДВИЖЕНИЕ:
|
||||||
|
Вперёд! Копьё указывает только в одном направлении.
|
||||||
|
|
||||||
|
АТАКА:
|
||||||
|
Не сдавайся!
|
||||||
|
|
||||||
|
ДВИЖЕНИЕ:
|
||||||
|
Все смертные – мои братья и сёстры.
|
||||||
|
|
||||||
|
АТАКА:
|
||||||
|
Собери волю в кулак и сражайся!
|
||||||
|
|
||||||
|
ДВИЖЕНИЕ:
|
||||||
|
Моя судьба – это моё оружие.
|
||||||
|
|
||||||
|
УБИЙСТВО ЧЕМПИОНА С ЩИТОМ:
|
||||||
|
Ты вернёшься домой на щите.
|
||||||
|
|
||||||
|
ВОЗРОЖДЕНИЕ:
|
||||||
|
Это не последнее поражение.
|
||||||
|
|
||||||
|
ПЕРВАЯ ВСТРЕЧА
|
||||||
|
Это божество сбежало из зверинца?
|
||||||
|
|
||||||
|
ДВИЖЕНИЕ:
|
||||||
|
Я тысячу раз доходил до предела и продолжал двигаться дальше.
|
||||||
|
|
||||||
|
ПЕРВАЯ ВСТРЕЧА С СОРАКОЙ:
|
||||||
|
Жаль, что твои сородичи не видят того же, что и ты, Сорака. Они забрали бы твою боль, как ты забираешь нашу.
|
||||||
|
|
||||||
|
ДВИЖЕНИЕ ДАЛЕКО:
|
||||||
|
Гора, на которую нужно взойти, не всегда высока. Хех...Это даже не всегда гора.
|
||||||
|
|
||||||
|
ПЕРВАЯ ВСТРЕ С ЛУНАРИ
|
||||||
|
Война – это наша судьба. Но лишь храбрейшие не бегут от неё. Я это понимаю, Лунари.
|
||||||
|
|
||||||
|
АТАКА:
|
||||||
|
Пока не затупится копьё!
|
||||||
|
|
||||||
|
ПЕРВАЯ ВСТРЕЧА С ЛУНАРИ
|
||||||
|
Лунари не нужно божество. Им нужен лидер!
|
||||||
|
|
||||||
|
ВОЗРОЖДЕНИЕ:
|
||||||
|
Я отправлюсь в мир иной, когда выполню свой долг в этом.
|
||||||
|
|
||||||
|
АТАКА:
|
||||||
|
Побеждай, если для тебя это важно!
|
||||||
|
|
||||||
|
УБИЙСТВО АСПЕКТА:
|
||||||
|
Звёзды лгут!
|
||||||
|
|
||||||
|
ДВИЖЕНИЕ:
|
||||||
|
Земля даёт мне опору.
|
||||||
|
|
||||||
|
АТАКА:
|
||||||
|
Я не жалею сильных!
|
||||||
|
|
||||||
|
ПЕРВАЯ ВСТРЕЧА С ВОЗНЁСШИМСЯ
|
||||||
|
Тебе хотелось стать богом, а они превратили тебя в ручную зверюшку.
|
||||||
|
|
||||||
|
ВОЗРОЖДЕНИЕ:
|
||||||
|
Восстань и не знай поражений.
|
||||||
|
|
||||||
|
НАСМЕШКА:
|
||||||
|
Я – воин! Ни больше, ни меньше.
|
||||||
|
|
||||||
|
АТАКА:
|
||||||
|
Всё или ничего!
|
||||||
|
|
||||||
|
АТАКА:
|
||||||
|
Стань легендой.
|
||||||
|
|
||||||
|
ДВИЖЕНИЕ ДАЛЕКО:
|
||||||
|
Суждено ли мне вернуться на ту ферму? Наверно, там сейчас пекут хлеб...
|
||||||
|
|
||||||
|
ПЕРВАЯ ВСТРЕЧА С ТАРИКОМ:
|
||||||
|
Не та ли это Сущность, которую когда-то все обожали?
|
||||||
|
|
||||||
|
УБИЙСТВО ЛЮБОГО:
|
||||||
|
Я запомню твоё имя и прокричу его небесам!
|
||||||
|
|
||||||
|
ДВИЖЕНИЕ ДАЛЕКО:
|
||||||
|
Когда гляжу на вершину горы, я представляю, что уже упал. И тогда восхождение меня не пугает.
|
||||||
|
|
||||||
|
АТАКА:
|
||||||
|
Бей! Сильнее!
|
||||||
|
|
||||||
|
ПЕРВОЕ ДВИЖЕНИЕ В МАТЧЕ:
|
||||||
|
Этот день войдёт в легенды.
|
||||||
|
|
||||||
|
ДВИЖЕНИЕ:
|
||||||
|
Стремиться вперёд – не значит бежать от ошибок.
|
||||||
|
|
||||||
|
ДВИЖЕНИЕ:
|
||||||
|
Я не задаю темп. Я стремлюсь обогнать его.
|
||||||
|
|
||||||
|
УБИЙСТВО АТРОКСА:
|
||||||
|
Сколько твоих сосудов мне придётся убить, Атрокс?
|
||||||
|
|
||||||
|
ДВИЖЕНИЕ:
|
||||||
|
Я – остриё копья, направленного против слабости!
|
||||||
|
|
||||||
|
АТАКА:
|
||||||
|
Тебя погубит собственная сила!
|
||||||
|
|
||||||
|
ПЕРВАЯ ВСТРЕЧА С АТРОКСОМ:
|
||||||
|
Ты готов утопить мир в крови, чтобы брызги долетели до небес?
|
||||||
|
|
||||||
|
ДВИЖЕНИЕ:
|
||||||
|
Я повторю узор своих шрамов на небе.
|
||||||
|
|
||||||
|
ПЕРВАЯ ВСТРЕЧА С КСИН ДЖАО:
|
||||||
|
Я получил это копьё, когда названый брат умер у меня на руках. А как ты заслужил своё, демасиец?
|
||||||
|
|
||||||
|
ДВИЖЕНИЕ:
|
||||||
|
Боги на небесах находят войну прекрасной. А для нас на земле это бессмысленная бойня.
|
||||||
|
|
||||||
|
УБИЙСТВО ТАРИКА:
|
||||||
|
Ты зовёшься Сущностью Заступника. Но защита нужна тебе самому!
|
||||||
Loading…
Add table
Add a link
Reference in a new issue