Моти-мотическое

Оказывается, кроме привычных признаков делимости на 2, 3, 5, и 9, существует и признак делимости на 7!

Возьмём, например, число 203. Последняя цифра — 3. Умножаем её на 2 и вычитаем из оставшихся цифр, то есть из 20:

20 − 6 = 14.
14 делится на 7, значит и 203 делится на 7: 203 / 7 = 29.

Работает даже с более крупными числами!

Ещё пример: 973. Берём последнюю цифру (3), удваиваем и вычитаем из оставшейся части числа:

97 − 6 = 91.
Делится ли 91 на 7? Хм, не сразу понятно. Повторим правило ещё раз:

9 − (1×2) = 7 — делится!
Значит, и 973 делится на 7: 973 / 7 = 139.

Можно применять этот метод даже к пятизначным и далее числам — рекурсивно!

Возьмём 13762.

Последняя цифра — 2, удваиваем и вычитаем:
1376 − 4 = 1372.

Неясно? Повторяем:
137 − (2×2) = 133.

Всё ещё не очевидно? Ещё раз:
13 − (3×2) = 7 — делится!

Значит, и 13762 разделится на 7: 13762 / 7 = 1966.

Офигеть, нас этому не помню, чтобы учили (у меня, правда, была языковая школа, не обычная или физико-математическая, может быть, это не секрет вовсе). Это моё старшее чадо попало в школьную математическую команду и теперь ездит на соревнования! Недавно удалось увидеть этот приём у него в тетради — понравилось жутко, захотелось поделиться 🙂

Как они повидлу в карамельки засовывают

В детстве у меня был проигрыватель для виниловых пластинок с изменяемой скоростью проигрывания. Обычный диск на 33 оборота можно было запустить на 45 — уже получалось смешно. А можно было зафигачить аж на 78 оборотов — тогда пластинка проигрывалась очень быстро, и всё звучало по-мультяшному. По башке, конечно, надо было мне дать, чтобы пластинки не портил, но что было, то прошло. У меня сейчас тоже проигрыватель пластинок есть, но такой дурью я больше не маюсь. Просто играю пластинки и всё.

Так вот, всегда мучал вопрос — как это ютупчик и прочие сервисы видео- и аудиоконтента, типа подкастов, могут убыстрять (или замедлять) проигрывание звука без изменения его высоты?

Оказалось, что делают так:

1. Разбивают цифровой звук на маленькие блоки в 512-2048 байт. На частоте дискретизации в 44.1 килогерца эти блоки имеют длину всего несколько миллисекунд.
2. На каждом блоке запускают преобразование Фурье. Для тех, кто вдруг не знает — это математический способ разбить звук на индивидуальные составляющие частоты.
3. Воссоздают те же частоты, но просто укорачивают или увеличивают им длину проигрывания в нужное количество раз по желанию пользователя. Склеивают звук назад.

PROFIT!

Ну, немного посложнее, конечно (обычно там не тупо дискретные блоки по 512 байт, а т.н. “скользящее окно” (sliding window) размером в 512 байт, например, но основа алгоритма Phase Vocoder (“фазовый вокодер”, что ли?) именно такая.

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

XKCD

Нравятся мне комиксы xkcd, рисуют их наши люди.

Кстати, действительно работает. Один узел = π/e миль в час, с довольно высокой точностью.

Via https://xkcd.com/3023/

Забавно, кстати, смотреть на то, что некоторые комиксы уже устарели. Это комикс примерно года эдак 2013-2014, когда нейросети были ещё слабо известны. Я, впрочем, с ними уже был знаком, и использовал в 2012 году для дипломного проекта нейросеть Caffe института Беркли, которую сам с нуля натренировал. Но для начала 2000х проблема была ещё нерешаема.

Квантовое

Однако, ровно месяц назад Национальный Институт Стандартов и Технологий США (NIST) наконец-то решил, какими именно алгоритмами шифрования мы будем пользоваться для защиты информации в пост-квантовую эпоху.

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

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

А теперь Микрософт объявил, что первый из алгоритмов, ML-KEM (чорт, мне нравится это название, КЕМ!) уже встроены в стандартную библиотеку шифрования их ОС. ML-KEM — алгоритмом Шора уже не ломается.

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

Математическое и компьютерное

Вот некоторые думают, что если вычисления перенести на ГПУ вместо ЦПУ, то:

1. Всё сразу заработает в сто раз быстрее.
2. Будет сразу работать лучше.

АвотшЫш. Не всегда, и не везде.

Вот сделал я нейросеть, модель одинаковая, довольно несложная, пятислойная, сто нейронов в каждом слое, итого 50 тысяч параметров — по нынешним меркам вообще три копейки.

Запускаю на ЦПУ — сеть тренируется за три минуты, и выдаёт довольно нормальный результат, с точностью в пределах 0.7%

Запускаю на ГПУ — сеть тренируется уже за пять минут, а не за три, а результат у ней — заметно хреновей, с погрешностью уже 1.23%

Я полагаю, что последнее это потому, что TensorFlow, будучи запущенным на ГПУ, по умолчанию до сих пор использует 16 бит для представления чисел с плавающей запятой, вместо 32 бит или даже 64. Надо будет поглядеть, можно ли его заставить использовать больше бит. Хотя, конечно, математика на компьютерах — она дело такое, что вообще-то никто гарантии, что результат вычислений будет одинаковым, если программа запускается на процессорах разной архитектуры, никогда не давал. Особенно, если числа такие, что представить их точно в формате IEEE-754 невозможно (например, десятичная дробь 0.2).

А вот почему оно ничуть не быстрее работает на ГПУ, чем на ЦПУ — для меня уже загадка. RTX3080 вроде как пошЫрше должен быть во флопсах, чем i9-11900k @ 3.5GHz. Может быть, такая маленькая модель его просто нагрузить толком не в состоянии.

И да, “чтобы два раза не вставать”.

Как наиболее правильно считать и представлять среднюю ошибку в вычислениях?

Вот, например, если в одном предсказании из двух программа ошиблась на +100%, а во втором — на -100%, врядли заявление о том, что средняя ошибка составляет 0% (100-100)/2, будет представляться нам истинным.
Но с другой стороны, если тупо считать ошибки по модулю, а программа при этом стабильно ошибается то на +1%, то на -1%, статистически-то ведь она, можно сказать, что не ошибается вовсе.
Как обычно действуют, вдруг кто знает?

Pi Day

Т.к. дату в формате ММДДГГГГ обычно пишут только в США, специальный день календаря 3.14 получается сугубо американским.

Ну, тогда вот вам шутку на математическом английском.

Объясняю, если кто недопонял:

Квадратный корень из минус единицы — это комплексное число, которое записывают буквой i.
Двойка в третьей степени — это восемь (eight), произносится точно так же как слово ate.
Сигма — это сумма (sum), произносится как слово some.
Ну и само число Пи, которое в английском Pi, и произносится не как Pee, а как слово Pie (пирог).

Так что получаем фразу, которая звучит как i ate some pie (я съел кусок пирога). Математический кавай.

Математическая шутка

Обожаю такие шутки.

Математик заходит в забегаловку, берёт столик на двоих. К нему подходит неопрятная официантка.

–Что будете заказывать?
–Я закажу бифштекс, но я также хочу разыграть своего коллегу, который тут будет с минуты на минуту. Вот сто долларов; когда он придёт, я задам вам вопрос, а вы ответите “икс в кубе поделить на три”, хорошо?
–Конечно.

Официантка берёт деньги и уходит.

За столик присаживается коллега математика.

–Привет!
–Привет! Слушай, тут такое классное место, и даже обслуживающий персонал умный. Вот смотри!

Математик останавливает проходяющую мимо официантку.

–Скажите мне, каков будет неопределённый интеграл функции икс в квадрате?
–Икс в кубе поделить на три плюс константа.

PS: шутка прекрасно переводится на все языки, матан — язык универсальный.

Взлом резервных копий смартфонов iPhone

Для начала немного теории.

Как хранятся пароли в операционных системах, вебсайтах, и т.д. Не открытым текстом, разумеется. Они хранятся в виде хешей. Хеш — это строка определённой длины, получаемая при обработке ввода (пароля в данном случае) хеш-функцией. До недавнего времени (да и сейчас кое-где) использовался алгоритм MD5. Так, хеш MD5 слова “password” представляет собой строку 5f4dcc3b5aa765d61d8327deb882cf99.

Поэтому когда ты логинишься на вебсайт, пароль обрабатывается алгоритмом MD5, и сравниваются хеши. Если на выходе 5f4dcc3b5aa765d61d8327deb882cf99, то всё нормально. Винда делает немного по-другому: хеш генерируется прямо на клиенте, и пересылается не пароль, а сразу хеш. Это цуцуть безопаснее. Ещё хеш солят, но про это в другой раз.

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

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

Сломаем MD5 хеш 5f4dcc3b5aa765d61d8327deb882cf99:

hashcat.exe -m 0 -a 3 hash.txt ?l?l?l?l?l?l?l?l

И меньше, чем за секунду всё сломано.

На моей уже старенькой 1070GTX поиск хешей MD5 происходит со скоростью около 8 миллиардов комбинаций в секунду.

Даже если сменить пароль на более сложный, типа P@$$w0rd, то 8-значный пароль взламывается в обозримые сроки, даже на не очень новом железе — за несколько дней.

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

А недавно я попробовал сломать бекап смартфона Apple. Для тёщи, которая раскокала телефон вдребезги, успев, правда, незадолго до сделать ему бекап. Но вот беда — она забыла пароль от бекапа! Она только знала, что пароль восьмизначный.

Хеш пароля для айфонного бекапа берётся в файле Manifest.plist. Этот файл скармливается вот этому сайту, например, и тебе дают хеш.

Так вот хеш там — какой-то проприетарный. И имеет настолько высокую вычислительную сложность, что на моей видеокарте котохеш перебирает комбинации со скоростью… 83 варианта в секунду. Надо отдать должное чувству юмора разработчиков котохеша: во время работы оно показывает, сколько времени осталось до перебора всех вариантов. Так вот в данном случае оно говорит, что работа программы закончится после следующего Большого Взрыва 😀

Вот так вот Плотнег лососнул тунца.

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

Не всё так плохо

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

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

Топоры-вилы-факелы отставить.

Как в Америке преподают математику

Извиняюсь за матюги, но выбесило.

Очередная чушь-бредятина от местной системы преподавания основ математики и горячий привет от Common, блядь, Core.

Как нормальные люди складывают два числа, которые они не могут просто сложить в уме? Правильно, в столбик (long addition). Как нынче учат складывать американцев? Для двузначных чисел рисуют, блядь, таблицу с числами от одного до ста (hundreds chart). Вот такую:

Допустим, надо тебе сложить 36 и 23. Для этого надо найти в таблице число 36, и спуститься вниз на две клеточки (добавляем десятки), и потом вправо на три (добавляем единицы). Получаем, разумеется, 59.

Что не так с этим методом? Да всё не так. Во-первых, он хуёво масштабируется. Если тебе надо тысячи сложить, что, таблицу до миллиона рисовать? А если складывать миллиарды?

Во-вторых, он ничему не учит. Он не учит тому, что десятки надо складывать с десятками, а единицы с единицами. Он учит МЕТОДУ, а не пониманию чисел.

В-третьих, он не учит тому, что надо делать, если требуется сложить, например, 19 и 39 — вправо ведь нету 9 клеточек.

Накатал училке гневную телегу (без матов), поглядим, что ответит.

Прямо таки “пора валить”, блядь.