Ad-social Bot

Smmok Bot

Vkserfing Bot

Vkstorm Bot

Vktarget Bot

Все программы

Запись опубликована: 21.04.2024

Я скучаю по механикам из старых игр

Обновить

dalerank 25 минут назад

Время на прочтение12 мин

Количество просмотров371

За время существования индустрии разработки игр формул разных механик, способных развлечь нас, придумали не одну сотню. Что-то умерло засветившись в паре игр, что-то ушло со временем, какие-то существуют до сих пор. Есть и такие, которые не просто выжили, но стали мейнстримом, хотя только портят нервы игрокам. Игровой дизайн большинства старых игр, от второго фолыча до первого FarCry и пятью активными перками, пусть и не был вершиной искусства — затягивал не хуже современных песочниц с миллионом активностей. Редкую игру захочется пройти второй раз, а как вспомню, что на прохождение можно потратить под сотню и больше часов — думаю, а оно мне действительно было надо? Можно же было заняться чем-то более интересным. Я знаю, чем закончился второй фолыч, знаю это уже четвертый раз, но каждый раз игра удивляет меня чем-то новым. А вот нового «Аватара» бросил на половине, слишком много всего и все недоделанное, и прозрачные стены… просто бич игры. И тут вопрос, чего-то не хватает в этой раздутой, перекачанной сотней механик игре? Только задумайтесь — в аватаре больше сотни основных механик, которые влияют на окружение. Может в играх что-то потерялось? Хотя «потерялось» — звучит странно — за столько лет индустрия только создала просто море всего нового. Статья ориентирована на «побурчать», так что не ждите каких-то великих секретов и тонкостей мастерства.

