diff --git a/00-english/vovabulary.md b/00-english/vovabulary.md index b24d2c8..edd9cb2 100644 --- a/00-english/vovabulary.md +++ b/00-english/vovabulary.md @@ -3,4 +3,9 @@ straightforward - ![[Pasted image 20251105170221.png]] contiguous - смежный -compassionate - сострадательный \ No newline at end of file +compassionate - сострадательный + +wise - мудрый + +$(a \cdot b) \pmod m$. + diff --git a/10-linux/10-kernel/init_swap.sh b/10-linux/10-kernel/init_swap.sh new file mode 100644 index 0000000..202608c --- /dev/null +++ b/10-linux/10-kernel/init_swap.sh @@ -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 diff --git a/10-linux/networking/README.md b/10-linux/networking/README.md index e69de29..ed6711d 100644 --- a/10-linux/networking/README.md +++ b/10-linux/networking/README.md @@ -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 +``` \ No newline at end of file diff --git a/20-dev/00-rust/20-dictionary/Untitled.md b/20-dev/00-rust/20-dictionary/Untitled.md index 2b7f078..194989d 100644 --- a/20-dev/00-rust/20-dictionary/Untitled.md +++ b/20-dev/00-rust/20-dictionary/Untitled.md @@ -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 + PartialEq + + ``` |Префикс|Что делает (Технический смысл)|Пример|Стоимость (Cost)| diff --git a/20-dev/README.md b/20-dev/README.md index e69de29..0049dde 100644 --- a/20-dev/README.md +++ b/20-dev/README.md @@ -0,0 +1 @@ +https://getcracked.io/questions \ No newline at end of file diff --git a/80-math/Untitled.md b/80-math/Untitled.md new file mode 100644 index 0000000..4fc4b60 --- /dev/null +++ b/80-math/Untitled.md @@ -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` — если нужно вращать элементы или рисовать на ``. +* **Интерполяция:** + * Кривые Безье (как работают `ease-in-out` анимации). + * Линейная интерполяция (Lerp) для плавных переходов цветов или позиций. +* **Матрицы трансформаций (CSS transform):** + * Понимание, как работает `matrix3d()` для 3D-эффектов в браузере. + +### Итог: Что учить в первую очередь? + +Учитывая твой профиль (Rust, Backend, Systems): +1. **Bitwise operations** (для низкоуровневых оптимизаций). +2. **Big O & Data Structures** (деревья, хэш-мапы — база бэкенда). +3. **Модульная арифметика** (для понимания криптографии и алгоритмов типа того же Миллера-Рабина). +4. **Статистика (перцентили)** — чтобы грамотно делать дашборды мониторинга для своих сервисов. \ No newline at end of file diff --git a/80-math/miller-rabin.md b/80-math/miller-rabin.md new file mode 100644 index 0000000..500478a --- /dev/null +++ b/80-math/miller-rabin.md @@ -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) diff --git a/90-history/about-calendar.md b/90-history/about-calendar.md new file mode 100644 index 0000000..a5e550c --- /dev/null +++ b/90-history/about-calendar.md @@ -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{ КБ}$ \ No newline at end of file diff --git a/lifestyle?/pantheon_phrases.txt b/lifestyle?/pantheon_phrases.txt new file mode 100644 index 0000000..6804f7b --- /dev/null +++ b/lifestyle?/pantheon_phrases.txt @@ -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." +"Я призываю звёзды испечь для меня пышный хлеб свежий из моей пекарни — мой тайный мечте." + diff --git a/lifestyle?/pantheon_phrases_ru.txt b/lifestyle?/pantheon_phrases_ru.txt new file mode 100644 index 0000000..d8e73f1 --- /dev/null +++ b/lifestyle?/pantheon_phrases_ru.txt @@ -0,0 +1,367 @@ +ДВИЖЕНИЕ: +Пока есть жизнь, будут и те кто ее защищает + +ПЕРВАЯ ВСТРЕЧА ЛЮБОГО: +Мы все проливаем кровь, так велит долг + +ДВИЖЕНИЕ: +Если меня убьют, я хотя бы умру человеком. + +ВОЗВРАЩЕНИЕ: +На горной вершине, нельзя отступать иначе полетишь вниз + +ПЕРВАЯ ВСТРЕЧА С ЗОИ: +Самозваное божество захватило тело ребенка? Как это низко! + +ПЕРВАЯ ВСТРЕЧА С АУРЕЛИОНОМ СОЛОМ: +Я не тот Пантеон которого ты помнишь, твар, я смертный Атрей и я отрублю голову дракону! + +АТАКА: +Копье и щит - вот мой пантеон! + +ДВИЖЕНИЕ: +Сила богов - всего лишь отражение нашей силы! + +ПЕРВАЯ ВСТРЕЧА С ААТРОКСОМ: +Аатрокс, губитель мира, ти знаешь, что смерть пораждает жизнь! +*Поднимает стакан* + +ДВИЖЕНИЕ: +Мир меняется, а небеса остаются прежними + +ДВИЖЕНИЕ ДАЛЕКО: +Смертные оказались в ловушке между Сущностями и Даркинами, но мы одолеем и тех и других! + +УБИЙСТВО АСПЕКТА: +Все когда-нибудь заканчивается! + +ДВИЖЕНИЕ ДАЛЕКО: +После каждого поражения и оббежал вокруг горы, пока даже стыд не оставался позади. + +УБИЙСТВО АСПЕКТА: +Только острие копья развеет пелену смертности + +ПЕРВАЯ ВСТРЕЧА С АСПЕКТОМ/ДАРКИНОМ +Божествам нужны рабы и они нашли тебя + +ДВИЖЕНИЕ: +Прошлое сражается на моей стороне + +АТАКА: +Войди в историю! + +ДВИЖЕНИЕ: +Нет ни жалости, ни сострадания + +ПЕРВАЯ ВСТРЕЧА С ИЛЛАОЙ +Ты проповедуешь движение, а сама вешаешь на души якорь! + +ВОЗРОЖДЕНИЕ: +Я не сдамся! + +ДВИЖЕНИЕ: +Смертные просят богов о силе, которая у них уже есть! + +ПЕРВАЯ ВСТРЕЧА С АСПЕКТОМ/ДАРКИНОМ: +Паразит! + +ПЕРВОЕ ДВИЖЕНИЕ В МАТЧЕ: +Они назвают себя богами! Но когда они умирают память о них уносит ветер! + +ДВИЖЕНИЕ: +Oднажды я слышал как звон клинков затих! + +АТАКА: +Не Сдавайся! + +ПЕРВОЕ ДВИЖЕНИЕ В МАТЧЕ: +Я брат воинов спящих под пшеничным полем, Я сын +сотни проигранных бытв! Я покажу богам кто я! И кем могу стать! + +УБИЙСТВО ЧЕМПИОНА: +Твоя смерть определяет тебя + + +ПЕРВАЯ ВСТРЕЧА С АСПЕКТОМ/ДАРКИНОМ: +Я - щит, укрывающей мир смертных от глупости богов и даркинов + +ПЕРВАЯ ВСТРЕЧА С ЛЕОНОЙ: +Прячься за своей верой и за мантиями +жрецов, Солари. + +ПЕРВОЕ ДВИЖЕНИЕ В МАТЧЕ (Аатрокс во вражеской команде): +Аатрокс убивал богов, а теперь пусть сразится с чебуреком! + +АТАКА: +Страх придает храбрости! + +ВОЗВРАЩЕНИЕ: +Кто умеет карабкаться - тот не боится падать + +ВСТРЕЧА С ГАРЕНОМ ИЛИ КАТАРИНОЙ: +Битва - это танец. Если повезет, найдешь достойного +партнера + +ДВИЖЕНИЕ: +Мы - то что мы преодолеваем + +ПЕРВОЕ ДВИЖЕНИЕ В МАТЧЕ: +Небеса боятся меня не потому, что я божество. Они боятся меня, потому что я - человек! + +ДВИЖЕНИЕ: +Жизнь это падение. Мы должны карабкаться вверх изо всех сил + +ДВИЖЕНИЕ ДАЛЕКО: +Тот, кто вкусил яд богов, вкладывает всю горечь в слова + +ПЕРВОЕ ДВИЖЕНИЕ В МАТЧЕ: +Щит защищает твое сердце и сердца тех кто рядом + +ПЕРВАЯ ВСТРЕЧА С КАИНОМ: +Кто из вас лишний, Каин? Ты, или твоё оружие? + +ДВИЖЕНИЕ: +Враждовать бессмысленно. Мы должны объединиться перед лицом смерти. + +ПЕРВОЕ ДВИЖЕНИЕ В МАТЧЕ: +Я буду сражаться, пока не рухну на колени...пока скользкое от крови копьё не выпадет из рук! Но и тогда вам не одолеть меня. Я плюну вам в лицо. + +ДВИЖЕНИЕ ДАЛЕКО: +Мы шагали бы куда быстрее, если б не тащили бремя страха. + +ДВИЖЕНИЕ ДАЛЕКО: +Когда мы вдыхаем, мы должны помнить, что пьём предсмертные вздохи погибших до нас. + +ПЕРВАЯ ВСТРЕЧА С ЛЕОНОЙ: +Не прячься под бронёй, Леона! Ты сильнее Сущности! + +ДВИЖЕНИЕ: +*Плевок* Я не придумываю оправданий. + +АТАКА: +Победить можно только себя. + +ДВИЖЕНИЕ ДАЛЕКО: +Рукой до звёзд не достать, поэтому я целюсь в них копьём. + +ВОЗВРАЩЕНИЕ: +Я искал силу на вершине Таргона, но нашёл её в своём сердце. + +ДВИЖЕНИЕ: +Я похоронил сожаления, вместе с моим именем. + +УБИЙСТВО ЧЕМПИОНА: +Слава тускнеет под пятнами крови. + +УБИЙСТВО ЧЕМПИОНА: +Вставай и сразись со мной снова! + +ДВИЖЕНИЕ ДАЛЕКО: +Сумерки богов приходят каждое утро, когда наш мир сияет ярче звёзд. + +АТАКА: +За каждым ударом сердца – удар копья! + +ДВИЖЕНИЕ: +Воин должен слушать биение собственного сердца, чтобы чувствовать, что он жив. + +ПЕРВАЯ ВСТРЕЧА С АТРОКСОМ: +Сила, к которой ты стремился, сгубила тебя, Атрокс. Глупо было ждать иной участи! + +ВОЗРОЖДЕНИЕ: +Бог умер. Человек выжил. + +ПЕРВАЯ ВСТРЕЧА С ДАРКИНОМ/АСПЕКТОМ: +Мне плевать, Даркин ты или Сущность! + +ДВИЖЕНИЕ ДАЛЕКО: +Моё копьё тяжело, но жизнь ещё тяжело. + +ДВИЖЕНИЕ ДАЛЕКО: +У каждого своё предназначение. Мой удел – быть поверженным, чтобы подниматься вновь. + +УБИЙСТВО АТРОКСА: +В предсмертном крике даркина боль всех погубленных смертных. + +ДВИЖЕНИЕ: +Даже пронзённый мечом, я не отступлю. + +ДВИЖЕНИЕ ДАЛЕКО: +Месть холодна, но на горной вершине она бесполезна. + +АТАКА: +Где твой боевой клич? + +АТАКА: +Я несокрушим! + +АТАКА: +Я один стою армии! + +ВОЗРОЖДЕНИЕ: +(смех) Сколько раз нужно умереть, чтобы научиться жить? + +ШУТКА: +УААААА! С пылу, с жару. Мечтаю открыть пекарню! + +ДВИЖЕНИЕ: +Гора отбрасывает тень на наши жизни. + +ПЕРВОЕ ДВИЖЕНИЕ В МАТЧЕ: +Меня зовут Воин. Клянусь своим копьём, я покажу им, что такое война! + +АТАКА: +Жизнь – это война! + +ПЕРВАЯ ВСТРЕЧА С ЛЕОНОЙ: +Пока ты кланяешься солнцу, моё копьё пронзит твою шею! + +ШУТКА: +Я призываю звёзды испечь для меня пышный хлеб! + +ДВИЖЕНИЕ: +Мне нужен шлем, ведь я обычный воин. + +ПЕРВАЯ ВСТРЕЧА ЛЮБОГО: +За что ты сражаешься? + +АТАКА: +Сражайся, это твой долг! + +АТАКА: +Моя воля даёт силу копью! + +ПЕРВАЯ ВСТРЕЧА С АУРЕЛИОН СОЛОМ: +Когда-то я вручал свою судьбу звёздам, теперь я доверяю только стали + +ДВИЖЕНИЕ: +Я сражаюсь не за идею, а за людей. + +ПЕРВАЯ ВСТРЕЧА ЛЮБОГО: +Сразись со мной. + +ДВИЖЕНИЕ: +Только смерть приняла меня с распростёртыми объятиями. + +АТАКА: +Ещё раз! + +ДВИЖЕНИЕ: +Вперёд! Копьё указывает только в одном направлении. + +АТАКА: +Не сдавайся! + +ДВИЖЕНИЕ: +Все смертные – мои братья и сёстры. + +АТАКА: +Собери волю в кулак и сражайся! + +ДВИЖЕНИЕ: +Моя судьба – это моё оружие. + +УБИЙСТВО ЧЕМПИОНА С ЩИТОМ: +Ты вернёшься домой на щите. + +ВОЗРОЖДЕНИЕ: +Это не последнее поражение. + +ПЕРВАЯ ВСТРЕЧА +Это божество сбежало из зверинца? + +ДВИЖЕНИЕ: +Я тысячу раз доходил до предела и продолжал двигаться дальше. + +ПЕРВАЯ ВСТРЕЧА С СОРАКОЙ: +Жаль, что твои сородичи не видят того же, что и ты, Сорака. Они забрали бы твою боль, как ты забираешь нашу. + +ДВИЖЕНИЕ ДАЛЕКО: +Гора, на которую нужно взойти, не всегда высока. Хех...Это даже не всегда гора. + +ПЕРВАЯ ВСТРЕ С ЛУНАРИ +Война – это наша судьба. Но лишь храбрейшие не бегут от неё. Я это понимаю, Лунари. + +АТАКА: +Пока не затупится копьё! + +ПЕРВАЯ ВСТРЕЧА С ЛУНАРИ +Лунари не нужно божество. Им нужен лидер! + +ВОЗРОЖДЕНИЕ: +Я отправлюсь в мир иной, когда выполню свой долг в этом. + +АТАКА: +Побеждай, если для тебя это важно! + +УБИЙСТВО АСПЕКТА: +Звёзды лгут! + +ДВИЖЕНИЕ: +Земля даёт мне опору. + +АТАКА: +Я не жалею сильных! + +ПЕРВАЯ ВСТРЕЧА С ВОЗНЁСШИМСЯ +Тебе хотелось стать богом, а они превратили тебя в ручную зверюшку. + +ВОЗРОЖДЕНИЕ: +Восстань и не знай поражений. + +НАСМЕШКА: +Я – воин! Ни больше, ни меньше. + +АТАКА: +Всё или ничего! + +АТАКА: +Стань легендой. + +ДВИЖЕНИЕ ДАЛЕКО: +Суждено ли мне вернуться на ту ферму? Наверно, там сейчас пекут хлеб... + +ПЕРВАЯ ВСТРЕЧА С ТАРИКОМ: +Не та ли это Сущность, которую когда-то все обожали? + +УБИЙСТВО ЛЮБОГО: +Я запомню твоё имя и прокричу его небесам! + +ДВИЖЕНИЕ ДАЛЕКО: +Когда гляжу на вершину горы, я представляю, что уже упал. И тогда восхождение меня не пугает. + +АТАКА: +Бей! Сильнее! + +ПЕРВОЕ ДВИЖЕНИЕ В МАТЧЕ: +Этот день войдёт в легенды. + +ДВИЖЕНИЕ: +Стремиться вперёд – не значит бежать от ошибок. + +ДВИЖЕНИЕ: +Я не задаю темп. Я стремлюсь обогнать его. + +УБИЙСТВО АТРОКСА: +Сколько твоих сосудов мне придётся убить, Атрокс? + +ДВИЖЕНИЕ: +Я – остриё копья, направленного против слабости! + +АТАКА: +Тебя погубит собственная сила! + +ПЕРВАЯ ВСТРЕЧА С АТРОКСОМ: +Ты готов утопить мир в крови, чтобы брызги долетели до небес? + +ДВИЖЕНИЕ: +Я повторю узор своих шрамов на небе. + +ПЕРВАЯ ВСТРЕЧА С КСИН ДЖАО: +Я получил это копьё, когда названый брат умер у меня на руках. А как ты заслужил своё, демасиец? + +ДВИЖЕНИЕ: +Боги на небесах находят войну прекрасной. А для нас на земле это бессмысленная бойня. + +УБИЙСТВО ТАРИКА: +Ты зовёшься Сущностью Заступника. Но защита нужна тебе самому! \ No newline at end of file