miller-robin

This commit is contained in:
Rorik Star Platinum 2025-12-12 21:49:18 +03:00
parent eda99760f3
commit 48f640b55d
10 changed files with 1291 additions and 1 deletions

View file

@ -4,3 +4,8 @@ straightforward - ![[Pasted image 20251105170221.png]]
contiguous - смежный
compassionate - сострадательный
wise - мудрый
$(a \cdot b) \pmod m$.

View 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

View file

@ -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
```

View file

@ -3,9 +3,11 @@ methods:
.to_lowercase()
.flat_map()
.par_iter()
.par_bridge()
.map()
.filter()
.fold()
.find()
.collect()
.copied()
.filter_map()
@ -13,11 +15,22 @@ methods:
.any()
.all()
.position()
.fetch_add()
.load()
.ends_with()
.enumerate()
.saturating_sub()
.try_fold()
crates:
use memchr::memmem;
traits:
AsRef<str>
PartialEq
```
|Префикс|Что делает (Технический смысл)|Пример|Стоимость (Cost)|

View file

@ -0,0 +1 @@
https://getcracked.io/questions

102
80-math/Untitled.md Normal file
View 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
View 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)

View 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{ КБ}$

View 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."
"Я призываю звёзды испечь для меня пышный хлеб свежий из моей пекарни — мой тайный мечте."

View file

@ -0,0 +1,367 @@
ДВИЖЕНИЕ:
Пока есть жизнь, будут и те кто ее защищает
ПЕРВАЯ ВСТРЕЧА ЛЮБОГО:
Мы все проливаем кровь, так велит долг
ДВИЖЕНИЕ:
Если меня убьют, я хотя бы умру человеком.
ВОЗВРАЩЕНИЕ:
На горной вершине, нельзя отступать иначе полетишь вниз
ПЕРВАЯ ВСТРЕЧА С ЗОИ:
Самозваное божество захватило тело ребенка? Как это низко!
ПЕРВАЯ ВСТРЕЧА С АУРЕЛИОНОМ СОЛОМ:
Я не тот Пантеон которого ты помнишь, твар, я смертный Атрей и я отрублю голову дракону!
АТАКА:
Копье и щит - вот мой пантеон!
ДВИЖЕНИЕ:
Сила богов - всего лишь отражение нашей силы!
ПЕРВАЯ ВСТРЕЧА С ААТРОКСОМ:
Аатрокс, губитель мира, ти знаешь, что смерть пораждает жизнь!
*Поднимает стакан*
ДВИЖЕНИЕ:
Мир меняется, а небеса остаются прежними
ДВИЖЕНИЕ ДАЛЕКО:
Смертные оказались в ловушке между Сущностями и Даркинами, но мы одолеем и тех и других!
УБИЙСТВО АСПЕКТА:
Все когда-нибудь заканчивается!
ДВИЖЕНИЕ ДАЛЕКО:
После каждого поражения и оббежал вокруг горы, пока даже стыд не оставался позади.
УБИЙСТВО АСПЕКТА:
Только острие копья развеет пелену смертности
ПЕРВАЯ ВСТРЕЧА С АСПЕКТОМ/ДАРКИНОМ
Божествам нужны рабы и они нашли тебя
ДВИЖЕНИЕ:
Прошлое сражается на моей стороне
АТАКА:
Войди в историю!
ДВИЖЕНИЕ:
Нет ни жалости, ни сострадания
ПЕРВАЯ ВСТРЕЧА С ИЛЛАОЙ
Ты проповедуешь движение, а сама вешаешь на души якорь!
ВОЗРОЖДЕНИЕ:
Я не сдамся!
ДВИЖЕНИЕ:
Смертные просят богов о силе, которая у них уже есть!
ПЕРВАЯ ВСТРЕЧА С АСПЕКТОМ/ДАРКИНОМ:
Паразит!
ПЕРВОЕ ДВИЖЕНИЕ В МАТЧЕ:
Они назвают себя богами! Но когда они умирают память о них уносит ветер!
ДВИЖЕНИЕ:
Oднажды я слышал как звон клинков затих!
АТАКА:
Не Сдавайся!
ПЕРВОЕ ДВИЖЕНИЕ В МАТЧЕ:
Я брат воинов спящих под пшеничным полем, Я сын
сотни проигранных бытв! Я покажу богам кто я! И кем могу стать!
УБИЙСТВО ЧЕМПИОНА:
Твоя смерть определяет тебя
ПЕРВАЯ ВСТРЕЧА С АСПЕКТОМ/ДАРКИНОМ:
Я - щит, укрывающей мир смертных от глупости богов и даркинов
ПЕРВАЯ ВСТРЕЧА С ЛЕОНОЙ:
Прячься за своей верой и за мантиями
жрецов, Солари.
ПЕРВОЕ ДВИЖЕНИЕ В МАТЧЕ (Аатрокс во вражеской команде):
Аатрокс убивал богов, а теперь пусть сразится с чебуреком!
АТАКА:
Страх придает храбрости!
ВОЗВРАЩЕНИЕ:
Кто умеет карабкаться - тот не боится падать
ВСТРЕЧА С ГАРЕНОМ ИЛИ КАТАРИНОЙ:
Битва - это танец. Если повезет, найдешь достойного
партнера
ДВИЖЕНИЕ:
Мы - то что мы преодолеваем
ПЕРВОЕ ДВИЖЕНИЕ В МАТЧЕ:
Небеса боятся меня не потому, что я божество. Они боятся меня, потому что я - человек!
ДВИЖЕНИЕ:
Жизнь это падение. Мы должны карабкаться вверх изо всех сил
ДВИЖЕНИЕ ДАЛЕКО:
Тот, кто вкусил яд богов, вкладывает всю горечь в слова
ПЕРВОЕ ДВИЖЕНИЕ В МАТЧЕ:
Щит защищает твое сердце и сердца тех кто рядом
ПЕРВАЯ ВСТРЕЧА С КАИНОМ:
Кто из вас лишний, Каин? Ты, или твоё оружие?
ДВИЖЕНИЕ:
Враждовать бессмысленно. Мы должны объединиться перед лицом смерти.
ПЕРВОЕ ДВИЖЕНИЕ В МАТЧЕ:
Я буду сражаться, пока не рухну на колени...пока скользкое от крови копьё не выпадет из рук! Но и тогда вам не одолеть меня. Я плюну вам в лицо.
ДВИЖЕНИЕ ДАЛЕКО:
Мы шагали бы куда быстрее, если б не тащили бремя страха.
ДВИЖЕНИЕ ДАЛЕКО:
Когда мы вдыхаем, мы должны помнить, что пьём предсмертные вздохи погибших до нас.
ПЕРВАЯ ВСТРЕЧА С ЛЕОНОЙ:
Не прячься под бронёй, Леона! Ты сильнее Сущности!
ДВИЖЕНИЕ:
*Плевок* Я не придумываю оправданий.
АТАКА:
Победить можно только себя.
ДВИЖЕНИЕ ДАЛЕКО:
Рукой до звёзд не достать, поэтому я целюсь в них копьём.
ВОЗВРАЩЕНИЕ:
Я искал силу на вершине Таргона, но нашёл её в своём сердце.
ДВИЖЕНИЕ:
Я похоронил сожаления, вместе с моим именем.
УБИЙСТВО ЧЕМПИОНА:
Слава тускнеет под пятнами крови.
УБИЙСТВО ЧЕМПИОНА:
Вставай и сразись со мной снова!
ДВИЖЕНИЕ ДАЛЕКО:
Сумерки богов приходят каждое утро, когда наш мир сияет ярче звёзд.
АТАКА:
За каждым ударом сердца удар копья!
ДВИЖЕНИЕ:
Воин должен слушать биение собственного сердца, чтобы чувствовать, что он жив.
ПЕРВАЯ ВСТРЕЧА С АТРОКСОМ:
Сила, к которой ты стремился, сгубила тебя, Атрокс. Глупо было ждать иной участи!
ВОЗРОЖДЕНИЕ:
Бог умер. Человек выжил.
ПЕРВАЯ ВСТРЕЧА С ДАРКИНОМ/АСПЕКТОМ:
Мне плевать, Даркин ты или Сущность!
ДВИЖЕНИЕ ДАЛЕКО:
Моё копьё тяжело, но жизнь ещё тяжело.
ДВИЖЕНИЕ ДАЛЕКО:
У каждого своё предназначение. Мой удел быть поверженным, чтобы подниматься вновь.
УБИЙСТВО АТРОКСА:
В предсмертном крике даркина боль всех погубленных смертных.
ДВИЖЕНИЕ:
Даже пронзённый мечом, я не отступлю.
ДВИЖЕНИЕ ДАЛЕКО:
Месть холодна, но на горной вершине она бесполезна.
АТАКА:
Где твой боевой клич?
АТАКА:
Я несокрушим!
АТАКА:
Я один стою армии!
ВОЗРОЖДЕНИЕ:
(смех) Сколько раз нужно умереть, чтобы научиться жить?
ШУТКА:
УААААА! С пылу, с жару. Мечтаю открыть пекарню!
ДВИЖЕНИЕ:
Гора отбрасывает тень на наши жизни.
ПЕРВОЕ ДВИЖЕНИЕ В МАТЧЕ:
Меня зовут Воин. Клянусь своим копьём, я покажу им, что такое война!
АТАКА:
Жизнь это война!
ПЕРВАЯ ВСТРЕЧА С ЛЕОНОЙ:
Пока ты кланяешься солнцу, моё копьё пронзит твою шею!
ШУТКА:
Я призываю звёзды испечь для меня пышный хлеб!
ДВИЖЕНИЕ:
Мне нужен шлем, ведь я обычный воин.
ПЕРВАЯ ВСТРЕЧА ЛЮБОГО:
За что ты сражаешься?
АТАКА:
Сражайся, это твой долг!
АТАКА:
Моя воля даёт силу копью!
ПЕРВАЯ ВСТРЕЧА С АУРЕЛИОН СОЛОМ:
Когда-то я вручал свою судьбу звёздам, теперь я доверяю только стали
ДВИЖЕНИЕ:
Я сражаюсь не за идею, а за людей.
ПЕРВАЯ ВСТРЕЧА ЛЮБОГО:
Сразись со мной.
ДВИЖЕНИЕ:
Только смерть приняла меня с распростёртыми объятиями.
АТАКА:
Ещё раз!
ДВИЖЕНИЕ:
Вперёд! Копьё указывает только в одном направлении.
АТАКА:
Не сдавайся!
ДВИЖЕНИЕ:
Все смертные мои братья и сёстры.
АТАКА:
Собери волю в кулак и сражайся!
ДВИЖЕНИЕ:
Моя судьба это моё оружие.
УБИЙСТВО ЧЕМПИОНА С ЩИТОМ:
Ты вернёшься домой на щите.
ВОЗРОЖДЕНИЕ:
Это не последнее поражение.
ПЕРВАЯ ВСТРЕЧА
Это божество сбежало из зверинца?
ДВИЖЕНИЕ:
Я тысячу раз доходил до предела и продолжал двигаться дальше.
ПЕРВАЯ ВСТРЕЧА С СОРАКОЙ:
Жаль, что твои сородичи не видят того же, что и ты, Сорака. Они забрали бы твою боль, как ты забираешь нашу.
ДВИЖЕНИЕ ДАЛЕКО:
Гора, на которую нужно взойти, не всегда высока. Хех...Это даже не всегда гора.
ПЕРВАЯ ВСТРЕ С ЛУНАРИ
Война это наша судьба. Но лишь храбрейшие не бегут от неё. Я это понимаю, Лунари.
АТАКА:
Пока не затупится копьё!
ПЕРВАЯ ВСТРЕЧА С ЛУНАРИ
Лунари не нужно божество. Им нужен лидер!
ВОЗРОЖДЕНИЕ:
Я отправлюсь в мир иной, когда выполню свой долг в этом.
АТАКА:
Побеждай, если для тебя это важно!
УБИЙСТВО АСПЕКТА:
Звёзды лгут!
ДВИЖЕНИЕ:
Земля даёт мне опору.
АТАКА:
Я не жалею сильных!
ПЕРВАЯ ВСТРЕЧА С ВОЗНЁСШИМСЯ
Тебе хотелось стать богом, а они превратили тебя в ручную зверюшку.
ВОЗРОЖДЕНИЕ:
Восстань и не знай поражений.
НАСМЕШКА:
Я воин! Ни больше, ни меньше.
АТАКА:
Всё или ничего!
АТАКА:
Стань легендой.
ДВИЖЕНИЕ ДАЛЕКО:
Суждено ли мне вернуться на ту ферму? Наверно, там сейчас пекут хлеб...
ПЕРВАЯ ВСТРЕЧА С ТАРИКОМ:
Не та ли это Сущность, которую когда-то все обожали?
УБИЙСТВО ЛЮБОГО:
Я запомню твоё имя и прокричу его небесам!
ДВИЖЕНИЕ ДАЛЕКО:
Когда гляжу на вершину горы, я представляю, что уже упал. И тогда восхождение меня не пугает.
АТАКА:
Бей! Сильнее!
ПЕРВОЕ ДВИЖЕНИЕ В МАТЧЕ:
Этот день войдёт в легенды.
ДВИЖЕНИЕ:
Стремиться вперёд не значит бежать от ошибок.
ДВИЖЕНИЕ:
Я не задаю темп. Я стремлюсь обогнать его.
УБИЙСТВО АТРОКСА:
Сколько твоих сосудов мне придётся убить, Атрокс?
ДВИЖЕНИЕ:
Я остриё копья, направленного против слабости!
АТАКА:
Тебя погубит собственная сила!
ПЕРВАЯ ВСТРЕЧА С АТРОКСОМ:
Ты готов утопить мир в крови, чтобы брызги долетели до небес?
ДВИЖЕНИЕ:
Я повторю узор своих шрамов на небе.
ПЕРВАЯ ВСТРЕЧА С КСИН ДЖАО:
Я получил это копьё, когда названый брат умер у меня на руках. А как ты заслужил своё, демасиец?
ДВИЖЕНИЕ:
Боги на небесах находят войну прекрасной. А для нас на земле это бессмысленная бойня.
УБИЙСТВО ТАРИКА:
Ты зовёшься Сущностью Заступника. Но защита нужна тебе самому!