Кросивое, и три квеста за пол игры :(

Кросивое, и три квеста за пол игры 🙁

Четкие цели

У всех игр (что я играл) где-то до конца 10-х была цель. Тот же Fallout 2(1998), Assassin’s Creed(2007), S.T.A.L.K.E.R(200x), не водит игрока за ручку, показывая маркером на карте, куда надо бежать. Скажу больше, вы сами пробуете понять куда идти, как выполнять квесты разговаривая с жителями, взламывая терминалы, читая заметки и дневники. И это интересно, погружает в лор игры покруче любых катсцен. А основная цель все равно всплывает в разговорах, какой бы квест не надо было выполнять. Мorrowind(2002), главный герой — перерождение легендарного героя Неревара, цель — выполнить пророчество и победить великого злодея — вампира Даготу, который планирует использовать какое-то старинное оружие массового поражения, это становится известно в первые пару часов игры. Что еще отличает эти игры, они давали возможность создавать собственные цели и добиваться их, и это было наиболее интересным времяпрепровождением. В 2009 появляется Minecraft, вот он наверное всех и сломал 🙂 поставив несюжетную составляющую игры во главу всего. И другие разработчики, хотели или не хотели, тащили эти идеи в свои игры, вот только не всегда это полезно.

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

Системный дизайн

Размытие или отсутствие целей в играх, привело к тому, что стало возможным делать игры неполностью, перейти на так называемый несистемный дизайн — это когда вы создаете механики в отрыве друг от друга, и надеетесь, что ближе к релизу оно срастется в одно целое.

Что выросло, то выросло

Что выросло, то выросло

Хороший системный дизайн конфликтует с dlc, потому что вам сразу надо сделать целостную игру, а dlc — самое злое, что могло случиться с индустрией. Но не путайте с сюжетными и покрасочными dlc, которые получились когда покатили фишки игры, потому что не успевали к релизу. Это относится к запланированному отрезанию частей, чтобы потом срубить еще деньжат после выхода, превращая полноценную игру в игру-сервис. Сама суть проблемы — разделение игру на такие части ломает игру, ломает сюжет, ломает механики, ломает активности. Зато это дает возможность выпускать «незаконченную» версию под видом полноценной игры, делая поток финансов более контролируемым и понятным во времени, это именно то, что надо менеджменту. В среднем игры с dlc зарабатывают в два раза больше денег на копию. Вы знаете сколько раз Fallout2 был под угрозой закрытия? Из официальных источников — 8. А может вам интересно сколько дополнений вышло для Fallout76? 7 крупных и больше сотни мелких. Несистемный дизайн позволяет делать игру частями, но при этом теряется целостность игры и её приходится делать проще. Простые игры, любого размера проще контролировать, студия дружно отчитывается о сделанных уровнях, все идет по плану, майлстоуны сдаются и бета версии играются — но «игры» нет, потому что там только половина игры, а вторая половина в dlc, которые будут выпущены после, генерируя контролируемый кеш-флоу.

Миссии и открытый мир

Эта потерянная механика вытекает из предыдущей, если нет системного дизайна и положенного на него сюжета, то вам не надо думать о создании интересных миссий. Где-то после начала 10-х разработчики почему-то решили, что создавать хорошо поставленные, интересные, продуманные и сложные миссии — это лишнее. А про двойное дно и серую мораль с разными концовками в квестах (в квестах, не в игре) и подавно забыли. Но взамен мы получили открытый мир и зачистку территорий. У вас прекрасный сюжет, прописанный конфликт и отличный нарратив? Давайте разбавим всё это десятками однотипных заданий подай-принеси-заруби. Смотрите сюжетный ролик и бегом зачищать карту. И так раз за разом, в каждом втором проекте. Давно ли вам приходилось прыгать по плиткам с именем умершего бога, притом что книга с именем находится в библиотеке у черта на куличках, или помогать ангелу в расследовании пропажи сестры с 8 разными концовками в отдельном квесте? Даже в последних частях Hitman, уж насколько эта игра отлично ложится на подобные песочницы, дается только 2-3 варианта решения на уровне и только специальными предметами, хотя даже в первых частях было возможно использовать все что было в инвентаре, от удавки и яда до упавшего лифта. Есть такое понятие в дизайне уровней как behavior base — это когда уровень строится так чтобы в любую есть часть можно было попасть минимум тремя путями, родоначальником таких дизайна уровней был DeusEx — сами уровни закрытые и не особо большие, но ощущаются как огромные песочницы, именно по этой причине. И даже спустя дцать лет после выхода первой части, там находят новые пути прохождения квестов. О том, что можно нанять почти любого компаньона для прохождения миссий (через консоль и читы, в оригинальной игре этой возможности нет), я узнал только в прошлом. Но сама такая возможность закладывалась. A c помощью пары модов, можно играть кооп по сети в сингл, будут бегать два JC Dentonа, причем каждый может выполнять свои квесты, что неудивительно для изначально сетевого Unreal Engine.

Уровень врагов

Повсеместно избавляясь от системного дизайна, в плане создания игры как единой целой системы, а не множества мелких с попытками подружить их перед релизом, многие разработчики столкнулись с тем, что приходится убирать систему уровней врагов, потому что получившегося монстра забалансить практически невозможно, и тут кому в голову приходит идея, а давайте поднимать уровень врагов вместе с уровнем игрока. После «практически идеальной и вылизанной» системы уровней, как игрока так и врагов, в Morrowind, выходит TES4 c автоматическим ростом «дамага» противников параллельно развитию главного героя. Блин, да чтобы убить какую-то завалящую крысу приходилось сказать вокруг неё две минуты в топовых шмотках.

Норм так крыска 70 уровня

Норм так крыска 70 уровня

Ладно крысы, другой вариант — «решительно» отыгрываем роль вора в старых свитках, наваливаем экспу в скрытность больше, чем на меч и щит. На раз обносим все дома в городе все из себя такие невидимые и беспощадные Робингуды, растем в уровнях. А потом «внезапно» начинаем проходить сюжетный боевой квест, помним при этом, что миссии уже «исправили», и банально не можем его пройти стелсом. Вояка из нашего каджита хуже чем никакой, а врагов в квесте много и они хорошего такого уровня, если бы виртуоз отмычек и ловких рук был воином. Пока качали вора, воины качали воинов, всё — приехали. В итоге на поздних стадиях игры всякий зачуханный грабитель-каджит начинал щеголять даэдрическими доспехами, таская параллельно еще одёжу для «небоевых операций» и «магических квестов». Многие просто создавали нового героя, потому что ветки прохождения за небоевые билды были банально сломаны. Другие разработчики смотря на космические продажи четвертых свитков, начинали думать, что автолевелинг не такая уж и плохая штука. Чтобы понять ущербность такого подхода в сюжетных играх, понадобилось больше 10 лет и дцать крупных проектов с плохим рейтингом, да и сейчас во многих играх автолевелинг остался, пусть и в гибридном виде, ведь это намного проще чем балансить игру.

Обучение через взаимодействие

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

Дизайнер поленился в обучение

Дизайнер поленился в обучение

Почему делают всплывающие подсказки или явные миссии? Во первых создание обучения откладывается на самый последний момент, или даже на этап финальных правок за месяц до релиза. Иногда это вызвано меняющимся концептом, но основная причина это презентабельность, обучение почти всегда идет в начале игры, ощущение от небрежно созданных миссий, пусть даже и обучающих, остается потом на всю игру. Выделять на обучающие миссии целого дизайнера, а то и не одного, становится слишком дорого. Остается использовать универсальные и простые инструменты для обучения вроде попапов, они не требуют контекста. Пусть это и воспринимается как вытаскивание игрока из процесса, зато не вызывает негатива по отношению к остальной игре. Это слова из интервью с Шери Грейнер Рэй, если коротко, то нормальное внутриигровое обучение — долго, дорого и немодно.

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

Награда и Наказание

Остались только награды за прогресс: новые предметы, опыт, сюжетные элементы и т.д. А такой важный мотиватор как наказание пропал, это не ошибка дизайнеров, люди расстраиваются, если не выигрывают. Расстроенный игрок пишет плохой отзыв об игре, его читают другие люди и не покупают игру. Наказание убрали, потому что это ведет к меньшим продажам. Давно ли вы видели аптечки в играх, а не просто посидеть в углу? В первых двух BG поведение с компаньонами влияло на шанс выпадения предметов в сундуках, в TES3/4 неправильно собранный билд закрывает квестовые ветки и возможность пройти целые квесты, Half-Life 2 — заставляет решать физические головоломки, чтобы пройти по сюжету. Первые Thief — штрафуют игрока за убийства, применение водяных стрел и громкие кражи, а потом продавцы дают меньше денег за хабар и едко комментируют приключения шумного вора. Это одна из немногих игр, которая честно использует звук окружения для нпс. Персонажи вокруг используют туже систему обнаружения, которая доступна игроку. Каждая поверхность имеет свою характеристику “шумности”. Самая шумная — металлическая, быстро выдаст вас всем стоящим рядом. Ковры заметно глушат шаги настолько, что по нему можно побегать и попрыгать, стражники кстати тоже. Каменный пол — звучит по разному, если вы до этого были в воде. А зеленая поверхность растительности шумит если вы там ходите. А еще звук — это не только шаги, но и стук тела упавшего солдата, прыжки с какой-либо высоты, звяканье брошенной тарелки или кружки, ваши и чужие действия.

Современные игры не наказывают за такое, потому что это снижает продажи: «Players money first’ что называется. M&M3 — Не знаете особенностей монстров? Карту скорее всего сольете даже на среднем уровне AI, за красивой картинкой скрываются подсчеты на листе бумаги.

Не уважаете механику стрельбы в Max Payne? Добро пожаловать на чек-поинт. И так пока не научитесь стрелять. Игра не прощает промахов даже на самом простом уровне, и никакой помощи на gamepad.

Система кармы

А эта проблема вытекает из отсутствия наказания, если нет наказания, то назаканием становится уменьшение награды. В большинстве современных игр есть фракции, отношения с персонажами, формально и карма в большинстве игр осталась, вот только она практически ни на что не влияет. А ведь раньше поступки действительно влияли на сюжет, в том же фолыче — вырезав как-то рандомную деревню бандитов на карте мира (случайно вышло, слово за слово, ежик и получил по морде) и вернувшись туда через какое-то время, обнаружил там людей из случайно каравана, встреченного на другом конце карты. И только потом вспомнил, что в беседе упомянул про свободную деревню в диалоге. Выполнил какой-то мелкий квест. А проходя New Reno, встретил жителя той деревни, который помог с квестом на ликвидацию одного из мафиозных кланов города. Да, наверное это был выписанный линейка квестов, которая хорошо ложится на случайные события, но какова её вероятность при отыгрыше, чтобы его специально так задизайнили? А в конце показали зарисовку с этой деревней. И это только одна из мелочей c кармой, сколько их было в каждом прохождении наверно и не вспомнить.

В Fable (2004) вам даже дом не везде продадут, а жители будут отказываться разговаривать если им не нравится ваше поведение. Причем есть два типа кармы, локальная и глобальная, относительно каждого жителя. Локальная получается, когда местные жители видят или расшаривают информацию о ваших действиях в пределах деревеньки, и она «забывается» со временем. Глобальная влияет на общее впечатление и внешний вид.

Попинывание куриц приводило к потере локальной кармы в деревне

Попинывание куриц приводило к потере локальной кармы в деревне

И наверное одна из лучших реализаций кармы в Vampire: The Masquerade – Bloodlines (2004)
В игре у игрока есть параметр «человечности», он никак не отображается, и за ним надо следить самому. В безумие может впасть и самый добрый вампир на уровне, просто это очень маловероятно. При использовании некоторых действий и принятии злых решений повышается вероятность впасть в безумие, когда игрок теряет возможность управлять персонажем и последний устраивает массакр человекам вокруг без участия клавиатуры.

Видимые стены и ограничения

Разработчики стали бояться ограничения пространства, стремление показать насколько игра масштабная и открытая затмевает кажется всё остальное (опять спасибо майнкрафту). Если у вас нет открытого мира — фу-фу-фу, ждите в два раза меньше галочек в вишлисте. Поэтому и лепят его — кто во что горазд. Конечно игровой дизайнер должен держать игрока в определенных границах мира, но ограничения (невидимые стены) без уважительной причины вызывают очередные wtf!?. Худшее, что можно сделать здесь — это поставить невидимые стены, которые не позволят исследовать дальше. Проще всего поставить невидимую стену, чем вписать любое ограничение в игру. Но теперь показать стену считается чем-то постыдным, надо сделать отличный вид уходящий вдаль и не пускать туда.

Извините, не удержался.

Извините, не удержался.

Дизайн для игрока

Fallout — это круто. Давайте сделаем новый фолыч. Знаете почему фолыч крут? Он не пытался никого повторить. Не вижу ничего плохого в том, чтобы заимствовать идеи из великих игр, но заимствовать — не значит копировать. Иначе на выходе получится так же, как в той крутой игре, что вышла в прошлом году, но похуже и с обрезанными текстурами. И вместо того, чтобы задать себе вопрос «А чем эта фича это будет интересна людям?», дизайнеры начинают накручивать рюшечки к известным механикам. А на выходе получается непонимание почему вот эта мега-фича не вызвала интерес. Ну как же так? На тестах наши QA говорили что все мегакруто.

Разработчики Uncharted моделят уровни так, чтобы в них было интересно играть детям сотрудников компании, не знаю как называется этот подход, но он точно работает уже четвертую игру подряд.

Сделайте дизайн уровня интересным ребенку, это действительно сложно.

Сделайте дизайн уровня интересным ребенку, это действительно сложно.

Беда многих команд, что они перестали делать игру для себя, Игру Мечты. Смотрят на графики, аудиторию, не задумываясь о фане и интересности геймплея, накручивают рющечки. Смотрят в рот издателю, который говорит делай раз, не делай два, потому что в прошлый раз это не окупилось. Сделали, шипнули и заплакали, потому что люди пошли играть в какую-то индюшатину. Или другая крайность — слепо верить в какой-то принцип, например, в реализм, не задумываясь, что и так хватает реалистичности вокруг. Или модная сейчас вера в большие проекты — надо побольше механик, побольше реализма, побольше карту — добавим всего, только побольше, побольше, и шипнем в стиме, там людей побольше, авось кто и купит. Много оружия, много монстров, много нпс, много активностей — почему это все должно быть интересно игроку — тайна за семью печатями. Больше не значит лучше, больше это просто больше. Основной критерий оценки игры — удовольствие. Фраза «а вот также было в игре полгода назад» не дает проекту +2 к успеху, и уж точно эта механика будет менее интересна, чем в той игре полгода назад.

Сложность

Игры перестали делать сложными, потому что от аудитории нет запроса на такие игры. Сложность игры напрямую коррелирует с количеством текстовой информации в ней, в сложных и интересных играх всегда было много текста, который нужно найти, прочитать, осмыслить и найти еще где применить эти знания — это все время, и его надо много на все эти действия. Зато есть запрос на казуалки, и короткие сессионные игры на 15 минут. На «Казуальные игры» в «узких» девелоперских кругах под ПК и большие консоли, честно, смотрят свысока, и немножко завидуют деньгам, которые там крутятся. Но казуальные — не значит «для идиотов», это значит они сделаны так просто, что будет понятно даже детям. А объяснить и показать сложные вещи простыми и главное интересно — задачка далеко не для середнячков, попробуйте, даже 10-летнего, ребенка увлечь CK3, а вот Сiv6 запросто. Это все равно, что пробовать объяснить исходники PhysX джуну. А там куда идет основная масса, там деньги. Дальше приходит издатель и спрашивает — «$$$ ???», остальные аргументы придумайте сами.

Размеры дистрибутива

Сaesar III в 98 году я пару дней носил на домашний комп такими флешками, потому что CD-привод был один на весь подъезд у соседа на пятом. А размер игры был что-то около 100Мб.

флешка-неделька из 1998

флешка-неделька из 1998

Оставлю тут, может кому интересно будет, закон Мура от разработчиков игр — размеры дистрибутива средней игры увеличивается вдвое каждые три года, и пусть вас не обманывает затишье в размерах дистрибутивов последние пару лет, часть размера просто ушло в онлайн. Примерно от 50% от размера дистрибутива на локальной машине, теперь шарится на CDN для доступа по запросу, но психологический барьер в 100Gb не за горами, и я верю скоро он будет преодолен, а там он снова уйдет на новый виток размеров.

Побурчать

Это не все потерянные знания древних, и наверное не большая их часть. Но остались еще ортодоксальные студии, которые знают как собирать «сложные и неудобные» игры, правда становится их все меньше. Понятно, что раньше и смузи был зеленее, и флешки квадратнее. Может еще игр было меньше, аудитория умнее и разработчики покруче. Но посмотрите на сложившуюся ситуацию с другой стороны, возможно мы находимся просто в начале подъёма качества, забыл как этот термин называется: ожидаемое качество проектов растет от года к году, вместе с этим неизбежно растет и накопленный опыт команд и индустрии в целом, а кто не осилил оказывается за бортом достаточно быстро. И когда-то это количество должно перерасти в качество я надеюсь, может и chatGPT скоро подтянется.

Weekend Offer в AliExpress

Дата
Время10:00 – 20:00
Место

Онлайн

Конференция «Я.Железо»

Дата
Время14:00 – 23:59
Место

МоскваОнлайн

Метки:





Запись опубликована: 21.04.2024

Фальшивые криптокошельки в официальном каталоге Ubuntu — индикатор более серьёзной угрозы

Обновить

Рейтинг

GlobalSign_admin 59 минут назад

Время на прочтение3 мин

Количество просмотров601

Через официальный каталог приложений Ubuntu Snap некоторое время распространялся фейковый криптокошелёк, средства с которых сразу переводились на сторонний адрес. У одного из пользователей удалось увести 9,84 BTC.

Это типичная supply chain attack, один из самых опасных видов атак. Он предполагает внедрение зловредов в официальные каналы поставки ПО. Например, в прошивки от производителя оборудования, официальные обновления программ, которые распространяются через официальные сайты, и т д.

Фальшивый криптокошелёк Exodus в официальном каталоге Snap компании Canonical был опубликован 6 февраля 2024 года (скриншот) и продержался там шесть дней.

12 февраля один из пользователей на форуме Snapchat рассказал о странном баге: после восстановления доступа к кошельку тот оказался пустым, а из истории кошелька следовало, что все средства перечислены на посторонний адрес.

Изучение софта в виртуальной машине с Wireshark показало, что пропажа средств из кошелька — не баг, а фича. Само приложение было мошеннической подделкой под оригинальный кошелёк Exodus.

От оригинального кошелька он отличался необычно малым размером бинарника, Фальшивая программа была создана с помощью фреймворка Flutter в отличие от оригинала на Electron.

При первом запуске приложение сразу спрашивало сид-фразу для восстановления доступа к онлайн-кошельку, после чего тот сразу опустошался.

В результате программа была удалена из каталога Snap.

Основатель Canonical и руководитель разработки Ubuntu Марк Шаттлворт признал, что вредоносных приложений с трюками социальной инженерии становится больше. Он сказал, что «мы живём во всё более опасном мире» и пообещал принять дополнительные меры безопасности для каталога программ Ubuntu, хотя компания тут мало чем может помочь.

Приём приложений в каталог автоматизирован, а опубликовать своё приложение довольно легко. Это уже не первый фальшивый криптокошелёк или майнер, опубликованный в каталоге Ubuntu за последние несколько лет. А некоторые из зловредов до сих пор работают на компьютерах пользователей. Для Ubuntu есть однострочник, который позволяет удалить сразу весь «криптомусор» из системы:

for s in 2048buntu hextris freecraft bip-web bitwallet btcwal btcwallet coinbase cryptowal electrum-wallet2 exodus exoduswal exoduswalet exodwallet guarda komodo ledger-live-wallet ledger1 ledgerlive liveledger metamask new-electrum-wallet sparrow sparrow-wallet sparrowwalet sparrowwallet trezor-wallet trezorwallet trustwallet; do sudo snap remove --purge $s; done

Выводы

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

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

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

По итогам истории с Exodus можно сделать вывод, что опасность скачивания бинарных приложений даже из официальных каталогов никуда не исчезла. Вредоносный код распространяется с пакетами PyPi и через каталог App Store. Можно предположить, что мошенники продолжат придумывать новые способы, как внедрять вредоносный код в официальные каналы поставки ПО.

Метки:





Запись опубликована: 21.04.2024

«Массовые вымирания ещё будут происходить»: палеонтолог — о прошлом и будущем Земли

[ comments ]

Некоторые виды животных и растений могут повторить судьбу динозавров.
«Массовые вымирания ещё будут происходить»: палеонтолог — о прошлом и будущем Земли

Далеко не все растения и животные, которые существовали десятки тысяч лет назад, сохранились до наших дней. Палеонтолог и геолог Эдуард Мычко рассказал ведущему YouTube‑канала «Основа» Борису Веденскому, сколько раз на нашей планете происходили массовые вымирания и что в них было полезного для биосферы Земли. Лайфхакер законспектировал интересные моменты беседы.

Эдуард Мычко
Палеонтолог, кандидат геолого-минералогических наук.

Почему изучать развитие жизни на Земле непросто

Палеонтологи сделали уже столько открытий, что нам кажется, будто мы знаем о нашей планете практически всё. Но это не так. Конечно, многие древние животные или растения нам известны. И они сохранились благодаря тому, что на планете постоянно идёт процесс диагенеза — то есть превращения мягких и рыхлых субстанций в твёрдые осадочные породы.

Земле вообще в этом смысле повезло. Например, на Венере или Меркурии никакой осадок не накапливается, поэтому информацию о прошлом этих планет получить очень сложно. На Земле же образуются и со временем растут твёрдые отложения. В этом огромную роль играют реки, водопады — словом, текущая вода, в которой собирается осадок. В итоге после затвердевания масс песка, водорослей, ила получается своеобразная геологическая летопись, которую можно прочитать.

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

Но представим, что животное погибло в пустыне или в лесу, где нет рек и не образуется осадок. Тушу сначала ели падальщики, потом остаток уничтожали бактерии и грибы. А завершила процесс эрозия, то есть выветривание. И всё — от животного не осталось и следа. Нечего изучать.

Не будем забывать и про химическое и температурное разрушение, которое влияет уже на горные породы. В итоге до наших дней сохраняется совсем немного подлинного материала из прошлого Земли. Мы даже не можем сказать, было ли миллионы лет назад больше биоразнообразия, чем сейчас, или наоборот.

Можно считать, что сегодня мы нашли менее одного процента от тех видов, которые когда‑то обитали на планете. А может, даже менее сотой процента.

Мы даже не знаем, сколько современных видов есть. Описано четыре миллиона, а их может быть и десять, а по некоторым расчётам даже сто миллионов — в том числе простейших и насекомых. А сколько в геологическом прошлом жило, мы никогда не узнаем. Мы работаем с теми организмами, которых было очень много и которым повезло попасть в геологическую летопись.

Эдуард Мычко

Что такое массовые вымирания и сколько их было на Земле

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

В конце XVIII — начале XIX века появилась наука стратиграфия. Она изучает вертикальное и горизонтальное распределение горных пород. Учёные быстро выяснили, что лежащие ниже, а значит, более ранние слои отличаются от верхних. Причём географических различий практически не было. То есть в Англии, Франции и России в слоях одной геологической эпохи находили останки одних и тех же животных. Представителей видов, которые были широко распространены в самых разных регионах. А в лежащих выше слоях этих животных уже не было, они словно исчезли из геологической летописи. Зато появились другие.

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

Сегодня же, благодаря радиоизотопным исследованиям, мы можем определить примерный возраст горных пород. А значит — и время событий из геологической летописи. В конце XX века появилась первая крупная база данных ископаемых организмов. В неё входили около 36 тысяч родов и семейств древних животных. Затем на основании анализа этой базы учёные построили график. Его горизонтальная ось — время. На ней были показаны важнейшие геологические эпохи. А вертикальная ось — число родов животных, которые жили на планете.

На графике исследователи увидели пять чётких провалов, когда кривая числа животных не просто шла вниз, а резко, катастрофически падала. Эти временные отрезки и назвали периодами массовых вымираний. Но на самом деле известная многим печальная пятёрка — лишь самые крупные эпизоды. Были на графике и другие провалы, но не такие глубокие.

Я думаю, многие слышали про мел‑палеогеновое вымирание, когда большая часть динозавров, морские рептилии, ихтиозавры, плезиозавры, мозазавры вымерли. Но кроме этого, были массовые вымирания и до мел‑палеогенового, и позже. Массовое — это когда за сравнительно короткий по геологическим меркам промежуток времени — 100 тысяч лет, скорее всего, —исчезает большое число крупных семейств и даже отрядов.

Эдуард Мычко

В чём причины таких катаклизмов

Для учёных это дискуссионный вопрос. Однозначных ответов, как правило, нет — многие исследователи выдвигают свои гипотезы и успешно их защищают.

Большинство учёных считает, что причиной становятся внешние факторы. Даже такие, как цикл вращения Солнечной системы вокруг ядра нашей Галактики, согласно которому возможны катаклизмы каждые 252 миллиона лет. Или взрыв сверхновой где‑то поблизости. Часть исследователей говорит о геохимических аномалиях, которые обнаруживаются в различных отложениях.

Например, на границе мел‑палеогена в соответствующих породах нашли большую прослойку иридия. Этот элемент крайне редко встречается в земной коре и попадает к нам, как правило, из космоса. А тут в самых разных частях планеты в геологических разрезах на границе мела и палеоцена — первого периода следующей эпохи — вдруг возникла заметная иридиевая прослойка.

Уже потом появилась гипотеза, что на Землю упал крупный метеорит, который и стал причиной вымирания динозавров. А позже в Мексике обнаружили кратер Чикшулуб, который считают местом падения небесного тела. Эта гипотеза вполне объясняет появление иридия в геологических отложениях.

А вот причина Пермского вымирания, которое считается крупнейшим из «большой пятёрки», вполне земная. Это вулканическая активность планеты. Тогда исчезло чуть ли не 80–90 процентов сухопутных и морских животных, а также растений. На территории Западной Сибири широко распространены так называемые траппы. Это рельеф, который образовала вулканическая магма. Тогда от неё пострадала территория площадью более 2 миллионов квадратных километров. А последствия ощутила вся планета.

В конце Пермского периода температура на экваторе достигала 60 °С. Там никто не жил. В Пермском периоде наблюдалась так называемая биполярная диверсификация: разнообразие жизни было на полюсах. У нас сейчас разнообразие в основном приурочено к экваториальной зоне, к тропикам. И чем дальше мы двигаемся к полюсам, тем разнообразие животных и растений уменьшается. А тогда, в Пермском периоде, было наоборот.

Эдуард Мычко

Гипотез о причинах вымираний много. Но при их анализе стоит пользоваться бритвой Оккама — останавливаться на простых непротиворечивых вариантах и отсекать всё лишнее.

Будут ли ещё массовые вымирания

Обязательно будут. А вот что станет их причиной — большой вопрос.

Например, сейчас много говорят об изменениях климата. Они действительно происходят, и нужно быть слепым, чтобы этого не замечать. Но одни учёные говорят, что причина этому исключительно человеческая деятельность. Другие возражают. И отмечают, что во время пандемии промышленность в некоторых странах вообще остановилась. Углеродные выбросы резко сократились, однако температура на планете продолжала повышаться.

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

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

Эдуард Мычко

Нам остаётся смотреть в будущее с оптимизмом. Помнить, что всегда выживают самые многочисленные виды. И надеяться, что у человечества всё будет хорошо.

Любовь Савенкова / Лайфхакер

[ comments ]

Метки:





Запись опубликована: 21.04.2024

10 интересных ролей Сета Рогена — звезды отвязных комедий и не только

[ comments ]

Богомол из «Кунг-фу Панды», Стив Возняк и дядя Стивена Спилберга.
10 interesnyh rolej Seta Rogena — zvezdy otvyaznyh komedij i ne tol'ko

15 апреля у Сета Рогена был день рождения. Вспомнили, где можно посмотреть на его актёрскую игру.

1. Донни Дарко

Donnie Darko

  • США, 2001 год.
  • Фантастика, триллер, драма, детектив.
  • Продолжительность: 113 минут.
  • IMDb: 8,0.

Старшеклассник Донни Дарко живёт в небольшом американском городке и страдает лунатизмом. Однажды ночью он видит человека в костюме кролика — тот зовёт Донни на улицу, где представляется Фрэнком. А ещё предупреждает, что через 28 дней 6 часов 42 минуты и 12 секунд наступит конец света. Просыпается Донни на поле для гольфа. Вернувшись домой, он обнаруживает, что на его комнату упал двигатель от самолёта.

«Донни Дарко» — мистический триллер Ричарда Келли об альтернативных реальностях, проводниках между мирами и психологических расстройствах. После премьеры картина провалилась в прокате, но со временем обрела культовый статус и сделала звездой Джейка Джилленхола — он сыграл главного героя.

А ещё «Донни Дарко» стал полнометражным дебютом Сета Рогена. В 2001 году он был начинающим актёром, снимавшимся лишь в комедийных сериалах. В картине Келли, впрочем, Роген играл во многом привычную для себя роль. Его первой фразой была реплика «Мне нравится твоя грудь», а самой запоминающейся — «Разве твой отец не ударил твою маму ножом?»

2. Жизнь прекрасна

50/50

  • США, 2011 год.
  • Драма, мелодрама, комедия.
  • Продолжительность: 100 минут.
  • IMDb: 7,6.

27-летний журналист Адам узнаёт, что у него рак. Шансы на выживание — примерно 50/50. В рамках лечения герою предстоит пройти курс химиотерапии, посетить психолога и сделать опасную операцию. Всё это время Адама поддерживает лучший друг Кайл — преимущественно тем, что знакомится с девушками, используя диагноз героя.

«Жизнь прекрасна» — одновременно забавное бадди-муви и суровая трагикомедия о том, как узнать о серьёзном диагнозе и свыкнуться с мыслью, что лечение может и не помочь. Рогену в фильме Уилла Райзера досталась роль Кайла — с виду не самого чуткого парня, который втайне переживает за лучшего друга, всячески ему помогает и пытается приободрить.

3. SuperПерцы

Superbad

  • США, 2007 год.
  • Комедия.
  • Продолжительность: 113 минут.
  • IMDb: 7,6.

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

Роген появился в «SuperПерцах» в запоминающейся роли классного полицейского, который задерживает МакТрахера в супермаркете. Но всё же наибольший вклад в успех картины Сет внёс как сценарист.

Фильм основан на переживаниях молодых Рогена и Эвана Голдберга: ещё в старшей школе они написали сценарий «SuperПерцев» и дали главным героям свои имена. Именно личный взгляд отличает эту картину от «Американского пирога» и других подростковых комедий нулевых.

4. Кунг-фу Панда

Kung Fu Panda

  • США, Великобритания, 2008 год.
  • Мультфильм, фэнтези, комедия, боевик, приключения.
  • Продолжительность: 91 минута.
  • IMDb: 7,6.

Панда По живёт в Долине Мира и помогает приёмному отцу, гусю Мистеру Пингу, управлять магазином лапши. Втайне По мечтает заниматься кунг-фу — и вдруг случайно получает титул величайшего Воина Дракона. Мастера кунг-фу Угвэй и Шифу берут над ним шефство. А тем временем из тщательно охраняемой тюрьмы сбегает опасный преступник Тай Лунг. Он отправляется в Долину, чтобы сразиться с Воином Дракона.

«Кунг-фу Панда» — комедийный боевик, с помощью которого постановщики Марк Осборн и Джон Стивенсон признались в любви к восточным единоборствам. Каждый герой мультфильма воплощает один из боевых стилей кунг-фу. Богомол, которого в оригинале озвучил Сет Роген, отвечает за танланцюань — один из популярных стилей ушу, также известный как стиль богомола.

5. Фабельманы

The Fabelmans

  • США, Индия, 2022 год.
  • Драма.
  • Продолжительность: 151 минута.
  • IMDb: 7,5.

В 1952 году семья Фабельманов идёт в кино на «Величайшее шоу мира». Маленький Сэмми видит на экране крушение поезда и навсегда влюбляется в кинематограф. Он пытается воспроизвести сцену с помощью игрушечной железной дороги, а позже получает в подарок камеру и начинает снимать собственные фильмы. С камерой Сэмми переживает главные этапы в жизни: от проблем в семье до травли сверстников.

«Фабельманы» — автобиографическая драма Стивена Спилберга, сценарий которой постановщик написал во время пандемии. В фильме режиссёр делится своими детскими травмами и показывает, как влюбился в кино. Актёры рассказывали, что съёмки для всех были очень эмоциональными.

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

6. Стив Джобс

Steve Jobs

  • Великобритания, США, 2015 год.
  • Драма, биография, история.
  • Продолжительность: 122 минуты.
  • IMDb: 7,2.

«Стив Джобс» Дэнни Бойла — один из лучших кинопортретов выдающейся личности. 14 лет из жизни Стива Джобса в фильме показаны всего лишь в рамках подготовки к трём важным презентациям: Macintosh в 1984-м, компьютера NeXT в 1986-м и iMac в 1998-м. В безумном темпе на экране развиваются отношения Джобса с лучшим другом, коллегами и дочерью.

В «Стиве Джобсе» Роген сыграл, пожалуй, свою главную драматическую роль — сооснователя Apple Стива Возняка. Комедийный талант позволил актёру здорово изобразить Возняка несколько неловким гиком. Но неожиданно было видеть эмоциональные взрывы Рогена в моменты споров экранных Возняка и Джобса.

7. Черепашки-ниндзя: Погром мутантов

Teenage Mutant Ninja Turtles: Mutant Mayhem

  • США, Япония, Канада, 2023 год.
  • Фантастика, фэнтези, боевик, комедия, приключения.
  • Продолжительность: 99 минут.
  • IMDb: 7,2.

Тяжело представить, что в год выхода «Паутины вселенных» могла появиться ещё более необычная адаптация комиксов. Но «Погром мутантов» к этой роли оказался максимально близок. Мультфильм Сета Рогена, Эвана Голдберга и Джеймса Уивера здорово показал становление Черепашек-ниндзя через историю четырёх подростков, которые хотят избавиться от гиперопеки суррогатного отца и добиться признания.

Картина запоминается необычной анимацией, острым юмором и яркими актёрскими работами. Визуально «Погром мутантов» походит то на рисунки из комиксов, то на пластилиновые мультфильмы, то на карандашные наброски. Герои высмеивают Tesla, обсуждают уместность слова «крыса» как оскорбления и спорят с другими мутантами о своём будущем. Причем озвучивают всё это рэпер Ice Cube, Сет Роген и Джон Сина.

8. Платонические отношения

Platonic

  • США, 2023 год — настоящее время.
  • Мелодрама, комедия.
  • Продолжительность: 1 сезон.
  • IMDb: 7,2.

Домохозяйка Сильвия узнаёт, что её бывший лучший друг Уилл разводится. Они давно в ссоре и уже несколько лет не общаются, но Сильвия всё же решает позвонить Уиллу и предложить встретиться. Постепенно герои начинают проводить вместе всё больше времени, а параллельно пытаются разобраться, почему их пути разошлись.

«Платонические отношения» — лёгкий сериал о том, как миллениалы переживают кризис среднего возраста. Уилл беспокоится из-за развода, а на Сильвию накатывают переживания о заброшенной юридической карьере. Вместе герои одновременно «молодятся» и узнают себя. Успеху такой концепции содействует химия между актёрами: Сет Роген и Роуз Бирн максимально органичны в роли друзей, у которых наступили не лучшие времена.

9. Немножко беременна

Knocked Up

  • США, 2007 год.
  • Мелодрама, комедия.
  • Продолжительность: 129 минут.
  • IMDb: 6,9.

Амбициозная журналистка Элисон празднует повышение и знакомится с Беном — бездельником, который живёт на пособие и разрабатывает порнографический сайт со звёздами. Герои по пьяни занимаются сексом, но расстаются утром. Через несколько недель Элисон узнаёт, что беременна. Она сообщает об этом Бену — и вскоре максимально не похожие друг на друга герои решают построить семью.

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

10. Интервью

The Interview

  • США, 2014 год.
  • Комедия, боевик.
  • Продолжительность: 112 минут.
  • IMDb: 6,5.

«Интервью» далеко не великая комедия, да и удачной политической сатирой картину назвать тяжело. И тем не менее это один из самых примечательных фильмов «десятых» годов, пусть скорее и из-за закулисных историй.

В очередной совместной картине Сет Роген и Эван Голдберг решили взяться за политику и высмеять диктатуру в Северной Корее. По сюжету тележурналист Дэйв отправляется в Пхеньян. Официально — чтобы взять интервью у Ким Чен Ына. В реальности — чтобы по заданию ЦРУ убить северокорейского лидера.

На поле политической сатиры Роген и Голдберг пришли с привычно простым и похабным юмором. Этого, впрочем, хватило, чтобы взбесить верхушку Северной Кореи. Производством и дистрибуцией картины занималась студия Sony — в 2014 году её атаковала группа хакеров, которая, по версии следствия, координировалась из Пхеньяна. В результате взломов утекли личные данные сотрудников Sony, информация о проектах студии и внутренние переписки.

кадр из сериала «Платонические отношения»

[ comments ]

Метки:





Запись опубликована: 21.04.2024

Миллер, Рабин, вектор

Обновить

ibessonov 3 часа назад

Уровень сложностиСложный
Время на прочтение16 мин

Количество просмотров651

Проверка небольших чисел на простоту — популярная подзадача в спортивном программировании. И тест Миллера-Рабина, пожалуй, наиболее популярный из простых алгоритмов для этого.

У меня давно было желание с ним поиграться, стараясь оптимизировать различными способами. Например, векторизовать и посмотреть, станет ли быстрее.

Дисклеймер. Я — Java разработчик, на C++ писал в основном только в университете. Так что местами мой код мог вдруг получиться каким-нибудь странным.
Сразу отмечу, что у меня не было цели написать портируемый код. Моей целью было развлечься и посмотреть, что я смогу сделать, а не предложить миру универсальное решение.

Какую именно задачу решаем

Цель: уметь понимать, является ли знаковое 32-битное целое число простым, и желательно быстро.

Оптимальным решением по скорости проверки в данном случае было заранее вычислить все простые числа, соответствующие нашим требованиям, и положить их в массив/хеш-таблицу, чтобы потом делать там поиск. Всего их вышло бы около 105 миллионов. Этого я делать не буду, чтобы избежать долгих предварительных вычислений.

Вообще, хочется иметь аналог такой функции, только быстрый:

bool testNaive(int32_t n) {
    if (n <= 2) return n == 2;
    for (int32_t m = 2, boundary = sqrt(n); m <= boundary; m++) {
        if (n % m == 0) return false;
    }
    return true;
}

В коде выше приведён классический тест на простоту, который перебирает потенциальных кандидатов в делители числа n. Работает он заO(sqrt n), то есть медленно.

Тест Миллера-Рабина

Тест Миллера-Рабина — вероятностный тест для проверки чисел на простоту. Но заранее зная верхнюю границу для проверяемого числа, этот тест несложно превратить в детерминированный, об этом чуть позже.

Тест простоты числа n состоит из нескольких раундов. На каждом раунде мы получаем один из двух ответов:
— число составное;
— число может быть простое, фиг знает.
Чем больше раундов мы получаем ответ «может быть простое», тем больше шанс, что число действительно простое.

Сам же раунд состоит из следующих действий:
— взять число 1 < a < n, да такое, которое ещё не использовалось в предыдущих раундах;
— проверить, является ли a «свидетелем простоты» числа n. Если не является, то n — составное, а если является, то n называют сильно псевдопростым по модулю a.

Далее я буду использовать имена переменных, как на википедии, чтобы было проще сверять. Проверка свидетельства простоты в тесте Миллера-Рабина происходит по следующему алгоритму:

  • В первую очередь нужно отсеять чётные числа, допустимы только нечётные n.

  • n нужно представить в виде 2^scdot{t}+1. Стоит заметить, что s всегда больше 0.

  • Выполнить следующий код. Внешне он отличается от псевдокода с википедии, но делает ровно то же самое. true означает сильную псевдопростоту n по модулю a:

int32_t s = __builtin_ctz(n - 1); // Число нулей в младших битах.
int32_t t = (n - 1) >> s;
int32_t x = pow_mod(a, t, n);     // Возведение в степень по модулю n.
if (x == 1) return true;
for (int i = 1; x != n - 1; i++) {
    if (i == s) return false;
    x = mul_mod(x, x, n);         // Возведение в квадрат по модулю n.
    if (x == 1) return false;
}
return true;

По какому принципу выбирать числа a? Лично я поступлю очень просто, хотя не факт что эффективно. На википедии есть ссылки на списки сильно псевдопростых чисел по модулю 2 и по модулю 3, так что мы могли бы сделать проверку для 2 и 3, и среди чисел, прошедших обе проверки, отсеять те, которые содержатся в обоих списках…

Но нет, на самом деле таких чисел довольно таки много. А вот если взять 2, 3 и 5, то в диапазоне от 1 до 231 останется только 4 сильно псевдопростых числа:

  • 25326001

  • 161304001

  • 960946321

  • 1157839381

Их уже легко можно захардкодить, получив в итоге следующий код:

bool testMillerRabinInteger(int32_t n) {
    if ((n & 1) == 0) return n == 2;
    if (n < 9) return n > 1; // 3, 5 и 7.
    int32_t s = __builtin_ctz(n - 1);
    int32_t t = (n - 1) >> s;
    int32_t primes[3] = {2, 3, 5};
    for (int32_t a : primes) {
        int32_t x = pow_mod(a, t, n);
        if (x == 1) continue;
        for (int i = 1; x != n - 1; i++) {
            if (i == s) return false;
            x = mul_mod(x, x, n);
            if (x == 1) return false;
        }
    }
    switch (n) {
        case 25326001:
        case 161304001:
        case 960946321:
        case 1157839381:
            return false;
        default:
            return true;
    }
}

Это уже полностью детерминированный тест на простоту, бери и пользуйся! Осталось расписать упомянутые тут mul_mod и pow_mod.

Для произведения по модулю достаточно расширить как множители, так и модуль, до 64-битных целых, чтобы защититься от переполнения в произведении, получив
(int32_t) (((int64_t) a * b) % m).

Для возведения в степень будем использовать разновидность быстрого возведения в степень, чуть более простую в реализации:

int32_t pow_mod(int64_t n, int32_t power, int64_t m) {
    int64_t result = 1;
    while (power) {
        if (power & 1) result = (result * n) % m;
        n = (n * n) % m;
        power >>= 1;
    }
    return (int32_t) result;
}

Включаем -O3, тестируем — всё работает! Рассчитываем на то, что компилятор хорошо оптимизировал этот код и самим ничего доделывать не придётся (если бы…).

База готова, вступление на этом закончено. Перейдём ко вкусненькому.

Что такое векторизация

Векторизация кода — это его параллелизация на уровне данных. Это примерно то, что делают видеокарты — один поток исполнения, но много независимых наборов данных, обрабатываемых одновременно.

Для CPU векторизация реализуется специальными наборами инструкций, например SSE и AVX. Обычно программистам не стоит об этом беспокоиться — всю работу на себя должен брать компилятор, главное указать ему ключи оптимизации. Основная цель компиляторной векторизации — циклы по большим массивам данных.

В нашем случае больших циклов нет, а данных мало, но зато есть тело цикла, которое выполняется до 3-х раз для 3-х различных значений параметра a. Такие паттерны компилятор сам векторизовать не будет, даже не надейтесь. Моя цель — убрать этот цикл, сделав «обычный» код, проводящий вычисления над всеми нужными значениями a одновременно.

Итого, нужно решить 2 подзадачи:

  • возведение в степень по модулю;

  • цикл с возведениями в квадрат.

Поскольку в среднем s сильно меньше t (s=O(log n),:t = O(n)), то можно сказать, что возведение в степень должно занимать гораздо больше времени исполнения, а значит сосредоточиться в первую очередь стоит на нём.

Векторные типы и инструкции

В более-менее современных CPU архитектуры x86 есть 2 набора векторных регистров — 128-битные XMM и 256-битные YMM. Бывают ещё 512-битные регистры в AVX-512, но они не так распространены.

Напрямую с регистрами мы работать не будем. C++ — язык высокоуровневый, в нём есть специальные типы данных для векторов, как и библиотечные функции на этих типах, которые соответствуют инструкциям процессора. Такие функции называются интринсиками. Чтобы почитать о них подробнее, придётся включать VPN, ведь документация запрещена на территории РФ (самим Intel, никакого экстремизма).

В рамках данной статьи я буду компилироваться GCC с 17-й версией языка (если это вдруг важно). Подключив immintrin.h, можно получить доступ ко множеству типов __m128* и __m256*, отвечающим различным типам векторов, например:

  • __m128i — это вектор из 4-х значений типа int32_t;

  • __m256i — это вектор из 4-х значений типа int64_t;

  • __m256d — это вектор из 4-х значений типа double.

Здесь видно первое преимущество векторов перед нашим циклом — они способны одновременно обрабатывать не 3 единицы данных, а 4. Это здорово, мы без каких-либо потерь можем добавить 4-е значение a, например, проверяя 2, 3, 5 и 7. Если снова заглянуть в OEIS, то будет видно, что все сильно псевдопростые числа по этим модулям, вплоть до 2147483648 (231), являются истинно простыми, т.е. тот switch в конце больше не будет нужен!

Для векторизованного возведения в степень нам нужно найти функции произведения и взятия остатка от деления, всё должно быть просто. Помним, что обе эти операции выполнялись над 64-битными целыми, а значит работать будем с __m256i.

И тут мы попадаем в первую серьёзную ловушку:

  • _mm256_mullo_epi64 — интринсик для умножения длинных целых, не компилируется:
    error: inlining failed in call to 'always_inline' '__m256i _mm256_mullo_epi64(__m256i, __m256i)': target specific option mismatch.

    Упс, кажется он доступен только для AVX-512. Мой процессор такого не умеет. Так что не удивительно, да и компилировался я только с -mavx -mavx2.

  • Векторизованного вычисления остатка от деления не существует в принципе. А обычное деление длинных целых, называемое _mm256_div_epi64, которое мне выдала документация — это даже не инструкция CPU, а кастомная функция, вообще отсутствующая в GCC. Придётся импровизировать.

Я не первый человек, который задался вопросом векторизованного деления целых чисел. Универсальный ответ, который дают люди из интернета — пользуйтесь делением с плавающей точкой, пока вам хватает точности. А когда перестанет хватать — напишите дополнительный код исправления ошибки. Так что отвлечёмся на минутку и подумаем, сколько точности нам даст double, если решить использовать именно его.

Числа с плавающей точкой

Как устроены числа типа double? Наверное не все хорошо помнят, так что освежим эту информацию. Любое такое число представлено в виде 3-х частей:

  • 1 бит для знака;

  • 52 бита для «мантиссы»;

  • 11 бит для «порядка», или же смещения плавающей точки.

double — это 53 значащих бита (мантисса + всегда присутствующая рядом с ней единица) и известное положение плавающей точки, которое может быть далеко за пределами значащих бит. Если пробовать кодировать только целые числа, то становится видно, что любое 53-битное беззнаковое число (54-битное знаковое соотв.) можно закодировать без потери точности.

64-битный int64_t мы использовали для того, чтобы не было переполнения при умножении 32-битных целых. А значит double можно использовать для того, чтобы избежать переполнения при умножении 26-битных чисел (53 / 2). Если ограничиться проверкой на простоту только 26-битных чисел, то этого будет легко достичь арифметикой с плавающей точкой. Так и поступим. Будем работать с четвёрками значений типа double, то есть с __m256d.

Возведение в степень по модулю

Проблема с умножением решена. Что же с делением с остатком? Для него нам придётся воспользоваться следующей формулой:

apmod{m} = a - lfloor frac{a}{m} rfloor cdot m

Реализовав эту формулу, мы получим следующую функцию вычисления произведения по модулю, сразу для 4-х значений типа double (в комментариях — невекторизованный аналог):

__m256d mul_mod(__m256d a, __m256d b, __m256d m) {
    __m256d c = _mm256_mul_pd(a, b);     // double c = a * b;
    __m256d tmp = _mm256_div_pd(c, m);   // double tmp = c / m;
    tmp = _mm256_floor_pd(tmp);          // tmp = floor(tmp);
    tmp = _mm256_mul_pd(tmp, m);         // tmp = tmp * m;
    return _mm256_sub_pd(c, tmp);        // return c - tmp;
}

Код возведения в степень же почти не будет отличаться от невекторизованного варианта:

__m256d pow_mod(__m256d n, int32_t power, __m256d m) {
    __m256d result = _mm256_set1_pd(1);  // result = {1, 1, 1, 1};
    while (power) {
        if (power & 1) result = mul_mod(result, n, m);
        n = mul_mod(n, n, m);
        power >>= 1;
    }
    return result;
}

Цикл с квадратами

Если попробовать сейчас собрать воедино то, что есть, то получим следующий код:

bool testMillerRabinVectorized0(int32_t n) {
    if ((n & 1) == 0) return n == 2;
    if (n < 9) return n > 1;
    int32_t s = __builtin_ctz(n - 1);
    int32_t t = (n - 1) >> s;
    __m256d primes = _mm256_set_pd(2, 3, 5, 7);
    __m256d n_pd = _mm256_set1_pd(n);
    __m256d x = pow_mod(primes, t, n_pd);
    // ?
}

На месте вопроса раньше стоял цикл, внутри которого во первых встречаются выражения return / continue, а во вторых для разных a там может быть разное число итераций:

if (x == 1) continue;
for (int i = 1; x != n - 1; i++) {
    if (i == s) return false;
    x = mul_mod(x, x, n);
    if (x == 1) return false;
}

Нужно привести этот код к виду, пригодному для векторизации. Парадоксально, но для этого нам потребуется выбросить условие выхода при x == 1 внутри цикла, оставим только выход по числу итераций и по x == n - 1. Сейчас объясню.

Сделаем так: будем присваивать x = 0, если это псеводпростое по модулю a. Если x станет равным 0 для всех a, то число n — простое, иначе — нет. Опишем это следующим псевдокодом:

if (x == 1)     x = 0;
if (x == n - 1) x = 0;
if (x == 0 forall a)     // x - сильно псевдопростое по всем модулям a.
    return true;
for (int i = 1; i < s; i++) {
    x = mul_mod(x, x, n);
    if (x == n - 1) x = 0;
    if (x == 0 forall a) // x - сильно псевдопростое по всем модулям a.
        return true;
}
return false;

Если на какой-то итерации x стал равным 1, то он останется 1 и на следующих итерациях, ведь 1 * 1 = 1. То же самое с 0, так как 0 * 0 = 0. В итоге return false на последней строке сработает, если:

  • для какого-то a мы получили x == 1;

  • для какого-то a мы получили i == s.

Это именно те условия выхода, которые нам нужны. Векторизованная версия этого кода будет выглядеть так:

__m256d n_minus_one = _mm256_set1_pd(n - 1);
x = blend_zero(x, _mm256_set1_pd(1)); // if (x == 1)     x = 0;
x = blend_zero(x, n_minus_one);       // if (x == n - 1) x = 0;
if (all_zero(x)) return true;
for (int i = 1; i < s; i++) {
    x = mul_mod(x, x, n_pd);
    x = blend_zero(x, n_minus_one);   // if (x == n - 1) x = 0;
    if (all_zero(x)) return true;
}
return false;

Что делает all_zero должно быть понятно из названия. blend_zero же делает покомпонентное сравнение элементов первого вектора с элементами второго вектора и проставляет в первом 0 там, где совпало, иначе оставляет оригинальное значение, где не совпало. Реализуются эти методы следующим образом:

const __m256d ZERO = _mm256_setzero_pd();
bool all_zero(__m256d a) {
    __m256d mask_pd = _mm256_cmp_pd(a, ZERO, _CMP_NEQ_OQ);
    return 0 == _mm256_movemask_pd(mask_pd);
}
__m256d blend_zero(__m256d a, __m256d b) {
    __m256d mask_pd = _mm256_cmp_pd(a, b, _CMP_EQ_OQ);
    return _mm256_blendv_pd(a, ZERO, mask_pd);
}

Маска типа __m256d содержит единичные биты (64 штуки, на весь double) в тех элементах, для которых условие в cmp выполнилось (в частности _CMP_NEQ_OQ или _CMP_EQ_OQ).

movemask преобразует вектор-маску в обычную битовую маску, где каждому элементу уже будет соответствовать ровно один бит, а не 64. То есть all_zero буквально проверяет, что «нет элементов, не равных 0». Да, двойное отрицание, и что?

_mm256_blendv_pd — составляет вектор из двух, беря элемент второго вектора, если в маске 1, либо первого вектора если в маске 0. Думаю, должно быть понятно, а если непонятно, то в документации есть псевдокод.

Кажется, что первая версия должна быть готова:

bool testMillerRabinVectorized(int32_t n) {
    if ((n & 1) == 0) return n == 2;
    if (n < 9) return n > 1;
    int32_t s = __builtin_ctz(n - 1);
    int32_t t = (n - 1) >> s;
    __m256d primes = _mm256_set_pd(2, 3, 5, 7);
    __m256d n_pd = _mm256_set1_pd(n);
    __m256d x = pow_mod(primes, t, n_pd);
    __m256d n_minus_one = _mm256_set1_pd(n - 1);
    x = blend_zero(x, _mm256_set1_pd(1));
    x = blend_zero(x, n_minus_one);
    if (all_zero(x)) return true;
    for (int i = 1; i < s; i++) {
        x = mul_mod(x, x, n_pd);
        x = blend_zero(x, n_minus_one);
        if (all_zero(x)) return true;
    }
    return false;
}

Сравниваем производительность

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

void measure(std::function<bool(int32_t)> test, uint32_t count) {
    auto start = std::chrono::high_resolution_clock::now();
    int32_t n = 0;
    for (uint32_t i = 1; i < count; i++) {
        n += test(i);
    }
    auto end = std::chrono::high_resolution_clock::now();
    std::cout << (end - start).count() * 1e-9d << " seconds" << std::endl;
    std::cout << n << " primes found" << std::endl << std::endl;
}

Запустим его для имеющихся реализаций, помня, что верхняя граница у нас — 226, и скрестим пальцы:

std::cout << "testNaive:" << std::endl;
measure(&testNaive, 1 << 26);
std::cout << "testMillerRabinInteger:" << std::endl;
measure(&testMillerRabinInteger, 1 << 26);
std::cout << "testMillerRabinVectorized:" << std::endl;
measure(&testMillerRabinVectorized, 1 << 26);
testNaive:
33.9298 seconds
3957809 primes found
testMillerRabinInteger:
4.77004 seconds
3957809 primes found
testMillerRabinVectorized:
4.74518 seconds
3957809 primes found

Реальность полна разочарований, чуда не произошло. Обе функции работают примерно с одной скоростью, в рамках погрешности. Может быть векторизованная версия чуть-чуть быстрее в среднем, но это неважно.

Потрясающее совпадение! Также это не плохая новость — ручное вычисление остатка от деления, оказывается, не слишком и медленное. Остановлюсь ли я на этом? Конечно же, нет, мне нужно однозначно обогнать невекторизованный код, так что начнём тюнинг.

Суперскалярность

Начну с оптимизации, которая принесёт не самый большой профит, но зато она очень показательна и больше её вставить некуда.

Суперскалярность — это тоже параллелизация на уровне данных, но уже не совсем явная в коде, а неявная в процессоре. Ядро CPU способно выполнять несколько инструкций одновременно, при условии, что они независимы. Так что код, который обрабатывает независимые данные, способен работать быстрее кода, который обрабатывает зависимые данные.

Рассмотрим пример — функцию pow_mod для целых чисел, повторю её код:

int32_t pow_mod(int64_t n, int32_t power, int64_t m) {
    int64_t result = 1;
    while (power) {
        if (power & 1) result = (result * n) % m;
        n = (n * n) % m;
        power >>= 1;
    }
    return (int32_t) result;
}

В этом коде есть независимые вычисления над result и n, но вот беда — они находятся в разных скоупах, поэтому и компилятору, и процессору было бы сложно что-то с этим сделать. Что если скоупы объединить?

int32_t pow_mod(int64_t n, int32_t power, int64_t m) {
    int64_t result = 1;
    while (power) {
        if (power & 1) {
            result = (result * n) % m;
            n = (n * n) % m;
        } else {
            n = (n * n) % m;
        }
        power >>= 1;
    }
    return (int32_t) result;
}

Запустим тест и проверим. Для testMillerRabinInteger до оптимизации было 4.78585 секунд, после стало 4.25464 секунд, то есть заметно быстрее. Хотя, может, дело и не только в суперскалярности, может, бранч-предиктор стал тоже себя иначе вести, кто его знает. Главное, что код стал быстрее.

Так стоп, что я наделал, я же должен был оптимизировать векторизованный код, теперь всё стало только хуже! Быстро делаем то же самое для векторизованной версии pow_mod, потирая руки:

__m256d pow_mod(__m256d n, int32_t power, __m256d m) {
    __m256d result = _mm256_set1_pd(1);
    while (power) {
        if (power & 1) {
            result = mul_mod(result, n, m);
            n = mul_mod(n, n, m);
        } else {
            n = mul_mod(n, n, m);
        }
        power >>= 1;
    }
    return result;
}

И… никакой заметной разницы. Вообще.

Почему? Может, компилятор не заинлайнил вызов mul_mod? Вроде бы нет, если сделать ручной инлайн, то производительность не меняется. Как было примерно 4.7 секунд, так и осталось.

Может, компилятор не захотел переупорядочить инструкции в коде во время компиляции? Проверим, вручную сгруппировав независимые операции:

__m256d pow_mod(__m256d n, int32_t power, __m256d m) {
    __m256d result = _mm256_set1_pd(1);
    while (power) {
        if (power & 1) {
            __m256d c1 = _mm256_mul_pd(result, n);
            __m256d c2 = _mm256_mul_pd(n, n);
            __m256d tmp1 = _mm256_div_pd(c1, m);
            __m256d tmp2 = _mm256_div_pd(c2, m);
            tmp1 = _mm256_floor_pd(tmp1);
            tmp2 = _mm256_floor_pd(tmp2);
            tmp1 = _mm256_mul_pd(tmp1, m);
            tmp2 = _mm256_mul_pd(tmp2, m);
            result = _mm256_sub_pd(c1, tmp1);
            n = _mm256_sub_pd(c2, tmp2);
        } else {
            n = mul_mod(n, n, m);
        }
        power >>= 1;
    }
    return result;
}

Невероятно, теперь я получаю примерно 4.224.28 секунд, примерно как в суперскалярной версии невекторизованного алгоритма! А значит, что компилятор не всегда способен эффективно переупорядочить инструкции. Особенно если речь идёт об интринсиках, но это так, скорее предположение.

Обе версии алгоритма теперь работают немного быстрее, при этом среди них всё ещё нет явного лидера.

Деление и умножение

Что проще, умножать или делить? Очевидно, что умножать. Но в нашем алгоритме очень много делений, нужно сократить их количество. Для этого вспомним весьма банальное свойство:

frac{a}{b} = a cdot frac{1}{b}

Деление — это умножение на обратное. Если посмотреть на код внимательно, то станет видно, что делим мы всегда на один и тот же вектор, а именно n_pd (внутри дополнительных функций встречается под именем m). Вместо этого предлагаю ввести второе значение:

__m256d n_pd  = _mm256_set1_pd(n);       // m
__m256d n_inv = _mm256_set1_pd(1.0 / n); // m_inv

И каждый раз, когда встречается _mm256_div_pd(c, m), писать вместо этого
_mm256_mul_pd(c, m_inv). Интуиция говорит, что должно стать быстрее, но насколько?

Сделаем и запустим. До исправления — 4.27096 секунды, после — 3.05808. Разница почти 30%, впечатляет! Вот уж действительно, деление — это очень дорого.

А знаете, какой алгоритм тоже использует деление? testMillerRabinInteger. Может если и в нём сделать умножение, то и он станет быстрее?

double mod_double(double n, double m, double m_inv) {
    double tmp = n * m_inv;
    tmp = floor(tmp);
    return n - tmp * m;
}
double pow_mod_double(double n, int32_t power, double m, double m_inv) {
    double result = 1;
    while (power) {
        if (power & 1) result = mod_double(result * n, m, m_inv);
        n = mod_double(n * n, m, m_inv);
        power >>= 1;
    }
    return result;
}
bool testMillerRabinDouble(int32_t n) {
    if ((n & 1) == 0) return n == 2;
    if (n < 9) return n > 1;
    int32_t s = __builtin_ctz(n - 1);
    int32_t t = (n - 1) >> s;
    double m = n,
           m_inv = 1.0 / m;
    int32_t primes[3] = {2, 3, 5};
    for (int32_t a : primes) {
        double x = pow_mod_double(a, t, m, m_inv);
        if (x == 1.0) continue;
        for (int i = 1; x != n - 1; i++) {
            if (i == s) return false;
            x = mod_double(x * x, m, m_inv);
            if (x == 1.0) return false;
        }
    }
    switch (n) {
        case 25326001:    // Остальные убрал, потому что они больше чем 1<<26.
            return false;
        default:
            return true;
    }
}

Тестируем:

testMillerRabinInteger:
4.2803 seconds
3957809 primes found
testMillerRabinDouble:
4.00873 seconds
3957809 primes found

Вот это поворот, вышло-то быстрее и для невекторизованного кода! То есть, это насколько целочисленные * и % долгие, если их можно заменить вещественными *, *, floor, ещё раз * и -, и всё равно окажется эффективнее.

У меня есть гипотеза. При умножении 64-битных целых чисел процессор фактически возвращает нам 128-битное произведение, разбитое на 2 регистра (старшая и младшая половины), один из которых нам не нужен. Аналогично с делением: процессор в один регистр кладёт частное, а в другой — остаток. Он просто делает много ненужной нам побочной работы. Уверен, есть и другие причины.

Итого, имеет векторизованный код, который проверяет «все» числа примерно за 3 секунды, и невекторизованный код, который делает то же самое примерно за 4 секунды. Кажется, что это победа. Для 26-битных чисел.

Как умножать если double недостаточно

Что делать для чисел, у которых от 27 до 31 значащих бит? Можно ли векторизовать их проверку на простоту, не прибегая к AVX-512? Конечно можно, но сразу скажу, что на эффективность этого решения рассчитывать не стоит. Тем не менее, я его реализую, чтобы хотя-бы узнать, насколько плохо всё выйдет.

Вся задача сводится к тому, чтобы реализовать функцию mul_mod, которая может перемножать 31-битные числа по модулю другого 31-битного числа, т.е. перестать ограничиваться 26-ю битами, как в текущей реализации:

__m256d mul_mod(__m256d a, __m256d b, __m256d m, __m256d m_inv) {
    __m256d c = _mm256_mul_pd(a, b);
    __m256d tmp = _mm256_mul_pd(c, m_inv);
    tmp = _mm256_floor_pd(tmp);
    tmp = _mm256_mul_pd(tmp, m);
    return _mm256_sub_pd(c, tmp);
}

Перед тем, как продолжить, я хочу немного отвлечься, вспомнив одну из своих любимых подзадач в спортивном программировании. Она здесь важна, правда:

Даны 2 числа a и b типа int64_t, нужно найти их произведение по модулю 1012. Желательно эффективно.

Всем желающим предлагаю отвлечься и подумать — как бы вы написали подобный алгоритм? На всякий случай напомню, что верхняя граница знаковых 64-битных чисел равна примерно 9*1018, этот факт легко забыть.

Я бы решал следующим образом. Без ограничения общности допустим, что и a, и b меньше 1012 (и неотрицательные). Если это не так, то вместо них можно взять соответствующие остатки от деления. В таком случае значение b всегда можно представить в виде
b = b1 * 1000000 + b2, где b1 < 1000000 и b2 < 1000000.

Чем хорош миллион, так это тем, что при перемножении числа <1012 и числа <106 мы получаем число <1018, то есть помещающееся в знаковое 64-битное. Такие произведения можно делать в коде без всяких опасений, главное, правильным образом преобразовать формулу для a * b:

(a cdot b) pmod{10^{12}} = (a cdot (b_1cdot 10^6 + b_2)) pmod{10^{12}} = (a cdot b_1 cdot 10^6) pmod{10^{12}} + (a cdot b_2) pmod{10^{12}}  = ((acdot b_1) pmod{10^{12}} cdot 10^6)pmod{10^{12}} + (a cdot b_2) pmod{10^{12}}  = ((acdot b_1) pmod{10^{12}} cdot 10^6 + (a cdot b_2)) pmod{10^{12}}

В этой формуле ни одно из произведений не переполняет int64_t, а значит она годится для реализации в коде, и потребует это всего лишь нескольких строк.

Какое отношение это имеет к решаемой задаче? Прямое. Нам аналогично нужно перемножить два 32-битных числа, но для вычисления произведения есть всего-лишь 53 бита. И я предлагаю разбить один из множителей (b) на пару b_hi и b_lo — старшие и младшие 16 бит числа, если представлять его его в виде int32_t. А вместо миллиона тогда будет константа 1 << 16. В этом случае каждое произведение будет не более, чем 48-битным, то есть без потерь может быть вычислено с помощью произведения в double.

Полноценная векторизация

Введём вспомогательную функцию mod, тело которой нам уже должно быть знакомо:

__m256d mod(__m256d a, __m256d m, __m256d m_inv) {
    __m256d tmp = _mm256_mul_pd(a, m_inv);
    tmp = _mm256_floor_pd(tmp);
    tmp = _mm256_mul_pd(tmp, m);
    return _mm256_sub_pd(a, tmp);
}

Здесь всё то же самое, что раньше было в mul_mod, кроме собственно произведения. Теперь задача простая — как раз написать mul_mod, используя ранее выведенную формулу.

Смотрите внимательно, надеюсь не запутаетесь:

// Маска для извлечения 2-х младших байт для 32-битных целых.
const __m128i MASK = _mm_set1_epi32((1 << 16) - 1);
// Вектор, который содержит значения "2 в 16-й степени".
const __m256d K = _mm256_set1_pd(1 << 16);
__m256d mul_mod(__m256d a, __m256d b, __m256d m, __m256d m_inv) {
    // Конвертируем вектор [double] в вектор [int32_t].
    __m128i b_epi32 = _mm256_cvtpd_epi32(b);
    // Извлекаем старшие 2 байта через сдвиг вправо на 16 бит.
    __m128i b_epi32_hi = _mm_srli_epi32(b_epi32, 16);
    // Извлекаем младшие 2 байта через конъюнкцию с маской.
    __m128i b_epi32_lo = _mm_and_si128(b_epi32, MASK);
    // Конвертируем вектора [int32_t] обратно в [double].
    __m256d b_hi = _mm256_cvtepi32_pd(b_epi32_hi);
    __m256d b_lo = _mm256_cvtepi32_pd(b_epi32_lo);
    // tmp1 = ((a * b_hi) % m) * K;
    __m256d tmp1 = _mm256_mul_pd(a, b_hi);
    tmp1 = mod(tmp1, m, m_inv);
    tmp1 = _mm256_mul_pd(tmp1, K);
    // tmp2 = a * b_lo;
    __m256d tmp2 = _mm256_mul_pd(a, b_lo);
    // return (tmp1 + tmp2) % m;
    tmp2 = _mm256_add_pd(tmp1, tmp2);
    return mod(tmp2, m, m_inv);
}

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

Время финального теста. На этот раз я выставлю верхнюю границу проверяемого интервала в 1u << 31, чтобы проверить вообще все 31-битные целые. Вот сколько времени это заняло:

testMillerRabinInteger:
160.792 seconds
105097565 primes found
testMillerRabinVectorized:
408.16 seconds
105097565 primes found

В 2.5 раза дольше невекторизованного целочисленного алгоритма. Довольно таки позорно, но хотя-бы посчитанное количество простых чисел совпало, а значит код скорее всего верный.

Выводы

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

Также интересным оказалось то, насколько оператор % тормозной. То есть я и так знал, что он медленный, но не осознавал масштабов. The more you know.

Weekend Offer в AliExpress

Дата
Время10:00 – 20:00
Место

Онлайн

Конференция «Я.Железо»

Дата
Время14:00 – 23:59
Место

МоскваОнлайн

Метки:





Запись опубликована: 21.04.2024

Как забота о себе поможет укрепить отношения

[ comments ]

Хорошо, когда у вас есть ресурсы поддержать не только себя, но и партнёра.
Как забота о себе поможет укрепить отношения

Отношения в паре лишь часть жизни. Они зависят в том числе и от того, насколько вы готовы заботиться не только о любимом человеке, но и о себе. Нет‑нет, речь совсем не о том, что нужно забыть о партнёре и думать исключительно о своём комфорте. Просто тот, кто уделяет внимание собственным душевным и физическим потребностям, как правило, более устойчив в самых разных обстоятельствах. А значит, сумеет помочь и себе, и другому.

Физическое благополучие

Любая система нуждается в балансе. Если одна из двух опор вдруг ослабевает, проблемы возникают и у второй. Когда у человека сложности со здоровьем, он, конечно, надеется на поддержку партнёра. И если с отношениями всё в порядке, получает её. Но партнёр — обычный человек, который тоже порой может болеть. Тогда ему будет нужна уже ваша помощь.

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

Конечно, ощущать себя сильным, энергичным, лёгким на подъём нужно прежде всего самому человеку. Но если у него есть ресурс при необходимости помочь партнёру, то он будет чувствовать себя в большей безопасности. Это наверняка пойдёт на пользу отношениям.

Поэтому стоит заняться спортом, добавить полезные продукты в рацион, танцевать, кататься на велосипеде или гулять по парку. Так вы сможете не только укрепить своё здоровье, но и добавить ощущения стабильности вашим отношениям.

Эмоциональный комфорт и психологическая устойчивость

Здесь тот же принцип: если вы более устойчивы, то и у партнёра меньше оснований тревожиться. Когда кто‑то из двоих теряет уверенность в себе, переживает из‑за неудач, чувствует себя в тупике, то и другому тоже невесело.

Человек, который расстраивается из‑за собственных проблем, становится менее внимательным к партнёру. Он не всегда может выслушать другого, посочувствовать ему, помочь разобраться в сложной ситуации. Да и порадоваться за близкого тоже порой не получается — кажется, что на это просто нет сил.

Такая ситуация вряд ли пойдёт на пользу отношениям. Если же эмоциональные проблемы возникнут сразу у обоих, велика вероятность взаимных обвинений в невнимательности и желании думать только о себе.

Забота о своём душевном комфорте — это не эгоизм.

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

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

Исследования показывают: у человека, который осознанно заботится о себе, возрастает субъективное ощущение благополучия. Значит, у него появляются ресурсы поддержать другого. Поэтому вам стоит найти время для занятий, которые помогут обрести опору под ногами, когда тяжело. И подарят ощущение радости, которым можно поделиться. Выбирайте то, что полезно именно вам: медитации, хобби, поездки на природу, встречи с друзьями, волонтёрство.

Финансовая независимость

Пары, в которых деньги зарабатывает лишь один партнёр, менее устойчивы, чем те, где оба финансово независимы. Хотя бы потому, что двое, как правило, могут получить больше средств, чем один.

Если вы заинтересованы в прочных отношениях, обратите внимание на результаты социологических исследований. Они показывают, что самая популярная причина разводов в России — бедность.
Кроме того, большинство россиян недовольны своей зарплатой. Значит, испытывают стресс и негативные эмоции, которые тоже могут отразиться на отношениях.

Поэтому забота о собственной финансовой устойчивости может помочь не только вам, но и вашей паре.

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

Старайтесь не перекладывать все финансовые вопросы на партнёра — стоит позаботиться и о собственном источнике дохода.

Желание развиваться и исследовать новое

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

Но иногда такое восприятие может лишь помешать. Это происходит, когда отношениям отводится главная роль в жизни, а всё остальное отодвигается на задний план и объявляется неважным.

Но дело в том, что один человек не сможет заменить весь остальной мир. Это непосильная для него нагрузка: у него просто не хватит на это ресурсов.

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

Поэтому стоит позаботиться о том, чтобы ваша картина мира не испытывала перекоса. Отношения — это лишь одна из опор и один из источников счастья. Ищите другие — те, что помогут не перегружать эту важную часть жизненного фундамента.

Исследования показывают: когда человек уделяет внимание личностному росту, а также делится своим опытом с партнёром, отношения укрепляются и могут стать более страстными. Поэтому развивайтесь профессионально, учите языки, осваивайте новые сферы деятельности. Общайтесь с интересными людьми. Слушайте новую для вас музыку, ищите интересные фильмы, сериалы, книги. То есть — заботьтесь о своём развитии.

Alphavector / Shutterstock / Мария Муреева / Лайфхакер

[ comments ]

Метки:





Запись опубликована: 21.04.2024

[Перевод] Космические войска США планируют провести первые военные учения на орбите

Обновить

SLY_G 1 час назад

Уровень сложностиПростой
Время на прочтение6 мин

Количество просмотров317

Перевод

«Поставщики будут отрабатывать реалистичный сценарий реагирования на угрозы».

Иллюстрация художника, изображающая два спутника, выполняющих операции по сближению на низкой околоземной орбите.

Иллюстрация художника, изображающая два спутника, выполняющих операции по сближению на низкой околоземной орбите.

Космические силы США объявили в четверг о сотрудничестве с двумя компаниями, Rocket Lab и True Anomaly, в рамках первой в своём роде миссии, призванной продемонстрировать, как военные могут противостоять «орбитальной агрессии».

В ходе этой миссии космический аппарат, созданный и запущенный Rocket Lab, будет преследовать другой спутник, созданный True Anomaly, стартапом из Колорадо. «Поставщики будут отрабатывать реалистичный сценарий под названием «Victus Haze», подразумевающий реагирование на угрозы в космическом орбитальном пространстве», — говорится в заявлении Командования космических систем Космических сил.

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

Поднимемся, чтобы взглянуть

«Когда другая страна выводит в космос объект, а мы не совсем понимаем, что это за объект, не знаем его намерений, не знаем его возможностей, нам нужна возможность подняться туда и выяснить, что это за штука», — сказал генерал Майкл Гетлейн, заместитель начальника Космических сил по космическим операциям.

Именно это Космические силы хотят продемонстрировать с помощью «Victus Haze». Для этой миссии космический аппарат True Anomaly будет запущен первым, выдавая себя за спутник потенциального противника, например Китая или России. В Rocket Lab будет находиться в режиме ожидания спутник, который поднимется и проверит космический аппарат True Anomaly, и запустит его, когда Космические силы дадут команду на запуск.

«Довольно интересное состязание», — говорит Эвен Роджерс, соучредитель и генеральный директор True Anomaly.

Затем, если всё пойдёт по плану, два космических аппарата поменяются ролями, и спутник «Jackal» компании True Anomaly будет активно маневрировать вокруг спутника Rocket Lab. По данным Space Force, True Anomaly и Rocket Lab предоставят свои космические аппараты не позднее осени 2025 года.

«Если ближайший конкурент совершает определённое действие, мы должны иметь в своём арсенале возможность совершить ответный манёвр, будь то демонстрация силы или осведомлённость о космическом пространстве, или понимание характеристик окружающей среды – понимание того, что происходит?» сказал Гетлейн.

«Victus Haze» — следующий в серии военных миссий, посвящённых проверке возможностей тактически оперативного использования космического пространства (TacRS). В ходе этих работ Космические силы и их коммерческие партнёры продемонстрировали, как они могут сократить время подготовки и запуска спутника.

В прошлом году Космические силы в сотрудничестве с компаниями Firefly Aerospace и Millennium Space Systems осуществили миссию «Victus Nox». Спутник «Victus Nox» был создан и испытан менее чем за год, а затем подготовлен к запуску менее чем за 60 часов. Компания Firefly успешно запустила космический аппарат на своей ракете Alpha через 27 часов после получения приказа на запуск от Космических сил. Это замечательное достижение в отрасли, где на создание спутников уходят годы, а кампании по запуску обычно длятся недели или месяцы.

 Один из двух первых автономных орбитальных аппаратов «Jackal» компании True Anomaly, которые были запущены в марте в рамках программы SpaceX rideshare.

Один из двух первых автономных орбитальных аппаратов «Jackal» компании True Anomaly, которые были запущены в марте в рамках программы SpaceX rideshare.

«У нас больше нет такой роскоши, как возможность ждать годы, 10 или 15 лет, чтобы обеспечить себе некоторые из этих возможностей», — сказал Гетлейн в ходе дискуссии, состоявшейся в январе в Центре стратегических и международных исследований. «Тактически значимые сроки — это вопрос недель, дней или даже часов».

««Victus Haze» — это продолжение разрушения этих парадигм и демонстрация того, как мы можем быстро обеспечить себе осведомлённость о космической области и реагировать на угрозу в режиме реального времени», — сказал Гетлейн.

Миссия «Victus Haze» сложнее, чем «Victus Nox», в ней участвуют два основных подрядчика, два космических аппарата и два запуска ракет с разных космодромов, и всё это происходит в сжатые сроки, «чтобы демонстрация была как можно более реалистичной», сообщил Ars представитель Космических сил.

«Эта демонстрация в конечном итоге подготовит Космические силы США к предоставлению боевым командованиям будущих сил для проведения быстрых операций в ответ на агрессию противника на орбите», — говорится в заявлении Командования космических систем.

Вера в коммерческий космос

«Это действительно значительная оперативная демонстрация, которая действительно расширяет технологические возможности и демонстрирует веру в промышленную базу США», — сказал Роджерс.

«По сути, речь идёт о том, чтобы впервые охарактеризовать неизвестные возможности на низкой околоземной орбите», — сказал Роджерс в интервью Ars. «Есть целый ряд проблем, которые возникают в связи с этим: как отслеживать манёвры объекта на низкой околоземной орбите при ограниченных возможностях контроля космического пространства, каким будет правильный баланс между автономностью и взаимодействия с человеком».

Первые два спутника «Jackal» компании True Anomaly были запущены в рамках программы SpaceX rideshare в прошлом месяце, но через несколько недель компания объявила, что оба спутника не смогут завершить запланированную демонстрацию рандеву. Это было бы предвестником того типа активности, которую True Anomaly и Rocket Lab продемонстрируют на «Victus Haze».

По словам Роджерса, его компания работает ещё над двумя демонстрационными полётами, которые состоятся до «Victus Haze».

Военное подразделение оборонных инноваций США выделило Rocket Lab 32 миллиона долларов на свою часть миссии «Victus Haze». Контракт True Anomaly с SpaceWERX, инновационным подразделением Космических сил, оценивается в 30 миллионов долларов. True Anomaly вложит 30 миллионов долларов частного капитала в оплату миссии, в результате чего общая стоимость «Victus Haze» составит около 92 миллионов долларов. Space Safari, подразделение Командования космических систем, курирует весь проект.

«Мы видим прекрасную возможность использовать инновации коммерческой космической промышленности для противодействия Китаю как главной угрозе для Америки», — сказал полковник Брайон Макклейн, руководитель программы командования космических систем по осведомлённости о космическом пространстве и боевой мощи. «Соединённые Штаты обладают самой инновационной космической промышленностью в мире. «Victus Haze» продемонстрирует в оперативно реалистичных условиях нашу способность реагировать на безответственное поведение на орбите».

«После завершения этапа создания миссия перейдёт к нескольким последовательным этапам, включающим в себя фазы горячего резерва, активации, оповещения и запуска», — заявили представители Космических сил. «Хотя это скоординированная демонстрация, каждому поставщику будут предоставлены уникальные профили запуска и миссии».

Спутник «Jackal» компании True Anomaly, размером почти с холодильник, будет запущен в рамках «быстрой поездки» с космодрома на мысе Канаверал во Флориде или с базы космических сил Ванденберг в Калифорнии, сообщает командование Space Systems. Скорее всего, это будет запуск на борту ракеты SpaceX Falcon 9. Запуск по программе rideshare сопряжён с другими проблемами, чем запуск на специальной ракете, как это было в прошлом году с миссией «Victus Nox».

 Запуск ракеты Electron из Новой Зеландии.

Запуск ракеты Electron из Новой Зеландии.

True Anomaly утверждает, что сможет достать свой спутник из хранилища и интегрировать его с ракетой за 12-84 часа, в зависимости от частоты полётов поставщика услуг по запуску. После запуска «Jackal» компании True Anomaly Космические силы дадут Rocket Lab 24-часовой запрос на запуск своего спутника, схожего по размерам с космическим аппаратом True Anomaly, на ракете Electron из Новой Зеландии или из Вирджинии. Запуск Rocket Lab должен быть точно рассчитан по времени, чтобы его спутник успел сблизиться с космическим аппаратом True Anomaly на орбите.

««Victus Haze» опирается на проверенный опыт Rocket Lab в области разработки решений для запуска и космических аппаратов, которые позволяют осуществлять передовые миссии в ускоренные сроки», — сказал в своём заявлении Питер Бек, основатель и генеральный директор Rocket Lab. «Возможность спроектировать, построить, запустить и эксплуатировать космический аппарат в рамках одной команды — редкое явление, которое обеспечит беспрецедентную скорость и ценность для нации».

Добиться такого сокращения времени запуска спутника было нелегко. Военная программа Operationally Responsive Space (ORS) ставила перед собой аналогичные цели в 2000-х и 2010-х годах, но она была направлена скорее на пополнение или замену потенциала, а не на реагирование на угрозы в космосе, говорит Гетлейн.

С тех пор коммерческие компании разработали собственный современный потенциал. Космическим силам доступны более совершённые технологии по более низкой цене. «В то время это было слишком дорого», — сказал Гетлейн.

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

«Тактическое реагирование в космосе зависит не от аппаратуры», — говорит Гетлейн. «Дело не в спутнике, не в датчике, не в ракете. Дело в мышлении. Дело в культуре».

Если эта публикация вас вдохновила и вы хотите поддержать автора — не стесняйтесь нажать на кнопку

Weekend Offer в AliExpress

Дата
Время10:00 – 20:00
Место

Онлайн

Конференция «Я.Железо»

Дата
Время14:00 – 23:59
Место

МоскваОнлайн

Метки:





Запись опубликована: 21.04.2024

Что такое диклофенак и зачем его используют

[ comments ]

Подробное описание препарата.
Что такое диклофенак и зачем его используют

Что такое диклофенак и когда его используют

Диклофенак — это нестероидный противовоспалительный препарат (НПВП) из группы производных фенилуксусной кислоты.

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

  • ревматоидный артрит и остеоартрит,
  • травмы и растяжения мышц и связок,
  • спинная боль,
  • зубная боль,
  • мигрень,
  • подагра,
  • анкилозирующий спондилит, вызывающий воспаление позвоночника и других частей тела.

История создания

Диклофенак был впервые синтезирован в 1973 году группой химиков под руководством Альфреда Саллманна и Рудольфа Пфистера. В то время они работали в компании Ciba‑Geigy — сейчас это часть фармацевтической корпорации Novartis.

Механизм действия и доказательная база

Диклофенак — это один из наиболее широко применяемых противовоспалительных препаратов. Механизм действия заключается в блокировании действия ферментов циклооксигеназы (ЦОГ).

Эти ферменты играют ключевую роль в производстве простагландинов — медиаторов, ответственных за воспаление, боль и повышение температуры. Блокировка действия этих ферментов предотвращает синтез простагландинов, что в итоге приводит к ослаблению симптомов.

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

Дозировка

Диклофенак принимают в форме таблеток, капсул, мази или суппозиториев. Обычная доза — от 25 мг до 50 мг в день, если это таблетки, и от 50 до 100 мг если это свечи. Врач может скорректировать дозировку, поэтому она может стать больше или меньше. Принимают диклофенак в среднем по 2–4 раза в сутки.

При назначении препарата ребёнку важно учитывать его вес, чтобы правильно подобрать нужное количество. В таком случае, опять же, лучше всего следовать рекомендациям педиатра или врача общей практики.

Если вы постоянно испытываете боль, врач может порекомендовать таблетки или капсулы с замедленным высвобождением. В таком случае препарат пьют дважды в день с перерывом между приёмами в 10–12 часов.

Информация перед применением

Обязательно проконсультируйтесь с врачом перед началом лечения, чтобы оценить возможные риски и преимущества:

Препарат может увеличить риск смертельного инфаркта или инсульта даже при отсутствии других факторов риска. Поэтому лучше не принимать его до или после операций на сердце.

Диклофенак может стать причиной желудочного или кишечного кровотечения, что может быть смертельно опасно, особенно у пожилых людей.

Во время беременности, особенно после 20‑й недели, препарат увеличивает риск серьёзных осложнений с сердцем или почками у нерождённого ребёнка.

Сообщите врачу обо всех аллергических реакциях, особенно на аспирин или другие НПВП. А также если вы перенесли астматический приступ или тяжёлую аллергическую реакцию после их приёма.

Важно принимать препарат с осторожностью при кормлении грудью, так как безопасность применения диклофенака в этот период не установлена. Важно обсудить этот момент с вашим лечащим врачом.

А ещё препарат нельзя применять людям младше 18 лет.

Побочные эффекты

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

  • Со стороны ЖКТ — тошнота, рвота, изжога, диарея, эрозии и язвы слизистой оболочки желудка и двенадцатиперстной кишки.
  • Со стороны сердечно‑сосудистой системы — повышение артериального давления, задержка жидкости, отёки.
  • Со стороны ЦНС — головная боль, головокружение, шум в ушах.
  • Аллергические реакции — кожная сыпь, зуд, крапивница.

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

  • Кровь в рвоте или чёрный кал.
  • Сильная изжога или боль в желудке, рвота и диарея.
  • Пожелтение кожи и белков глаз.
  • Осязаемая зудящая сыпь, опухшая или одутловатая кожа.
  • Одышка, усталость и отёкшие ноги или лодыжки.

Применение при беременности и в период лактации

Во время беременности диклофенак обычно не прописывают. Слишком высок риск негативного воздействия на развитие ребёнка — на кровообращение и объём амниотической жидкости в утробе.

Использование в период беременности оправдано, только если ожидаемая польза для матери значительно превышает потенциальный риск для плода. Часто существуют альтернативные, более безопасные методы лечения боли, например парацетамол.

При грудном вскармливании диклофенак применять можно, так как лишь минимальное количество препарата проникает в грудное молоко.

Однако при любых изменениях в аппетите или состоянии здоровья ребёнка следует немедленно проконсультироваться со специалистом.

Взаимодействие с другими препаратами

Не рекомендуется применять диклофенак:

  • С другими НПВС (нестероидными противовоспалительными препаратами), поскольку это увеличивает риск развития желудочно‑кишечных язв и кровотечений.
  • Антикоагулянтами, так как препарат увеличивает риск кровотечений.
  • Диуретиками, потому что диклофенак может снизить их эффективность и увеличить риск почечной недостаточности.
  • Литием и метотрексатом, так как это может увеличить риск токсического воздействия этих препаратов.

Перед началом приёма диклофенака важно рассказать врачу обо всех принимаемых препаратах, включая безрецептурные лекарства, витамины и БАДы, чтобы избежать потенциально опасных взаимодействий.

Пропуск дозы

Если забыли принять диклофенак по своему расписанию, то примите сразу, как вспомните, если только не подошло время приёма следующей дозы. В таком случае не надо принимать в два раза больше, просто выпейте или используйте одну обычную.

Передозировка

Симптомы передозировки обычно такие:

  • Тошнота.
  • Рвота.
  • Головная боль.
  • Головокружение.
  • Сонливость.
  • Повышение артериального давления.

В случае передозировки нет какого‑то специфического антидота. Поэтому основные варианты решения — это промывание желудка и приём активированного угля. Если лучше не становится, то нужно обратиться за медицинской помощью.

Если нашли ошибку, выделите текст и нажмите Ctrl + Enter

[ comments ]

Метки:





Запись опубликована: 21.04.2024

Как привести тело в форму: 4 слагаемых хорошего результата

[ comments ]

Как привести тело в форму:

4 слагаемых отличного результата
Хорошо себя чувствовать и быть уверенным в себе можно в любом весе. Но если для внутреннего комфорта вы хотите стать стройнее, можно сделать это без изнуряющего голода и потери энергичности. Лайфхакер расскажет, как начать худеть без стресса и «диетных качелей», получить удовольствие от процесса и оставаться в отличной форме надолго.

Забота о здоровье

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

Что такое грелин и как он мешает вам похудеть

Что такое грелин и как он мешает вам похудеть

Почему нельзя похудеть, если не избавиться от стресса

Почему нельзя похудеть, если не избавиться от стресса

Как генетика влияет на фигуру и спортивные показатели

Как генетика влияет на фигуру и спортивные показатели

Правда ли сильно потеть на тренировке полезно для здоровья и фигуры

Правда ли сильно потеть на тренировке полезно для здоровья и фигуры

Правда ли людям с большим лишним весом нельзя бегать

Правда ли людям с большим лишним весом нельзя бегать

Почему возникают нарушения обмена веществ и что с ними делать

Почему возникают нарушения обмена веществ и что с ними делать

Как нездоровый кишечник мешает нам похудеть

Как нездоровый кишечник мешает нам похудеть

15 вещей, которые следует знать об обмене веществ, чтобы держать себя в форме

15 вещей, которые следует знать об обмене веществ, чтобы держать себя в форме

5 психологических причин, которые мешают похудеть

5 психологических причин, которые мешают похудеть

Почему люди набирают вес после 40 лет и как это исправить

Почему люди набирают вес после 40 лет и как это исправить

Что такое метаболический синдром и почему он так опасен

Что такое метаболический синдром и почему он так опасен

6 способов ускорить метаболизм, которые по силам каждому

6 способов ускорить метаболизм, которые по силам каждому

Чем опасен висцеральный жир и как от него избавиться

Чем опасен висцеральный жир и как от него избавиться

Что нужно знать об ожирении

Что нужно знать об ожирении

Откуда берётся гипотиреоз и что с ним делать

Откуда берётся гипотиреоз и что с ним делать

Что такое индекс массы тела и стоит ли его считать

Что такое индекс массы тела и стоит ли его считать

Диеты и правильное питание для тех, кто хочет похудеть

Жёсткие ограничения приводят к быстрым результатам, но не помогают удержать вес. А некоторые популярные диеты могут вызвать проблемы со здоровьем. Рассказываем, как этого избежать.

Помогает ли вода похудеть

Помогает ли вода похудеть

Правда ли, что от алкоголя толстеют

Правда ли, что от алкоголя толстеют

8 продуктов, которые помогут похудеть

8 продуктов, которые помогут похудеть

Читмил: как есть сладости и фастфуд и оставаться в форме

Читмил: как есть сладости и фастфуд и оставаться в форме

Стоит ли пить протеин для похудения

Стоит ли пить протеин для похудения

Что такое L-карнитин и поможет ли он похудеть и развить мощность

Что такое L-карнитин и поможет ли он похудеть и развить мощность

Калькулятор: как рассчитать норму калорий

Калькулятор: как рассчитать норму калорий

5 главных ошибок в питании, которые мешают похудеть

5 главных ошибок в питании, которые мешают похудеть

Какие добавки для похудения действительно работают, а какие — нет

Какие добавки для похудения действительно работают, а какие — нет

Помогут ли похудеть продукты с отрицательной калорийностью

Помогут ли похудеть продукты с отрицательной калорийностью

Что такое диета 5 : 2 и правда ли она поможет похудеть

Что такое диета 5 : 2 и правда ли она поможет похудеть

7 принципов интуитивного питания, которые помогут похудеть без диет

7 принципов интуитивного питания, которые помогут похудеть без диет

Как есть имбирь, чтобы похудеть

Как есть имбирь, чтобы похудеть

Что такое кетогенная диета и как на ней сидеть

Что такое кетогенная диета и как на ней сидеть

Как голодание помогает терять жир и сохранять мышцы

Как голодание помогает терять жир и сохранять мышцы

Что такое сиртфуд-диета и правда ли она моментально избавит от жира

Что такое сиртфуд-диета и правда ли она моментально избавит от жира

5 диет, эффективность которых подтверждена учёными

5 диет, эффективность которых подтверждена учёными

Чем хороша средиземноморская диета и как на ней сидеть

Чем хороша средиземноморская диета и как на ней сидеть

Тренировки для похудения

Физические нагрузки не только помогают тратить дополнительные калории, но и улучшают состав тела, ускоряют обмен веществ и способствуют удержанию нового веса. Читайте, как заниматься в домашних условиях.

Правда ли, что тренировки на голодный желудок помогают похудеть

Правда ли, что тренировки на голодный желудок помогают похудеть

Прокачка: простая интервальная тренировка для сжигания жира

Прокачка: простая интервальная тренировка для сжигания жира

8 лучших упражнений для похудения

8 лучших упражнений для похудения

Как прокачать всё тело за полчаса: интенсивная тренировка без оборудования

Как прокачать всё тело за полчаса: интенсивная тренировка без оборудования

Йога для похудения: миф или реальность

Йога для похудения: миф или реальность

Как выполнять махи гирей, чтобы сжечь максимум калорий и накачать попу

Как выполнять махи гирей, чтобы сжечь максимум калорий и накачать попу

Как похудеть за 10 минут в день. Адская интервальная тренировка

Как похудеть за 10 минут в день. Адская интервальная тренировка

Как делать упражнение «скалолаз», чтобы качать пресс и худеть

Как делать упражнение «скалолаз», чтобы качать пресс и худеть

Прокачка: комплекс с гирей и бёрпи для ускоренной траты калорий

Прокачка: комплекс с гирей и бёрпи для ускоренной траты калорий

Как делать зарядку для похудения

Как делать зарядку для похудения

Прокачка: домашняя тренировка с гантелями, которая сожжёт немало калорий

Прокачка: домашняя тренировка с гантелями, которая сожжёт немало калорий

Прокачка: простой комплекс для подтянутого тела

Прокачка: простой комплекс для подтянутого тела

Правда ли для похудения больше подходят спокойные тренировки

Правда ли для похудения больше подходят спокойные тренировки

5 кругов ада: интенсивная тренировка, которая приведёт вас в форму

5 кругов ада: интенсивная тренировка, которая приведёт вас в форму

Как тренироваться, если у вас большой лишний вес или ожирение

Как тренироваться, если у вас большой лишний вес или ожирение

Помогает ли обруч худеть и как правильно его крутить

Помогает ли обруч худеть и как правильно его крутить

30 минут аэробного треша для здоровья, похудения и выносливости

30 минут аэробного треша для здоровья, похудения и выносливости

5 кругов ада: 30-минутная тренировка с мощным двойным эффектом

5 кругов ада: 30-минутная тренировка с мощным двойным эффектом

5 кругов ада: тренировка жжёт калории и прокачивает взрывную силу

5 кругов ада: тренировка жжёт калории и прокачивает взрывную силу

20 вариантов бёрпи для прокачки всего тела

20 вариантов бёрпи для прокачки всего тела

5 кругов ада: тренировка для похудения и укрепления плеч

5 кругов ада: тренировка для похудения и укрепления плеч

5 кругов ада: убойная 30-минутная тренировка для похудения

5 кругов ада: убойная 30-минутная тренировка для похудения

Суперинтенсивная круговая тренировка сожжёт жир и прокачает мышцы

Суперинтенсивная круговая тренировка сожжёт жир и прокачает мышцы

5 кругов ада: домашняя тренировка для борьбы с лишним весом

5 кругов ада: домашняя тренировка для борьбы с лишним весом

5 кругов ада: 30-минутная тренировка для красивого тела и здорового сердца

5 кругов ада: 30-минутная тренировка для красивого тела и здорового сердца

5 кругов ада: крутая тренировка для ускоренной траты калорий

5 кругов ада: крутая тренировка для ускоренной траты калорий

Табата: 4-минутные тренировки, которые сжигают жир лучше бега

Табата: 4-минутные тренировки, которые сжигают жир лучше бега

Полезные советы для похудения

Качественное похудение зависит от многих факторов. Гормональный фон, количество сна и стресса могут сильно повлиять на борьбу с лишним весом. Узнайте, как помочь своему организму и избежать ошибок в процессе.

10 советов, как начать худеть без диет и спортзала

10 советов, как начать худеть без диет и спортзала

Сколько калорий нужно сжигать, чтобы худеть

Сколько калорий нужно сжигать, чтобы худеть

5 способов тратить больше калорий без тренировок

5 способов тратить больше калорий без тренировок

15 приложений для похудения

15 приложений для похудения

Какие ошибки мешают похудеть, даже если вы ходите в спортзал

Какие ошибки мешают похудеть, даже если вы ходите в спортзал

10 научно обоснованных привычек, которые помогут сбросить вес и держать его под контролем

10 научно обоснованных привычек, которые помогут сбросить вес и держать его под контролем

Почему вес перестал снижаться и как снова начать худеть

Почему вес перестал снижаться и как снова начать худеть

Почему не получается сбросить вес, несмотря на все усилия

Почему не получается сбросить вес, несмотря на все усилия

Как правильно отслеживать свой прогресс в похудении

Как правильно отслеживать свой прогресс в похудении

[ comments ]

Метки:





Запись опубликована: 20.04.2024

6 вопросов для тех, кто хочет прекратить общение с токсичным членом семьи

[ comments ]

Не спешите обрывать родственные связи, возможно, ваша тётя просто очень надоедливая.
6 вопросов для тех, кто хочет прекратить общение с токсичным членом семьи

Устанавливать границы бывает очень сложно, особенно когда речь идёт о близких людях. Недра Тавваб, лицензированный терапевт и автор бестселлера «Установи границы, обрети душевный покой», посвятила этой проблеме свою новую книгу «Без драм: руководство по управлению нездоровыми семейными отношениями» (Drama Free: A Guide to Managing Unhealthy Family Relationships). В ней автор помогает читателям разобраться с наиболее распространённым типом дисфункциональных отношений — тех, что связывают нас с семьёй.

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

Конечно, если общение становится слишком изматывающим и небезопасным, любые связи пора обрывать. Но прежде чем вы сделаете такой серьёзный шаг, Тавваб предлагает ответить на шесть вопросов.

1. Чувствую ли я, что нахожусь в опасности рядом с этим человеком?

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

Безопасность — один из самых важных факторов, которые нужно учитывать.

Физическое насилие — максимально веская причина оборвать все контакты, если вы хотите и можете это сделать. Тавваб также выделяет менее очевидные примеры жестокого обращения: неприятные прозвища, уничижительные комментарии, угрозы, постоянная «игра в молчанку», игнорирование или высмеивание ваших чувств.

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

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

2. Родственник ведёт себя токсично или просто надоедливо?

Представьте, что вы рассказываете о неприятных моментах детства, а брат или сестра перебивает и говорит вам или, что ещё хуже, членам вашей семьи, что вы врёте и такого никогда не было. Это токсичное поведение. А если он или она обрывает вас на полуслове, просто потому что не умеет слушать, и вообще «сейчас моя очередь говорить», — это обычное проявление эгоизма. Подобное поведение, безусловно, раздражает, и его нужно обсудить с близким человеком, но оно необязательно токсично.

Умение справляться с отвратительными чертами характера других людей — часть жизни. Те, кого мы искренне любим, иногда выводят нас из себя. Попробуйте честно поговорить с близким человеком и рассказать о том, что вас ранит. А если это не помогает, подумайте, как часто вы готовы с ним видеться и терпеть его нетоксичные, но крайне раздражающие манеры.

3. Говорил ли я родственнику прямо о том, что меня беспокоит?

Люди, которые присутствуют в вашей жизни с того момента, как вы (или они) родились, могу быть уверены, будто понимают вас как никто другой. Иногда это приятно. Например, когда ваша бабушка поддерживает ваши творческие начинания и её вера придаёт вам силы. Однако в семье с дисфункциональной динамикой такая уверенность заставляет чувствовать, будто вы задыхаетесь.

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

Когда мы даём другому человеку понять, как на нас влияет его поведение, мы даём ему шанс измениться.

Главное — помнить, что вы можете контролировать исключительно свою часть диалога. Чтобы он прошёл успешно, родственник должен быть готов выслушать вас, признать свою неправоту и решить что‑то изменить. К сожалению, в дисфункциональных семьях люди обычно не хотят даже слушать о чужих переживаниях, не то что меняться. Поэтому будьте готовы к тому, что родственник попытается замять тему или перевести стрелки на вас.

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

4. Скорректировал ли я свои ожидания?

По словам Тавваб, часто мы полагаем, что родители обязаны дарить нам любовь и внимание, потому что играют особенную роль в нашей жизни. Однако многие люди не умеют быть внимательными и чуткими не только по отношению к окружающим, но и по отношению к самим себе. Так что дело совсем не в вас, а в них. Возможно, ваш родственник сам не получил достаточно любви в детстве или страдает от зависимости и проблем с ментальным здоровьем.

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

5. Пытался ли я отстраниться от родственника, не обрывая связь насовсем?

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

Тавваб уверена, что существует множество способов сократить общение, не прерывая его окончательно. Порой мы считаем, что отношения должны быть близкими, только потому что они семейные. Но есть родственники, которых регулярно и постоянно мы терпеть не можем, а иногда — можем. Остаётся только определить меру этого «иногда».

Отстраниться и сохранить контакты можно несколькими способами:

  • Пропустить следующую праздничную встречу.
  • Сократить количество телефонных разговоров, например до одного раза в неделю.
  • Не отвечать сразу на каждое сообщение.
  • Стоять на своём, когда родственник делает то, что вы просили его не делать.

6. Готов ли я действительно прекратить отношения?

Обрывать все контакты с родственником или нет — очень личное решение. Если вы перепробовали все тактики, описанные выше, и чувствуете, что ваше терпение достигло предела, разрыв отношений может казаться неизбежным шагом.

Однако если вас постоянно преследуют мысли о том, что будет, если завтра с родным человеком что‑нибудь случится, или вина внутри вас сильнее, чем желание защитить собственные чувства, это может быть признаком того, что вы ещё не готовы.

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

Иногда отдаление от семьи может длиться недолго, и после паузы даже удаётся вновь наладить отношения. Однако так происходит, только если каждый проделывает кропотливую внутреннюю работу. Очень важно сохранять реалистичные ожидания и иметь чёткий план действий для неприятных ситуаций в будущем. А самое главное заключается в том, чтобы честно говорить о причинах, по которым вы решили закончить общение.

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

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

[ comments ]

Метки: