Русский
Русский
English
Статистика
Реклама

Математика

Модель натурального числа. Часть I

25.06.2020 16:23:50 | Автор: admin



Теоремы существования и теоремы перечисления. Модели


Ограниченность научных, теоретических знаний тормозит научное и общественное развитие.
Взять закон распределения простых чисел (ЗРПЧ) или ту же основную теорему арифметики (ОТА). Да, они фундаментальны, но что ОТА утверждает?

Это всего лишь (как и ЗРПЧ) теорема существования, для любого числа N существует произведение степеней простых чисел, которое единственно и равно этому числу N. Как получить и увидеть отдельные делители N в теореме не говорится. Аналогично и с простыми числами. Сами числа (большие и очень большие) получать умеем только квазипростыми.

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

Более того, большинство и других основных теорем теории чисел теоремы существования. Чтобы воспользоваться многими теоремами относительно простых или составных чисел N необходимо располагать разложением этого числа на делители. А этого-то мы и не умеем!
Где же ответ? Где ключевые направления для получения положительных решений?

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

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


Автором предлагаемой статьи длительное время самостоятельно разрабатываются теории НРЧ, отдельного числа и факторизации чисел в рамках нового (пока не было ссылок в комментариях о чем-то подобном в прошлом) оригинального (нет ссылок и на заимствования у других авторов) подхода к решению проблемы.

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

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

С учетом аудитории (надежда попасть на крутых спецов) и возможностей Habra (публикации в научных журналах не комментируются, что свойственно Хабру, журнальные рецензенты не в счет, это вопрос везения) в каждой публикации (в том числе и в рецензируемых журналах из списка ВАК) автору удается лишь в ограниченном объеме излагать отдельные новые оригинальные идеи подхода. Замечу, что нынешний рынок публикаций опубликует за деньги где хотите и что хотите академический журнал не панацея для истины.

Но для заинтересованных лиц в публикациях автора (часто с минусовыми оценками, новое чаще принимается в штыки, чем одобряется) можно более подробно ознакомиться с рядом результатов. Перечислю лишь некоторые: Закон распределения делителей (ЗРД здесь) числа, основная теорема факторизации (ОТФ здесь), необычное, независящее от разрядности, установленное новое свойство чисел (ф-инвариант нечетного числа здесь) и еще множество других деталей рассматриваемого подхода.

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

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

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

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

Например, публикация в 2010 г Арнольда В.И. Случайны ли квадратичные вычеты? обратила мое более пристальное внимание на этот объект, поскольку я был убежден в его неслучайности, детерминированности, а сомнения в этом академика РАН от математики для меня было просто удивительным.

В рамках фрагмента НРЧ, определяемого значением N, ряд при его формировании как бы самостоятельно определяет в какой позиции, что нужно вписать, где полный квадрат, а где другое значение. Более правильным вопросом относительно квадратичных вычетов (КВВ) мог бы быть: Почему они так распределены, почему так происходит?

Поиск причин конкретных распределений квадратичных вычетов в конечных числовых кольцах вычетов (КЧКВ) по составному модулю N, и в частности, квадратичных вычетов полных квадратов (КВК) привел к формулированию нового закона Распределения делителей числа в НРЧ.

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

Законом вскрывается причинно-следственная связь положения в НРЧ делителей, их кратных и квадратичных вычетов-полных квадратов по модулю N.

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

Долгое время оставалось загадкой, почему так происходит. Математики это видели всегда, но проходили мимо, не обращая внимания на сам факт, не удивлялись этому, не задавались вопросом и не искали разгадки. А академик РАН Арнольд В.И. вопрос себе задал, выполнил исследование и позднее опубликовал его.

Именно КВК несут в себе информацию о делителях числа N (выполняют роль обнаружителей, детекторов делителей), и они вычисляются элементарными операциями. Так был открыт новый закон в теории чисел. Он мог быть открыт и раньше, но публикация, надоумившая меня серьезно заняться этим вопросом случайно попалась мне на глаза лишь в 2014 году.
Закон распределения делителей числа обнаруживает их положение в НРЧ и обеспечивает их перечисление для заданного составного числа N.

Модель отдельного нечетного числа


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

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

В теории чисел значительное место отводится проблеме факторизации. Теорема факторизации устанавливает необходимость рассмотрения числового множества, ограниченного лишь подмножеством нечетных натуральных чисел (СННЧ) определенного вида (здесь), что является и достаточным для решения задачи факторизации. Это ограничение существенно упрощает проблему моделирования основного объекта (числа), но не делает ее простой.

Кроме модели числа важно располагать и более объемлющей моделью, в которой сами числа являются всего лишь отдельными элементами. Таким объемлющим числа объектом рассматривается НРЧ, модели которого также рассматриваются в предлагаемом новом подходе к проблеме факторизации. Это линейная модель (обычный НРЧ), плоскостные: контурная модель-спираль Улама (полная) и квадратичная Г2 модель (модель усеченного НРЧ). (здесь)

В этой публикации начнем рассмотрение моделей отдельного числа. В каждой из названных моделей НРЧ элементами выступают отдельные числа: в линейной это индекс позиции регистрового разряда, в котором помещается число, в контурной модели нечетное число полуконтур (левый или правый) с множеством свойств, в квадратичной Г2 модели число представляется разностью\суммой квадратов (целочисленными точками гиперблы, окружности) N=x12xo2.

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

Обоснование выбора списковой многострочной модели (СММ) числа


В статье предлагается концепция линейной алгебраической модели числа N, с погружением ее в множество подобных, представляемой многострочной таблицей. Модель достаточно простая. Будем представлять СННЧ N разбиением на две части N=x1+x0 всеми возможными способами.

Очевидно, таких способов представления числа N существует (N 1), при этом каждая сумма размещается в отдельной строке таблицы модели. Переменная x0 пробегает все строки от 1 до (N 1), т. е. играет роль текущего номера строки СМ-модели, который может совпадать в некоторой строке с конкретным делителем N и его кратными (см. табл.1).

Таблица 1 фрагмент СМ- модели


Обоснование выбора такой модели следующее. В линейной модели НРЧ присутствуют все числа без пропусков, что позволяет задать любое составное нечетное N = рq в соответствующей позиции. Очевидно, фрагмент НРЧ от 1 до N = рq, где р и q простые числа ( 2), содержит следующие подряд все числа, среди которых обязательно встретятся р и q и их кратные. Добавив к этому множеству чисел нулевой элемент получим конечное числовое кольцо вычетов (КЧКВ) по составному модулю N.

Если это множество чисел (фрагмент НРЧ) содержит среди элементов делители и кратные им значения, то возникает мысль, нельзя ли выудить из таких элементов сами делители р и q. Поставив целью исследования выуживание делителей из модели, модель должна сохранить полностью элементы фрагмента НРЧ.

Следовательно, простота, полнота, включение делителей и их кратных, структурность КЧКВ и гипотеза о возможности выуживания делителей положены в обоснование выбора СМ-модели.

Последовательность натуральных чисел СММ и ее фундаментальное свойство
Последовательность непрерывно следующих натуральных чисел используется в СМ-модели в двух колонках x1 и x0, в которых x0 играет роль текущего номера строки модели до середины исходного списка. Значение х1 = N хо дополнение до модуля снизу вверх записывается в строках модели. Для каждого из элементов (номера и дополнения) строки вычисляется rл(x0) и rл(x1) квадратичный вычет по модулю N. Эти КВВ совпадают, что допускает ограничиваться хо.

Для малых значений x0 редукция по N не меняет значений rл (x0) и строки, содержащие такие неизменяемые левые вычеты, всегда образуют для различных N область тривиальных КВК, обозначаемую ТКВК. Граница этой области называется левым верхним первым порогом, а ее значение вычисляется, например, для N=1961, как x0в1= N=1961=44,28, округляется до 44.

Полные квадраты из ТКВК области не используются ЗРД и не участвуют в факторизации. При движении вниз по строкам таблицы за пределами порога КВВ (x0>44) превышают модуль и редуцирование уменьшает значения. В некоторых строках при этом получаются дубли из ТКВК и они (и только они) используются для факторизации в рамках ЗРД .

Итак, последовательность содержит делители N и их кратные; начинается тривиальной ТКВК областью; некоторым значениям хо в дублях строк соответствуют КВВ полные квадраты.

Последовательность нечетных чисел СММ и ее фундаментальное свойство
В предлагаемой модели возникают последовательности нечетных чисел Т и Тп. Они играют существенную роль и на этом явлении остановимся подробнее. Ряды нечетных чисел (колонки 4 и 7) в таблице СММ встречно направлены, но состав их и структура идентичны
Т, Тп = {ti, i = 1(1)(N-1), ti =1(2) N-2}.

Они в НРЧ образуют бесконечную непрерывную последовательность нечетных значений, (но в примерах ограничены значениями от 1 до N 2). Каждый элемент t такого ряда (последовательности) будем представлять суммой смежных чисел t=t1+t0, где значение tо=t1-1. Слагаемые t1+t0 будем перемножать друг на друга р(t)=t1t0. Обозначим редуцированное произведение символом rc (t) =(t2 -1) и назовем средним вычетом. Оказывается, такие произведения обладают рядом замечательных свойств.

Во-первых, произведения таковы, что их флексии принимают только три четных значения {0, 2, 6}. Флексии в нечетных рядах следуют пятерками строк, которые следуют в порядке 02620 (табл. 1) и повторяются периодически до бесконечности.

Во-вторых, значения произведения р(t) с ростом ti возрастают, но в рамках модели редуцируются при превышении модуля N. Произведения меньшие модуля при редукциях остаются без изменений, и обладают свойством сохранять смежность сомножителей (ССС). Множество строк, в которых ti следуют подряд и их произведения обладают свойством ССС называется тривиальной областью и обозначается ТССС (заливка в колонке 6 зеленый цвет).

Граница этой области называется нижним средним первым порогом, а ее значение вычисляется как 1892 = 442 44, где значение 44=N=196144,2. В СММ (табл.1) в колонке 6 размещены строки ТССС средние вычеты rc(t) в строках с номерами хо = 937 по хо = 980 элементы.

В-третьих, те ti, для которых значения произведений превышают модуль, редуцируются и редукция уменьшает их значение. При этом в некоторых строках редуцированные значения повторяют (дублируют) некоторые значения из ТССС. Эта особенность произведений ti обладать свойством ССС после редукции оказывается весьма важной в процессе факторизации модуля N.

Итак, последовательность нечетных чисел t завершается тривиальной ТССС областью (колонка 6); некоторым значениям хо в дублях строк этой области соответствуют КВВ-полные квадраты, что свидетельствует о непустом пересечении двух нетривиальных областей ТКВКТССС

Пример 1. (Редуцированные значения со свойством ССС). Пусть в СММ (см табл.1) задано
N = 1961 = рq и значение t=t1+t0 = 45 = 22 + 23. Находим значение произведения смежных слагаемых р(t) = 2223 = 506. Результат не превышает модуля 506 <1961, следовательно, редукция оставляет результат без изменения, т.е. rс(р) = р(mod N) = 506(mod 1961)= 506.
Флексия 506(mod10)=6 {0, 2, 6} говорит о выполнимости свойства rс(р) ССС.

Изменим t=t1+t0 = 89 = 44 +45. Находим значение произведения смежных слагаемых
р(t) = 4445 = 1980. Результат превышает модуль 1980 >1961, следовательно, требуется редукция, уменьшающая результат произведения, т.е. rс(р) = р(mod N) =1980(mod 1961)= 19.
Флексия результата 19(mod10)=9 {0, 2, 6} показывает, что свойство rс(р) ССС не выполняется.

Рассмотрим явления, происходящие при моделировании отдельного числа N, в рамках СМ-модели. Удобно это сделать на числовом примере, сопровождаемом комментариями. Выбор числа сделаем таким, чтобы исключить простое угадывание делителей. Здесь ограничимся лишь строками нижней части основной таблицы СМ-модели, хотя и не столь малого объема.

Пример 2. Задано число N = 1961 = рq, которое подвергнем факторизации. Для этого воспользуемся оригинальной СМ-моделью (см. табл.1) и определим (заполнены) полные верхнюю
rл(1) = 1, х1=1960, хо =1, t=1959, rс(1) = 491, tп = 1, rп(1) = N rл(1) = 1961 1 = 1960 и нижнюю
rл(0) = 1471, х1=981, хо =980, t=1, rс(0) = 0, tп = 1959, rп(0) = N rл(0) = 1961 1471 = 490, строки СММ а также остальные элементы в области ТССС и в других строках. Дело в том, что свойства модели допускают заполнение всех полей строк основной таблицы ручным способом, даже не прибегая к использованию компьютерной программы.

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

Целью предлагаемого рассмотрения именно этой области (ТССС) строк основной таблицы СМ-модели является установление тех из них, которые содержат в левой колонке области таблицы квадратичные вычеты номеров строк по составному модулю N, являющиеся полными квадратами, т. е. КВК.

Теперь можно в деталях описать фрагмент модели числа (таблицы 1).
Описание фрагмента таблицы СМ-модели отдельного числа. Полная таблица строк СММ для N = 1961 содержит 980 строк и 8 столбцов (левый столбец примечаний не обязателен). Предварительно заполним поля столбцов t, tп, верхнюю и нижнюю строки СМ-модели. Строки нумеруются подряд сверху вниз хо до середины списка (нижняя нулевая строка р = rc=0) и далее продолжение х1 снизу вверх в колонке слева (слева от хо = 980 стоит х1 = 981).

Строки имеют типовую начинку: левый квадратичный вычет rл(хо), номер хо строки, х1 дополнение номера до N, разность t=х1хо пробегает монотонно убывающие нечетные значения от N 2 до 1, произведение р(t)=t1tо= (t2 1), средний вычет rс(р) = р(mod N), tп нечетные числа от 1 до N 2, правый вычет произведения rп(хо) = хох1 (mod N) = N rл(хо). Кратными будем называть строки, номера которых кратны делителям N.

Из полного списка строк приводимый фрагмент (табл.1) включает лишь 57 строк: первую, 901-ю, и все с 925-й по 980-ю строки. Заливкой выделены пары строк: номера хо = 901 и хо = 954 которых кратны большему делителю (оранжевый цвет); номера хо = 925 и хо = 962 которых кратны меньшему делителю (зеленый цвет); номера хо = 958 и хо = 966 строк, содержащих квадратичные вычеты КВК полные квадраты (синий цвет).

Следовательно, оранжевые и зеленые строки кратные. В таблице замкнутый интервал строк между ближайшей парой кратных строк разного цвета хо = 954 и хо = 962 содержит 9 строк, средняя с номером хоц = (954 + 962) = 958 строка.

В соответствии с законом распределения делителей числа в этой хоц точке КВВ должен быть полным квадратом удаленности (в числе строк) от нее кратных строк (точек) с разным цветом заливки. Действительно, строки хо = 954 (оранжевая) и хо = 962 (зеленая) удалены от центральной хоц = 958 обе на 4 позиции (строки) каждая.

Более поучительный случай (синяя) строка, имеющая номер хоц = 966. Поскольку вычисление КВВ в этой точке дает результат rл(хоц) = хоц (t)2(mod N) = 9662(mod1961) = 412 равный полному квадрату (412), то эта точка (по ЗРД) должна быть центром замкнутого интервала с нечетным числом строк в нем 83 = 241+ 1.

Удаленность (41 позиция) обеих границ интервала от центра. Действительно, такая пара строк (заливкой разного цвета) с номерами кратными делителям N, существует. Это строки с номерами хо = 925 (зеленая) и хо = 1007 (оранжевая). Удаленность границ равна разности
1007 966 = 966 925 = 41. Длина замкнутого интервала 83 = 241+ 1.

Наличие таких строк (даже одной синей из них) делает допустимым на основе ЗРД быстрое и успешное завершение ЗФБЧ. В соответствии с законом распределения делителей числа N в НРЧ в установленных строках определяются значения их текущих номеров. Это номера (точки хо) тех строк, в которых порождаются КВК.

Далее, следуя пунктам алгоритма (ниже) вычисления значений делителей р и q, находятся и сами делители. Вообще подряд все строки восстанавливать не обязательно, хотя и полезно для понимания и обучения. Важно уметь оперативно получать те из них, в которых КВВ полные квадраты.

Установление таких строк реализуется элементарными действиями над элементами СМ-модели. В приведенном фрагменте таблицы СММ такими строками являются строки с номерами хо = 958 и хо = 966 (выделены заливкой синего цвета).

Каким образом получаются окончательные решения, т. е. как вычисляются делители N?
На самом деле кратные делителям правая и левая границы Гп, Гл замкнутых симметричных относительно центров интервалов с нечетным числом строк неизвестны, так как неизвестны ни делители N, ни коэффициенты кратности номеров строк-границ.

В примере используется фрагмент СМ-модели, предоставляющий числовые данные, которые легко наблюдаются и анализируются. Собственно, такие таблицы (небольшого объема) формируются и используются для исследовательских целей и решения конкретных задач, для визуализации найденных законов, закономерностей, свойств, поиска и выявления скрытого потенциала модели и подхода к факторизации в целом, теоретического вывода математических и логических формул.

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

Поэтому предлагаемый алгоритм факторизации начинается с определения полных квадратов (КВК) в колонке квадратичных вычетов СМ-модели. Это можно сделать, вычисляя очередной номер строки, при движении в СМ-модели сверху вниз, либо снизу вверх. Путем перебора для каждого очередного номера строки вычислять КВВ и проверять, является ли он полным квадратом.

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

При установленных в примере значениях таких квадратов (КВВ 16 и 1681) и точек хоц= 958, хоц= 966, в которых они получены возможно (обратная задача) построение замкнутого интервала с определением его границ Гп, Гл = хоц (rл )= 958 4 = 962, 954, а также
Гп, Гл = хоц (rл )= 966 41 = 1007, 925.

Для окончательного получения значений делителей используется алгоритм Евклида наибольшего общего делителя НОД. Для первого случая, строка
хоц= 958 (синяя) и rл(хоц) =16 =42 имеем
di = НОД(N, Гi ) = НОД (1961, 962) = 37; di = НОД(N, Гi ) = НОД (1961, 954) = 53.

Для второго случая, строка с номером хоц = 966 (синяя) и КВК rл(хоц) =1681 = 412 имеем di = НОД(N, Гi ) = НОД (1961, 925) = 37; di = НОД(N, Гi ) = НОД (1961, 1007) = 53.

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

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

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

Обратим внимание на замечательную особенность колонки КВВ таблицы СМ-модели. Значения КВВ при движении вверх монотонно возрастают. Их рост ограничивается значением N-модуля. Как только значение КВВ превысит N оно редуцируется и становится равным разности (КВВ N), которая всегда меньше N. Эта разность является новым значением КВВ и может оказаться полным квадратом, т.е. КВВ = КВК. Именно этой возможностью и воспользуемся в алгоритме факторизации.

Другая особенность СМ-модели состоит в замечательном свойстве самой модели. Вне модели воспользоваться свойством не удается. Оказывается, левый квадратичный вычет, может вычисляться не только через квадратичное сравнение. Он может представляться суммой левого квадратичного вычета нижней строки модели rл(0) и текущего среднего вычета строки. Используется и это свойство КВВ в СМ-модели: rл(хоц) = rл(0) + rс(хоц) = 1471 + 506 = 1977.

Выбор среднего вычета 506 специально сделан таким, чтобы сумма его с rл(0) превысила N.
Поскольку найденное значение превышает модуль N = 1961, то его следует редуцировать, т. е. привести по N модулю rл(хоц) = rл(0) + rс(хоц) (mod1961) = 1977 1961 = 16 = 42. Редукция суммы при этом равна разности, что для rл(хоц) ожидаемо как малое значение (получили квадрат =16).

Если бы был получен не квадрат, то выполняется переход в следующую строку и действия повторяются до тех пор, пока не возникнет квадрат, а его возникновение гарантируется. Поясним откуда взялось значение rс(хоц) = 506? Это достаточно простой трюк.

Среди прочих отыскивается наименьший средний вычет rс(хоц), который при суммировании его с КВВ нижней строки модели превысил бы значение модуля N. Само значение rс(хоц) = 506 получено из t нечетного числа, rс(t) до определенной границы не зависит от N. Для некоторых значений t их отображение р(t) = rс(t) = t1tо обратимо, т. е. по значению rс(t) можно восстановить t = р(р(t))-1=р(rс(t))-1.

Далее, для любых N набор rс(хо) одинаков до определенного предела (порога, зависящего от N). Зная значение rс(t) = 506, найдем и значение t. Извлекаем квадратный корень и округляем до меньшего целого t1 = 506 = 22,49, тогда значение tо= t1+1 и t = t1 + tо.
Фактически получены значения tо = 23, t1 = 22 их сумма t = t1 + tо =22 + 23 = 45. По значению t можно восстановить все элементы строки, в которой оно лежит.

Поиск центра интервала. Нам требуется определить точку хоц центра замкнутого интервала, в которой КВВ полный квадрат. Еще одно свойство СМ-модели обеспечивает решение и этой задачи. Свойство реализуется достаточно простой формулой
хоц(t) = (N t) = (1961 45) = 958. Итак, центр найден хоц(t) = 958.

Проверим, действительно ли, в этой точке КВК rл(хоц) = 16.
rл(хоц) = хоц (t)2(mod N) = 9582(mod1961) = 917764(1961) = 42+ 4681961 = 16+ 0 = 16 =42.
Поиск границ интервала. При наличии центральной точки интервала и КВК в ней границы интервала находятся по зависимостям ЗРД Гп, Гл = хоц (rл(хоц)).

Алгоритм решения ЗФБЧ с учетом области ТКВК


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

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

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

В алгоритме задается составное число N = рq = dmdб где р и q простые числа высокой разрядности. Для удобства изложения при описании воспользуемся числовым примером, в котором р и q простые числа не очень высокой разрядности, что позволит без больших усилий воспринимать текст и понимать (проверять) практически все результаты промежуточные и окончательные.

Задача 3. Пусть задано составное число N = рq = 2501, необходимо найти его делители р и q. Предварительно находим пороги ТКВК хов1 = N=2501= 50,0099, ТССС хон1=1201, rсн1(t) = 2450.

Алгоритм



1. Заполняется первая строка. Левый, средний и правый вычеты rл(1)=1, rс(1) = 626, rп(1)=2500.
х1 = 2500, хо = 1, t = N 2 = 2501 2 = 2499, tп = 1.
В последней строке СММ rл(0) = 1251 + 625 = 1876, смежные значения х1 + хо = N = 2501,
х1 = 1251, хо = 1250, разность t = х1 хо = 1, rс(t =1) = 0, tп = N 2, rп(0) = 625.

2. Определяем циклически в области ТКВК номер строки меньшего среднего вычета со свойством ССС (из перебора исключаются все строки до верхнего 1-го порога среднего вычета) хо = N=1876=43,3 квадрат этого значения (округление в меньшую сторону) дает для rс(хо) = 625 + 432 = 2474, это меньше 1-го порога равного 2501.

Повторяем цикл, увеличиваем еще на единицу номер строки хо = 43 +1 = 44.
Следующее значение rс(хо) = 625 + 442 2501= 2561 2501 = 60 превышает порог на 60. Значение rс(хо) не соответствует ССС. Увеличиваем еще на единицу номер строки хо = 45, тогда rс(хо) = 625 + 452 2501 = 2650 2501 = 149.

Значение rс(хо) превышает порог, но также не соответствует свойству ССС.
Увеличиваем еще на единицу номер строки хо = 46. Тогда средний вычет имеет свойство ССС rс(хо) = 625 + 462 2501= 2741 2501 = 240 = 1516.

3. Вычисляем значение разности t = x1 -xо (нечетного t в области ТССС) t = 15 + 16 = 31.
4. Определяем для этого t номер центральной строки хоц (t) = (N t) = (250131) = 1235.
5. Находим для хоц (t) квадратичный вычет центральной строки замкнутого интервала.
rл(хо)=хо (t)2(mod N) =12352(mod2501) = 462 КВК.

6. Вычисляем делители с использованием НОД
dб = НОД(N, 46+1235) = 61; dm = НОД(N, 1235 46) = 41.
7. Проверка N = рq = 4161 =2501. Делители N успешно найдены.

Задача может решаться иначе:

Известно (автору), что в области ТКВК для RSA-чисел появляются два средних вычета со свойством ССС вначале с большим (при меньшем хо) значением, и ниже его с меньшим (в примере это rс(хо) = 240). Начать поиск решения можно с большего rс(хо). Покажем на примере, как это происходит.

Задано составное число N = рq = 2501, необходимо найти его делители р и q. Предварительно находим пороги ТКВК хов1 = N=2501= 50,0099, ТССС хон1=1201, rсн1(t) = 2450.

Первая строка. Левый, средний и правый вычеты rл(1) = 1, rс(1) = 626, rп(1) = 2500.
х1 = 2500, хо = 1, t = N 2 = 2501 2 = 2499, tп = 1.
В последней строке Вычисляем сумму и разность смежных слагаемых N = 1250 +1251, rл(0) = 1251 + 625 = 1876, смежные значения х1 + хо = N = 2501, х1 = 1251, хо = 1250, разность
t = х1 хо = 1, rс(t =1) = 0, tп =N 2, rп(0) = 625.

В цикле по хо от хо = 1 вычисляем rс(хо) и проверяем его принадлежность области ТССС. Если rс(хо) принадлежит ТССС, то переходим к П.3 алгоритма, если не принадлежит, то увеличиваем значение хо = хо +1 и повторяем действия цикла.

На пятом шаге хо = 5 получаем значение t =N -2xо = 2501 -10 =2491 rс(хо =5) =(t2 1)(modN) =650. Флексия 650(mod10)=0 {0, 2, 6} говорит о том, что средний вычет может иметь свойство ССС. Устанавливаем из смежных ли чисел произведение равное 650. Извлекаем квадратный корень t0=650 =25,49, t1 =t0+1=25+1=26.
Находим произведение р= 2526= 650, редуцированный вычет принадлежит ТССС.
Вычисляем значение нечетного t в области ТССС t = 25 + 26 = 51.

Определяем для этого t номер строки хоц (t) = (N t) = (2501 51) = 1225.
Находим для хоц (t) квадратичный вычет (левый в СММ)
rл(хо) = хо (t)2(mod N) =12252(mod2501) = 52.

Вычисляем делители с использованием НОД
dб = НОД(N, 5+1235) = 61; dm = НОД(N, 1235 5) = 41.

Проверка N = рq = 4161 = 2501. Такая схема также приводит к успешному решению.
Подробнее..

Модель натурального числа II

25.06.2020 20:11:16 | Автор: admin



Структура конечного кольца вычетов по составному модулю



Формирование работоспособной модели числа оказалось достаточно сложным и объемным процессом, поэтому принято решение разбить его на 2 статьи.
Будем рассматривать натуральный ряд чисел (НРЧ) и считать, что его элементы размещены в ячейках регистра бесконечной длины, для каждого элемента хо которого вычисляется квадрат, помещаемый в ленту другого бесконечного регистра. Если же задать нечетное составное натуральное число (СННЧ) N, то лента с квадратами преобразуется.

В нее будут включены не просто квадраты (хо), а квадратичные вычеты (КВВ) чисел rл хо2 (mod N) по модулю этого составного числа N=dмdб. Для ячеек двух этих регистровых полос будет выполняться условие комплементарности. При этом мы ограничиваемся рассмотрением лишь фрагмента НРЧ.

Добавление к фрагменту слева нулевого элемента превращает его в конечное числовое кольцо вычетов (КЧКВ) по модулю N. Если квадратичный вычет получает значение полного квадрата, то КВВ обозначается КВК.
Ситуация с моделированием чисел и факторизацией как пишут Манин и Панчишкин близка к тупику или уже в тупике.

В этой статье на основе закона распределения делителей (ЗРД см.здесь ) числа рассматривается вопрос о структуре КЧКВ и о том, как неизвестные нам делители N управляют возникновением полных квадратов КВВ в списке квадратичных вычетов, которые доступны нашему наблюдению.


Тривиальные области СММ нечетного числа


Введем несколько определений.
Определение. Списочной многострочной моделью (СММ, СМ-моделью) числа называется таблица строк заданного вида (формата из 8 именованных полей: rл, х1, хо, t, p, rc , tп, rп). Ниже привожу расчетные формулы для переменных.

rлхо2(modN)x12(modN)-квадратичный вычет левый;
х1 = N xо дополнение хо до модуля;
хо текущий номер строки СММ;
t=х1 хо =t1 + tо разность слагаемых строки; раскладывается в сумму смежных;
p =t1tо произведение смежных слагаемых;
rс (t2 1)(mod N) =t1tо(modN); средний вычет в строке;
tпi = 2xоi 1; нечетное число; сумма номеров смежных строк;
rп х1хо(modN=N rл произведение слагаемых; правый вычет в строке.

Определение. (ТКВК) Тривиальной областью строк СМ-модели называется начальное множество строк списка, следующих подряд, содержащих в качестве rл (левого КВВ) монотонно возрастающие полные квадраты.

Определение. Границей ТКВК (левый 1-й верхний порог) называется наибольший КВК полный квадрат, не превышающий составного модуля N, например, для N =34999, граница ТКВК
rлmax N (mod N) = 34999 = 187.
Извлекаемые квадратные корни округляются до целых значений.

Определение. (ТССС) Тривиальной областью строк СМ-модели (внизу списка) называется множество строк конца списка, следующих снизу вверх подряд, содержащих монотонно возрастающие разности нечетных чисел
t = x1-xо от 1 до границы (порога), а в качестве вычетов rс (полные квадраты за вычетом первой степени) и обладающие свойством сохранять смежность сомножителей (ССС).

Определение. Границей ТССС (средний 1-й нижний порог) называется наибольший КВК без первой степени квадрата, например, для N =34999, граница ТССС
rсmax (хо2 -хо) (mod N) =1872 -187 = 34782.

Тип модели


Под типом модели будем понимать степень различия (разность) делителей модуля N. Если в области строк ТКВК имеет место пересечение (строки, содержащие левые и правые вычеты из тривиальных областей) одной или более строк с тривиальной областью ТССС, то это первый тип моделей (рабочий), если пересечение пусто, то это модели второго типа.

К первому типу относятся все RSA-числа и многие другие, в которых значения делителей с одной стороны не являются близкими, а с другой не очень удаленными друг от друга на числовой оси НРЧ. Поясним сформулированные условия.

Числа N в СММ могут существенно различаться не только своими значениями, но и делителями. Сами делители также могут иметь различия (малые и большие значения) при близких значениях их произведений, т.е. N1 и N2 близки, а их делители N1 = 111129 = 12419 существенно различаются на 1129 11 = 1118 или N2 = 101123 = 12423 всего на 123 101 = 22 единицы.

Числа, включающие в качестве делителей квадраты, имеют свои особенности. Указанные различия проявляются специфически в СМ-моделях и всегда желательно учитывать такую специфику N.
Например, в канонической СМ-модели (N = a(a+2) близнецы) дублируемые КВК следуют смежными парами, сумма первых степеней которых постоянна и равна среднему числу (a + 1).

Пример. (Делители числа значительно удалены друг от друга). Пусть N = 311129 = 34999; rс(1) = 26250 = 3rл(0) = 38750, контур НРЧ 34999 +35001 = 70000 с номером kп =70000:8 = 8750, инвариант N равен kп/2 = 4375, отсюда интервал для N содержит слагаемых 31 и среднее слагаемое равно dб = 1129, меньшее число tпм= 1 + dб dм = 1+1129 31 =1099 и большее число интервала tпб= dб + dм 1= 1129 + 311 = 1159; действительно, 15(tпм+ tпб) + dб =152258 +1129 = 34999.

Инвариант числа определяется суммой номеров 15 контуров и половиной номера большего
275+276+277+278+279+280+281+282+283+284+285+286+287+288+289+290/2= 4375.

Границы интервала и контуров левая Гл(k = 275) = (2275 1)2 = 301401, для интервала правая Гп(k = 290) = (2290)2 = 336400. Разность границ Гп Гл = 336400 301401 = 34999 = N.
Граница ТКВК хомах = 187 = 631 + 1; хо (rc = 0) = 3952; первая точка
хо = 952 дубля с КВК(177) = 31329.
В этой точке ЗРД определяются делители: 952 177 = 775 = 3125; 952 + 177 = 1129.

Рассмотрим поведение КВВ (всего имеется 187 КВК), дублирующих (181 КВК) тривиальной области списка. Квадрат числа 31 и квадраты его кратных не дублируются, так как число является делителем N.
Распределение КВК по списку обладает определенной регулярностью, КВК группируются по 12 строк с интервалом между ними 31, и интервал между группами строк равен 797 либо 766 строк. Это следует из анализа таблиц. Существует 15 групп 1-15. В пределах групп возникают аттракторы, строки как бы притягивающие полные квадраты КВК.

Определение. Аттрактором (притягивающим квадраты элементом НРЧ) будем называть точку (клетку) НРЧ, соответствующую значению кратному dб.

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

Для более ясного представления и понимания как все устроено с делителями N в НРЧ вначале будем рассматривать картину хорошо разделяемых областей аттракторов. Текст будем сопровождать числовым примером, в котором роль модуля играет полупростое число
N =311129 = 34999. Следовательно, аттракторами будут числа: 11129, 21129 = 2258, 31129 =3387, , 151129.


Клетка, выделенная заливкой зеленого цвета инволюция КЧКВ. Желтым цветом выделены КВК для каждого аттрактора. Соединения полосы переменной хо (без заливки) не везде показаны (не загромождают рисунок), но фактически имеют место, являются сплошной лентой.

Пока хо малы (левая желтая колонка верхней части таблицы) их квадраты 187 штук (хо2 < N) не превышают модуль N. Таким образом, начальный отрезок строк CM-модели для (хо) в НРЧ от 1 до N, содержащих КВВ равные подряд следующим полным квадратам (КВК) мы определили как область тривиальных квадратичных вычетов (rл) квадратов (ТКВК).

Эти значения при дальнейшем продолжении вычислений КВВ будут изредка повторно встречаться (дублироваться) еще по одному разу (при полупростом N) в других точках хо или более при произвольном N.

Рассмотрение для подряд следующих всех нечетных чисел от 1 < t < N 2 преобразований вида rс (t2 1)(mod N), где
t = х1 хо = N 2хо разность значений, также порождает ещё одну другую тривиальную область значений переменной (rс), обозначаемую (ТССС).

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

Эта область также характеризуется порогом, при превышении которого произведение смежных слагаемых редуцируется и результат (уменьшенное значение) уже чаще не сохраняет смежность меньших сомножителей, чем сохраняет. При сохранении говорят средний вычет имеет свойство ССС- сохранение смежности сомножителей.

Устройство моделей натурального ряда чисел (НРЧ) и отдельного составного нечетного натурального числа (СННЧ) можно представить разными математическими зависимостями. Каждая из моделей ее автором ориентируется, приспосабливается к конкретной задаче или группе задач, представляющих интерес для исследования. Здесь будем рассматривать списочную многострочную модель (СММ) составного натурального числа
N = dmdб.

На числовой оси с шагом, равным большему делителю dб, размечаются точки (позиции): dб, 2dб, 3dб, , dmdб аттракторы. После этого аналогичную разметку выполняем для меньшего делителя dm. Последняя точка в обоих случаях совпадает с N.

Между размеченными с разным шагом точками возникает множество интервалов разной длины четной и нечетной, среди которых имеются такие интервалы, которые называются решающими, так как именно они обеспечивают нахождение делителей составного модуля КЧКВ
N = dmdб.

В соответствии с законом распределения делителей (ЗРД) решающий задачу факторизации больших чисел (ЗФБЧ) интервал своими границами [Гл, Гп] должен иметь точки кратные разным делителям N.

Поскольку относительно произвольной точки кратной dб группируются точки кратные dm и их 2 или более слева и справа от dб, то точки кратные dб назовем (Аi) аттракторами (притягивающими). Для решающих интервалов между построенными точками их границы выбираются кратными одна меньшему делителю, другая большему.

Для установления решающих интервалов и их границ выполняем детальный анализ окрестностей точек аттракторов (dб). При разметке числовой оси каждый аттрактор (Аi) как бы накрывается коротким интервалом (величиной из dm позиций, точек), совпадая с одной из промежуточных. Расстояние (в числе точек) аттрактора до ближайших одной из границ накрывающего малого интервала всегда четное, до другой нечетное.

Пример А. Пусть задан составной модуль приведения N = dmdб = 311129 = 34999 конечного числового кольца вычетов. Числовая ось (фрагмент ряда) разбита точками с шагами dm = 31 и dб = 1129. Требуется представить картину подобного разбиения фрагмента на отрезки и определить положение решающих ЗФБЧ интервалов с их характеристиками.

Решение. Начнем с первой (i = 1) точки (аттрактора А1) с координатой равной dб. Эта точка принадлежит замкнутому малому интервалу [1116, 1147 = 1116+31], накрывающему ее, 36dm<1129< 37dm или 1116< 1129 < 1147. Удаленность dб от границ замкнутого интервала [1116, 1147] слева от dб равна 1129 1116 = 13 нечетному числу и справа от dб равна четному числу 1147 1129 = 18.

Правый интервал [Гл, Гп] = [1129, 1147] имеет целочисленную среднюю точку с координатой хц = (Гл + Гп) = (1129 + 1147) = 1138. В этой точке хц ее квадратичный вычет по заданному составному модулю N (в соответствии с ЗРД) должен быть равен полному квадрату, в чем легко убеждаемся, 11382(mod 34999) = 81 = 92 и этот результат указывает на то, что этот интервал решающий, т. е. обеспечивает вычисление делителей модуля N. Вычисления делителей пока отложим.

Перейдем к рассмотрению интервала [1116, 1129] слева от А1 аттрактора, длина которого 13. Он не имеет целочисленной средней точки и не является решающим, но положение легко исправимо, переносом левой границы (Гл) в другую точку более близкую к началу координат (дальше от аттрактора).

Исправленный новый интервал [Гл, Гп] = [1116 31, 1129] решающий и он приобретает вид [1085, 1129] с изменившейся длиной 1129 1085 = 44, т. е. уже имеет среднюю точку, координата которой равна хц = (Гл+ Гп) = (1085 + 1129) = 1107.

В этой точке, следуя ЗРД, квадратичный вычет по заданному составному модулю также должен быть равен полному квадрату. В этом легко убедиться выполнив вычисления 11072 (mod 34999) = 484 = 222 , что также обеспечивает в соответствии с ЗРД вычисление делителей модуля.

Таким образом, найдены два (справа и слева) решающих ЗФБЧ интервала для аттрактора А1, т. е. точки 1dб, ближайшей (i = 1) среди кратных к началу координат. Зададимся вопросом ограничено ли количество решающих интервалов для этого аттрактора? Если да, то чем определяется это ограничение?

Сделаем пояснения. Квадратичные вычеты (за пределами области строк ТКВК), являющиеся полными квадратами это всегда КВК центров решающих интервалов. Они являются дублями КВК из ТКВК. Их количество в ТКВК конечно и допустимое значение наибольшего из них ограничено.

В рассматриваемом примере порог maxКВК = rлmax =N=34999=187,080, т. е. превышает 6-кратную длину малого интервала 631 = 186 < 187, но 7-кратное значение интервала превышает это значение maxКВК 731 = 217 > 187.

Следовательно, все значения КВК (дубли из ТКВК) могут принимать значения, не превышающие 187. Что касается количества решающих интервалов, группируемых аттракторами, то анализ ситуации показывает следующее.

Мощность множества ТКВК это 187 элементов кольца, из которых не дублируются КВК кратных значений kmdm, km = 1(1)(187/ dm). В примере таких шесть значений 31, 62, 93, 124, 157, 186. Строки СМ-модели в своем составе содержат строки, кратные разным делителям.

Строк кратных dб всего 15 = (dm 1), так в каждой из них сумма номера строки хо и его дополнения х1 = N хо остается постоянной равной N, т. е. дополнение также кратно числу dб.

Из анализа нашего примера следует, что существует всего 15 аттракторов Аi, i = 1(1)15 и с каждым из них связаны (187 6)/15 = 12,06 решающих интервалов, с центрами которых связаны дубли из ТКВК. Другими словами, сдвигаясь к началу координат с шагом 31, увеличиваем решающий интервал, КВВ в центре которого получаем новый полный квадрат.

Пример Б. Используя данные примера А, вычислим решающие интервалы, наиболее удаленные влево и вправо от аттрактора А1. Левые интервалы:
[Гл, Гп] = [1116 62, 1129] = [1054, 1129] этот интервал не имеет целочисленной центральной точки хц = (Гл +Гп) = (1054 + 1129) = 1091,5.
Обе границы интервалов должны быть нечетными числами.

Сдвигаемся еще на один dm интервал [1116 93, 1129] = [1023, 1129] и находим центр
хц = (Гл + Гп) = (1023 + 1129) = 1076, в котором
КВВ = КВК = 10762 (mod 34999) = 2809 = 532 .

Заметим, что положение центров (53 22 = 31) интервалов, как и их протяженности (rл) изменяются на величину кратную dm, а левой границы на 2dm. Таким образом, левые (правые) границы решающих интервалов и их центры принимают конкретные значения (здесь граница 1129 постоянная):



Зачеркнутые числа выходят за пределы допустимых элементов КЧКВ
Для аттрактора А2 = 2dб и всех последующих вычисления аналогичные. Их результаты приведены в таблицах 1-15.

В работе здесь рассмотрена контурная модель, связанная с изучением задачи факторизации больших чисел (ЗФБЧ). Особенность модели состоит в том, что в ней НРЧ представлен непрерывной последовательностью нумерованных (номер k = 1(1) ) контуров (блоков), размер которых (L(k)) с увеличением номера возрастает, но остается кратным числу 8, L(k) = 8k.

Каждый контур представляет множество позиций НРЧ, где крайние позиции содержат квадраты нечетных последовательных чисел. Эти крайние позиции называются границами: левая
(Гл(k) = (2k 1)2) и правая (Гп(k) = (2k + 1)2, Гп(k) > Гл(k)).

Все контуры образованы двумя полуконтурами с размерами левый полуконтур m(k) = 4k 1 и правый контур M(k) = 4k+1. Полуконтуры в k-м контуре имеют общую границу
Гц(k) = (2k)2 квадрат четного числа.

Длина (размер) каждого полуконтура нечетное число и M(k) m(k)= 2, а их сумма равна
M(k) + m(k) = L(k) длине k-го контура, левая и правая границы которого совпадают с левой границей меньшего и с правой большего полуконтура.

С введением понятий контура и полуконтура модель НРЧ можно представить как непрерывную последовательность нечетных чисел 1, 3, 5, , в которой каждое число является полуконтуром некоторого k -го контура, где при известном значении N полуконтура, его номер определяется соотношением
k =(N 1).

Знак (+) соответствует левому полуконтуру и () правому. Любое составное нечетное натуральное число (СННЧ) N >9, будем рассматривать как полуконтур или интервал в НРЧ с длиной N. Длина интервала нечетное число равное сумме нечетного количества последовательных слагаемых (полуконтуров), в которой количество слагаемых равно меньшему делителю N, а среднее слагаемое большему делителю N.

В действительности нам известны лишь N и, что оно составное, равно произведению двух простых чисел.
Рассматриваются составные нечетные натуральные числа (СННЧ) среди которых нет чисел N =k2 полных нечетных квадратов.

Дело в том, что такие квадраты дают другую картину распределения квадратичных вычетов (КВВ) элементов кольца, отличающуюся от картины для полупростых чисел N = pq, p < q. Квадратичные вычеты для N = k2 из тривиальной области не дублируются в списочной многострочной модели (СММ) числа и закон распределения делителей (ЗРД) в такой ситуации не работает.

Напомним, что в СММ при дублировании одного из вычетов строки дублируются и другие два. При этом, если делители p и q не очень близки (далеки) друг от друга, то в области тривиальных строк ТКВК имеются две строки, содержащие средние вычеты со свойством, сохранять смежность сомножителей (ССС).

Утверждение. Для двух нечетных произвольных простых чисел p и q их сумма и разность четные и либо их сумма = (р + q), либо их разность = (р q) делится на 4.

Расстояние (в числе строк) между этими строками равно меньшему делителю р. Номер верхней строки с дублируемым средним вычетом определяется соотношением хов = (р q):4. Отсюда номер нижней строки равен хон = хов + р. Положение этих (верхняя и нижняя) строк определяются элементами колонки Тп, которые кратны меньшему делителю.

В случае, когда разность делителей = (р q) не делится на 4, а сумма делится, то номер верхней строки равен хов = хон , где хон = (р + q):4.
В области строк СММ тривиальных средних вычетов, также появляются две строки, содержащие средние вычеты и дублируемые левые КВВ, с теми же значениями вычетов, что и в верхней части модели.

Области аттракции модуля сравнения N = 34999






Размах области аттракции постоянный для всех аттракторов (равен 341 строке), кроме той, что содержит инволюцию (увеличен на dm =31 строку).
Между областями аттракции интервалы либо 766, либо 797 строк. Области хорошо разделены, хотя их влияние друг на друга не исключается.

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

Выводы



Основой списочной многострочной модели (СММ) числа N является модифицированное конечное числовое кольцо вычетов по модулю составного числа N;

Появление квадратичного вычета (полного квадрата) в некоторой точке конечного числового кольца вычетов (КЧКВ) вне пределов тривиальной области квадратичных вычетов полных квадратов (ТКВК) указывает на существование симметричного относительно нее интервала, в котором она является центральной; это решающий интервал;

В соответствии с законом распределения делителей (ЗРД) решающий задачу факторизации больших чисел (ЗФБЧ) интервал своими границами [Гл, Гп] должен иметь (и имеет) точки кратные разным делителям N;

Соотношение ЗРД (di=НОД(N, xоxо2(mod N))) обеспечивает получение (вычисление) делителей N.
Подробнее..

AES АМЕРИКАНСКИЙ СТАНДАРТ ШИФРОВАНИЯ, ЧАСТЬ I

30.06.2020 18:10:31 | Автор: admin
image

Эта публикация вызвана необходимостью дать возможность обучаемым изучать и моделировать процессы шифрования/расшифрования и дешифрования последнего стандарта США. Ознакомление с имеющимися публикациями в сети не соответствуют программе обучения в силу их поверхностного подхода, неполноты изложения, и отсутствия должной строгости. Например, нигде не встречается выбор и задание примитивного элемента, формирующего поле, без чего работу и подготовку специалиста, особенно криптоаналитические явления и процессы, организовать и моделировать невозможно. В этой работе используется описание, несколько отличное от оригинала AES, представленного FIPS PUB 197. Здесь описывается шифр AES, с использованием матриц над GF(28), но примечания работы сохраняются, т. е. шифр реализуется над конечным расширенным полем GF (28). На русском языке достаточно полная и доступная версия шифра изложена Зензиным О.С. и Ивановым М.А.


МАТЕМАТИЧЕСКИЕ ОСНОВ СТАНДАРТА ШИФРОВАНИЯ AES США


AES блочный шифр с длиной блоков равной 128 битам, и шифр поддерживает ключи длиной $N_к$, равной 128, 192 или 256 бит. AES это шифр с итерационным ключом: состоит из повторного применения раундового преобразования состояния блока State шифруемого текста. Число раундов шифра обозначается $N_r$ зависит от длины ключа ($N_r = 10$ для ключа 128 битов, $N_r= 12$ для ключа 192 бита и $N_r = 14$ для ключа 256 бит).

Шифр AES преобразует исходное состояние блока, обозначаемое символом S (State) и принадлежащее множеству матриц {M4(GF(28))} (то есть S {M4(GF (28))} матрица 4 4 байта, с ее элементами (коэффициентами) в GF (28)), к другому шифрованному состоянию в {M4 (GF (28))}.

Пример 1. Блок данных длиной в 128 = 432, 4 слова по 32 разряда представляется квадратной таблицей байтов из 4-х строк и 4-х столбцов. Каждая строка содержит байты из 4-х разных 32 разрядных слов, а столбец байты одного и того же 32-разрядного слова. Весь квадрат образован 44 = 16 байтами, которые могут обрабатываться как самостоятельные единицы.

Именно такой подход к представлению данных определяет и обеспечивает байт-ориентированную структуру шифра и обработку данных. Ключ шифра K расширяется в $N_r+1$ подключей, обозначаемых матрицей Ki ={M4(GF(28))}, принадлежащей множеству {M4 (GF(28))}, (i = 0, 1, ..., Nr). Перестановка элементов в матрице S, возникающая при операции сдвига строк обозначена символом р(х).

Представление данных, выбранное для элементов поля GF(28)


В шифре AES используется байтовая структура данных. Представление, выбранное в [1] из векторного пространства GF(28), соответствующего полю GF(28)[X]/< (x) >, где (x) неприводимый многочлен,

$(x) = x^8 + x^4 + x^3 + x + 1$

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

Таблица 1. Соответствие десятичных, шестнадцатеричных, двоичных чисел и многочленов

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

Представление данных, используемых в шифре AES


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

1. 21210, десятичным видом числом в 10-ой системе счисления.

2. {11010100}b, представление элементов сообщения двоичным вектором элементом векторного пространства GF(28) двоичных векторов,

3. $x^7+ x^6 + x^4 + x^2$, многочленное представление элементом поля Галуа GF [28], соответствующим двоичному вектору,

4. {D4}16, шестнадцатеричное представление числом в 16-системе счисления,

операция поразрядного суммирования векторов из GF(28) по mod2 (без переноса 1 в старший разряд).
операция умножения элементов (векторов, многочленов, чисел) из поля GF(28)

Алгоритм стандарта AES и шифра RIGNDAEL оперирует с байтами информации, которые отождествляются с элементами конечного поля Галуа GF(28). Степень расширения простого поля GF(2) равна 8. Все элементы расширенного поля при представлении их многочленами имеют показатель степень не более семи ( 7).

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

В рассматриваемом алгоритме примитивный элемент задан (его порядок должен быть равен порядку мультипликативной группы поля), а многочлен фиксирован и имеет вид (x). Не располагая этими характеристикам, работать со стандартом не получится

$(x) = x^8 + x^4 + x^3 + x + 1$

или 1{1b} в 16-ричной форме.
Шестнадцатеричная запись неприводимого многочлена 1{1b} использует 9 разрядов и многочлен (x) не принадлежит полю GF(28).
Таблица П1 представления элементов поля GF(28) (в конце текста в Приложении).
В таблице П1 размещены все элементы поля в порядке возрастания показателя степени примитивного элемента ( = 000000112 = 310), мультипликативный порядок которого равен 255.

Рассмотрим примеры выполнения арифметических операций над элементами поля при различных представлениях этих элементов. Любой байт исходного текста (элемент поля) формально можно представить строкой символов $a_i, i = 0(1)7$, коэффициентов двоичного вектора в виде:

${a_7, a_6, a_5, a_4, a_3, a_2, a_1, a_0}, a_iGF(2), i = 0(1)7.$


Пример 2. Элемент расширенного поля GF(28) задан в виде двоичного вектора:

${a_7, a_6, a_5, a_4, a_3, a_2, a_1, a_0}, a_iGF(2), i = 0(1)7$


Описание многочленом этого элемента имеет вид:

$(x) = a_7 x^7 + a_6 x^6 + a_5 x^5 + a_4x^4 + a_3 x^3 + a_2 x^2 + a_1 x^1 + a_0 x^0$


Если доопределить значения ai двоичными значениями, i = 0(1)7, например, так ${a_7, a_6, a_5, a_4, a_3, a_2, a_1, a_0}$ = {11000001}2, то получим многочлен

$(x) = x^7 + x^6 +1,$

так как $ a_5 = a_4 =a_3 =a_2 =a_1 = 0.$

Шестнадцатеричное представление этого элемента 16 = {с1}={11000001}, а десятичное
10 = $2^7 + 2^6 + 2^0$ = 128 + 64 + 1 = 19310.

При выбранном примитивном элементе поля степенное представление
i ={с1}= 178.
Входим в таблицу П1 элементов поля GF(28) со значением 178 и в соответствующих столбцах для этой строки находим описанные представления, а также другие характеристики этого элемента поля. Для понимания возможных преобразований с элементами поля рассмотрим операции с его элементами в деталях.

Суммирование элементов поля GF(28)


Сложение в рассматриваемом поле представляет операцию поразрядного суммирования значений разрядов слагаемых без переноса единицы в старший разряд. Это операция исключающего ИЛИ (EXOR EXLUSIV OR) часто обозначается просто XOR. В модулярной арифметике такое сложение называется суммированием по модулю два (mod2).

Пример 3. Выберем в качестве операндов многочлены
$A(x) = x^7+ x^6 + 1;$
$B(x) = x^3 + x^2 + x^0.$
Двоичное представление суммы многочленов по модулю два имеет вид
[A(x)B(x)]mod2 = {11000001} {00001101} = {11001100};

16-ричное представление {c1}{0D}={cc}sub>16=55;
степенное представление 178 + 238 = 55 {123 + 183} = 55 1 = 55.

Представление многочленами
$(x^7+x^6+1) (x^3+x^2+1)(mod2)= (x^7+x^6+x^3+x^2+2)(mod2)=x^7+x^6+x^3+x^2.$
Заметим, что при сложении операндов степень многочлена результата не
увеличивается, и необходимость приведения его по модулю неприводимого многочлена поля (x) не возникает. Коэффициенты результата приводятся по модулю два, т. е. все четные коэффициенты обращаются в нуль.

В полях характеристики 2 действия сложения и вычитания операндов равнозначны. Для каждого элемента поля в аддитивной группе обратным к нему (противоположным) является он сам. Так, для элемента (а) противоположным является (-а), так как а + (-а) = 0. Нулевой элемент (единица аддитивной группы поля, нейтральный элемент) в шестнадцатеричном виде это {00}16.

Умножение элементов поля GF(28)



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

Пример 4. Умножение операндов в двоичном представлении
А(х) В(х) = {c1}{0d}

Остаток от деления получает вид двоичного, многочленного и 16-ричного представлений (как элемент поля)
R(x) = 01011 10102 = $x^7+ x^5+ x^4+ x^3+ x $= {ba}16. Старший разряд остатка равен нулю и не учитывается.
Степенное представление здесь не приводим, но по таблице П1 его можно найти.

Остаток от деления на неприводимый многочлен (x) в его двоичном представлении результата умножения операндов принимаем в качестве произведения операндов как элементов поля GF(28).
Выполним умножение операндов в представлении многочленами.

Пример 5. Умножение операндов элементов поля в многочленном представлении
А(х) В(х) = {c1}{0d}
A(x) B(x) = $(x^7+ x^6+ 1)(x^3+ x^2+1) $(modd(x),2) =
=(x10+$ x^9+ x^9+ x^8+ x^7+ x^6+ x^3+ x^2+1)$(modd(x),2) =
=(x10+$ x^8+ x^7+ x^6+ x^3+ x^2+1)$(modd(x),2).

Здесь символ (modd (x),2) обозначает приведение по двойному модулю: многочлен по модулю (x), а его коэффициенты по модулю два, т.е. четные коэффициенты обнуляются. Получившаяся степень (deg(A(x) B(x)) =10) результата произведения выводит (этот многочлен результат) за пределы поля. Чтобы результат принадлежал полю, его приводят (редуцируют, делят) по модулю неприводимого многочлена. Выполним такое деление обычным способом (уголком)

Пример 6. Необходимость деления многочленов возникает при
их умножении А(х)В(х)/ (x).(Операции деления в поле нет, когда надо что-то поделить, это что-то умножают на обратный элемент делителя в поле)

остаток отделения на (x) принадлежит полю GF(28), и его принимаем в качестве окончательного результата $R(x) = x^7+x^5+x^4+x^3+x$ модулярного умножения.

Иначе умножение A(x)B(x) представимо как
$(x^2 + 1)(x^8 + x^4+ x^3+ x +1) (x^7+ x^5+ x^4+ x^3+ x) = = (x^2+1)(x)R(x)$ = {ba}16=161,
где R(x) остаток и degR(x)< deg (x).
Степенное представление для получения произведения элементов поля самое удобное.
A(x) B(x) = 178 238 = (178+238) = 416 = 161255 =161 = {ba}16.

Для любого ненулевого элемента поля справедливо 1 =. Мультипликативной единицей в GF(28) является элемент {01}16 =255.
Все вычисленные произведения для различных представлений операндов эквивалентны (преобразуются в один элемент поля со значением {ba}16).

Наряду с обычным (классическим) рассмотрением операции умножения элементов в двоичном поле существует более удобная схема. Именно такая схема и реализована в стандарте AES.

Рассмотрим сущность этого способа умножения



Пример 7. Другой способ умножения в конечном поле. Пусть задан произвольный многочлен седьмой степени
$A(x) = a_7x^7+ a_6x^6+ a_5x^5+ a_4x^4+ a_3x^3+ a_2x^2+ a_1x+ a_0$
и значения его коэффициентов $(a_7 a_6 a_5 a_4 a_3 a_2 a_1 a_0) = (10000011)_2$.

Умножим его на $x$ и получим $a_7x^8+ a_1x^2+ a_0x$. Этот результат не принадлежит полю GF(28) степень его многочлена больше 7 и его необходимо привести по модулю (x) = 1{1b}, после чего такое произведение станет элементом поля GF(28).

С этой целью определяют значение $ a_7 $, если $а_7 = 0$ то результат уже принадлежит полю, если же $ a_7 = 1$, то достаточно вместо деления выполнить лишь вычитание A(x)x (x) или операцию XOR для произведения A(x)x с (x).

В этом случае при записи A(x) в сдвиговом регистре умножению на x полинома A(x), т.е. $A(x){00000010} = A(x){02}$ соответствует сдвиг полинома A(x) на один разряд в сторону старших разрядов (влево, т.е. увеличение вдвое) и, если требуется, применяется операция XOR с неприводимым многочленом поля 1{1b}16 =(x).

В алгоритме стандарта шифрования введена операция (функция) xtime( ), которая по существу и выполняет умножение полинома на х, так как это описано ранее. Многократное применение xtime обеспечивает умножение на x8. Далее вычисляя сумму различных степеней, можно получить результат умножения произвольных элементов поля GF(28).

Пример 8. Перемножим многочлены A(x) = {c1}16 и B(x) = {11}16, используя их 16-ичные представления и представляя суммой {11} ={1001}.
{c1}{11}={11000001}{00010001}={c1}{1001}={a4}{c1}=01100101 ={65}16.

Детализируем все действия. Элемент х в поле GF(28) имеет представление
x = {02}16=(00000010)2.
{c1}{11}={c1}{10}{c1}{01}= 178 100178 0={a4}{c1}, так как 178 100=(178+100-255)=23={a4}

Тогда умножение на него приводит просто к сдвигу первого операнда на 1 разряд влево.
{c1} {02} = xtime{c1} = 11000001 00000010= 110000010 9-ти разрядное двоичное число. Этот результат выходит за пределы нашего поля. Его возвращают вычитанием неприводимого многочлена поля (х), преобразуя в элемент поля. Итоговый результат 10011001 = {99}

$\begin{array}{r} - \begin{array}{r} 110000010\\ 100011011\\ \end{array} \\ \hline \begin{array}{r} 10011001 \end{array} \end{array}$


{c1} {04} = xtime(99) = 10011001 00000010 =100110010 9-ти разрядное двоичное число. Этот результат выходит за пределы нашего поля. Его возвращают вычитанием неприводимого многочлена поля (х), преобразуя в элемент поля. Итоговый результат 00101001 = {29}

$\begin{array}{r} - \begin{array}{r} 100110010\\ 100011011\\ \end{array} \\ \hline \begin{array}{r} 00101001 \end{array} \end{array}$


Очередной шаг процедуры
{c1} {08} = xtime(29) = 00101001 00000010 = 0101 0010 = {52}.
Здесь результат не суммируем с (x), так как коэффициент $a_7 = 0$.

И еще один шаг
{c1} {10} = xtime(52) = 0101001000000010 = 10100100 = {a4}16.
Здесь также не суммируем с (x), так как коэффициент $a_7 = 0$.
Таким образом, найдено значение первого слагаемого в сумме для исходного
выражения, где второе слагаемое равно {c1}16.
Теперь находим окончательно
{c1} {11} = {c1} {10} {c1} {01} = {a4} {c1} =10100100 11000001 = {65} или

$\begin{array}{r} - \begin{array}{r} 10100100\\ 11000001\\ \end{array} \\ \hline \begin{array}{r} 01100101 \end{array} \end{array}$



проверка обычным умножением (степенное представление)
A(x) B(x) = {c1}{11} = 1784 = 182
(по таблицам находим в строке для 1182) 182 соответствует {65}16.

Еще большего эффекта при производстве вычислений можно достигнуть, если укрупнить элементы, с которыми выполняются манипуляции. Так в криптоалгоритме RIJNDAEL используются 32-разрядные (4-х-байтовые) слова. Составляющие байт разряды не анализируются по отдельности. Такой подход позволяет 4-байтовому слову в соответствие поставить многочлен А(х) степени не более трех, и коэффициенты которого лежат в поле GF(28).

Операция умножения таких слов
$A(x) = a_3x^3 + a_2x^2 + a_1x + a_0$ и
$B(x) = b_3x^3 + b_2x^2 + b_1x+b_0$,
где $a_i, b_i$GF(28), i = 0(1)3, выполняется по модулю многочлена степени не более четырех. Взятие результата произведения по модулю неприводимого многочлена степени 4 обеспечивает всегда получение результата произведения, как элемента поля.

В качестве такого многочлена выбран многочлен $(x) = x^4 + 1$. Он имеет наиболее простую запись, и для него справедливо
$x_i (mod(x^4+1)) = x_i (mod4)$.
Последнее свойство оказывается очень полезным при вычислениях.
Для рассматриваемых многочленов операция сложения выполняется аналогично (XOR поразрядное по mod2)
$inline$A(x) B(x) = (a_3 b_3) x^3 (a_2 b_2) x^2 (a_1 b_1)x (a_0 b_0)$inline$.

Умножение многочленов.
$inline$A(x) B(x) = C(x) = (c_6x^6 c_5x^5 c_4x^4 c_3x^3 c_2x^2 c_1x^1 c_0) mod(x^4+1)$inline$.
Коэффициенты $c_j, j = 0(1)6$ определяются из соотношений
$C_0 = a_0b_0$,
$C_1 = a_1b_0 a_0b_1$,
$C_2 = a_2b_0 a_1b_1a_0b_2$,
$C_3 = a_3b_0 a_2b_1 a_1b_2a_0b_3$,
$C_4 = a_3b_1 a_2b_2 a_1b_3$,
$C_5 = a_3b_2 a_2b_3$,
$C_6 = a_3b_3$.

Окончательно результатом D(x) умножения двух многочленов по модулю $x^4+1$ будет
$inline$D(x) = A(x)B(x) = d_3x^3 d_2x^2 d_1x d_0$inline$, где
$d_0 = a_0b_0 a_3b_1 a_2b_2 a_1b_3$,
$d_1 = a_1b_0 a_0b_1 a_3b_2 a_2b_3$,
$d_2 = a_2b_0 a_1b_1 a_0b_2 a_3b_3$,
$d_3 = a_3b_0 a_2b_1 a_1b_2 a_0b_3$,
или более кратко в векторно матричной записи,

выполним умножение В(х) на х по $mod(х^4+1)$, учитывая свойства многочлена. Такому умножению, как и ранее, соответствует циклический сдвиг байтов в пределах слова в направлении старшего байта. Так как
$x^4mod(x^4 + 1) = x_i mod4 = x^0 = 1$, то
$x B(x) = b_2x^3+ b_1x^2+ b_0x+ b_3 => x(b_3 b_2 b_1 b_0)$
реализуется циклический сдвиг байтов.

Приложение


Таблица П1 расширенного поля, неприводимый многочлен (х)=Р (х), примитивный элемент =316



Подробнее..

АES американский стандарт шифрования. Часть II

03.07.2020 16:05:03 | Автор: admin
image

Основные операции шифра


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

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

Продолжая тему о блочном шифре победителе конкурса, проводимого Национальным институтом стандартов и технологий США (1997 2000), будем рассматривать его функционирование, работу. Агентство национальной безопасности США не являлось участником конкурса, поэтому шансы стать победителем у разработчиков были велики.

Конкурсной комиссией были предварительно отобраны 15 заявок от разных стран. Выступать могли как организации, так и частные лица. В итоге победил RIJNDAEL(Бельгия) авторы Винсент Рюмен (Vincent Rijmen) и Ион Дэмен (Joan Daemen). Структуру шифра считают классической SP-сетью.

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

Шифрование сообщений


Разработчиками создан шедевр, впервые идеология и реализация симметричного блочного шифра стала до конца понятной, так как шифр полностью основан на элементах классической (прозрачной) алгебраической структуры (поле), с достаточно скромными для обозрения количественными характеристиками. Конечное расширенное поле (поле многочленов) характеристики 2 имеет степень расширения n=8 и число элементов (порядок поля 28 = 256), отсюда обозначение поля GF(28).

Выбор неприводимого многочлена поля $(x) =x^8 +x^4 + x^3 + x + 1$ и примитивного элемента поля = 000000112 = 310, также не является загадочным. Одним словом, это не DES и не отечественный ГОСТ 28147.89.
Исходные тексты подготавливаются на устройствах с клавиатурой, используя
Таблицу Символы кода ASCII



Раунды и операции шифрования АЕS


Число раундов шифра обозначается Nr и зависит от длины ключа (Nr = 10 для ключа 128 битов, Nr= 12 для ключа 192 бита и Nr = 14 для ключа 256 битов).
Цикл (один раунд) шифрования AES состоит (в изменении состояния State шифруемого сообщения) из четырех основных операций:
1. AddRoundKey S + Ki; суммирование состояния (исходного текста с ключом)
2. SubBytes ax-1 + b; замена результатов суммирования другими байтами
3. ShiftRows; Sp(x); циклические сдвиги строк на разное число позиций
4. MixColumns A0S. перемешивание столбцов квадрата.

Покажем, как это происходит на числовом примере для текущего состояния в каждой операции, начиная с верхней (нулевой) строки. Результаты 2-й и 3-й операций не требуют числовых преобразований, но MixColumns связана с умножением 2-х матриц и определение элементов результирующей матрицы требует конкретных вычислений в поле GF(28). Алгоритм выработки ключа (Kеу Schedule) формирует 32-разрядные слова, число которых равно длине блока Nb.

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

Существует анимация, поясняющая функционирование алгоритм шифра AES, весьма наглядно демонстрируются раундовые операции. Автор не ставил перед собой цели показать все детали процесса зашифрования, но даже этот упрощенный вариант (на уровне байтов), что почти совпадает с элементами поля GF(28), удачно демонстрирует работу шифра AES. Детальное изложение для уяснения математических основ работы с элементами поля и конкретная реализация в различных представлениях элементов поля здесь.

Операция AddRoundKey для i-го раунда


Суммирование столбцов State с раундовым ключом (Add Round Key).

Раундовый ключ, предварительно вычисленный и выбранный, представляется в форме (квадрат) State (Key). Суммирование выполняется для одноименных столбцов. Пара столбцов State (Data) и State (Key) операцией XOR поразрядно складывается.

Таким образом, преобразование AddRoundKey состоит из суммирования матрицы S блока (квадрата 44) сообщения в M4(GF(28)) с частичным Ki ключом i-го раунда (также с квадратом 44 ). Результат суммирования обозначается SiA, т е. состояние после i-го AddRoundKey M4(GF (28)) M4(GF (28)), S SiA = S + Ki.
В начальном раунде (r = 0) выполняется только Add RoundKey суммирование по mod2 (XOR) байтов блока данных и блока ключа. Результат этого раунда используется как исходное (State) состояние для первого раунда (r=1) и представляется в формате квадрат.
Шифрование сообщений AES

Пример 1. Сообщение (исходный текст = ИТ) в 16-ричном представлении
имеет вид 32 43 f6 a8 88 5a 30 8d 31 31 98 a2 e0 37 07 34,
а ключ шифра 2b 7e 15 16 28 ae d2 a6 ab f7 15 88 09 0f 4f 3c.
Операция AddRoundKey S + Ki для всех 16 байтов квадрата State
Предварительный раунд зашифрования подготавливает сумму ИТ с ключом.

Их Сумма, представленная байтами в формате квадрат при Nb = Nk = 4 и Nr = 10 имеет вид:


Рисунок Результат предварительного раунда (до первого)

Ключ и исходный текст (это может быть и звук и картинка и др.) представлены в 16-ричном виде. Это не самое удобное представление, поэтому преобразуем его к двоичным векторам и выполняем сложение по модулю 2.



Для удобства ручного счета 16-ричное представление байтов преобразуется в двоичное, а после суммирования обратный переход от двоичного к 16-ричному представлению.

Операция SubByte для i-го раунда


Замена байтов (Sub Bytes ( ) )

Первый раунд. Операция AddRoundKey уже выполнена. Все байты суммарного квадрата (исходного состояния обозначим их точками (х, y) на некоторой плоскости) преобразуются функцией S (x, y) в новые значения табличка "Замена байтов".

Заменяем угловой (левый верхний) байт State = Сумма, (равный 19), на байт d4 из таблицы замен S-блока и следующий (3D) на 27 (они выделены заливкой). Так преобразуются все 16 байтов квадрата "Сумма".

Так для первого байта {19} = {x, y}, x = 1, y = 9, S(19) = d4. Все такие значения также представляются квадратом с замещениями.

Функция S (x, y) табулирована, т. е. задана таблицей с двумя входами строка (х) и столбец (у). Поскольку все многообразие байтов исчерпывается числом 256, то таблица имеет размер 1616 = 256, а ее строки и столбцы пронумерованы x, y = 0(1)15 цифрами 16-ричной системы счисления. Вид таблицы S (x, y) приведен ниже.



Покажем, как получены значения этой таблицы S (x, y). Вначале каждый байт исходного состояния {x, y} преобразуется в инвертированный {x, y}-1, в мультипликативный обратный в поле GF(28). Затем байт умножается на матрицу А. Нулевой байт переходит в себя {0, 0}-1 = {0, 0}.

Каждая строка матрицы аффинного преобразования А содержит лишь пять единиц.

Затем к инвертированному (обращенному) байту применяют аффинное преобразование, которое в векторно-матричной форме записывается так



Аффинная матрица

Запись векторов сверху (младший разряд) вниз. Вектор сдвига c = {63}16, что в таблице S (x, y) отражено для байта {00}. Каждый байт исходного состояния подвергается такому преобразованию, и их значения вписаны в квадратную таблицу S (x, y).

Скалярное представление аффинного преобразования имеет следующий вид (общий вид i -го элемента результата):


где $c_0 = c_1 = c_5 = c_6 = 1; c_2 = c_3 = c_4 = c_7 = 0$; $b_i$, $b_i$' соответственно исходное и преобразованное значение i-го разряда байтов, i = 0(1)7.

Выражение для $b_i$' содержит 6 слагаемых, так как каждая строка циклической матрицы аффинного преобразования имеет лишь 5 ненулевых элементов; шестое слагаемое берется из вектора сдвига ci.

Для ускорения вычислений используется квадратная таблица фиксированных значений (S (x, y) блок). Значение b =63 16 ричное число принадлежит GF(28) и матрица а имеет вид, показанный ранее. В сущности, операция реализует подстановку (замену) байт из S квадрата 1616.

Преобразование SubByte состоит в применении к каждому элементу матрицы S элементарного преобразования s. Результат этой операции обозначается SiSu, т. е. это состояние блока текста после операции SubByte i-го раунда. Не путать буквы S и s (большую и малую).

В сущности, здесь выполняется аффинное преобразование с постоянным вектором сдвига, обозначаемым символом b
M4 (GF(28)) M4 (GF(28)).

Запись векторов сверху (младший разряд) вниз. Вектор сдвига c = {63}16, что в таблице S (x, y) отражено для байта {00}. Каждый байт исходного текста (состояния) подвергается такому преобразованию, и их значения вписаны в таблицу S (x, y).

Пример 2. Первый байт исходного состояния первого раунда равен {19}. Мультипликативный обратный для него (см. Табл. П1) равен 3f = {19}-1= 0011 11112 =113. Это значение легко находится по таблице элементов поля GF(28). При отсутствии таблицы элементов поля можно выполнить и непосредственные вычисления.

Пусть байт {x, y} = 09 = 199 и {09} -1 = 4f, тогда
b0 = (1+0+1)mod2 = 0, b4 = (1+1+0)mod2 = 0,
b1 = (1+0+1)mod2 = 0, b5 = (0+1+1)mod2 = 0,
b2 = (1+0+0)mod2 = 1, b6 = (0+1+1)mod2 = 0,
b3 = (1+1+0)mod2 = 0, b7 = (0+1+0)mod2 = 1.
Результирующий вектор ( 0, 1, 2, 3, 4, 5, 6, 7) =1000 01002 = 84.

Следовательно, байт 4f S-блоком преобразуется в байт 84, что можно увидеть в таблице замен S (x, y) = S (4, f) = 84. Этот результата лежит на пересечении строки с номером 4 и столбца с номером f. Геометрическое представление замены байтов (SubBytes) изображено на рисунке 4, где s нелинейное преобразование, определяемое соотношениями:
GF(28) GF(28),


Операция ShiftRows для i-го раунда


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

Выбор величин сдвигов подчинен следующим условиям:
Каждая строка должна иметь индивидуальное смещение элементов;
Реализация операции должна быть простой;

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

А) атак, использующих сокращенные дифференциалы
В) атак типа Square.


Рисунок 5 Состояние после сдвига строк

ShiftRows преобразование перемещения байтов строки в матрице состояния S, которое циклически сдвигает строки матрицы состояния на различные по величине смещения. Результат операции обозначается SiSh, т. е. это состояние после операции ShiftRows
i-го раунда. Такие перемещения могут быть описаны Р(х) перестановкой байт из квадрата S, которая имеет вид:


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

Геометрическое представление преобразования замены байтов изображено на рисунке 4, где приведены квадраты числового примера для первого раунда.

Сдвиг строк в массиве State выполняется влево. Строка с номером нуль остается неподвижной (не сдвигается). Остальные строки RIJNDAEL сдвигаются на число байтов c1, c2, c3, указанное в квадрате на рисунке 5), в зависимости от числа Nb байтов в блоке данных. Строка 1 сдвигается на c1 байтов, строка 2 на c2 байтов и строка 3 на с3 байтов.

В стандарте AES величина Nb = 128 постоянная, поэтому всегда c1 = 1, c2 = 2 и c3 = 3.

Таблица Величины сдвигов



Операция MixColumns для i-го раунда


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

  • Обратимость получаемого результата.
  • Линейность в поле GF(28); выполнение этого требования создает условия для применения алгоритма прямого расшифрования.
  • Достаточно сильное рассеивание данных.
  • Высокую скорость реализации на 8-разрядных процессорах; единообразие обработки любых блоков данных, т. е. симметричность.
  • Простой вид для описания и реализации.

Все названные требования удовлетворены в стандарте АES. Из возможных линейных преобразований 4 bytes 4 bytes выбрана операция умножения многочленов (элементов поля) по модулю (x) = x4 + 1. Выбор коэффициентов сомножителей обусловлен требованиями 1, 3 и 4. Коэффициенты {00}, {01}, {02}, {03}, соответствуют: {00} отсутствию преобразования; {01} не требуется умножения; {02} умножение при использовании функции x time ( ) и {03} при использовании x time и последующего сложения по mod2 промежуточных результатов.

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

Сущность преобразования Mix Columns ( ) состоит в следующем. Столбцы State
S = < S0c, S1c, S2c, S3c>, с = 0(1)3, после сдвига строк рассматриваются как элементы поля GF(28) и умножаются по mod(x4 + 1) на фиксированный многочлен g(x):
g(x) = {03}x3+{0,1}x2+{01}x+{02}.


где с номер столбца State, c = 0(1)3.

где А циркулянтная матрица, т. е. линейное инвертируемое (обратимое) отображение на GF (28), А принадлежит M8(GF (28)),
обозначает умножение матрицы из GF (28) и вектора
х -1 = {b0 b1b7 }b, который рассматривается как элемент над полем GF(2) векторного пространства, эквивалентный транспонированному в вектор {b0 b1b7 }b.

Развернем это выражение в скалярную форму
S0C = ({02} S0C) ({03} S1C) S2C S3C;
S1C = S0C ({02} S1C) ({03} S2C) S3C;
S2C = S0C S1C ({02}S2C) ({03} S3C);
S3C = ({03} S0C) S1C S2C ({02} S3C).
В результате выполнения указанных действий байты вектора
SC = <S0c, S1c, S2c, S3c> будут заменены байтами S0C, S1C, S2C, S3C.

MixColumns преобразование состоит из умножения двух матриц. Матрицы S промежуточного состояния текста и фиксированной матрицы A0 обе из введенного ранее множества M4 (GF (28)). Результат операции обозначается символом SiM, это по существу состояние S после операции MixColumns i-го раунда.

M4 (GF (28)) M4 (GF (28)),
S Si, М = АS,
где матрицы А и А-1 (циркулянтные матрицы) определяются как:

.
Операция MixColumns произведение специальной цикловой А0 матрицы на матрицу State, по правилу строка на столбец

.
Два пустых столбца в результирующей матрице оставлены для самостоятельного заполнения.
Начинаем с левого углового элемента нулевой строки квадрата. Его значение определяется суммой произведений пар элементов: {02}D4{03}BF {01}5D {01}30. Элементы обеих матриц это элементы поля GF(28) с одной стороны и информационные байты в 16-ричном представлении с другой. Умножение элементов в поле удобно выполнять в степенном представлении примитивного элемента.

Пользуясь таблицей поля, выполним замену 16-ричного представления на степенное для левой цикловой матрицы элементы {01} = a0, {02} = a25, {03} = a1. Для правой матрицы в произведении получим


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

1-й элемент нулевой строки определяется в виде:

{02}D4 {03}BF {01}5D {01}30 = a25а65 a1а157 a0а136 a0а101 = а90 a158а136а101,

2-й элемент нулевой строки определяется аналогичным соотношением (поменялся столбец)

{02}Е0{03}B4 {01}52 {01}АЕ = a25а68 a1а251 a0а253 a0а123 = а93 a252 а253а123,

3-й элемент нулевой строки определяется аналогичным соотношением поменялся столбец

{02}B8{03}41 {01}11 {01}F1 = a25а59 a1а143 a0а4 a0а74 = а84 a144 а4 а74,

4-й элемент нулевой строки определяется аналогичным соотношением поменялся столбец

{02}1Е{03}27 {01}98 {01}Е5 = a25а28 a1а106 a0а89 a0а32 = а53a107 а89а32.

Показатели степеней просто суммируются при перемножениях как логарифмы. Суммирование слагаемых удобно выполнить возвратом к 16-ричному, а от него к двоичному представлению. Опять воспользуемся таблицей элементов поля GF(28).



Перейдем к вычислению элементов 1-й строки матрицы (изменяется номер строки циклической матрицы) Элементы в парах произведений изменяются относительно 0-й строки.

1-й элемент 1-й строки матрицы перемешанных столбцов определяется соотношением.


Перейдем к вычислению элементов 2-й строки матрицы (изменяется номер строки циклической матрицы). Элементы в парах произведений изменяются относительно 1-й строки.

1-й элемент 2-й строки матрицы перемешанных столбцов определяется соотношением



Перейдем к вычислению элементов 3-й строки матрицы (изменяется номер строки циклической матрицы) Элементы в парах произведений изменяются относительно 2-й строки.

Подробнее..

Canvas и геометрия. Это почти просто

06.07.2020 14:13:22 | Автор: admin

Трехмерную графику можно реализовать в браузере не только применяя WebGL или
библиотеки созданные на основе WebGL, но и путем простой отрисовки на 2D-холсте используя
для этого функции HTML5 Canvas.


Существует множество книг, статей и информации в интернет о том как использовать холст
HTML5 Canvas для отображения рисунков, графиков и даже анимации в некоторых браузерных играх.
Однако практически никогда не рассматривается возможность непосредственного использования холста
для отображения трехмерных объектов.


Остановимся на этом чуть подробнее.

Если создается трехмерная компьютерная игра, например 3D-шутер, то разработчики стараются сделать ее
как можно более реалистичной и используют для этого графические ускорители. В этом случае без соответствующих
программных инструментов обойтись не удастся. Для таких игр в браузере есть прямой смысл
использовать WebGL и Three.js. Самое главное, что с помощью шейдеров предназначенных для этих
программных инструментов можно осуществить реалистичное освещение сцены и находящихся на сцене объектов.


Но если требуется просто показать трехмерный объект со всех сторон, то можно обойтись
без WebGL и шейдеров. Например некоторые программы CAD/CAM предназначены только для моделирования
формы объектов и не предполагают использования реалистичного освещения.
На сайте Canvas и геометрия
я последовательно и очень подробно объясняю как используя исключительно HTML5 Canvas можно
создать изображения 3D-моделей многогранников.




Полгода тому назад была опубликована моя статья Three.js и геометрия
которая относилась к серии из 30 глав (уроков) на одноименном сайте
Three.js и геометрия где
мной описывалось отображение 3D-моделей многогранников при помощи three.js. Теперь все модели
на новом сайте созданы только с помощью HTML5 Canvas. Однако сам расчет координат вершин моделей
на обеих сайтах сделан абсолютно одинаково. Отличие заключается лишь в способе вывода изображения на экран.


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



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

Просмотр нумерации вершин модели.

Масштабирование модели.

Возможность выбора любой грани модели мышью
(при использовании three.js это делается с помощью RayCaster'а).

Возможность просмотра значений координат любой точки находящейся на поверхности модели.

Проверка корректности построенной модели.
При желании можно выключать/включать проверку корректности построения модели.

Показано как на 3D-модели отобразить размеры ее частей
при помощи выносных и размерных линий. На сайте сделанном при помощи three.js
эта возможность отсутствует.

Имитация простейшего освещения.

Задание цвета и яркости падающего на модель света.

Задание прозрачности модели.



Если используется WebGL/three.js программист может
не заботиться об удалении невидимых линий это
делается автоматически при помощи Z-буфера.
На сайте Canvas и геометрия
показано как можно отображать только внешние (направленные к наблюдателю) грани модели
двумя различными способами.


При создании online-программ находящихся на сайте использовались лишь самые простые конструкции языка JavaScript.
Самая сложная конструкция этого языка, которая используется на сайтах это prototype в моей библиотеке WebGeometry,
при помощи которой производятся геометрические расчеты. Хотя можно было бы в принципе при создании этой библиотеки обойтись и
без prototype. В самом начале моей работы по отображению трехмерных моделей в браузере мне было весьма непривычно
пользоваться JavaScript. Мне казалось диким, что в языке нет заранее прдопределенных типов данных. Да и некоторые
другие его особенности также казались весьма странными.
В течение многих лет я программировал на C/C++ и поэтому поначалу JavaScript мне показался ущербным языком.
Но спустя некоторое время до меня дошло, что имея только браузер (я в основном использую Chrome и иногда Firefox)
и Notepad++ работать на JavaScript очень удобно результат виден сразу особенно это относится к небольшим
графическим программам.


Если не относться заранее предвзято к особенностям языка, то он оказывается достаточно комфортен.
Поэтому сейчас я изменил свое отношение к этому языку в гораздо лучшую для него сторону.
Иногда правда я с тоской вспоминаю замечательный (это мое личное мнение) отладчик в Visual Studio.
Поэтому, когда требуется найти сложную ошибку в геометрических вычислениях,
я обращаюсь к Visul C++ и этому отладчику. Но отладчики в Chrome и Firefox тоже
производят самое хорошее впечатление.


Сейчас для создания больших программ на JavaScript все время появляются новые инструменты такие как React,
Angular, Vue.
Освоение этих программ требует значительных усилий. К счастью для создания простых графических программ можно обойтись
без них. У меня даже пока не возникала потребность в использовании новых (на данный момент уже и не новых) возможностей ES6.


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



Для отрисовки моделей и нанесения их размеров на холст была сделана библиотека
canvas2D,
которая фактически представляет собой небольшую обертку вокруг функций HTML5 Canvas.
При этом функции входящие в библиотеку canvas2D сделаны таким образом, чтобы их было
максимально удобно использовать совместно с функциями входящими в состав библиотеки
WebGeometry

,
предназначенной для геометрических расчетов на плоскости и в пространстве.

Несколько слов про использование библиотеки WebGeometry. Эта библиотека сделана таким
образом, чтобы программист котрый создает 3D-модель с нуля не задумывался о том как решить очередную задачу
аналитической геометрии на плоскости и в пространстве для прямых и плоскостей. В основном для решения таких
задач требуются неплохие знания работы с матрицами, и если у вас нет соответствующих готовых функций
то перед вами возникают дополнительные проблемы. В библиотеке WebGeometry нет функций
для перспективных преобразований в пространстве, которые производятся при помощи не трехмерных, а четырехмерных матриц.
Перспективные преобразования не требуются при создании трехмерных моделей. Поэтому они и не включены
в состав библиотеки WebGeometry. Если потребуется выполнить такие преобразования, то соответствующие
функции можно найти, если вы используете three.js, то в самой этой библиотеке или в популярной библиотеке
glMatrix

.
Однако в этих двух упомянутых библиотеках практически нет функций для решения задач аналитической геометрии.
Поэтому и была сделана библиотека функций WebGeometry. В библиотеке
Sylvester есть некоторые (но не все требуемые)
такие функции и поэтому я решил сделать библиотеку полностью подходящую под мои задачи с нуля
на основе уже существующих функций на C/C++.

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



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



На сайте Three.js и геометрия все 16 моделей многогранников расчитаны с помощью библиотеки
WebGeometry (так же как и на текущем сайте), но отображены они на холст с помощью three.js.



На сайте Diamond Cuts модели 7 многогранников также расчитаны спомощью библиотеки
WebGeometry и отображены на холст с помощью three.js. При этом используется
несколько типов шейдеров и кубические текстуры. Все программы на этом сайте снабжены
подробными комментариями и поэтому на их примере можно посмотреть как
шейдеры встраиваются в three.js.



На страницах
Diamond Cuts collection in environments
и Diamond Cuts with Dispersion Light
можно найти множество моделей различных многогранников отображенных при помощи шейдеров и кубических текстур.
Вывод на экран моделей с этих страниц осуществляется при помощи three.js.
При определении координат вершин всех этих моделей координаты предварительно расчитывались на Visual C++
и их значения записывались в файлы. Эти файлы с сохраненными в них значениями координат используются
в программах отображения моделей на экран (three.js и API WebGL).

По ссылке
Pages можно перейти на страницы этого сайта на которых находятся 36 моделей различных огранок.
Вывод на экран на этих страницах осуществляется при помощи чистого API WebGL.
Также отсюда можно скачать exe-файл моей программы под Windows сделаной на C/C++
и OpenGL для просмотра моделей огранок. DLL-файлы нескольких моделей скачиваются с этой же страницы.

На страницах
Shine on You Crazy Diamond ! того же сайта можно под музыку Pink Floyd и других музыкальных групп
двигаться по сцене и рассматривать модели огранок. Управление движением мышь и клавиатура (, , , , <, > )
как в компьютерных играх. Вывод на экран осуществляется при помощи three.js.
На мой взгляд получилось весьма интересно. Не забудьте при прсмотре включить звук!



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

Спасибо всем за просмотр моей статьи!

Подробнее..

Рекурсия сознания ловушка мышления и барьер прогрессу. Исторический очерк

23.06.2020 02:20:15 | Автор: admin
С момента появления языка как второй сигнальной системы инструмента для мышления и общения, человечество получило критическое преимущество перед всеми другими живыми существами, поведение которых управляется системами первого уровня и поэтому принципиально ограничено в уровнях абстрагирования.
Но, давая человеку инструмент огромной силы, язык и абстрактное мышления в то же время создают ограничения и ловушки, ведущие к проблемам, конфликтам и деструктивному поведению. Чем человечество последние 5000 лет в основном и занимается. (Может и 500 000, но нет письменных свидетельств).
90-99% всех войн, конфликтов, ссор и убийств происходят по идейным, идеологическим, религиозным, политическим и другим абстрактным причинам, лежащим в сфере идей и информации, а не материального мира. И прежде чем война, конфликт, ссора приводит к реальным действиям, ей всегда предшествует этап намерения, замысла, подготовки, планирования, нагнетания, организации, проходящий на уровне слов и информации.
Источник и инструмент всех войн, убийств, дискриминации, инквизиции, угнетения язык.
Но он же инструмент науки, культуры, прогресса, развития, цивилизации.
И виноват в проблемах не инструмент, а незрелое мышление, сознание и культура тех, кто его использует.
Еще с античных времен лучшие умы это понимали и пытались исправить.
Aristotle Altemps Inv8575
Наибольший вклад в развитие цивилизации внес, конечно, Аристотель. Разработка формальной логики дала хоть и простой, но все-же общепризнанный и легко применимый инструмент разрешения споров и поиска истины. По сути, это создало основу, фундамент всей Западной цивилизации.
Хотя до сих пор формальную логику понимает и умеет пользоваться, по разным оценкам, не более 1-10% населения планеты.
И уже в те времена философы и мыслители, используя этот инструмент, натолкнулись на ловушку рекурсии, лежащую в основе значительной части парадоксов, апорий и логических противоречий.
Парадокс лжеца, апории Зенона, множество других парадоксов в основе всех одна и та же мыслительная ошибка. Считать, что высказывание, направленное само на себя, ничем не отличается от высказываний, имеющих другое основание.
Это высказывание написано на русском языке, Это высказывание истинное рекурсивные высказывания без парадокса.
Это высказывание ложное пример парадоксальной рекурсии.
Некоторые античные мыслители даже сошли с ума или покончили жизнь самоубийством, пытаясь разрешить такие загадки.
Но выхода так и не нашли.
Философы средневековья и Возрождения потратили тысячи часов на решения подобных и еще более схоластических вопросов, но единственным продуктом были все более и более абстрактные теории, в которых авторы избретали новые названия для старых категорий и все больше в них запутывались.
Как ехидно заметил Пуанкаре,
"все, что ученый на самом деле создает это язык, которым он это возвещает."

Выходы из логического тупика начали находить только по мере развития естественных и точных наук где-то к началу XX века. Нашлись они, как и можно было ожидать, представителями самой формальной и точной науки математики.
Bertrand Russell transparent bg
Б. Рассел в своих Основаниях математики (1903) показал, что класс не может включать сам себя в виде элемента класса, а тип не может быть сам себе подтипом. Аналогично множество, включающее само себя в качестве подмножества, обладает особыми свойствами и не может рассматриваться в ряду обычных множеств, не приводя к логическим ошибкам указанного типа.
1925 kurt gdel
Наиболее полно и красиво разобрался с этой проблемой Курт Гёдель, опубликовавший в 1931 году свои знаменитые теоремы о неполноте:
Любая формальная система аксиом содержит неразрешенные предположения

Логическая полнота (или неполнота) любой системы аксиом не может быть доказана врамках этой системы. Для ее доказательства или опровержения требуются дополнительные аксиомы (усиление системы).

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

Работы Гёделя оказали серьезное влияние на все точные науки, не только математику.
Einstein 1921 by F Schmutzer - restoration
Его идеи продолжил в физике Альберт Эйнштейн, утверждавший, что
"невозможно решить проблему на том же уровне, на котором она возникла. Нужно стать выше этой проблемы, поднявшись на следующий уровень".
По сути, это та же теорема о неполноте, выраженная в более абстрактной форме.
Не обошли вниманием эту тему и отечественные исследователи.
Ivan Pavlov 1934
Великий ученый и мыслитель Иван Петрович Павлов еще в далеком 1918 году предвосхитил на много лет Структурный Дифференциал А. Коржибского, исследователя уровней абстрагирования, в своих лекциях Об уме вообще, о русском уме в частности:
"действительность, понять которую ставит своей задачей ум, эта действительность является в значительной степени скрытой от него. Она, как говорится, спрятана за семью замками. Между действительностью и умом стоит и должен стоять целый ряд сигналов, которые совершенно
заслоняют эту действительность."

"Что такое наши слова, которыми мы описываем факты, как не новые сигналы, которые могут, в свою очередь, затемнить, исказить истину."

"словесная передача этим другим обстановки всего его дела не соответствует, не воспроизводит точно и полно действительности."

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


Alfred Korzybski
Это описание тех же уровней абстрагирования, и принципов отношения реальности, языка и сознания, что показаны А. Коржибским на его Структурном Дифференциале в книге Science and Sanity в 1933 году, и даже почти теми же самыми словами.
Но, благодаря картинкам и материальной модели, идеи Коржибского все-таки поняли в тот момент несколько человек, (как, впрочем, и Эйнштейна сразу после публикации Теории Относительности) и в результате этого появились и НЛП, и Дианетика с Сайентологией, и некоторые направления позитивной психологии, маркетинга, рекламы, политтехнологий, пропаганды и других инструментов работы с сознанием. К сожалению, на первоисточник авторы этих разработок предпочитают не ссылаться, чтобы не палить тему.
Но, по крайней мере, идея Карта не территория вышла за рамки научных статей и стала достоянием широкого круга людей и достаточно общепринятым фактом.
А И. Павлов опередил эпоху, и в то непростое время, его глубоко не понял, наверное, вообще никто.
И даже сейчас, через почти 100 лет после этих исследований, публикаций и выступлений, контролировать свое абстрагирование, отслеживать уровни, избегать рекурсии и не попадать в уровневые ловушки умеет не так много людей, на порядки меньше, чем владеют формальной логикой.
Хорошо, что на этом ресурсе собираются люди, близкие к ИТ и программированию, которых с первых шагов в профессии обучают логике, структуре и строгости мышления и которые знают, что программа не должна вызывать сама себя в качестве подпрограммы, массив не может включать сам себя в качестве элемента массива, а переменная не может принимать в качестве значения сама себя.
Но то, что для программистов самоочевидно, совсем не так в других областях науки и деятельности.
Миллионы людей продолжают пытаться выучить язык с помощью языкового описания языка (грамматики), не замечая, что они попадают в логическую ловушку рекурсии без шанса выбраться оттуда.
Когда вы не знаете, как построить предложение на другом языке, чтобы выразить нужную вам мысль, вы сказать этого не можете.
Но когда вы выучили правило и знаете, как построить это предложение, вы все равно сказать это не сможете.
Потому что та зона мозга, которая должна управлять этим действием, занята мыслями о том, как это сделать (правилами).
Это подобно попытке укусить себя за зубы или перерезать нож ножом. Причем этим самым ножом.
Рекурсия в чистом виде.
Но этого почти никто не замечает, кроме психологов-физиологов, которые давно используют такой механизм блокировки речи для исследований языка и мышления.
Психолингвист и методист Стивен Крашен сформулировал эту идею в виде Гипотезы грамматического монитора. Он утверждает, что грамматика не может служить инструментом для порождения устной речи, а только как монитор для последующего контроля и коррекции. Но, исходя из фактов, полученных другими науками, это никакая не гипотеза, а аксиома, следующая из законов логики, математики, психологии, физиологии. И только фрагментация и сегментация наук и все более узкая специализация ученых не позволяет это заметить.
Аналогичные проблемы с бесконтрольным абстрагированием и злоупотреблением рекурсией можно найти в сфере психологии, когда начинают исследовать мышление с помощью мышления, в методологии, когда пытаются управлять управлением с помощью управления, в философии, которая множит абстрактные сущности без всякого страха перед Оккамом, и во многих других сферах человеческой деятельности.
И задача технарей, айтишников, представителей точных наук помочь выбраться из рекурсивной ловушки, дать инструменты структурирования мышления, научить избегать рекурсии и совместно с гуманитариями разработать новые продукты и инструменты, решающие насущные задачи и лишенные рекурсивных замыканий.
Одним из таких инструментов может быть Структурно-Визуальный метод, разработанный автором этой статьи. Он предлагает для структурирования знаний в некоторой предметной области использовать визуальное представление структуры с использованием цвета для кодирования ограниченного количества смыслов самого верхнего уровня абстракции.
С помощью этого метода были получены некоторые интересные схемы и модели для разных предметных областей ИТ, управления, психологии, лингвистики, педагогики, изучения иностранных языков, а их практическое применение оказалось довольно результативным и перспективным.
Но об этом в следующих статьях, если это будет интересно читателям Хабра.

Успехов вам в любой деятельности и осознанного абстрагирования!
Подробнее..

Технологические соревнования Радиофест-2020

29.06.2020 22:07:32 | Автор: admin
Мировая пандемия пришла неожиданно и внесла свои коррективы в намеченные планы. Многие мероприятия были отменены, еще больше перенесены и мы также были вынуждены с тревогой следить за развитием ситуации. Находиться в неопределенности и постоянном ожидании очень не просто.

Это был непростой период для всех нас, Covid-19 буквально забрал у нас все то, что, казалось бы, навсегда с нами, привычное общение с коллегами на работе, встречи с друзьями в кафе, прогулки в парке с семьей и многое другое из нашей повседневной жизни. И вот наконец-то жизнь постепенно возвращается в привычное русло. И мы рады Вам сообщить, что Радиофест-2020 состоится! Да, конечно, произошло много изменений и появилось много ограничений. Но, как говориться, нет ничего невозможного. Мы приложим максимальные усилия, чтобы мероприятие прошло комфортно и безопасно.

Начнем с организационной части. Итак, с 7 по 9 октября 2020 года, все в том же замечательно месте, Технополис Москва (площадка Алабушево) состоятся вторые Всероссийские технологические соревнования по перспективным направлениям развития радиосвязи Радиофест-2020. Порядок проведения соревнований также остается неизменным, первые два дня будет хакатон, на котором командам будет предоставлено оборудования для отладки программного обеспечения, третий день торжественное открытие, проведение соревнований по направлениям и церемония награждения победителей.

Теперь про техническую составляющую соревнований. Непосредственно направления проведения соревнований остаются неизменными, это по прежнему радионавигация, радиоперехват и радиосвязь/РЭБ. Но, уже имея опыт проведения первых соревнований, мы внесли некоторые изменения в новый Регламент, направленные, в первую очередь, на расширения аудитории потенциальных участников соревнований. Выбранная нами, для проведения первого радиофеста, SDR платформа LimeSDR, отличный радиочастотный фронтенд, но все же достаточно дорогая, и трудно доставаемая вещь, в амперку или chip-dip не пойдешь, не купишь. Соответственно, далеко не у всех есть возможность приобрести необходимый комплект оборудования и подготовится к соревнованиям. Что ставит тех же радиолюбителей энтузиастов в неравные условия с командами, которых поддерживает образовательное учреждение или тем более коммерческая организация. В связи с этим, в конкурсе поймай волну мы переходим на использование в качестве радиооборудования хорошо себя зарекомендовавшего приемника RTL-SDR Blog V3. Простой, дешевый, легко доставаемый, с достаточным частотным диапазоном, был бы еще канал на передачу, вообще бы цены этому донглу не было. В вычислительной части комплекта оборудования все остается неизменным, используем Raspberry Pi 4 4GB.

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

Итого, на Радиофесте-2020 будут следующие конкурсные задания.

Конкурс по направлению радиоперехват поймай волну не меняет свою суть конкурсное задание заключается в автоматическом определении вида модуляции сигнала. Но вместо LimeSDR командам предоставляется RTL SDR. Если команды показывают одинаковый результат, то для определения победителя проводится Супр-Игра. В ходе Супер-Игры для излучаемого сигнала уменьшается соотношение сигнал шум и добавляется псевдослучайная перестройка рабочей частоты.

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

Конкурс по направлению радионавигация, несмотря на переименование с охоты на лис на геобитва, сути не меняет и заключается в определении координат нескольких источников радиоизлучения с использованием комплектов LimeSDR. Но теперь количество приемников доступных командам фиксировано два комплекта, плюс комплекты оборудования могут обмениваться данными по проводной сети Ethernet. Если команды показываю одинаковый результат, то для определения победителя проводится Супр-Игра. В ходе проведения Супер-Игры один их комплектов оборудования снабжается дополнительной передающей антенной, команды могут использовать передающий канал для постановке помех команде сопернику.

Мероприятию посвящен отдельный веб-сайт. В самое ближайшее время на нем будет опубликован Регламент Радиофест-2020. Также, учитывая опыт проведения предыдущих соревнований, на сайте будет доступен раздел с примерами кода. В частности, будут доступны примеры кода на С и python для взаимодействия с сервером Оргкомитета, в части подключения и загрузки/выгрузки файлов.

Для участи в Радиофест-2020 необходимо заполнить заявку на участие, которая также будет скоро опубликована на сайте http://радиофест.рф

До встречи на Радиофест-2020!
Подробнее..

Нефтянка для инженеров, программистов, математиков и широких масс трудящихся, часть 4

02.07.2020 08:05:44 | Автор: admin
image

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

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


Моделирование, прогноз, неопределённость


Все перечисленные в предыдущих статьях (раз, два, три) физические эффекты важно понимать не просто для того, чтобы знать, как устроен мир. Скорее всего их придётся учитывать при построении модели, которая умеет правильно предсказывать будущее. Зачем нам уметь предсказывать будущее в нефтедобыче, если цену нефти и коронавирус всё равно не предсказать? Да затем же, зачем и везде: чтобы принимать правильные решения.

image

В случае с месторождением мы не можем непосредственно наблюдать, что происходит под землёй между скважинами. Почти всё, что нам доступно, привязано к скважинам, то есть к редким точкам на необъятных просторах болот (все что мы можем измерить заключено примерно в 0.5% породы, о свойствах остальных 99.5% мы можем только догадываться). Это проведённые измерения на скважинах тогда, когда скважина строилась. Это показания приборов, которые на скважинах установлены (давление на забое, доля нефти воды и газа в получаемой продукции). И это измеряемые и задаваемые параметры работы скважин когда включать, когда выключать, с какой скоростью качать.

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

image

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

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

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

Модели в жизни месторождения


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

image

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

image

Затем начинается разведочное бурение, и по мере бурения скважин в них спускают на кабеле приборы, измеряющие всякие разные показатели вдоль ствола скважины, то есть проводят ГИС (геофизические исследования скважин). Результат такого исследования каротаж ГИС, то есть кривая определённой физической величины, измеренная с определённым шагом вдоль всего ствола скважины. Разные приборы измеряют разные величины, а обученные инженеры затем проводят интерпретацию этих кривых, получая значимую информацию. Один прибор измеряет естественную гамма-радиоактивность породы. Глины фонят сильнее, песчаник фонит слабее это знает любой инженер-интерпретатор и выделяет на каротажной кривой: тут глины, тут слой песчаника, тут что-то среднее. Другой прибор измеряет естественный электрический потенциал между соседними точками, возникающий при проникновении в породу бурового раствора. Высокий потенциал показывает наличие фильтрационной связи между точками пласта, знает инженер и подтверждает наличие проницаемой породы. Третий прибор измеряет сопротивление насыщающего породу флюида: солёная вода ток пропускает, нефть ток не пропускает и позволяет отделить нефтенасыщенные породы от водонасыщенных и так далее.
На этом месте дата-сайнс инженеры снова оживились, потому что входные данные у этой задачи это простые численные кривые, а заменить инженера-интерпретатора какой-нибудь ML-моделью, умеющей вместо инженера по форме кривой сделать вывод о свойствах породы это значит решить классическую задачу классификации. Это только потом у дата-сайнс инженеров начинает дергаться глаз, когда выясняется, что часть этих накопленных кривых со старых скважин есть только в виде длинных бумажных портянок.

image

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

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

image

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

image

Затем наступает этап дискретизации, при котором область пространства, занимаемая месторождением, разбивается на такой изогнутый в соответствии с залеганием слоёв (характер которого виден ещё на сейсмической модели!) параллелепипед из ячеек. Каждая ячейка этого изогнутого параллелепипеда однозначно определяется тремя номерами, I, J и K. Все слои этого изогнутого параллелепипеда лежат согласно распространению слоёв, а количество слоёв по K и количество ячеек по I и J определяется детальностью, которую мы можем себе позволить.
Насколько детальная информация о породе у нас есть вдоль ствола скважины, то есть по вертикали? Настолько детальная, насколько часто делал замеры своей величины геофизический прибор при движении по стволу скважины, то есть, как правило, каждые 20-40 см, поэтому каждый слой может быть и 40 см, и 1 м.

Насколько детальная у нас есть информация по латерали, то есть в сторону от скважины? Ни насколько: в сторону от скважины у нас информации нет, поэтому смысла разбивать на очень маленькие ячейки по I и J, как правило, нет, и чаще всего они бывают по 50 или 100 м по обеим координатам. Выбор размера этих ячеек является одной из важных инженерных задач.

image

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

image

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

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

image

Затем за работу берутся специалисты-гидродинамики. Они могут укрупнить геологическую модель, объединив несколько слоёв по вертикали и пересчитав свойства породы (это называется апскейлинг, и представляет собой отдельную непростую задачу). Потом они добавляют остальные нужные свойства для того, чтобы гидродинамический симулятор мог моделировать, что куда будет перетекать: кроме пористости, проницаемости, нефте-, водо-, газонасыщенности, это будут давление, газосодержание и так далее. Они добавят в модель скважины и внесут по ним информацию о том, когда и в каком режиме они работали. Вы ещё не забыли, что мы пытаемся воспроизвести историю, чтобы иметь надежду на корректный прогноз? Гидродинамики возьмут отчёты из лаборатории и добавят в модель физико-химические свойства нефти, воды, газа и породы, всяческие зависимости их (чаще всего от давления) и всё, что получилось, а это будет гидродинамическая модель, отправят в гидродинамический симулятор. Тот честно рассчитает, из какой ячейки в какую всё будет в какой момент времени перетекать, выдаст графики технологических показателей на каждой скважине и скрупулёзно сравнит их с реальными историческими данными. Гидродинамик вздохнёт, глядя на их расхождение, и пойдёт изменять всё неопределённые параметры, которые он пытается угадать так, чтобы при следующем запуске симулятора получить что-то близкое к реально наблюдавшимся данным. А может при следующем запуске. А может при следующем и так далее.

image

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

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

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

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

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

Продолжение следует
Подробнее..

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

04.07.2020 20:20:46 | Автор: admin
В наше время компьютеры представляют собой мощные вычислительные машины,
способные выполнять миллионы операций в секунду. И естественно не обойтись без симуляции реального или игрового мира. Одна из задач компьютерного моделирования и симуляции состоит в определении столкновения двух объектов, одно из решений которой реализуется теоремой о разделяющей оси.



Примечание. В статье будет приведен пример с 2 параллелепипедами(далее кубы), но идея для других выпуклых объектов будет сохранена.
Примечание. Вся реализация будет выполнена в Unity.

Акт 0. Общая теория


Для начала нужно познакомиться с "теоремой о разделяющей гиперплоскости".Именно она будет лежать в основе алгоритма.

Теорема. Две выпуклые геометрии не пересекаются, тогда и только тогда, когда между ними существует гиперплоскость, которая их разделяет. Ось ортогональная разделяющей
гиперплоскости называется разделяющей осью, а проекции фигур на нее не пересекаются.


Разделяющая ось (двумерный случай)


Разделяющая ось (трехмерный случай)
Можно заметить, что проекции на разделяющую ось не пересекаются.

Свойство. Потенциальная разделяющая ось будет находиться в следующих множествах:
  • Нормы плоскостей каждого куба(красные)
  • Векторное произведение ребер кубов $\{[\vec{x},\vec{y}] : xX, yY\}$,

где X ребра первого куба (зеленые), а Y второго (синие).



Каждый куб мы можем описать следующими входными данными:
  • Координаты центра куба
  • Размеры куба (высота, ширина, глубина)
  • Кватернион куба

Создадим для этого дополнительный класс, экземпляры которого будут предоставлять информацию о кубе.
public class Box{    public Vector3 Center;    public Vector3 Size;    public Quaternion Quaternion;    public Box(Vector3 center, Vector3 size, Quaternion quaternion)    {       this.Center = center;       this.Size = size;       this.Quaternion = quaternion;    }    // дополнительный конструктор, который    // позволяет сгенерировать объект на основе GameObject    public Box(GameObject obj)    {        Center = obj.transform.position;        Size = obj.transform.lossyScale;        Quaternion = obj.transform.rotation;    }}

Акт 1. Кватернионы


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

Кватернион это гиперкомплексное число, которое определяет вращение объекта в пространстве.

$w+xi+yj+zk$


Мнимая часть(x,y,z) представляет вектор, который определяет направление вращения
Вещественная часть(w) определяет угол, на который будет совершено вращение.

Его основное отличие от всем привычных углов Эйлера в том, что нам достаточно иметь один вектор, который будет определять направление вращения, чем три линейно независимых вектора, которые вращают объект в 3 подпространствах.

Рекомендую две статьи, в которых подробно рассказывается о кватернионах:

Раз
Два

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

Формула вращения вектора

$\vec{v}' = q * \vec{v} * \overline{q}$


$\vec{v}'$ искомый вектор
$\vec{v}$ исходный вектор
$q$ кватернион
$\overline{q}$ обратный кватернион

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

$q = w+xi+yj+zk$
$\overline{q} = w-xi-yj-zk$

Посчитаем $\vec{v} * \overline{q}$

$ M = \vec{v}*\overline{q} = (0 + v_xi + v_yj + v_zk)(q_w - q_xi - q_yj - q_zk) = $
$=\color{red}{v_xq_wi} + \color{purple}{v_xq_x} - \color{blue}{v_xq_yk} + \color{green}{v_xq_zj} +$
$+\color{green}{v_yq_wj} + \color{blue}{v_yq_xk} + \color{purple}{v_yq_y} - \color{red}{v_yq_zi} +$
$+\color{blue}{v_zq_wk} - \color{green}{v_zq_xj} + \color{red}{v_zq_yi} + \color{purple}{v_zq_z}$

Теперь выпишем отдельные компоненты и из этого произведения соберем новый кватернион
$M = u_w+u_xi+u_yj+u_zk$
$u_w = \color{purple}{v_xq_x + v_yq_y + v_zq_z}$
$u_xi = \color{red}{(v_xq_w - v_yq_z + v_zq_y)i}$
$u_yj = \color{green}{(v_xq_z + v_yq_w - v_zq_x)j}$
$u_zk = \color{blue}{(-v_xq_y + v_yq_x + v_zq_w)k}$

Посчитаем оставшуюся часть, т.е. $ q*M $ и получим искомый вектор.

Примечание. Чтобы не загромождать вычисления, приведем только мнимую(векторную) часть этого произведения. Ведь именно она характеризует искомый вектор.

$\vec{v}' = q*M = (q_w + q_xi + q_yj + q_zk)(u_w + u_xi + u_yj + u_zk) =$
$= \color{red}{q_wu_xi} + \color{green}{q_wu_yj} + \color{blue}{q_wu_zk} + $
$ +\color{red}{q_xu_wi} + \color{blue}{q_xu_yk} - \color{green}{q_xu_zj} +$
$+\color{green}{q_yu_wj} - \color{blue}{q_yu_xk} + \color{red}{q_yu_zi} +$
$+\color{blue}{q_zu_wk} +\color{green}{q_zu_xj} -\color{red}{q_zu_yi}$

Соберем компоненты вектора

$v_x' = \color{red}{q_wu_x + q_xu_w + q_yu_z - q_zu_y}$
$v_y' = \color{green}{q_wu_y - q_xu_z + q_yu_w + q_zu_x}$
$v_z' = \color{blue}{q_wu_z + q_xu_y - q_yu_x + q_zu_w}$

$v' = (v_x', v_y', v_z')$
Таким образом необходимый вектор получен

Напишем код:

private static Vector3 QuanRotation(Vector3 v,Quaternion q){        float u0 = v.x * q.x + v.y * q.y + v.z * q.z;        float u1 = v.x * q.w - v.y * q.z + v.z * q.y;        float u2 = v.x * q.z + v.y * q.w - v.z * q.x;        float u3 = -v.x * q.y + v.y * q.x + v.z * q.w;        Quaternion M = new Quaternion(u1,u2,u3,u0);                Vector3 resultVector;        resultVector.x = q.w * M.x + q.x * M.w + q.y * M.z - q.z * M.y;          resultVector.y = q.w * M.y - q.x * M.z + q.y * M.w + q.z * M.x;        resultVector.z = q.w * M.z + q.x * M.y - q.y * M.x + q.z * M.w;                return resultVector;}

Акт 2. Нахождение вершин куба


Зная как вращать вектор кватернионом, не составит труда найти все вершины куба.

Перейдем к функцию нахождении вершин куба. Определим базовые переменные.

private static Vector3[] GetPoint(Box box){        //Тут будут храниться координаты вершин        Vector3[] point = new Vector3[8];        //получаем координаты        //....        return point;}

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

Из центра покоординатно вычитаем половину размерности куба.Потом к опорной точке прибавляем по одной размерности куба.

//...        //первые четыре вершины        point[0] = box.Center - box.Size/2;        point[1] = point[0] + new Vector3(box.Size.x , 0, 0);        point[2] = point[0] + new Vector3(0, box.Size.y, 0);        point[3] = point[0] + new Vector3(0, 0, box.Size.z);//таким же образом находим оставшееся точки        point[4] = box.Center + box.Size / 2;        point[5] = point[4] - new Vector3(box.Size.x, 0, 0);        point[6] = point[4] - new Vector3(0, box.Size.y, 0);        point[7] = point[4] - new Vector3(0, 0, box.Size.z);//...


Можем видеть, как сформированы точки

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

//...        for (int i = 0; i < 8; i++)        {            point[i] -= box.Center;//перенос центра в начало координат            point[i] = QuanRotation(point[i], box.Quaternion);//поворот            point[i] += box.Center;//обратный перенос        }//...

полный код получения вершин
private static Vector3[] GetPoint(Box box){        Vector3[] point = new Vector3[8];                //получаем координаты вершин        point[0] = box.Center - box.Size/2;        point[1] = point[0] + new Vector3(box.Size.x , 0, 0);        point[2] = point[0] + new Vector3(0, box.Size.y, 0);        point[3] = point[0] + new Vector3(0, 0, box.Size.z);//таким же образом находим оставшееся точки        point[4] = box.Center + box.Size / 2;        point[5] = point[4] - new Vector3(box.Size.x, 0, 0);        point[6] = point[4] - new Vector3(0, box.Size.y, 0);        point[7] = point[4] - new Vector3(0, 0, box.Size.z);        //поворачиваем вершины кватернионом        for (int i = 0; i < 8; i++)        {            point[i] -= box.Center;//перенос центра в начало координат            point[i] = QuanRotation(point[i], box.Quaternion);//поворот            point[i] += box.Center;//обратный перенос        }                return point;}


Перейдем к проекциям.

Акт 3. Поиск разделяющих осей


Следующим шагом необходимо найти множество осей, претендующих на разделяющую.
Вспомним, что ее можно найти в следующих множествах:

  • Нормали плоскостей каждого куба(красные)
  • Векторное произведение ребер кубов $\{[\vec{x},\vec{y}[ : xX, yY\}$, где X ребра первого куба (зеленые), а Y второго (синие).



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



Необходимо найти нормали плоскостей, порожденные векторами:

  • $\vec{a}$ и $\vec{b}$
  • $\vec{b}$ и $\vec{c}$
  • $\vec{a}$ и $\vec{c}$

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

такой код позволяет получить эти вектора и найти нормали к плоскостям для двух кубов(понятный вариант)
private static List<Vector3> GetAxis(Vector3[] a, Vector3[] b){        //ребра        Vector3 A;        Vector3 B;        //потенциальные разделяющие оси        List<Vector3> Axis = new List<Vector3>();        //нормали плоскостей первого куба        A = a[1] - a[0];        B = a[2] - a[0];        Axis.Add(Vector3.Cross(A,B).normalized);                A = a[2] - a[0];        B = a[3] - a[0];        Axis.Add(Vector3.Cross(A,B).normalized);                A = a[1] - a[0];        B = a[3] - a[0];        Axis.Add(Vector3.Cross(A,B).normalized);                //нормали второго куба        A = b[1] - b[0];        B = b[2] - b[0];        Axis.Add(Vector3.Cross(A,B).normalized);                A = b[1] - b[0];        B = b[3] - b[0];        Axis.Add(Vector3.Cross(A,B).normalized);                A = b[2] - b[0];        B = b[3] - b[0];        Axis.Add(Vector3.Cross(A,B).normalized);        //...}


Но можно сделать проще:
private static List<Vector3> GetAxis(Vector3[] a, Vector3[] b){        //ребра        Vector3 A;        Vector3 B;//потенциальные разделяющие оси        List<Vector3> Axis = new List<Vector3>();//нормали плоскостей первого куба        for (int i = 1; i < 4; i++)        {            A = a[i] - a[0];            B = a[(i+1)%3+1] - a[0];            Axis.Add(Vector3.Cross(A,B).normalized);        }//нормали второго куба        for (int i = 1; i < 4; i++)        {            A = b[i] - b[0];            B = b[(i+1)%3+1] - b[0];            Axis.Add(Vector3.Cross(A,B).normalized);        }        //...}

Еще мы должны найти все векторные произведения ребер кубов. Это можно организовать простым перебором:

private static List<Vector3> GetAxis(Vector3[] a, Vector3[] b){        //...        //получение нормалей        //...        //Теперь добавляем все векторные произведения        for (int i = 1; i < 4; i++)        {            A = a[i] - a[0];            for (int j = 1; j < 4; j++)            {                B = b[j] - b[0];                if (Vector3.Cross(A,B).magnitude != 0)                {                    Axis.Add(Vector3.Cross(A,B).normalized);                }            }        }        return Axis;}

Полный код
private static List<Vector3> GetAxis(Vector3[] a, Vector3[] b){//ребра        Vector3 A;        Vector3 B;//потенциальные разделяющие оси        List<Vector3> Axis = new List<Vector3>();//нормали плоскостей первого куба        for (int i = 1; i < 4; i++)        {            A = a[i] - a[0];            B = a[(i+1)%3+1] - a[0];            Axis.Add(Vector3.Cross(A,B).normalized);        }//нормали второго куба        for (int i = 1; i < 4; i++)        {            A = b[i] - b[0];            B = b[(i+1)%3+1] - b[0];            Axis.Add(Vector3.Cross(A,B).normalized);        }        //Теперь добавляем все векторные произведения        for (int i = 1; i < 4; i++)        {            A = a[i] - a[0];            for (int j = 1; j < 4; j++)            {                B = b[j] - b[0];                if (Vector3.Cross(A,B).magnitude != 0)                {                    Axis.Add(Vector3.Cross(A,B).normalized);                }            }        }        return Axis;}


Акт 4. Проекции на оси


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

Но для начала напомним формулу скалярной проекции вектора v на единичный вектор a:

$proj_\left\langle \vec{a} \right\rangle \vec{v} = \frac{(\vec{v},\vec{a})}{| \vec{a} |}$



private static float ProjVector3(Vector3 v, Vector3 a){        a = a.normalized;        return Vector3.Dot(v, a) / a.magnitude;        }

Теперь опишем функцию, которая будет определять пересечение проекций на оси-кандидаты.

На вход подаем вершины двух кубов, и список потенциальных разделяющих осей:

private static Vector3 IntersectionOfProj(Vector3[] a, Vector3[] b, List<Vector3> Axis){        for (int j = 0; j < Axis.Count; j++)        {           //в этом цикле проверяем каждую ось           //будем определять пересечение проекций на разделяющие оси из списка кандидатов        }        //Если мы в цикле не нашли разделяющие оси, то кубы пересекаются, и нам нужно         //определить глубину и нормаль пересечения.}

Проекция на ось задается двумя точками, которые имеют максимальные и минимальные значения на самой оси:



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

private static void ProjAxis(out float min, out float max, Vector3[] points, Vector3 Axis){        max = ProjVector3(points[0], Axis);        min = ProjVector3(points[0], Axis);        for (int i = 1; i < points.Length; i++)        {            float tmp = ProjVector3(points[i], Axis);            if (tmp > max)            {                max = tmp;            }            if (tmp < min)            {                min= tmp;            }        }}

Итого, применив данную функцию( ProjAxis ), получим проекционные точки каждого куба.

private static Vector3 IntersectionOfProj(Vector3[] a, Vector3[] b, List<Vector3> Axis){        for (int j = 0; j < Axis.Count; j++)        {            //проекции куба a            float max_a;            float min_a;            ProjAxis(out min_a,out max_a,a,Axis[j]);            //проекции куба b            float max_b;            float min_b;            ProjAxis(out min_b,out max_b,b,Axis[j]);                        //...        }        //...}

Далее, на основе проекционных вершин определяем пересечение проекций:



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

            float[] points = {min_a, max_a, min_b, max_b};            Array.Sort(points);

Заметим следующее свойство:

1) Если отрезки не пересекаются, то сумма отрезков будет меньше, чем отрезок сформированными крайними точками:



2) Если отрезки пересекаются, то сумма отрезков будет больше, чем отрезок сформированными крайними точками:



Вот таким простым условием мы проверили пересечение и непересечение отрезков.

Если пересечения нет, то глубина пересечения будет равна нулю:

            //...            //Сумма отрезков            float sum = (max_b - min_b) + (max_a - min_a);            //Длина крайних точек            float len = Math.Abs(p[3] - p[0]);                        if (sum <= len)            {                //разделяющая ось существует                // объекты непересекаются                return Vector3.zero;            }            //Предполагаем, что кубы пересекаются и рассматриваем текущую ось далее            //....

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

В случае пересечения кубов, все немного интереснее: проекции кубов на все вектора будет пересекаться, и мы должны определить вектор с минимальным пересечением.

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

private static Vector3 IntersectionOfProj(Vector3[] a, Vector3[] b, List<Vector3> Axis){        Vector3 norm = new Vector3(10000,10000,10000);        for (int j = 0; j < Axis.Count; j++)        {                //...        }        //в случае, когда нашелся вектор с минимальным пересечением, возвращаем его        return norm;{

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

Так же я добавил определение ориентации нормали по отношению первого куба.

//...if (sum <= len){   //разделяющая ось существует   // объекты не пересекаются   return new Vector3(0,0,0);}//Предполагаем, что кубы пересекаются и рассматриваем текущий вектор далее//пересечение проекций - это расстояние между 2 и 1 элементом в нашем массиве//(см. рисунок на котором изображен случай пересечения отрезков)float dl = Math.Abs(points[2] - points[1]);if (dl < norm.magnitude){   norm = Axis[j] * dl;   //ориентация нормали   if(points[0] != min_a)   norm = -norm;}//...

Весь код
private static Vector3 IntersectionOfProj(Vector3[] a, Vector3[] b, List<Vector3> Axis){        Vector3 norm = new Vector3(10000,10000,10000);        for (int j = 0; j < Axis.Count; j++)        {            //проекции куба a            float max_a;            float min_a;            ProjAxis(out min_a,out max_a,a,Axis[j]);            //проекции куба b            float max_b;            float min_b;            ProjAxis(out min_b,out max_b,b,Axis[j]);            float[] points = {min_a, max_a, min_b, max_b};            Array.Sort(points);            float sum = (max_b - min_b) + (max_a - min_a);            float len = Math.Abs(points[3] - points[0]);                        if (sum <= len)            {                //разделяющая ось существует                // объекты не пересекаются                return new Vector3(0,0,0);            }            float dl = Math.Abs(points[2] - points[1]);            if (dl < norm.magnitude)            {                norm = Axis[j] * dl;                //ориентация нормы                if(points[0] != min_a)                    norm = -norm;            }        }        return norm;}


Заключение


Проект с реализацией и примером загружен на GitHub, и ознакомиться можно с ним здесь.

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

Перевод Бесполезное представление, преобразовавшее математику

23.06.2020 14:06:23 | Автор: admin

Изначально от теории представлений отказались. Сегодня она играет важнейшую роль в большинстве областей математики.




Когда в конце XIX века впервые появилась теория представлений, многие математики сомневались в ценности этого подхода. В 1897 году английский математик Уильям Бёрнсайд писал, что сомневается в том, что эта необычная перспектива даст какие-то полезные результаты.

Бёрнсайд, по сути, говорил о том, что теория представлений бесполезна, сказал Джорди Уильямсон из Сиднейского университета в лекции 2015 года.

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

Не сразу становится понятно, что её стоит изучать, сказала Эмили Нортон из Кайзерслаутернского технического университета в Германии.

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

Математикам, по сути, про матрицы известно уже всё. Это одна из немногих математических тем, в которой мы хорошо и досконально разобрались, сказал Джаред Вайнштайн из Бостонского университета.

Чтобы понять, как матрицы могут представлять группы, стоит рассматривать каждый объект по очереди.

Возьмём сначала группы. Чтобы упростить пример, возьмём шесть симметрий равностороннего треугольника:
  • Две вращательных (на 120 и 240).
  • Три зеркальных (относительно линий, проведённых из каждой вершины через середину противоположной стороны).
  • Тождественная симметрия когда с треугольником ничего не происходит.




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

Делаю что-то одно, потом делаю что-то другое. Важно то, что в итоге получается всё равно симметрия треугольника, сказал Нортон.



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

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

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

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

Иногда группы становятся чересчур сложными, сказал Вайнштейн.

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

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

Преобразование происходит при применении к вектору другой матрицы. К примеру, когда мы применяем к вектору матрицу

[2 0]
[0 2]

То он вытягивается в длину в два раза. Это пример линейного преобразования.



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

[1 0]
[0 1]

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

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

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

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

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

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



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

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

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

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

Некоторые из самых продуктивных представлений не используют ни вещественные, ни комплексные числа. Они используют матрицы, элементы которых взяты из миниатюрных, или модульных числовых систем. Это мир арифметики циферблата, в котором 7+6 оборачивается вокруг 12-часового циферблата и даёт 1. У двух групп с одинаковыми таблицами характеров в вещественном представлении могут быть разные таблицы характеров в модульном представлении, что позволяет различать их.

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

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

Теория представлений и в частности, модульные представления сыграли важную роль в знаковом доказательстве Великой теоремы Ферма, полученном Эндрю Уайлсом в 1994 году. В задаче вставал вопрос о существовании решений уравнений вида an + bn = cn в целых числах. Уайлс доказал, что для n>2 таких решений не существует. Если говорить примерно, то он доказывал, что если бы такие решения существовали, привели бы к появлению группы эллиптической кривой с весьма необычными свойствами. Эти свойства были настолько необычными, что казалось возможным доказать невозможность существования подобного объекта. Однако напрямую доказать, что он не существует, оказалось слишком тяжело. Вместо этого Уайлс обратился к семейству модульных представлений, которое было бы связано с этой группой, если бы она существовала. Он доказал, что такого семейства модульных представлений быть не может, что означает, что не может существовать и группы (или эллиптической кривой), что означает, что и решений тоже не существует.

Что, в свою очередь, означает, что примерно через 100 лет после того, как Уильям Бёрнсайд отбросил теорию представлений как бесполезную, она оказалась критически важным компонентом, возможно, наиболее знаменитого доказательства XX века.

Я не мог придумать доказательства Великой теоремы Ферма, в котором бы нигде не использовалась теория представлений , сказал Вайнштейн.
Подробнее..

Перевод Математические расчёты, стоящие за феноменом роллинг-шаттера

03.07.2020 18:07:41 | Автор: admin
image


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

Многие современные цифровые камеры используют КМОП-матрицу в качестве своего чувствительного устройства, также известную как активный датчик пикселей, который работает путем накопления электронного заряда при падении на него света. По истечении определенного времени времени экспозиции заряд построчно перемещается обратно в камеру для дальнейшей обработки. После этого камера сканирует изображение, построчно сохраняя ряды пикселей. Изображение будет искажено, если во время съемки присутствовало хоть какое-то движение. Для иллюстрации представьте съемку вращающегося пропеллера. В анимациях ниже красная линия соответствует текущему положению считывания, и пропеллер продолжает вращаться по мере считывания. Часть под красной линией это полученное изображение.

Первый пропеллер совершает 1/10 часть вращения во время экспозиции:

image


Подписывайтесь на каналы:
@Ontol самые интересные тексты/видео всех времен и народов, влияющие на картину мира
@META LEARNING где я делюсь своими самыми полезными находками про образование и роль ИТ/игр в образовании (а так же мыслями на эту тему Антона Макаренко, Сеймура Пейперта, Пола Грэма, Джозефа Ликлайдера, Алана Кея)


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

image


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

image


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

image


Пропеллер с большими лопастями:

image


Колесо автомобиля:

image


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

image


Пусть изображение будет I(r,), реальный (вращающийся) объект будет f(r,), где (r,) это 2D полярные координаты. Мы выбрали полярные координаты для этой задачи из-за вращательного движения объектов.

Объект вращается с угловой частотой , а шаттер перемещается по изображению со скоростью v по вертикали. В положении (r,) на картинке, дистанция, которую прошел шаттер с начала экспозиции, равна y=rsin, где прошедшее с этого момента время равно (rsin)/v. За это время объект повернулся на (/v)rsin) радианов. Итак, мы получаем

I(r,)=f(r,+(/v)rsin),

что и является требуемой трансформацией. Коэффициент /v пропорционален числу вращений за экспозицию и параметризует трансформацию.

Чтобы получить более глубокое представление об очевидных формах пропеллеров, мы можем рассмотреть объект, состоящий из P пропеллеров, где f является ненулевым только для

=2/P,4/P2=2p/P для 1<p<P.

Изображение I является ненулевым для +(/v)rsin=2p/P или

image

В Декартовой системе координат оно становится

image

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

image


Раз мы узнали немного больше о процессе, можем ли мы исправить испорченные фотографии? Используя одно из изображений выше, я могу провести через него линию, повернуть назад и вставить эти пиксели в новое изображение. В анимации ниже я сканирую изображение слева, помеченное красной линией, а затем вращаю пиксели вдоль этой линии, получая новое изображение. Так мы можем воссоздать изображение реального объекта, даже если вдруг назойливый роллинг-шаттер испортил вам фотографию.

image


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

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

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

image


Я должен был понять, где находится центр пропеллера, поэтому нарисовал круг. Судя по всему, центр должен быть где-то рядом. К сожалению, одна лопасть отсутствует, но для изображения информации хватает.

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

image


image


К сожалению, картинка не идеальна, но по крайней мере очень приближена к реальности.

Об авторе: Джейсон Коул аспирант из Лондона, который горит математикой, физикой и визуализацией данных. Здесь его вебсайт. А статья была опубликована здесь.

Обсуждение на Hacker News

доп. видео









Подписывайтесь на каналы:
@Ontol самые интересные тексты/видео всех времен и народов, влияющие на картину мира
@META ОБУЧЕНИЕ, где я делюсь своими самыми полезными находками про образование и роль ИТ/игр в образовании (а так же мыслями на эту тему Антона Макаренко, Сеймура Пейперта, Пола Грэма, Джозефа Ликлайдера, Алана Кея)


image

Узнайте подробности, как получить востребованную профессию с нуля или Level Up по навыкам и зарплате, пройдя платные онлайн-курсы SkillFactory:



Читать еще


Подробнее..

Перевод Бенуа Мандельброт на TED Фракталы и искусство изломов

04.07.2020 18:11:54 | Автор: admin
image

Большое спасибо. Прошу прощения за то, что я сижу. Я очень старый человек.

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

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

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

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

image

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

В связи с изучением этой проблемы я обнаружил нечто совершенно удивительное: изломанность можно измерить числом, скажем, 2,3 или 1,2, а иногда и намного большим. Однажды, один мой друг принёс фотографию и, полушутя, спросил: Каков излом у этой кривой? Я сказал: Чуть меньше, чем полтора Как оказалось, он был равен 1,48. Это не заняло у меня много времени, поскольку я так долго изучал эти вещи. Числа, о которых идёт речь, означают степень изломанности поверхности.

image

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

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

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

image

Лёгкое очень странный объект. Нам всем прекрасно известно, что оно имеет какой-то вес. Известно также, что объём лёгкого весьма мал. А как насчёт площади лёгкого? Анатомы долго вели по этому поводу дискуссии. Считается, что у нормального мужчины площадь лёгкого равна площади одного баскетбольного мяча. Другие утверждают, что нет, пяти таких мячей. Расхождения колоссальны. Почему? Потому, что площадь лёгкого весьма нечётко определённое понятие. Бронхи разветвляются и разветвляются всё глубже. А перестают они разветвляются не ввиду какого-то принципа, а из-за чисто физических условий, из-за слизи внутри лёгкого. Так образуется намного большее лёгкое: бронхи разветвляются всё глубже, пока просвет между ними примерно одинаковым и для кита, и для человека, и для небольшого грызуна.

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

image

Это облако полностью искусственное, на 100%. Ну ладно, на 99,9%. Единственный естественный элемент тут число, изломанность облака это число взято у природы. Такая сложная вещь, как облако, такая неустойчивая, изменчивая, подчиняется простому правилу. Это простое правило не есть объяснение облачности. Но море облаков должно учитывать это правило. Не знаю, насколько совершенны эти старые фотографии. Я интенсивно занимался этим, но потом моё внимание было направлено на другие явления.

А вот ещё одна довольная любопытная вещь. Одно из революционных событий в истории математики, недостаточно оцененное многими, произошло примерно 130 лет назад, 145 лет назад. Математики начали создавать несуществующие формы. Среди математиков стало цениться, причём в совершенно невообразимой степени, умение человека создать то, чего в природе никогда не было. В частности, они смогли изобрести кривую, которая заполняет всю плоскость до последней точки. Кривая это кривая, плоскость это плоскость, и эти два понятия не стыкуются. Оказалось, что всё-таки стыкуются.

image

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

image

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

image

В 1919-м году человек по имени Хаусдорф определил число, которое можно было считать математической шуткой. Но я обнаружил, что это число хороший инструмент измерения изломанности. Когда я впервые рассказал об этом моим коллегам, они сказали: Не занимайся глупостями. Это же нечто На самом деле я не занимался глупостями.

image

Великий художник Хокусай прекрасно знал это. В нижней части картины водоросли. Хокусай не владел нужной математикой: её тогда просто не существовало. Кроме того, будучи японцем, он [в те времена] не имел контактов с Западом. Но художественное искусство с давних времен содержит фрактальные элементы. Об этом я могу говорить долго.

image

Эйфелева башня имеет фрактальные элементы. Я прочитал книгу Эйфеля о его башне объём его понимания просто потрясающий.

image

Вот беспорядок внутри беспорядка. Броуновская петля. Однажды я решил, что прошла немалая часть моей профессиональной жизни, и столько разного занимало меня, что я решил, что пора бы испытать себя. Могу ли я исследовать объект, который все уже давно исследуют, и найти в нём что-либо радикально новое? Я стал изучать всё, что входит в категорию Броуновского движения. Пытался подойти с разных сторон, пробовал различные методы, и вернулся к тому, с чего начал. Тогда я предложил своему ассистенту: Я тут ничего не вижу. Сможешь закрасить? Он так и сделал, то есть заполнил все внутренности. У меня получилось

image

Но я закричал: Стоп! Стоп! Стоп! Понял: это остров. Удивительно. Броуновское движение имеет изломанность равную двум. Измеряю, получается 1,33. Измеряю заново и заново. Долгие замеры, большие Броуновские движения. Опять: 1,33. Тут же возникает математическая проблема: как это доказать? Моим друзьям для этого понадобилось 20 лет. У троих доказательства были неполные. Они соединили усилия, и вместе им удалось получить доказательство. В результате они удостоились известной [Филдсовской] медали для математиков. В целом, математики получили три медали [Филдса] за доказательство фактов, которые я видел, но не мог доказать.

Сейчас меня всюду спрашивают: Как это всё началось? Как ваши занятия привели вас к таким необычным вещам?

image

Что позволило мне быть одновременно инженером-механиком, географом, математиком и т.п.? Как это ни странно, но я начинал с изучения цен на фондовом рынке.

image

У меня возникла теория, и я написал об этом книги.

image

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

image

В течение 50 лет к моей идее относились с насмешкой, потому что можно было делать проще. Но сейчас, скажу я вам, ко мне стали прислушиваться. (Смех) Эти две кривые представляют средние значения. Синяя индекс Standard and Poors [S&P 500], а красная индекс Standard and Poors, из которого вычтены 5 крупнейших скачков цен. Скачок, безусловно, портит анализ, и во многих исследованиях он считается [не поддающимся анализу] особым случаем. Невероятное совпадение, вмешательство Господа. Ну, мелочь, её можно просто отложить в сторону. Вмешательства Господа на этом графике, а их ровно пять, как оказалось, так же важны, как и всё остальное. Иными словами, вмешательства Господа нельзя откладывать в сторону.

image

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

image

Теперь я перейду к последней теме множество, названное моим именем. В некотором смысле, это история моей жизни. Моё отрочество прошло во Франции, оккупированной в те годы Германией. Поскольку я думал о том, что в любой момент меня может не стать у меня были большие мечты. После войны я вновь встретился с дядей. Мой дядя был выдающимся математиком и он сказал: Вот тебе задача. 25 лет назад я не смог решить её, и никто её не может решить. Это построение одного математика по имени Гастон Джулиа и другого по имени Пьер Фату. Если сможешь найти тут нечто новое, всё что угодно, считай, что твоя карьера обеспечена. Очень просто. Я стал изучать эту проблему, и, как и тысячи тех, кто до меня это пытался с делать, ничего не добился.

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

image

Эта имеет исключительную сложность. В ней скрыто уравнение: z трансформируется в z ^ 2 + c. Так просто и скучно, так неинтересно. Теперь прокрутим это один раз, два раза Два раза достаточно. О чудо! Появляется вот что. Я не собираюсь объяснять здесь эти вещи, но получается вот что и вот что.

image

image

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

image

И всё из этой короткой формулы, в которой всего сколько там? пять значков. И вот что в результате.

image

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

В 1990-м году я был в Великобритании, в Кембридже, мне там от университета вручали приз. Спустя три дня один лётчик, пролетая над полем, увидел вот это.

image

Откуда бы такая вещь? Ясное дело от пришельцев.

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

image

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

Translated by Namik Kasumov
Reviewed by Ekaterina Tsvetkova




image

Узнайте подробности, как получить востребованную профессию с нуля или Level Up по навыкам и зарплате, пройдя платные онлайн-курсы SkillFactory:



Читать еще


Подробнее..

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

06.07.2020 10:05:56 | Автор: admin

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


image
Можно ли найти в замкнутой петле все виды прямоугольников?

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

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

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

Эту задачу крайне просто сформулировать и понять, однако она очень сложная для решения, сказала Элизабет Денн из Университета Вашингтона и Ли.

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

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

Грин сказал, что из всех сложных проектов, над которыми он работал, этот, по-моему, был наименее многообещающим.

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

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

Это довольно странно, сказал Ричард Шварц из Брауновского университета. Эта идея идеально подошла к этой задаче.

Переосмысливая прямоугольники


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

Это старая и неприятная задача, которую никак не могут взломать, сказал Грин.

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

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

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

Некоторые непрерывные [не гладкие] кривые просто отвратительны, сказала Денн.

Но всё-таки, решённая Грином и Лоббом задача от носится к гладким, и, следовательно, непрерывным кривым. И вместо того, чтобы разбираться в том, всегда ли на таких кривых есть четыре точки, образующие квадрат для гладких непрерывных кривых этот вопрос был решён в 1929 году они изучали другое: всегда ли на таких кривых есть четыре точки, формирующие прямоугольник любых заданных пропорций, т.е. с любым отношением длин сторон. У квадрата это отношение равно 1:2, у телевизоров высокого разрешения 16:9.



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

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

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



Представьте себе прямоугольник с вершинами ABCD. В нём расстояние между точками AC (по диагонали) равно расстоянию между точками BD (по другой диагонали). Также эти диагонали пересекаются ровно посередине.

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



Чтобы понять, что это значит, начнём с чего-то попроще. Возьмём числовую прямую. Выберем на ней две точки допустим, числа 7 и 8 и построим их в виде одной точки на числовой плоскости (7, 8). Также мы можем строить точки, представляющие собой пару одинаковых чисел (7, 7). Теперь рассмотрим все возможные пары чисел, которые можно найти на числовой прямой (а их много!). Если мы построим все пары таких чисел, то мы заполним всю числовую плоскость. Другой способ выразить это сказать, что числовая плоскость параметризует, то есть, собирает упорядоченным образом все пары чисел на числовой прямой.

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



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

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

Четырёхмерные ответы


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

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

Приведём простой пример вложения.

Начнём с одномерной прямой. Каждая точка прямой определяется единственным числом. Теперь вложим эту прямую в двумерное пространство то есть, нарисуем её на плоскости.

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

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

По сути, у вас есть лента Мёбиуса, и каждой её точке нужно присвоить четыре координаты. Это будет что-то вроде адреса точки в четырёхмерном пространстве, сказал Лобб.

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

Для этого он начал с конкретной точки на ленте Мёбиуса и взял две точки на изначальной замкнутой кривой, которые она обозначала. Затем он нашёл середину отрезка, соединяющего эти точки, и определил её координаты х и у. Получились первые два значения четырёхмерного адреса (штат и город).

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



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

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

Почему?

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

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


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

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

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

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

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

Хьюгельмейер использовал стратегию работы с пересечением в четырёхмерном окружении и получил больше, чем удавалось кому-либо до него. Ленту Мёбиуса можно повернуть на любой угол от 0 до 360, и он доказал, что треть из всех этих поворотов даёт пересечение оригинала и повёрнутой копии. Это эквивалентно заявлению о том, что на замкнутой кривой можно найти прямоугольники с третью из всех возможных пропорций сторон.

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

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

В конце концов, должен же быть способ достать и оставшиеся две трети, сказал Грин. Но как?

Симплектический подход


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

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

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

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

Но, допустим, что у двумерной поверхности, в которую вы вкладываете петлю, есть своя структура. Представим, например, карту, стрелочками (или векторами) обозначающую нам, в каком направлении и с какой скоростью дует ветер на поверхности Земли. И вот у вас уже есть двумерная поверхность с дополнительной информацией, или структурой, в каждой точке.

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

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



Другие геометрические пространства могут налагать другие ограничения. Важным для работы Грина и Лобба оказалось т.н. симплектическим пространством.

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

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

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

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

Если ленту Мёбиуса можно заставить следовать симплектическим правилам, можно будет использовать некоторые из симплектических теорем, сказал Лобб.

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

Когда у нас появилась эта идея, стало ясно, что что-то произойдёт, сказал Лобб.

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

Связь с бутылкой Клейна


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

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

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



В мае Грин и Лобб вспомнили один факт, касающийся бутылки Клейна её невозможно вложить в четырёхмерное симплектическое пространство так, чтобы она себя не пересекала [из работы ещё одного российского математика, Всеволода Викторовича Шевчишина, касающуюся лагранжева вложения бутылки Клейна в четырёхмерное пространство / прим. перев.]. Иначе говоря, не существует бутылки Клейна без самопересечения, удовлетворяющей всем требованиям симплектического пространства. Этот факт стал ключевым для доказательства. Это была волшебная палочка, сказал Грин.

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

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

Окончание доказательства обрушивается на читателя как лавина.

Там сначала идёт настройка, настройка, настройка, а потом хрясь и доказательство готово, сказала Денн.

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

У этих задач, появлявшихся в 1910-е и 1920-е, не было подходящей платформы, на основе которой можно было бы о них размышлять, сказал Грин. И теперь мы начинаем понимать, что они на самом деле это скрытые воплощения явления симплектичности.
Подробнее..

Рубрика Читаем статьи за вас. Май 2020. Часть 2

25.06.2020 14:15:14 | Автор: admin


Привет, Хабр! Продолжаем публиковать рецензии на научные статьи от членов сообщества Open Data Science из канала #article_essense. Хотите получать их раньше всех вступайте в сообщество!


Статьи на сегодня:


  1. ECA-Net: Efficient Channel Attention for Deep Convolutional Neural Networks (China, 2020)
  2. TAPAS: Weakly Supervised Table Parsing via Pre-training (Google, 2020)
  3. DeepFaceLab: A simple, flexible and extensible faceswapping framework (2020)
  4. End-to-End Object Detection with Transformers (Facebook AI, 2020)
  5. Language Models are Few-Shot Learners (OpenAI, 2020)
  6. TabNet: Attentive Interpretable Tabular Learning (Google Cloud AI, 2020)


1. ECA-Net: Efficient Channel Attention for Deep Convolutional Neural Networks


Авторы статьи: Qilong Wang, Banggu Wu, Pengfei Zhu, Peihua Li, Wangmeng Zuo, Qinghua Hu (China, 2020)
Оригинал статьи :: GitHub project
Автор обзора: Эмиль Закиров (в слэке bonlime)


Очередной вариант self-attention для computer vision. Авторы внимательно посмотрели на известный squeeze-and-excitation (SE), который сейчас используют во многих SOTA сеточках и его аналоги, попробов понять почему же именно оно работает. Потом предложили свой супер легкий attention block, который практически не увеличивает количество параметров, быстрее чем SE и при этом лучше работает.




Все последние attention блоки обладают одним из двух свойств, они либо используют уменьшение количества каналов, либо включают какое-то взаимодействие между каналами. SE, к примеру, делает и то и то.




Хочется понять насколько эти две составляющие влияют на итоговое качество. Для этого авторы предлагают несколько слегка модифицированных вариантов SE block:


  • SE-Var1 просто делаем GlobalAvgPool + sigmoid. Даже такой просто attention даёт прирост к качеству.
  • SE-Var2 GlobalAvgPool + каждый канал умножается на какой-то параметр + sigmoid. В отличие от дефолтного SE нет DR и нет cross-channel interaction, а качество выше! Вывод авторов избегание DR важнее чем какие-то cross-channel interactions.
  • SE-Var3 как SE, но без уменьшения количества каналов в середине. Работает лучше, но добавляет очень много параметров и сильно замедляет обучение.
  • SE-GC попытки делать attention через групповые свертки. Работает лучше чем SE, но group convs медленно обучаются.
  • ECA вариант авторов. GlobalAvgPool + Conv1d (kernel size=3). Операция Conv1d дешевая, при этом удалось избежать dimensionality reduction и добавить какое-то cross-channel interaction.



Attention block авторов в деталях.
Размер ядра после GlobalAvgPool можно пытаться определять с помощью каких-то эвристик. У авторов она такая чем больше каналов, тем больше ядро. Для 128 каналов ядро будет 3, а для 1024 7. Но как видно из последних двух строчек на таблице выше это не особо влияет на качество.




Проведено сравнение использования разных размеров ядра для 1d свертки vs adaptive. т.к. разница на уровне погрешности, можно остановиться на самом простом случае ядре размера 3. В коде авторов так и сделано, везде захардкожено 3.


Проведено сравнение для задачи детекции. На фоне практически незаметного увеличения количества параметров дает прирост метрик на 1-2%, что выглядит очень убедительно.


Пара практических заметок.
Хотя Conv1d на порядки быстрее, чем две FC в SE блоке, ускорение на практике получается только ~5% потому что самая дорогая операция это GlobalAvgPool, а не последующие свертки.


Проведено сравнение весов для каналов, выученных SE блоком и ECA блоком для 4х разных классов. Прогоняют все картинки этого класса из валидации и записывают среднее для разных каналов. SE выучивает очень похожие attention для разных классов, в том время как у ECA они "have better discriminative ability".


Заметка от автора обзора
Зачем верить авторам на слово, если можно проверить. У меня на Imagenet за 90 эпох обычный SE даёт Acc@1 78.988 Acc@5 94.440, а ECA даёт Acc@1 79.281 Acc@5 94.664. Там была небольшая разница в конфигах обучения SE учился на 4хV100, а ECA на 3хV100, и у них был разный lr. Т.е. не могу пока точно утверждать что ECA > SE, но как минимум не хуже точно, при том что быстрее и практически не добавляет параметров.


2. TAPAS: Weakly Supervised Table Parsing via Pre-training


Авторы статьи: Jonathan Herzig, Pawe Krzysztof Nowak, Thomas Mller, Francesco Piccinno, Julian Martin Eisenschlos (Google, 2020)
Оригинал статьи :: GitHub project :: Colab
Автор обзора: Александр Бельских (в слэке belskikh)


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




Авторы спарсили большой датасет для претрейна из WikiTable и Infobox, собрав оттуда таблички с различными данными. Модельку завели на основе BERT, добавив туда различных эмбеддингов, специфичных для табличных данных. На вход модель получает последовательность токенов вопроса и табличных данных, а на выходе у неё два классификационных слоя один для выбора ячеек сети (если ответ является просто какой-то ячейкой сети) и один для операции агрегации выбранных ячеек (COUNT, SUM, AVG). Все эмбеддинги токенов комбинируются с наборов специфичных для табличных данных:


  • Position ID индекс токена в табличке (таблица представлена во flatten виде).
  • Segment ID 0 для сегмента с вопросом и 1 для сегмента с табличными данными.
  • Column / Row ID.
  • Rank ID если данные как-то можно упорядочить (дата, число, время) то указывается ранг, как относительный порядок.
  • Previous Answer в некоторых сетапах модель работает в conversational режиме, поэтому добавляют отдельный эмбеддинг, является ли токен аутпутом модели с предыдущей стадии.

Во время инференса выбираются из классификационного слоя ячейки с вероятностью больше 0.5 и над ними проводится предсказанная операция агрегации (NONE, COUNT, SUM, AVG). Претрейн проводится на собранном из WikiTable и Infobox датасете, используется masked language model pre-training objective, как в BERT. Затем модель обучили на датасетах WIKISQL, WIKITQ, SQA, получив выше или на уровне с СОТА-аналогами.


Претрейн проходил на 32 Cloud TPUv3 в течение трёх дней, а файнтюнинг на нужный датасет там же от 10 до 20 часов. Модель примерно такого же размера, как и BERT-large.


Полученная модель позволяет отвечать на вопросы по таблицам, но при этом архитектурно значительно проще существующих аналогов. Более того, она показала хорошие результаты на файнтюнинге под новые схожие данные, что, возможно, станет новым прорывом в работе с табличными данными. Модель на данный момент ограничена тем, что не может процессить слишком большие таблички и не может сформулировать ответ по некоторому сабсету ячеек таблицы. Например, запрос number of actors with an average rating higher than 4 не может быть обработан правильно.




3. DeepFaceLab: A simple, flexible and extensible faceswapping framework


Авторы статьи: Ivan Perov, Daiheng Gao, Nikolay Chervoniy, Kunlin Liu, Sugasa Marangonda, Chris Um, Mr. Dpfks, Carl Shift Facenheim, Luis RP, Jian Jiang, Sheng Zhang, Pingyu Wu, Bo Zhou, Weiming Zhang (2020)
Оригинал статьи :: GitHub project
Автор обзора: Евгений Кашин (в слэке digitman, на habr digitman)


Автор самой популярной репы на гитхабе (14к+ звездочек) по дипфейкам решил закинуть свое творение к академикам и написал статью с кучей "фрилансеров" в авторах. Сам подход достаточно простой и давно известный, но у них настроенные пайплайны, легкая кастомизация, большое комьюнити. Ну и конечно результаты по моему у них на данный момент самые "приятные".


Естественно это подается под соусом "дипфейки это плохо, но лучшая защита это нападение". Что интересно в авторах есть Ctrl Shift Face очень популярные видосы на ютубе с дипфейками, а также Mr. dpfks, который, наверное, делает MrDeepFakes сайт порнхаб с селебами на дипфейках.


Код на TF, но автор написал свой велосипед для TF Leras(Lighter Keras), который вроде проще (куда еще) и быстрее. В любом случае, большинство кто использует сидят на винде и все что им надо создать две папки с картинками двух людей.


Пайплайн из трех частей extraction, training, conversion. Подход ограничен конвертацией "one-to-one" под каждую пару людей нужно все переучивать.


Extraction состоит из:


  • детекции лица и кейпоинтов (S3FD, но можно заменить на RetinaFace);
  • выравнивание лица сглаживают по времени кейпоинты и применяют трансформацию (Umeyama), чтобы привести лицо к нормальному положению;
  • сегментация лица(TernausNet).



Сегментация лица часто не очень точная, поэтому они сделали свою тулзу XSeg которая помогает интерактивно подправить плохие маски и дозакинуть их заново в обучение, такой active learning. Говорят достаточно доразметить 50 фоток руками.


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




Второй LIAE. Энкодер также зашарен, а ботлнека два разных. InterAB генерит эмбединг и для source и для target, а InterB только для target. На вход зашаренному декодеру подается конкат двух эмбедингов. Для source просто конкатится InterAB эмбединг сам с собой, для target InterAB с InterB. Вроде InterAB должен вытаскивать общую для двух доменов инфу, а InterB детали target домена.




Во время "автоэнкодерного" обучения давали разный вес лосам за реконструкцию разных частей лица, например у глаз был самый большой вес. Лоссы: DSSIM + MSE. На гпу обучение пару часов.


Conversion. По сути берется лицо из source и просто прогоняется или через Decoder dst в случае DF или через InterAB и InterB в случае LIAE. Сгенеренное лицо реалайнится по кейпоинтам таргет лица. Результат матчится по цветовой схеме с таргетом одним из 5 алгоритмов на выбор. Блендинг границ лица по сегментационной маске делают через Poisson blending optimization. После этого еще прогоняют результат через суперрез для четкости.




По метрикам конечно сота.




Также есть Ablation Study в котором они тестили немного разные архитектуры, добавление ган лосса и TrueFace. Примеры работы подхода представлены ниже.




4. End-to-End Object Detection with Transformers


Авторы статьи: Nicolas Carion, Francisco Massa, Gabriel Synnaeve, Nicolas Usunier, Alexander Kirillov, Sergey Zagoruyko (Facebook AI, 2020)
Оригинал статьи :: GitHub project
Автор обзора: Андрей Лукьяненко (в слэке artgor, на habr artgor)


Классный новый подход к object detection от facebook! Они предлагают работать с этой с задачей, как с прямым предсказанием сета и использовать трансформер. Базовая модель даёт 42 AP на COCO! Но тренируется 3 дня на 16 V100.


Основная суть DETR заключается в том, то он сразу предсказывает все объекты и тренируется с лоссом, который делает двустороннее соответствие (performs bipartite) между предсказанными боксами и разметкой. Получается, что нам не нужны ни якоря, ни non-maximal supression. Есть один минус: авторы признают, что DETR отлично работает на больших объектах, то хуже на мелких. И для тренировки нужно, цитирую "extra-long training schedule", а также дополнительные лоссы. С другой стороны, подход можно использовать и для других задач, например, сегментации.




DETR Model
Для прямого предсказания сетов нужны две составные части: лосс, который делает уникальный матчинг между предсказанными и размеченными боксами, и архитектура, которая за один проход предсказывает сеты объектов и моделирует их взаимосвязи.


Object detection set prediction loss
Модель предсказывает N объектов за один раз. Обычно число значительно выше, чем количество реальных объектов. Лосс делает двусторонний матчинг и оптимизирует лоссы для боксов.


В формуле y ground truth, y-hat предсказания. Поскольку "y" меньше размером, то делают паддинг со значениями "no object". По факту ищем пермутации объектов с минимальным костом.


$$display$$\DeclareMathOperator*{\argmin}{arg\,min} \newcommand{\lmatch}[1]{{\cal L}_{\rm match}(#1)} \hat{\sigma} = \argmin_{\sigma\in\Sigma_N} \sum_{i}^{N} \lmatch{y_i, \hat{y}_{\sigma(i)}}$$display$$


Lmatch pair-wise matching cost between ground truth and prediction. Считают с помощью Hungarian algorithm. Он учитывает классы и схожесть между боксами.


Теперь считаем Венгерский лосс для всех пар, которые получились на предыдущем шаге. Для "no object" делим лог-вероятность на 10, чтобы компенсировать дисбаланс классов.


$$display$$\newcommand{\hloss}[1]{{\cal L}_{\rm Hungarian}(#1)} \newcommand{\bloss}[1]{{\cal L}_{\rm box}(#1)} \newcommand{\indic}[1]{1_{\{#1\}}} \hloss{y, \hat{y}} = \sum_{i=1}^N \left[-\log \hat{p}_{\hat{\sigma}(i)}(c_{i}) + \indic{c_i\neq 0} \bloss{b_{i}, \hat{b}_{\hat{\sigma}}(i)}\right]\,,$$display$$


Bounding box loss
Просто использовать L1 не вариант, ибо будут разные масштабы значений для мелких и больших боксов. Поэтому добавляют IoU. Лямбды гиперпараметры. И лосс делят на количество объектов в батче.


$\lambda_{\rm iou}{\cal L}_{\rm iou}(b_{i}, \hat{b}_{\sigma(i)}) + \lambda_{\rm L1} || b_{i} - \hat{b}_{\sigma(i)} ||_1$


DETR Architecture: CNN + transformer + FNN.
Backbone: можно использовать любую. На выходе авторы хотят иметь feature maps с 2048 каналами, высота и ширина картонок в 32 раза меньше оригинальных.




Трансформер.
Энкодер и декодер инвариантны к перестановкам.


Энкодер. Вначале используем 1x1 convolution, чтобы уменьшить количество каналов до d. Поскольку энкодеру надо на вход подавать последовательности, мы преобразуем данные и получаем размерность dxHW. В энкодере используется multi-head attention + FNN. К каждому attention добавляются positional embeddings.


Декодер. Декодирует объекты параллельно в каждом слое. На вход дополнительно подают N эмбеддингов это тренируемые positional encodings, которые добавляются на каждом слое. Им дали название object queries.


На выходе эмбеддинги независимо друг от друга декодируются в координаты боксов и классы с помощью FNN. Благодаря attention модель может учитывать взаимосвязи между объектами.


FNN. Голова просто трехслойный перцептрон. Предсказывает координаты центра боксов и их размеры, линейный слой предсказывает классы с помощью softmax.




Auxiliary decoding losses
В каждом слое декодера добавляют prediction FFNs, параметры которых шарятся, и Hungarian loss. И дополнительно используют layer-norm для нормализации входов в prediction FNN с каждого слоя декодера.


Эксперименты на COCO
Параметры обучения: AdamW, начальный LR трансформера 10^-4, backbone's 10^-5, weight decay 10^-4. Попробовали ResNet-50 and ResNet-101 в качестве backbones модели назвали DETR and DETR-101.


Попробовали ещё улучшить архитектуру: улучшить разрешение с помощью добавления dilation на последней стадии backbone и убирания stride на этой же стадии. Модели назвали DETR-DC5 and DETR-DC5-R101. Требует в 2 раза больше вычислений, но улучшает результаты для мелких объектов.


Scale augmentation поресайзили картинки так, чтобы минимальная сторона была от 480 до 800, а максимальная не больше 1333. Random crop augmentation (+1 AP). И постпроцессинг если модель предсказывает пустые классы, взять следующий класс по вероятности. +2 AP. Обучение: 300 эпох 3 дня на 16 V100. Тренировка на 500 эпох дает + 1.5 AP.




Сравнение с Faster R-CNN
Попробовали улучшить Faster R-CNN:


  • добавить IoU в лосс;
  • random crop augmentations;
  • дольше тренировка.

В таблице выше обычный Faster R-CNN тренировался в 3 раза дольше обычного. Значок "+"означает тренировку в 9 раз дольше (109 эпох). DETR тащит почти все AP кроме AP75 и APs


Ablation
Энкодер по своей сути global scene reasoning и это помогает разъединять объекты. Увеличение количества слоев энкодера и декодера помогает.


FNN внутри трансформера можно интерпретировать как 1 1 convolutional, то есть получается нечто похожее на attention augmented convolutional. Без этого AP падает на 2.3.




DETR for panoptic segmentation
Просто добавляет голову с маской после декодера (бинарно на каждый класс). Но боксы все равно надо предсказывать для лосса.


И классы предсказываются с помощью argmax по каждому пикселю. Так защищаемся от потенциального перекрытия масок разных классов.





И последнее картинка про качество, для тех, кто очень обрадовался. Чем больше объектов, тем хуже работает модель.




5. Language Models are Few-Shot Learners


Авторы статьи: Tom B. Brown et.al. (OpenAI, 2020)
Оригинал статьи :: GitHub with examples and statistics
Автор обзора: Вадим Петров (в слэке graviton, на habr belgraviton)


До сих пор, использование предобученных трансформеров в прикладных задачах (например, questions answering) требовало дообучения. Большая группа ученых из OpenAI продемонстрировала, что при увеличении размера языковой модели GPT-3 (до 175B весов), достигается хорошая точность на специфических задачах без дообучения, сравнимая с моделями, которые файнтюнились на них (см. график ниже). Для задачи генерации новостей достигнуто качество, сложно отличимое от новостей, написанных людьми.


Авторы изучали модель применительно к разным задачам на основе подходов zero-shot, one-shot и few-shot. Случай дообучения под задачи они оставили на будущее. Для случая few-shot на графике снизу видно значительное увеличение точности при росте числа параметров модели.




Авторы пытались решить следующие задачи:


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

Архитектура
Использована архитектура GPT-2 с модифицированной инициализацией, преднормализацией и обратимой токенизацией. Отличием является использование плотных и локально разреженных "attention patterns" в слоях трансформера. Обучено 8 моделей от 125M до 175B параметров.




Замечу, что архитектура GPT-2 тоже лишь незначительно отличается от GPT-1, которая представлена ниже.




Тренировка
Были использованы 5 датасетов: Common Crawl, WebText2, Books1, Books2 и Wikipedia. Всего около 300 млрд токенов.


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


Использован Adam, с ограничением градиента в 1.0, cosine learning rate decay и warmup. Обучение GPT-3 заняло 3640 PetaFlops-days на кластере из V100 GPUs, предоставленном Microsoft.


Результаты


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




На задаче предсказания последнего слова в параграфе SOTA улучшена на 8 %, а в тесте с ответами на вопросы о физических процессах модель превзошла предыдущую SOTA (fine-tuned RoBERTa) на 1% даже в zero-shot режиме!





Арифметические операции


Для задачи выполнения арифметических операций сгенерировали датасет, на котором продемонстрировали способность модели (few-shot) решать данную задачу с точностью больше 90% для 2-х и 3-х значных чисел. Датасет обещают выложить.


Генерация новостей
Анализировался режим few-shot. Модели для генерации новости показывалось 3 новости по выбранной теме и заголовок с подзаголовком для новой статьи. Качество статей проверялось 80 людьми. Точность идентификации источника новостей заметно снижается при увеличении модели и достигает для GPT-3 только 52%, что очень близко к уровню случайного выбора (50%) несмотря на то, что люди тратили больше времени на оценку результатов больших моделей.




Имеющиеся проблемы


  • В то же время разработчики нашли ряд задач, в которых модель была неуспешна (оценка связи двух выражений -ANLI dataset, сжатие текста RACE, QuAC).


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


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



6. TabNet: Attentive Interpretable Tabular Learning


Авторы статьи: Sercan O. Arik, Tomas Pfister (Google Cloud AI, 2020)
Оригинал статьи :: GitHub project
Автор обзора: Александр Бельских (в слэке belskikh)


Работа от Google, в которой представлена архитектура нейросети для табличных данных, превосходящая доминирующие до этого подходы на ансамблях деревьев, сохраняя свойства интерпретируемости и легковесности. Дополнительно обладает возможностью предобучения в режиме self-supervising, что открывает большие возможности для дообучения и обучения на маленьких датасетах.


В отличии от tree-based подходов, на вход TabNet поступают сырые табличные данные, а обучается она через обычный градиентный спуск, выучивая хорошие репрезентации данных.


В архитектуре использован sequential attention механизм, который определяет, какие признаки будут использованы во время текущего decision step, что позволяет получить интерпретируемость предсказания.


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




Дискретные признаки классически приводятся к виду таблицы выучиваемых эмбеддингов. Сами признаки прогоняются через специальный модуль feature transformer (ничего общего с архитектурой Transformer не имеет).


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




Модель показала себя наравне или лучше чем текущие SOTA модельки для табличных данных.





Ссылка на начало.

Подробнее..

2.МАТЕМАТИЧЕСКОЕ ОПИСАНИЕ СИСТЕМ АВТОМАТИЧЕСКОГО УПРАВЛЕНИЯ

29.06.2020 02:20:27 | Автор: admin

Публикую первую часть второй главы лекций по теории автоматического управления.
В данной статье рассматриваются:


2.1. Получение уравнений динамики системы. Статическая характеристика. Уравнение динамики САУ (САР) в отклонениях
2.2. Линеаризация уравнений динамики САУ (САР)
2.3. Классический способ решения уравнений динамики


Лекции по курсу Управление Техническими Системами, читает Козлов Олег Степанович на кафедре Ядерные реакторы и энергетические установки, факультета Энергомашиностроения МГТУ им. Н.Э. Баумана. За что ему огромная благодарность.


Данные лекции только готовятся к публикации в виде книги, а поскольку здесь есть специалисты по ТАУ, студенты и просто интересующиеся предметом, то любая критика приветствуется.


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




2.1. Получение уравнений динамики системы. Статическая характеристика. Уравнение динамики САУ (САР) в отклонениях


При составлении уравнений, описывающих нестационарные процессы в САУ (САР) и которые в дальнейшем будем называть уравнениями динамики, система разбивается на отдельные элементы (звенья), для каждого из которых не существует проблем в записи соответствующего уравнения динамики.


На рис. 2.1.1 представлено схематичное представление САУ (звена) в переменных вход-выход, где x(t) (или u(t)) входное воздействие, а y(t) выходное воздействие, соответственно. Нередко входное воздействие будет называться управляющим, а выходное воздействие регулируемой величиной (переменной).



Рис. 2.1.1 Схематическое представление САУ (звена)

При составлении уравнений динамики используются фундаментальные законы сохранения из разделов Механики, Физики, Химии и др.


Например, при описании перемещения узла какого-то механизма силового привода используются законы сохранения: момента, энергии, импульса и др В теплофизических (теплогидравлических) системах используются фундаментальные законы сохранения: массы (уравнение неразрывности), импульса (уравнение движения), энергии (уравнение энергии) и др


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


$\left[ \begin{gathered} y(t) =y_0 + \Delta y(t)\\ u(t) = u_0 + \Delta u(t)\\ \end{gathered} \right.$


где: $y_0,u_0$ стационарные значения входного и выходного воздействий;
$\Delta y, \Delta u$ отклонения от станционара, соотвесвенно.

В качестве примера рассмотрим технологию получения уравнений динамики для механического демпфера, схематическое изображение которого представлено на рис. 2.1.2.



Рис. 2.1.2 Механический демпфер

Согласно 2-му закону Ньютона, ускорение тела пропорционально сумме сил, действующих на тело:

$m \cdot \frac{d^2 y(t)}{dt} = \sum F_j \ \ \ \mathbf{(2.1.1)}$


где, m масса тела, Fj все силы воздействующие на тело (поршень демпфера)


Подставляя в уравнение (2.1.1) все силы согласно рис. 2.2, имеем:


$m \cdot \frac{d^2y(t)}{dt} = m\cdot g+ u(t) - k \cdot y(t) - c \cdot \frac{dy(t)}{dt} \ \ \ \mathbf{(2.1.2)}$

где $m\cdot g$ сила тяжести; $k \cdot y(t)$ сила сопротивления пружины, $c \cdot \frac{dy(t)}{dt}$ сила вязконо трения (пропорциональна скорости поршеня)


Размерности сил и коэффициентов, входящих в уравнение (2.1.2):

$m \cdot g \Rightarrow [\frac{кг \cdot м}{ с^2}]; c \Rightarrow [\frac{кг}{с}]; k \Rightarrow [\frac{кг}{с^2}]$

Предполагая, что при t 0 поршень демпфера находился в равновесии, то есть

$$display$$\left \{ \begin{eqnarray} t &\le 0 \\ u(t) &= u_0\\ y(t) &= y_0\\ \end{eqnarray} \right.$$display$$

перейдем к отклонениям от стационарного состояния:
Пусть при t>0 $\left[ \begin{gathered} y(t) =y_0 + \Delta y(t); u(t) = u_0 + \Delta u(t);\\ y'(t) = [\Delta y(t)]; y''(t) =[\Delta y(t)]'\\ \end{gathered} \right.$. Тогда, подставляя эти соотношения в уравнение (2.1.2), получаем:

$m \cdot \frac{d^2\Delta y(t)}{dt^2} = m \cdot g - k \cdot y_0- k \cdot \Delta y(t) - c\frac{d\Delta y(t)}{dt} \ \ \ \mathbf{(2.1.3)}$


если $t \le 0$, то уравнение принимает вид:

$0 = m \cdot g+u_0 - k \cdot y_0 \ \ \ \mathbf{(2.1.4)}$

или

$y_0 = \frac{1}{k} \cdot[u_0+m \cdot g] \ \ \ \mathbf{(2.1.5)}$


Соотношение (2.1.4) уравнение звена (демпфера) в равновесном (стационарном) состоянии, а соотношение (2.1.5) статическая характеристика звена демпфера (см. рисунок 2.1.3).



Рис. 2.1.3 Статическая характеристика механического демпфера

Вычитая из уравнения (2.1.3) уравнение (2.1.4), получаем уравнение динамики демпфера в отклонениях:

$m\cdot g \frac{d^2 \Delta y(t)}{dt^2} = \Delta u(t) - k \cdot \Delta y(t) - c \cdot \frac{d \Delta y(y)}{dt}, $


тогда, разделив на k, имеем:

$T_2^2 \cdot \frac{d^2 \Delta y(t)}{dt^2}+ T_1 \cdot \frac{d \Delta y(t)}{dt} + \Delta y(t) = k_1 \cdot \Delta u(t) \ \ \ \mathbf{(2.1.6)}$


где:

$T_2^2= \frac{m}{k}; T_1= \frac{c}{k}; k_1=\frac{1}{k}.$


Уравнение (2.1.6) это уравнение динамики в канонической форме, т.е. коэффициент при y(t) равен 1.0!


Легко видеть, что коэффициенты перед членами, содержащими производные, имеют смысл (и размерность!) постоянных времени. В самом деле:


$T_1 = \frac{c}{k} \Rightarrow [\frac{кг \cdot c^2}{c \cdot кг}] = [c]$


$T_2^2 = \frac{m}{k} \Rightarrow [\frac{кг \cdot c^2}{kg}] =[c^2]$


Таким образом, получаем, что:
коэффициент перед первой производной имеет размерность [c] т.е. смысл некоторой постоянной времени;
коэффициент перед второй производной: [$c^2$];
коэффициент в правой части ($k_1$): [$\frac{c^2}{кг}$].
Тогда уравнение (2.1.6) можно записать в операторной форме:


$(T_2^2 \cdot p^2 + T_1 \cdot p+1)\Delta y(t) = k_1 \Delta u(t)$, что эквивалентно

$L(p)\Delta y(t) = N(p) \Delta u(t) \ \ \ \mathbf{(2.1.6.а)}$

где: $p= \frac{d}{dt}$ оператор диффренцирования;
$L(p) = T_2^2 \cdot p + T \cdot p + 1$ -линейный дифференциальный оператор; $L(p)$
$N(p)$ линейный дифференциальный оператор, вырожденный в константу, равную $k_1$.

Анализ уравнения (2.1.6.а) показывает, что такое уравнение имеет размерные переменные, а также размерными являются все коэффициенты уравнения. Это не всегда удобно. Кроме того, если реальная САР (САУ) состоит из многих звеньев, выходными воздействиями которых являются различные физические переменные (скорость, температура, нейтронный поток, тепловой поток и т.д.), то значения коэффициентов могут различаться на большое число порядков, что ставит серьезные математические проблемы при численном решении уравнений динамики на компьютере (поскольку числа в компьютере всегда представляются с какой-то точностью). Одним из наилучших способов избежать численных трудностей является принцип нормализации, т.е. переход к безразмерным отклонениям, которые получены нормированием отклонения на стационарное значение соответствующей переменной.


Введем новые нормированные (безразмерные) переменные:

$\left[ \begin{gathered} \widetilde y(t) = \frac {y(t)-y_0}{y_0} = \frac {\Delta y(t)}{y_0}\\ \widetilde u(t) = \frac {u(t)-u_0}{u_0} =\frac {\Delta u(t)}{u_0}\\ \end{gathered} \right. \Rightarrow \left[ \begin{gathered} y(t) =y_0 \cdot [1+ \widetilde y(t)]\\ u(t) = u_0 \cdot [1+ \widetilde u(t)]\\ \end{gathered} \right. \Rightarrow \left[ \begin{gathered} y'(t) =y_0 \cdot \widetilde y(t)\\ y''(t) = y_0 \cdot \widetilde y(t)''\\ \end{gathered} \right. $


Подставляя эти соотношения в уравнение (2.1.2), имеем:

$m \cdot y_0 \cdot \frac{d^2 \widetilde y(t)}{dt^2} = m \cdot g +u_0 \cdot[1+\widetilde u(t)] -k \cdot y_0 \cdot[1+\widetilde y(t)] - c \cdot y_0 \cdot \frac{d \widetilde y(t)}{dt}; или$

$m \cdot y_0 \cdot \frac{d^2 \widetilde y(t)}{dt^2} = \underline {m \cdot g} + \underline {u_0} +u_0 \cdot \widetilde u(t) - \underline {k \cdot y_0} - k \cdot y_0 \cdot \widetilde y(t) - c \cdot y_0 \cdot \frac{d \widetilde y(t)}{dt}.$


Поддчеркнутые члены выражения в сумме дают 0 (см. 2.1.4) Перенося в левую часть члены, содержащие $\widetilde y(t)$, и, разделив на $k \cdot y_0$, получаем:

$\frac{m \cdot y_0}{k \cdot y_0} \cdot \frac{d^2 \widetilde y(t)}{dt^2} + \frac {c \cdot y_0}{k \cdot y_0} \cdot \frac{d \widetilde y(t)}{dt} +\widetilde y(t)= \frac{u_0}{k \cdot y_0} \cdot \widetilde u(t) \Rightarrow $

$(T_2^2 \cdot p + T \cdot p + 1) \cdot \widetilde y(t) = k_x \cdot \widetilde u(t) \ \ \ \mathbf{(2.1.7)}$


где: $T_2^2= \frac{m}{k}; T_1= \frac{c}{k}; k_x=\frac{u_0}{k \cdot y_0} $ коэффициент усиления, причем безразмерный.

Проверим размерность коэффициента $k_x$

$\left[\frac{кг \cdot м}{с^2} \cdot \frac{c^2}{кг} \cdot \frac{1}{м}\right] =[1].$


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


На рис. 2.1.4 представлены статические характеристики для механического демпфера:



Рис. 2.1.4 Статические характеристики механического демпфера

Процедура нормировки отклонений позволяет привести уравнения динамики к виду:

$L(p) \cdot \widetilde y(t) = N(p) \cdot \widetilde u(t) \ \ \ \mathbf{(2.1.8)}$

где $L(p), N(p) - $ дифференциальные операторы.

Если дифференциальные операторы $L(p), N(p) - $ линейные, а статическая характеристика САУ (звена) тоже линейна, то выражение (2.1.8) соответствует линейному обыкновенному дифференциальному уравнению (ОДУ).


А если $L(p), N(p) - $ нелинейные дифференциальные операторы, или $\widetilde y_{stat} \neq k \cdot \widetilde u_{stat}$, то уравнение динамики нелинейное. Под нелинейными действиями понимаются все математические действия, кроме сложения (+) и вычитания (-).


Пример создания модели демпфера можно посмотереть здесь: Технология получения уравнений динамики ТАУ



2.2. Линеаризация уравнений динамики САУ (САР)


Практически все реальные системы автоматического управления (САУ) являются нелинейными, причем нелинейность САУ может определяться различным причинами:


  1. Нелинейностью статической характеристики.
  2. Нелинейностью динамических членов в уравнениях динамики.
  3. Наличием в САУ принципиально нелинейных звеньев.

Если в замкнутой САУ (САР) нет принципиально нелинейных звеньев, то в большинстве случаев уравнения динамики звеньев, входящих в систему, могут быть линеаризованы. Линеаризация основана на том, что в процессе регулирования (т.е. САУ с обратной связью) все регулируемые величины мало отклоняются от их программных значений (иначе система регулирования или управления не выполняла бы своей задачи).


Например, если рассмотреть управление мощностью энергетического ядерного реактора, то главная задача САР поддержание мощности на заданном (номинальном) уровне мощности. Существующие возмущения (внутренние и внешние) отрабатываются САР и поэтому параметры ядерного реактора незначительно отличаются от стационарных. На рис. 2.2.1 представлена временная зависимость мощности ядерного реактора, где нормированные отклонения мощности N /N0 << 1, и поэтому уравнения динамики ядерного реактора, в принципе, могут быть линеаризованы.



Рис. 2.2.1 Пример изменения мощности реактора

Рассмотрим некоторое звено (или САР в целом), описание динамики которого можно представить в переменных вход-выход:



Рис. 2.2.2 Звено САР

Предположим, что динамика данного звена описывается обыкновенным дифференциальным уравнением n-го порядка:

$L(p) \cdot y(t) = N(p) \cdot u(t) \ \ \ \mathbf{(2.2.1)}$


Перенесем $N(p) u(t)$ в левую часть уравнения и запишем уравнение в виде%

$F(y,y',y'',...y^{n}, u, u',u'', ...u^m,t)=0 \ \ \ \mathbf{(2.2.2)}$


где $F$ - функция регулируемой переменной и ее производных, а также управляющего (входного) воздействия и его производных, причем F обычно нелинейная функция.


Будем считать, что при t 0 САУ (звено) находилось в равновесии (в стационарном состоянии). Тогда уравнение (2.2.2) вырождается в уравнение статической характеристики:

$y'=y''=...y^n=u'=u''=...u^m=0 \Rightarrow F(y_0,u_0)=0 \ \ \ \mathbf{(2.2.3)}$


Разложим левую часть уравнения (2.2.2) в ряд Тейлора в малой окрестности точки равновесного состояния $(y_0, u_0)(y0, u0)$.


Напомним, что разложение в ряд Тейлора трактуется следующим образом: если $y = f(x)$, то простое разложение функции в ряд Тейлора в окрестности точки $x = x_0$ будет выглядеть так:


$ \begin{eqnarray} y(x) = f(x) = f(x_0)+ \frac{1}{1!} \cdot \left( \frac{df}{dx}\right)_{x=x_0} \cdot (x-x_0)+ \frac{1}{2!} \cdot \left( \frac{d^2f}{dx^2} \right)_{x=x_0} \cdot (x-x_0) +\\ ...+\frac{1}{n!} \cdot \left( \frac{d^nf}{dx^n} \right)_{x=x_0} \cdot (x-x_0) \end{eqnarray}$


C учетом вышеприведенного разложение принимает вид:


$ \begin{eqnarray} F(y,y',y'',...y^{n}, u, u', ...u^m,t) = F(y_0,u_0)+\frac{1}{1!}\cdot \left( \frac{dF}{dy}\right)_{ y=y_0;u =u_0 } \cdot (y-y_0)+\\ + \frac{1}{2!} \cdot \left( \frac{d^2F}{dy^2}\right)_{y=y_0;u =u_0}\cdot (y-y_0)^2+\frac{1}{3!} \cdot \left( \frac{d^3F}{dy^3}\right)_{y=y_0;u =u_0}\cdot (y-y_0)^3 +..\\+\frac{1}{k!} \cdot \left( \frac{d^kF}{dy^k}\right)_{y=y_0;u =u_0}\cdot (y-y_0)^k+ \frac{1}{1!}\cdot \left( \frac{dF}{dy'}\right)_{ 0 } \cdot (y') +\frac{1}{2!}\cdot \left( \frac{d^2F}{d(y')^2}\right)_{ 0 } \cdot (y')^2+\\ ..+\frac{1}{1!}\cdot \left( \frac{dF}{dy^{(n)}}\right)_{ 0 } \cdot (y^{(n)})+ \frac{1}{2!}\cdot \left( \frac{d^2F}{d(y^{n})^2}\right)_{ 0 } \cdot (y^{(n)})^2+..\\ ..+\frac{1}{1!}\cdot \left( \frac{dF}{du}\right)_{ 0 } \cdot (u-u_0)+\frac{1}{2!} \cdot \left( \frac{d^2F}{du^2}\right)_{0}\cdot (u-u_0)^2+..\\ ..+\frac{1}{k!}\cdot \left( \frac{d^kF}{d(u^{m})^k}\right)_{ 0 } \cdot (u^{(m)})^k+.. \end{eqnarray}$


Предполагая, что отклонения выходных и входных воздействий незначительны, (т.е.:$\frac{\Delta y(t)}{y_0} <<1; \frac{\Delta u(t)}{u_0} <<1;$), оставим в разложении только члены первого порядка малости (линейные). Поскольку $[y(t)-y_0] \equiv \Delta y(t); y'(t) = [y_0+\Delta y(t)]' = (\Delta y(t))'$, получаем:


$ F(y,y',y''..y^{(n)},u,u',u''..u^{m})\simeq \left( \frac{\partial F}{\partial y} \right)_0\cdot \Delta y+\left(\frac{\partial F}{\partial y'}\right)_0 \cdot (\Delta y)' +\left(\frac{\partial F}{\partial y''}\right)_0 \cdot (\Delta y)''+..\\ ..+\left(\frac{\partial F}{\partial u}\right)_0 \cdot \Delta u+ \left(\frac{\partial F}{\partial u'}\right)_0 \cdot (\Delta u)' + \left(\frac{\partial F}{\partial u''}\right)_0 \cdot (\Delta u)''+..+ \left(\frac{\partial F}{\partial u^{m}}\right)_0 \cdot (\Delta u)^{(m)}\ \ \ \mathbf{(2.2.4)}$


Подставляя соотношение (2.2.4) в уравнение (2.2.2), и перенося множители при у и u в разные части получаем уравнения:

$a_n^0 \cdot \frac{d^{(n)}}{dt^n} \Delta y +a_{n-1}^0 \cdot \frac{d^{(n-1)}}{dt^{n-1}} \Delta y +..+a_{1}^0 \cdot \frac{d}{dt} \Delta y +a_{0}^0\cdot\Delta y = \\ =b_m^0 \cdot \frac{d^{(m)}}{dt^m} \Delta u +b_{m-1}^0 \cdot \frac{d^{(m-1)}}{dt^{m-1}} \Delta u +..+b_{1}^0 \cdot \frac{d}{dt} \Delta u +b_{0}^0\cdot\Delta u \ \ \ \mathbf{(2.2.5)}$

где:

$a_0^0= \left( \frac{\partial F}{\partial y} \right)_{y =y_0;u =u_0};a_1^0= \left( \frac{\partial F}{\partial y'} \right)_{y =y_0;u =u_0}; ...a_n^0= \left( \frac{\partial F}{\partial y^{(n)}} \right)_{y =y_0;u =u_0} ; \\ b_0^0= \left( \frac{\partial F}{\partial u} \right)_{y =y_0;u =u_0};b_1^0= \left( \frac{\partial F}{\partial u'} \right)_{y =y_0;u =u_0}; ...b_m^0= \left( \frac{\partial F}{\partial u^{(m)}} \right)_{y =y_0;u =u_0}.$


Коэффициенты $a_i^0, b_j^0$ постоянные коэффициенты, поэтому уравнения 2.2.5 линейное дифференциальное с постоянными коэффициентами.


В дальнейшем нами будет часто использоваться операторная форма записи уравнений динамики:

$L(p)\cdot\Delta y(t) = N(p) \cdot \Delta u(t)\ \ \ \mathbf{(2.2.6)}$


где $p = \frac{\partial }{\partial t}$ оператор дифференцирования;
$L(p)$ линейный дифференциальный оператор степени n;
$N(p)$ линейный дифференциальный оператор степени m, причем обычно порядок оператора $L(p)$ выше порядка оператора $N(p)$: $ n m.$

Уравнения (2.2.5) и (2.2.6) уравнения динамики системы (звена) в отклонениях.


Если исходное уравнение (2.2.1) дифференциальное уравнение в физических переменных (температура, скорость, поток и т.д.), то размерность коэффициентов $a_i^0, b_j^0$ может быть произвольной (любой).


Переход к нормализованным отклонениям позволяет упорядочить размерность коэффициентов. В самом деле, разделив уравнение (2.2.5) на $(y_0, u_0)$ и выполнив некоторые преобразования, получаем:


$a_n^* \cdot \tilde{y}^{(n)} +a_{(n-1)}^* \cdot \tilde{y}^{(n-1)} +..+a_1^* \cdot \tilde{y}'+a_0^* \cdot \tilde{y} = \\ =b_m^* \cdot \tilde{u}^{(m)} +b_{(m-1)}^* \cdot \tilde{u}^{(m-1)} +..+b_1^* \cdot \tilde{u}'+b_0* \cdot \tilde{u} \ \ \ \mathbf{(2.2.7)}$


Приведение уравнения динамики САУ (звена) к нормализованному виду позволяет унифицировать размерность коэффициентов уравнений: ==>


$$display$$[a_0^*] = [1] ;\ \ [a_1^*]= [c];\ \ [a_2^*]= [c^2];\ \ [a_3^*]= [c^3];...[a_n^*]= [c^n]\\ [b_0^*] = [1] ;\ \ [b_1^*]= [c];\ \ [b_2^*]= [c^2];\ \ [b_3^*]= [b^3];...[b_m^*]= [c^m]$$display$$


Если вынести в правой части (2.2.7) коэффициент $b_0^*$ за общую скобку и разделить все уравнение на $a_0^*$, то уравнение принимает вид:


$a_n \cdot \tilde{y}^{(n)} +a_{(n-1)}\cdot \tilde{y}^{(n-1)} +..+a_1\cdot \tilde{y}'+\tilde{y} = \\ =k \cdot [b_m \cdot \tilde{u}^{(m)} +b_{(m-1)} \cdot \tilde{u}^{(m-1)} +..+b_1 \cdot \tilde{u}'+ \tilde{u}] \ \ \ \mathbf{(2.2.8)}$


где:

$a_n = \frac{a_n^*}{a_0^*};\ a_{n-1} = \frac{a_{n-1}^*}{a_0^*}; \ ...a_{1} = \frac{a_{1}^*}{a_0^*}; \ k = \frac{b_0^*}{a_0^*} \\ b_n = \frac{b_n^*}{b_0^*};\ b_{n-1} = \frac{b_{n-1}^*}{b_0^*}; \ ...b_{1} = \frac{b_{1}^*}{b_0^*}; $

или в операторном виде:

$(a_n \cdot p^{(n)} +a_{(n-1)}\cdot p^{(n-1)} +..+a_1\cdot p'+1) \cdot \tilde{y} = \\ =k \cdot (b_m \cdot p^{(m)} +b_{(m-1)} \cdot p^{(m-1)} +..+b_1 \cdot \tilde{u}'+ 1)\cdot \tilde{u}\\ L(p)\cdot \tilde{y} =k \cdot N(p) \cdot \tilde{u} \ \ \ \mathbf{(2.2.9)}$


Линеаризация уравнений динамики и нормализация переменных позволяют привести уравнения динамики САУ (звена) к виду, наиболее удобному для использования классических методов анализа, т.е. к нулевым начальным условиям.


$$display$$Если \ t 0 \Rightarrow \left[ \begin{gathered} \tilde {y}(t) = \tilde {y}(0) =0;\\ \tilde u(t) = \tilde u(0) = 0.\\ \end{gathered} \right.$$display$$


Пример


Выполнить линеаризацию уравнения динамики некоторой абстрактной САР в окрестности состояния (x0, y0), если полное уравнение динамики имеет вид:


$a_3^0 \cdot y'''(t) +a_2^0 \cdot y''(t)+a_1^0 \cdot y'(t) \cdot[y(t)-d]+ a_2^0 \cdot y^2(t)=b_1^0 \cdot x'(t) +b_0^0 \cdot x(t); $


Нелинейность полного уравнения динамики проявляется в следующем:


во-первых, в нелинейности статической характеристики:


$a_0^0 \cdot y^2(0) = b_0^0 \cdot x(0); \Rightarrow y_0 = \sqrt{\frac{b_0^0}{a_0^0} \cdot x_0} = \sqrt {k_0 \cdot x_0}$



Рис. 2.2.3 Линеаризации статической характеристики

во-вторых, слагаемое в левой части $a_1^0 \cdot y'(t) \cdot[y(t)-d]$ чисто нелинейное, так как действие умножения является нелинейным.


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


Преобразования выполним в следующей последовательности:


  1. Перейдем к безразмерным переменным (нормализованным);
  2. Выполним линеаризацию, отбросив нелинейные члены 2-го и выше порядков малости.

Перейдем к новым безразмерным переменным:


$\tilde{y}(t) = \frac{y(t) - y_0}{y_0};\ \Rightarrow y(t) = y_0 \cdot [1+ \tilde{y}(t)]; \\ \tilde{x}(t) = \frac{x(t) - x_0}{x_0};\ \Rightarrow x(t) = x_0 \cdot [1+ \tilde{x}(t)].$


Заметим, что:
$x(t) = x_0+ \Delta x(t) = x_0+ x_0 \cdot \tilde{x}(t) \ и \ y(t) = y_0+ \Delta y(t) = y_0+ y_0 \cdot \tilde{y}(t)$.


Подставляя значения x(t) и y(t) в исходное уравнение:


$ a_3^0 \cdot y_0 \cdot \tilde y'''(t) +a_2^0 \cdot y_0 \cdot \tilde y''(t)+a_1^0 \cdot y_0 \cdot \tilde y'(t) \cdot[y_0+y_0 \cdot \tilde y(t) -d]+a_0^0 \cdot y_0^2 \cdot[1+ \tilde y(t)]^2 = \\ = b_1^0 \cdot x_0 \cdot \tilde x'(t) + b_0^0 \cdot х_0 \cdot[1+\tilde x(t)]; \ \Rightarrow \ раскрыв \ скобки \Rightarrow \\ a_3^0 \cdot y_0 \cdot \tilde y'''(t)+a_2^0 \cdot y_0 \cdot \tilde y''(t)+a_1^0 \cdot y_0^2 \cdot \tilde y'(t) + a_1^0 \cdot y_0^2 \cdot \tilde y'(t) \cdot \tilde y(t)-a_1^0 \cdot y_0 \cdot \tilde y'(t) \cdot d + \\ +a_0^0 \cdot y_0^2 +2 \cdot a_0^0 \cdot y_0^2 \cdot\tilde y(t) +a_0^0 \cdot y_0^2 \cdot\tilde y(t)^2 = b_1^0 \cdot x_0 \cdot \tilde x'(t) + b_0^0 \cdot х_0+ b_0^0 \cdot х_0 \cdot \tilde x(t)];$


Удаляем полученного уравнения уравнения стационара: $a_0^0 \cdot y_0^2= b_0^0 \cdot х_0$, а так же пренебрегая слагаемыми второго прядка малости: $\ a_1^0 \cdot y_0^2 \cdot \tilde y'(t) \cdot \tilde y(t)$, получаем следующее уравнение:


$ a_3^0 \cdot y_0 \cdot \tilde y'''(t)+a_2^0 \cdot y_0 \cdot \tilde y''(t)+(a_1^0 \cdot y_0^2 -a_1^0 \cdot y_0 \cdot d) \cdot \tilde y'(t)+2 \cdot a_0^0 \cdot y_0^2 \cdot\tilde y(t) =\\ = b_1^0 \cdot x_0 \cdot \tilde x'(t) + b_0^0 \cdot х_0 \cdot \tilde x(t);$


Вводим новые обозначения:

$a_3^* = a_3^0 \cdot y_0 ; \ \ a_2^* = a_2^0 \cdot y_0; \ \ a_1^* = a_1^0 \cdot y_0^2 -a_1^0 \cdot y_0 \cdot d; \ \ a_0^* =2 \cdot a_0^0 \cdot y_0^2; \\ b_1^* = b_1^0 \cdot x_0; \ \ b_0^*=b_0^0 \cdot х_0 \ $


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


$a_3^* \cdot \tilde y'''(t)+a_2^* \cdot \tilde y''(t)+a_1^* \cdot \tilde y'(t)+ a_0^* \cdot\tilde y(t) = b_1^* \cdot \tilde x'(t) + b_0^* \cdot \tilde x(t);$


Если в правой части вынести за общую скобку $b_0^*$ и разделить все уравнение на $a_0^*$, то уравнение (линеаризованное) принимает вид:


$a_3 \cdot \tilde y'''(t)+a_2 \cdot \tilde y''(t)+a_1 \cdot \tilde y'(t)+ \tilde y(t) = k \cdot[ b_1 \cdot \tilde x'(t) + \tilde x(t)]$


где:

$a_3 = \frac{a_3^*}{a_0^*}; \ \ a_2 = \frac{a_2^*}{a_0^*}; \ \ a_1 = \frac{a_2^*}{a_0^*}; \ \ k = \frac{b_o^*}{a_0^*}; \ \ b_1 = \frac{b_1^*}{b_0^*}; $


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


2.3. Классический способ решения уравнений динамики


Классический метод решения уравнений динамики САУ (САР) применим только для линейных или линеаризованных систем.


Рассмотрим некоторую САУ (звено), динамика которой описывается линейным дифференциальным уравнением вида:


$L(p) \cdot y(t) = N(p)*x(t), \ \ \ \mathbf{(2.3.1)}\\ где: L(p) = a_n\cdot p^n + ..+a_1 \cdot p + a_0 \\ N(p) = b_m \cdot p^m+..+b_1 \cdot p+b_0 $


Переходя к полной символике, имеем: $\Rightarrow$


$a_n \cdot y^{(n)}+a_{n-1} \cdot y^{(n-1)}+..+a_1 \cdot y'+a_{0} = b_m \cdot x^{(m)}+b_{n-1} \cdot x^{(n-1)}+..+b_1 \cdot y'+b_{0} \ \ \mathbf{(2.3.2)};$


Выражение (2.3.2) обыкновенное дифференциальное уравнение (ОДУ), точнее неоднородное ОДУ, так как правая часть 0.


Известно входное воздействие x(t), коэффициенты уравнения и начальные условия (т.е. значения переменных и производных при t = 0).


Требуется найти y(t) при известных начальных условиях.


Известно, что


$y(t) = y_{общ.}(t)+y_{част.}(t),\ \ \ \mathbf{(2.3.3)}$


где: $y_{общ.}(t)$ решение однородного дифференциального уравнения $L(p) y(t) = 0; $y_{част.}(t) $inline$ - частное решение. $inline$


Будем называть решение однородного дифференциального уравнения $y_{общ.} = y_{собств.}$, собственным решением, так как его решение не зависит от входного воздействия, а полностью определяется собственными динамическими свойствами САУ (звена).


Вторую составляющую решения (2.3.3) будем называть $y_{част.} = y_{вын.}$, вынужденным, так как эта часть решения определяется внешним воздействием $x(t)$, поэтому САУ (САР или звено) вынуждена отрабатывать это воздействие:


$y(t) = y_{собств.}(t)+y_{вын.}(t),\ \ \ \mathbf{(2.3.4)}$


Напомним этапы решения:


1) Если имеется уравнение вида $L(p) \cdot y(t) = N(p)*x(t)$, то сначала решаем однородное дифференциальное уравнение:


$a_n \cdot y^{(n)}+a_{n-1} \cdot y^{(n-1)}+..+a_1 \cdot y'+a_{0} =0 $


2) Записываем характеристическое уравнение:


$L(\lambda) =0; \ \Rightarrow \ a_n \cdot \lambda^{n}+a_{n-1} \cdot \lambda^{n-1}+..+a_1 \cdot \lambda+a_{0} =0 \ \ \ \mathbf{(2.3.5)}$


3) Решая уравнение (2.3.5), которое является типичным степенным уравнением, каким-либо способом (в том числе и с помощью стандартных подпрограмм на компьютере) находим корни характеристического уравнения $\lambda_i$
4) Тогда собственное решение записывается в виде:


$y_{собств.}(t)=\sum_{j=1}^n C_j \cdot e^{\lambda_j \cdot t}, \ \ \ \mathbf{(2.3.6)}$


если среди $\lambda_i$ нет повторяющихся корней (кратность корней равна 1).


Если уравнение (2.3.5) имеет два совпадающих корня, то собственное решение имеет вид:


$y_{собств.}(t)=\sum_{j=1}^{n-2} C_j \cdot e^{\lambda_{j} \cdot t} +C_{n-1} \cdot e^{\lambda_{n-1} \cdot t}\cdot [1+C_n\cdot t]. \ \ \ \mathbf{(2.3.7)}$


Если уравнение (2.3.5) имеет k совпадающих корней (кратность корней равна k), то собственное решение имеет вид:


$y_{собств.}(t)=\sum_{j=1}^{n-k} C_j \cdot e^{\lambda_{j} \cdot t} +C_{n+1-k} \cdot e^{\lambda_{n+1-k} \cdot t}\cdot [1+C_{n+2-k}\cdot t+C_{n+3-k}\cdot t^2+.. \\ ..+C_{n}\cdot t^{k-1}]. \ \ \ \mathbf{(2.3.8)}$


5) Вынужденную часть решения можно найти различными способами, но наиболее распространены следующие способы:
а) По виду правой части.
б) Методом вариации постоянных.
в) Другие методы


Если вид правой части дифференциального уравнения относительно несложная функция времени, то предпочтительным является способ а): подбор решения. $y_{вын.}(t) = f_{вын}(t)$.


6) Суммируя полученные составляющие (собственную и вынужденную), имеем: $\Rightarrow$


$y_{полн.}(t)=\sum_{j=1}^n C_j \cdot e^{\lambda_j \cdot t} + f_{вын}(t).$


7) Используя начальные условия (t = 0), находим значения постоянных интегрирования $C_j$. $\Rightarrow$ Обычно получается система алгебраических уравнений. $\Rightarrow$ Решая систему, находим значения постоянных интегрирования $C_j$


Пример


Найти аналитическое выражение переходного процесса на выходе звена, если


$\left\{ \begin{gathered} 2 \cdot y''(t)+5 \cdot y'(t)+2 \cdot y(t) =1- e^{-t}\\ Начальные \ условия \ t = 0; \Rightarrow y(0) = 0; y'(0) =0.\ \end{gathered} \right.$


Решение. $\Rightarrow$ Запишем однородное ОДУ: $2 \cdot y''(t)+5 \cdot y'(t)+2 \cdot y(t) =0$
Характеристическое уравнение имеет вид: $2 \cdot \lambda ^2+5 \cdot \lambda+2 = 0$; Решая, имеем: $\lambda_1 = -2; \ \ \lambda = 0.5,$ тогда:

$y_{соб} = С_1 \cdot e^{-2 \cdot t}+С_2 \cdot e^{-0.5 \cdot t},$


где $С_1, С_2$ неизвестные (пока) постоянные интегрирования.

По виду временной функции в правой части запишем $y_{вын}(t)$ как:


$у_{вын}(t) =A+B \cdot e^{-t} \Rightarrow у_{вын}'(t) = -B\cdot e^{-t} \Rightarrow у_{вын}''(t) = B\cdot e^{-t} $


Подставляя в исходное уравнение, имеем:


$2\cdot B \cdot e^{-t} - 5 \cdot B \cdot e^{-t}+2\cdot A +2 \cdot B \cdot e^{-t} =1 - e^{-t} \Rightarrow \left\{ \begin{gathered} 2 \cdot A =1\\ -B = -1\ \end{gathered} \right. \Rightarrow\\ \Rightarrow \left\{ \begin{gathered} A = \frac{1}{2}\\ B = 1\ \end{gathered} \right. \Rightarrow y_{вын.}(t) = \frac{1}{2} -e^{-t};$


Суммируя $y_{соб}, y_{вын}$, имеем: $y(е) = С_1 \cdot e^{-2 \cdot t}+С_2 \cdot e^{-0.5 \cdot t}+\frac{1}{2}+ e^{-t}.$


Используя 1-е начальное условие (при t = 0), получаем: $0 =C_1+C_2+0.5+1$, а из 2-го начального условия имеем: $0 = -2 \cdot C_1 - 0.5 \cdot C_2 -1.$


Решая систему уравнений относительно $С_1$ и $С_2$, имеем: $С_1 = -1/6; \ \ \ C_2 = -4/3. $
Тогда окончательно:


$y(t) = - \frac{1}{6} e^{-2t}- \frac{4}{3} e^{-0.5t}+\frac{1}{2}+e^{-t};$


Что бы проверить результ, выполним моделирование процесса в SimInTech, для этого преобразуем исходное уравнение к виду:


$2 \cdot y''(t)+5 \cdot y'(t)+2 \cdot y(t) =1- e^{-t} \Rightarrow \\ \Rightarrow y''(t) = 0.5 - 0.5\cdot e^{-t} - 2.5 \cdot y'(t)- y(t)$


Создадим модель SimInTech, содержащую исходное динамическое уравнение и полученное аналитическое решение, и выведем результаты на один график (см. рис. 2.3.1).



Рис. 2.3.1 структурная схема для проверки решения


На рис. 2.3.2 приведено решение по вышеприведенному соотношению и численное решение задачи в среде SimInTech (решения совпадают и линии графиков наложены друг на друга).



Рис. 2.3.2 Решение уравнения динамики

Ссылки по теме:


  1. Википедия про ряд Тейлора
  2. Дифференциальные уравнения на Match24.ru
  3. Пример создания модели груза на пружине.
  4. Начало лекций здесь: Введение в теорию автоматического управления. Основные понятия теории управления техническим системами
Подробнее..

Модельно-ориентированное проектирование. Построение активного выпрямителя (на основе математической модели)

06.07.2020 06:04:37 | Автор: admin

Продолжение цикла статей про модельно ориентированное проектирование. В предыдущих сериях:


В этой серии, авторы Ю. Н. Калачев и А.Г. Александров, представляют математическую модель активного выпрямителя в среде структурного моделирования.




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



Рис. 1 Принципиальная схема активного выпрямителя

1. Как это работает?


Инвертор в данном устройстве работает как повышающий преобразователь, поддерживающий в звене постоянного тока заданное напряжение (Udc) с помощью управления амплитудой и фазой тока дросселя.


При этом заряженную емкости Cdc</sub> инвертора можно рассматривать как источник напряжения, из которого инвертор с помощью ШИМ способен формировать трехфазное напряжение различной амплитуды и фазы (естественно, вследствие импульсного управления речь идет о среднем напряжении). Это напряжение совместно с напряжением сети формирует напряжение, на трехфазном дросселе определяющее фазу и амплитуду его тока.

На холостом ходу (если потребление тока от сети отсутствует) инвертор формирует напряжение, совпадающее с напряжением входной сети по амплитуде и фазе. Ток в дросселе при этом, естественно, не течет.


В режиме активного потребления на дросселе формируется напряжение, фаза которого опережает фазу сети на /2. При этом ток в индуктивности, отстающий от напряжения на /2, совпадет по фазе с напряжением сети. Его амплитуда, необходимая для поддержания в звене постоянного тока заданного напряжения, определяется амплитудой напряжения на дросселе.

В режиме рекуперации (при отдаче энергии в сеть) на дросселе формируется напряжение, отстающее от сетевого по фазе на /2, что приводит к протеканию тока дросселя в противофазье с напряжением сети. Заданное напряжение в звене постоянного тока при этом поддерживается амплитудой напряжения на дросселе.


На Рис.2 показаны векторные диаграммы, поясняющие вышесказанное.



Рис. 2 векторные диаграммы в различных режимах

На диаграммах:
$\vec U_ 1 $ вектор напряжения входной сети
$\vec U_ 2 $ вектор напряжения, формируемый инвертором
$\vec U_ 1 - \vec U_ 2 $ вектор напряжения дросселя
$\vec I $ вектор тока сети
Система координат ABC неподвижная, трехфазная
Система координат XY вращающаяся система координат, ось X которой совпадает с вращающимся вектором напряжения сети.


ПРИМЕЧАНИЕ Глядя на диаграммы на Рис.2 можно заметить интересную деталь: малейшее отличие фазы вектора напряжения инвертора от фазы вектора напряжения сети приводит к фазовому скачку напряжения на дросселе на 90, и соответственно, к смене режима холостого хода на рекуперацию или активное потребление.


Итак, как уже говорилось, на трехфазном дросселе и инверторе строится повышающий преобразователь, обеспечивающий поддержание заданного напряжения звена постоянного тока (Udc). Это поддержание осуществляется с помощью управления вектором входного тока. За счет ШИМ-управления и повышения частоты переключения IGBT-ключей инвертора удается добиться снижения индуктивностей входного дросселя до разумных значений при получении синусоидальной формы входного тока и обеспечении его активного характера.


2. Математическое описание работы активного выпрямителя


Для схемы на Рис.1 можно записать следующее выражение:

$\vec U_1 = \vec U_2+ \vec I \cdot R +L \cdot \frac{d \vec I}{dt}$

где:
R активное сопротивление дросселя;
L индуктивность дросселя.

Для вращающейся системы координат XY, связанной с вектором напряжения входной сети, можно записать:


$\left \{ \begin{gathered} U_1 =U_{2X} + I_X R +L \frac{dI_X}{dt} - \omega L I_Y\\ 0= U_{2Y} + I_Y R +L \frac{dI_Y}{dt} + \omega L I_X\\ \end{gathered} \right.$


где:
$\omega = 2\pi f = 100 \pi $ для 50 Гц
$I_X$ активная составляющая входного тока (совпадает с фазой сети);
$I_Y$ реактивная составляющая входного тока (отстает или опережает фазу сети на 90).

Для того, чтобы характер потребления корректора был активным необходимо поддерживать $I_Y = 0$.


Кроме того, корректор должен обеспечивать функции выпрямителя, то есть поддерживать заданное значение $U_{dc} $, независимо от тока нагрузки.


3. Структура системы управления активного выпрямителя


Рассмотрим структуру системы на основе ее модели в SimInTech (Рис.3).



Рис. 3 структурная схема модели

Система регулирования строится во вращающейся синхронно с вектором напряжения входной сети системе координат XY по двухконтурной структуре. Внешний контур напряжения с помощью регулятора напряжения вырабатывает задание на активную согставляющую тока дросселя ($I_X $), необходимую для поддержание заданного$U_{dc}$.


Внутренний контур тока обеспечивает отработку задания активной составляющей тока ($I_X$) при нулевой реактивной составляющей ($I_Y=0$).


Ниже перечислены и кратко описаны блоки системы:
Uset задатчик напряжения Udc,.
ВФ вычислитель фазы сети, определяет угол поворота вектора напряжения входной сети в неподвижной системе координат и формирует сигналы необходимые для координатных преобразований.
ABC=>XY преобразователь координат, осуществляет переход из неподвижной трехфазной системы координат во вращающуюся прямоугольную систему координат ХY, связанную с вектором входного напряжения.
XY=>ABC преобразователь координат осуществляет переход из вращающейся системы координат ХY в неподвижную трехфазную.
PU регулятор напряжения (ПИ), преобразует сигнал ошибки $U_{dc}$ в сигнал задания активной составляющей входного тока $I_{1X}$.
РIx регулятор тока, преобразует сигнал ошибки активного тока в сигнал задания напряжения по оси Х вращающейся системы координат.
РIy регулятор тока, преобразует сигнал ошибки реактивного тока в сигнал задания напряжения по оси Y вращающейся системы координат.
Огр.U ограничитель напряжения ограничивает вектор напряжения по модулю максимально возможным значением с приоритетом Y составляющей.
КПС блок компенсации предназначен для компенсации перекрестных связей между токами координат (см. последние члены в уравнениях 1.1). Компенсация не осуществляется по координате X, так как предполагается равенство нулю тока по оси Y.
ФЗМ Формирователь Закона Модуляции блок алгоритма ШИМ с полным использованием напряжения звена постоянного тока.


ВНИМАНИЕ:
  • Имеющий глаза да увидит несколько необычное построение вычитающих блоков на входе регуляторов тока. В них сигнал задания тока вычитается из сигнала обратной связи, а не наоборот, как обычно бывает. Это связано с тем, что при координатных преобразованиях положительным считается фазный ток, вытекающий из источника напряжения. Для преобразования АВС=>XY источником является сеть, а для обратного преобразования, XY => АВС, источником является инвертор. Так как фазные токи с точки зрения сети и инвертора противоположны, требуется инвертирование задания и обратной связи в контуре тока, что и реализуется в структуре вычитающих блоков на входе его регуляторов.
  • На описании математики блоков подробно не останавливаюсь, так как она присутствует во внутренних структурах блоков, доступных пользователю SimInTech (смотрите внутреннюю структуру, читайте help на элементы).

4. Структура силовой части выпрямителя


Структура силовой части выпрямителя рассмотрена на основе ее математической модели в представлена на Рис.4.



Рис. 4 структурная схема модели силовой части выпрямителя

Параметры силовой схемы следующие:
L = 0.0015 Гн
С = 10 000 мкФ
Частота ШИМ 8.33 кГц


5. Работа модели


Пакет модели состоит из двух проектов, схемы которых приведены выше. Время интегрирования проекта системы управления равно такту ШИМ 160мкс Время интегрирования проекта силовой части 1мкс Синхронизация проектов с частотой обсчета проекта системы управления моделирует временную дискретность реальной (цифровой) системы управления.
Ниже приведено описание алгоритма работы пакета модели и поясняющие его работу графики (Рис.5, 6 и 7).


На участке 1 транзисторы инвертора выключены, происходит заряд емкости звена постоянного тока через диоды инвертора с ограничением тока на зарядном резисторе.
На участке 2 зарядный резистор шунтируется реле и на холостом ходу происходит повышение напряжения до заданного (700В).
На участке 3 ток нагрузки (50А) потребляется из сети.
На участке 4 ток нагрузки (-50А) рекуперируется в сеть.



Рис. 5

Рис. 6

Рис. 7

Токи сети имеют активный и синусоидальный характер. Содержание высших гармоник в токе по данным анализатора спектра графика в SimInTech составляет 4.4% .


Осциллограмма тока и напряжения фазы А и экран измерения режимов снятые при работе реального активного выпрямителя в качестве звена постоянного тока преобразователя частоты приведены на Рис.8 ниже.



Рис. 8

Можно констатировать, что ток и напряжение совпадают по фазе и Cos=1


Для связи с автором Юрий Николаевич Калачёв (Kalachev_i@mail.ru)
Подробнее..

Книга Глубокое обучение с подкреплением. AlphaGo и другие технологии

23.06.2020 12:07:45 | Автор: admin
image Привет, Хаброжители! Мы издали книгу Максима Лапаня shmuma, это подробное руководство по новейшим инструментам глубокого обучения с подкреплением и их ограничениям. Мы реализуем и проверим на практике методы кросс-энтропии и итерации по ценностям (Q-learning), а также градиенты по стратегиям.

Для экспериментов используются самые разные среды обучения с подкреплением (RL), начиная с классических CartPole и GridWorld и заканчивая эмуляторами Atari и средами непрерывного управления (на основе PyBullet и RoboSchool). Множество примеров основано на нестандартных средах, в которых мы с нуля разработаем модель окружения.


Для кого эта книга


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

Структура издания
Глава 1 Что такое обучение с подкреплением это введение в обучение с подкреплением и представление основных формальных моделей.

Глава 2 OpenAI Gym ознакомит читателя с практическим аспектом обучения с подкреплением с помощью библиотеки Gym с открытым исходным кодом.

Глава 3 Глубокое обучение с помощью PyTorch представляет собой краткий обзор библиотеки PyTorch.

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

Глава 5 Динамическое программирование и уравнение Беллмана это введение в семейство методик обучения с подкреплением с оценкой состояния.

Глава 6 Глубокие Q-сети описывает DQN расширение базовых методов оценки состояний, которые позволяют работать над сложными средами.

Глава 7 Расширения для DQN дает детальный обзор современных расширений метода DQN, обеспечивающих большие стабильность и сходимость в сложных средах.

Глава 8 Торговля акциями с использованием обучения с подкреплением это первый практический проект, в котором метод DQN применен к торгам на бирже.

Глава 9 Градиенты по стратегиям рассматривает другое семейство методов RL на основе оптимизации стратегии.

Глава 10 Метод актора-критика описывает один из наиболее широко используемых методов в RL.

Глава 11 Асинхронный метод актора-критика расширяет метод актора-критика взаимодействием с параллельными средами, чтобы улучшить стабильность и сходимость.

Глава 12 Тренировка чат-ботов с помощью обучения с подкреплением второй проект, в котором методы обучения с подкреплением применены к задачам NLP.

Глава 13 Веб-навигация еще один большой проект с применением обучения с подкреплением к навигации по веб-страницам; в нем использован набор задач MiniWoB.

Глава 14 Непрерывное пространство действий описывает специфику сред с использованием непрерывного пространства действий.

Глава 15 Доверительные области TRPO, PPO и ACKTR это еще одна глава о непрерывных пространствах действий, описывающая набор методов доверительной области.

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

Глава 17 Методы, основанные на моделях среды: воображение представляет основанный на моделях подход к RL с использованием результатов последних исследований о воображении в RL.

Глава 18 AlphaGo Zero описывает метод AlphaGo Zero в применении к игре Connect Four.


Обучение seq2seq


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

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


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

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

image

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

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

С первым токеном в декодированной последовательности, который должен порождаться токеном , заданным на входе, все ясно, но как насчет остальной части последовательности? Здесь есть два варианта. Первый подача токенов из сопоставляемого предложения. Например, если у нас есть тренировочная пара Je ne mange pas six jours > I haven't eaten for six days, мы подаем токены (I, havent, eaten) в декодировщик и затем используем потери на перекрестную энтропию между выводом RNN и следующим токеном в предложении. Этот режим обучения называется управляемым учителем (teacher forcing), и на каждом шаге мы вводим токен из правильного перевода, запрашивая у RNN корректный следующий токен. Данный процесс показан на схеме (рис. 12.5).

image

Выражение для потерь в предыдущем примере будет рассчитываться следующим образом:

L = xentropy(p1,"I") + xentropy(p2,"haven't") + xentropy(p3,"eaten") +   xentropy(p4,"for") + xentropy(p5,"six") + xentropy(p6,"days") +   xentropy(p7,"<END>")

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

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

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

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

Чтобы не допустить этого, существует второй подход к обучению seq2seq, называемый обучением по цепочке (curriculum learning). Этот метод использует те же самые потери на перекрестную энтропию, но вместо передачи полной целевой последовательности в качестве входных данных декодировщика мы просто просим его декодировать последовательность таким же образом, каким собираемся применять ее после обучения. Данный процесс иллюстрируется на следующей схеме (рис. 12.6). Это добавляет надежности декодировщику, что дает лучший результат при практическом применении модели.

image

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

Оценка Bilingual evaluation understudy


Прежде чем перейти к основной теме этой главы (RL для seq2seq), нам нужно ввести параметр, применяемый для сравнения качества вывода машинного перевода и обычно используемый в задачах NLP. Параметр Bilingual evaluation understudy (BLEU) является одним из стандартных способов сравнения выходной последовательности, создаваемой машиной, с некоторым набором опорных выходов. Он позволяет задействовать несколько эталонных выходов (одно предложение может быть переведено различными способами) и, по сути, вычисляет соотношение униграмм, биграмм и т. д., которые совместно используются полученными выводами и ссылочными предложениями.

Существуют и другие альтернативы, такие как CIDEr и ROGUE. В этом примере мы применяем BLEU, реализованный в библиотеке nltk из Python (пакет nltk.translate.bleu_score).

RL в seq2seq


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

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

Вторым преимуществом является оптимизация интересующего показателя. При обучении с использованием максимального правдоподобия мы сводим к минимуму перекрестную энтропию между созданными и взятыми из эталона токена ми, но при машинном переводе и решении многих других задач NLP нас не особо волнует максимальное правдоподобие: мы хотим максимизировать оценку BLEU полученной последовательности. К сожалению, оценка BLEU недифференцируема, поэтому мы не можем использовать ее как ошибку в алгоритме обратного распространения. Однако такие методы PG, как REINFORCE (см. главу 9), работают даже тогда, когда вознаграждение недифференцируемо: мы просто увеличиваем вероятности для успешных эпизодов и уменьшаем для неудачных.

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

Для того чтобы понять, как переключить обучение с максимального правдоподобия на сценарий RL, рассмотрим их оба с математической точки зрения. Оценка максимального правдоподобия означает максимизацию суммыimage путем подстройки параметра модели, что является тем же самым, что и минимизация расстояния Кульбака Лейблера между распределением вероятности данных и распределением вероятности, параметризованным моделью, которое может быть записано как максимизация выражения image

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

На практике REINFORCE для обучения seq2seq может быть записан в виде следующего алгоритма.

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

2. Инициализировать текущий токен специальным значением T = ''.

3. Инициализировать выходную последовательность пустой последовательностью Out = [].

4. Пока T != '':

  • получить распределение вероятностей токенов и новое скрытое состояние, передав текущие токен и скрытое состояние: p, H = Decoder (T, E);
  • сэмплировать выходной токен image из распределения вероятностей;
  • запомнить распределение вероятностей p;
  • добавить image в конец выходной последовательности Out += image;
  • установить текущий токен T image, E H.

5. Рассчитать BLEU или другой параметр между выходной и сопоставляемой последовательностями: Q = BLEU(Out, Outref).

6. Оценить градиенты image

7. Обновить модель с помощью SGD.

8. Повторять до достижения сходимости.

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


Описанный подход, несмотря на свои положительные стороны, сопряжен с рядом сложностей. Обучаться с нуля практически бесполезно. Даже для простых диалогов выходная последовательность обычно содержит минимум пять слов, каждое из которых взято из словаря в несколько тысяч слов. Число различных фраз, состоящих из пяти слов со словарем из 1000 слов, равно 51000, что немного меньше, чем 10700. Таким образом, вероятность получения правильного ответа в начале обучения, когда веса для кодировщика и декодировщика являются случайными, ничтожно мала. Чтобы справиться с этим, можно объединить подходы, основанные на максимальном правдоподобии и RL, и предварительно обучить модель с показателем максимального правдоподобия (переключение между обучением, управляемым учителем, и обучением по цепочке), а после того, как она достигнет некоторого уровня качества, переключиться на метод REINFORCE для тонкой настройки. В общем, это можно рассматривать как единый подход к сложным задачам RL, когда большое пространство действий делает невозможным старт с агентом, чье поведение случайно, поскольку вероятность того, что такой агент случайно достигнет цели, незначительна. Существует множество исследований, посвященных включению сгенерированных извне примеров в процесс обучения RL, и в них в качестве одного из подходов называют предварительное обучение с использованием максимальных правдоподобий на правильных действиях.

Еще одна проблема с методом REINFORCE высокая дисперсия градиентов, которую мы обсуждали в главе 10. Как вы, наверное, помните, для решения этой проблемы был применен метод актора-критика (A2C), который использовал специальную оценку ценности состояния в качестве дисперсии. Таким образом, мы можем применить метод A2C, конечно, расширив декодировщик другим выходом и вернув оценку ценности BLEU, учитывая декодированную последовательность, однако существует более удачный подход. В работе Self-Critical Sequence Training for Image Captionings, опубликованной С. Ренье (S. Rennie), Е. Марчереттом (E. Marcherett) и другими в 2016 году, был предложен лучший подход.

Авторы статьи применили декодировщик в режиме argmax для генерации последовательности, которая затем использовалась для вычисления параметра сход ства типа BLEU или аналогичного. Переключение в режим argmax делает процесс декодирования полностью детерминированным и обеспечивает базу для градиентов по стратегиям REINFORCE в формуле:

image

В следующем разделе мы реализуем и обучим простой чат-бот из набора диалогов, взятых из фильмов.

Об авторе


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

Максим живет в Москве (Российская Федерация) с семьей и работает в израильском стартапе в должности старшего разработчика NLP (Natural Language Processing обработка естественного языка).

О редакторах


Басем О. Ф. Алижла (Basem O. F. Alijla) получил степень кандидата наук по интеллектуальным системам в USM (Малайзия) в 2015 году. В данный момент преподает на кафедре разработки программного обеспечения Исламского университета сектора Газа (Палестина). Он автор нескольких технических работ, опубликованных в журналах и представленных на международных конференциях. Сейчас в круг его интересов входят оптимизация, машинное обучение и извлечение данных (Data mining).

Олег Васильев специалист в области информатики и инженерии данных. Участвовал в разработке программы Прикладная математика и информатика для Национального исследовательского университета Высшая школа экономики (Москва), в частности раздела о распределенных системах. Принимал участие в разработке Git-course, Practical_RL и Practical_DL, преподавал в Высшей школе экономики и Школе анализа данных Яндекса (YSDA). Ранее Олег был научным сотрудником в Dialog Systems Group и Yandex. В данный момент он занимает должность вице-президента по управлению инфраструктурой в GoTo Lab образовательной корпорации, а также сотрудничает с Digital Contract в качестве инженера-программиста.

Михаил Юрушкин кандидат математических наук, трудится в области прикладной математики. В сферу его исследований входят высокопроизводительные вычисления и оптимизация разработки компиляторов. Он участвовал в разработке современной системы оптимизации параллельной компиляции. Михаил старший преподаватель Южного федерального университета (Ростов-на-Дону, Россия). Он ведет курсы глубокого обучения, в частности на тему компьютерного зрения и NLP. Михаил восемь лет занимался кросс-платформенной нативной разработкой на С++, машинным обучением (ML) и глубоким обучением (DL). Сейчас он является консультантом в сферах ML/DL.

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

Для Хаброжителей скидка 25% по купону Глубокое обучение

По факту оплаты бумажной версии книги на e-mail высылается электронная книга.
Подробнее..

Перевод Смотрим на Chapel, D, Julia на задаче вычисления ядра матрицы

24.06.2020 14:16:49 | Автор: admin

Введение


Кажется, стоит вам отвернуться, и появляется новый язык программирования, нацеленный на решение некоторого специфического набора задач. Увеличение количества языков программирования и данных глубоко взаимосвязано, и растущий спрос на вычисления в области Data Science является связанным феноменом. В области научных вычислений языки программирования Chapel, D и Julia являются весьма релевантными. Они возникли в связи с различными потребностями и ориентированы на различные группы проблем: Chapel фокусируется на параллелизме данных на отдельных многоядерных машинах и больших кластерах; D изначально разрабатывался как более продуктивная и безопасная альтернатива C++; Julia разрабатывалась для технических и научных вычислений и была нацелена на освоение преимуществ обоих миров высокой производительности и безопасности статических языков программирования и гибкости динамических языков программирования. Тем не менее, все они подчеркивают производительность как отличительную особенность. В этой статье мы рассмотрим, как различается их производительность при вычислении ядра матрицы, и представим подходы к оптимизации производительности и другие особенности языков, связанные с удобством использования.

Вычисление ядра матрицы формирует основу методов в приложениях машинного обучения. Задача достаточно плохо масштабируется -O(m n^2), где n количество векторов, а m количество элементов в каждом векторе. В наших упражнениях m будет постоянным и мы будем смотреть на время выполнения в каждой реализации по мере увеличения n. Здесь m = 784 и n = 1k, 5k, 10k, 20k, 30k, каждое вычисление выполняется три раза и берется среднее значение. Мы запрещаем любое использование BLAS и допускаем использование только пакетов или модулей из стандартной библиотеки каждого языка, хотя в случае D эталон еще сравнивается с вычислениями, использующими Mir, библиотеку для работы с многомерными массивами, чтобы убедиться, что моя реализация матрицы отражает истинную производительность D. Подробности вычисления ядра матрицы и основных функций приведены здесь.

При подготовке кода для этой статьи сообщества Chapel, D и Julia были очень полезны и терпеливы в отношении всех моих обращений, чему я признателен.

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

Бенчмарки языков программирования на задаче вычисления ядра матрицы


Приведенная выше диаграмма (сгенерированная с помощью ggplot2 на R с помощью скрипта) показывает время выполнения для количества элементов n для Chapel, D, и Julia, для девяти вычислений ядра. D лучше всего работает в пяти из девяти случаев, Julia лучше в двух из девяти, а в двух задачах (Dot и Gaussian) картинка смешанная. Chapel был самым медленным для всех рассмотренных задач.
Стоит отметить, что математические функции, используемые в D, были взяты из math API языка C, доступного в D через core.stdc.math, так как математические функции в стандартной библиотеке std.math языка D бывают достаточно медленными. Использованные математические функции приведены здесь. Для сравнения рассмотрим скрипт mathdemo.d, сравнивающий C-функцию логарифма с D-функцией из std.math:
$ ldc2 -O --boundscheck=off --ffast-math --mcpu=native --boundscheck=off mathdemo.d && ./mathdemoTime taken for c log: 0.324789 seconds.Time taken for d log: 2.30737 seconds.

Объект Matrix, используемый в бенчмарке D, был реализован специально из-за запрета на использование модулей вне стандартных языковых библиотек. Чтобы удостовериться, что эта реализация конкурентоспособна, т.е. не представляет собой плохую реализацию на D, я ее сравниваю с библиотекой Mir's ndslice, тоже написанной на D. На диаграмме ниже показано время вычисления матрицы минус время реализации ndslice; отрицательное значение означает, что ndslice работает медленнее, что указывает на то, что используемая здесь реализация не представляет собой негативную оценку производительности D.


Условия тестирования


Код был выполнен на компьютере с операционной системой Ubuntu 20.04, 32 ГБ памяти и процессором Intel Core i9-8950HK @ 2.90GHz с 6-ю ядрами и 12-ю потоками.
$ julia --versionjulia version 1.4.1$ dmd --versionDMD64 D Compiler v2.090.1$ ldc2 --versionLDC - the LLVM D compiler (1.18.0):  based on DMD v2.088.1 and LLVM 9.0.0$ chpl --versionchpl version 1.22.0

Компиляция


Chapel:
chpl script.chpl kernelmatrix.chpl --fast && ./script

D:
ldc2 script.d kernelmatrix.d arrays.d -O5 --boundscheck=off --ffast-math -mcpu=native && ./script

Julia (компиляция не требуется, но может быть запущена из командной строки):
julia script.jl


Реализации


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

Chapel


Chapel использует цикл forall для распараллеливания по потокам. Также используется C-указатели на каждый элемент, а не стандартное обращение к массивам, и применяется guided итерация по индексам:
proc calculateKernelMatrix(K, data: [?D] ?T){  var n = D.dim(0).last;  var p = D.dim(1).last;  var E: domain(2) = {D.dim(0), D.dim(0)};  var mat: [E] T;  var rowPointers: [1..n] c_ptr(T) =    forall i in 1..n do c_ptrTo(data[i, 1]);  forall j in guided(1..n by -1) {    for i in j..n {      mat[i, j] = K.kernel(rowPointers[i], rowPointers[j], p);      mat[j, i] = mat[i, j];    }  }  return mat;}
Код на Chapel был самым трудным для оптимизации по производительности и потребовал наибольшего количества изменений кода.

D


Для распараллеливания кода D используется taskPool потоков из пакета std.parallel. Код на D претерпел наименьшее количество изменений для оптимизации производительности большая польза от использования специфического компилятора и выбранных ключей компиляции (обсуждается далее). Моя реализация Matrix позволяет отобрать столбцы по ссылке с помощью refColumnSelect.
auto calculateKernelMatrix(alias K, T)(K!(T) kernel, Matrix!(T) data){  long n = data.ncol;  auto mat = Matrix!(T)(n, n);  foreach(j; taskPool.parallel(iota(n)))  {    auto arrj = data.refColumnSelect(j).array;    foreach(long i; j..n)    {      mat[i, j] = kernel(data.refColumnSelect(i).array, arrj);      mat[j, i] = mat[i, j];    }  }  return mat;}

Julia


Код Julia использует макрос threads для распараллеливания кода и макрос views для ссылок на массивы. Единственное, что сбивает с толку с массивами в Julia это их ссылочный статус. Иногда, как и в этом случае, массивы будут вести себя как объекты-значения, и на них нужно ссылаться с помощью макроса views, иначе они будут генерировать копии. В других случаях они ведут себя как ссылочные объекты, например, при передаче их в функцию. С этим может быть немного сложно разобраться, потому что вы не всегда знаете, какой набор операций сгенерирует копию, но там, где это происходит, views обеспечивает хорошее решение.
Тип Symmetric позволяет сэкономить немного дополнительной работы, необходимой для отражения в матрице.
function calculateKernelMatrix(Kernel::K, data::Array{T}) where {K <: AbstractKernel,T <: AbstractFloat}  n = size(data)[2]  mat = zeros(T, n, n)  @threads for j in 1:n      @views for i in j:n          mat[i,j] = kernel(Kernel, data[:, i], data[:, j])      end  end  return Symmetric(mat, :L)end
Макросы @ bounds и @ simd в основных функциях использовались для отключения проверки границ и применения оптимизации SIMD к вычислениям:
struct DotProduct <: AbstractKernel end@inline function kernel(K::DotProduct, x::AbstractArray{T, N}, y::AbstractArray{T, N}) where {T,N}  ret = zero(T)  m = length(x)  @inbounds @simd for k in 1:m      ret += x[k] * y[k]  end  return retend
Эти оптимизации достаточно заметны, но очень просты в применении.

Использование памяти


Суммарное время для каждого бенчмарка и общая используемая память была собрана с помощью команды /usr/bin/time -v. Вывод для каждого из языков приведен ниже.

Chapel занял наибольшее общее время, но использовал наименьший объем памяти (почти 6 Гб оперативной памяти):
Command being timed: "./script"User time (seconds): 113190.32System time (seconds): 6.57Percent of CPU this job got: 1196%Elapsed (wall clock) time (h:mm:ss or m:ss): 2:37:39Average shared text size (kbytes): 0Average unshared data size (kbytes): 0Average stack size (kbytes): 0Average total size (kbytes): 0Maximum resident set size (kbytes): 5761116Average resident set size (kbytes): 0Major (requiring I/O) page faults: 0Minor (reclaiming a frame) page faults: 1439306Voluntary context switches: 653Involuntary context switches: 1374820Swaps: 0File system inputs: 0File system outputs: 8Socket messages sent: 0Socket messages received: 0Signals delivered: 0Page size (bytes): 4096Exit status: 0

D расходует наибольший объем памяти (около 20 ГБ оперативной памяти на пике), но занимает меньше общего времени, чем Chapel для выполнения:
Command being timed: "./script"User time (seconds): 106065.71System time (seconds): 58.56Percent of CPU this job got: 1191%Elapsed (wall clock) time (h:mm:ss or m:ss): 2:28:29Average shared text size (kbytes): 0Average unshared data size (kbytes): 0Average stack size (kbytes): 0Average total size (kbytes): 0Maximum resident set size (kbytes): 20578840Average resident set size (kbytes): 0Major (requiring I/O) page faults: 0Minor (reclaiming a frame) page faults: 18249033Voluntary context switches: 3833Involuntary context switches: 1782832Swaps: 0File system inputs: 0File system outputs: 8Socket messages sent: 0Socket messages received: 0Signals delivered: 0Page size (bytes): 4096Exit status: 0

Julia потратила умеренный объем памяти (около 7,5 Гб пиковой памяти), но выполнялась быстрее всех, вероятно, потому что ее генератор случайных чисел является самым быстрым:
Command being timed: "julia script.jl"User time (seconds): 49794.85System time (seconds): 30.58Percent of CPU this job got: 726%Elapsed (wall clock) time (h:mm:ss or m:ss): 1:54:18Average shared text size (kbytes): 0Average unshared data size (kbytes): 0Average stack size (kbytes): 0Average total size (kbytes): 0Maximum resident set size (kbytes): 7496184Average resident set size (kbytes): 0Major (requiring I/O) page faults: 794Minor (reclaiming a frame) page faults: 38019472Voluntary context switches: 2629Involuntary context switches: 523063Swaps: 0File system inputs: 368360File system outputs: 8Socket messages sent: 0Socket messages received: 0Signals delivered: 0Page size (bytes): 4096Exit status: 0

Оптимизация производительности


Процесс оптимизации производительности на всех трех языках был очень разным, и все три сообщества были очень полезны в этом процессе. Но были и общие моменты.
  • Статическая диспетчеризация функций ядра вместо использования полиморфизма. Это означает, что при передаче функции ядра используется параметрический (времени компиляции) полиморфизм, а не динамический (времени исполнения), при котором диспетчеризация с виртуальными функциями влечет за собой накладные расходы.
  • Использование представлений/ссылок, вместо копирования данных в многопоточном режиме, имеет большое значение.
  • Распараллеливание вычислений имеет огромное значение.
  • Знание того, что массив является основным для строки/столбца, и использование этого в вычислениях имеет огромное значение.
  • Проверки границ и оптимизации компилятора дают огромную разницу, особенно в Chapel и D.
  • Включение SIMD в D и Julia внесло свой вклад в производительность. В D это было сделано с помощью флага -mcpu=native, а в Julia это было сделано с помощью макроса @ simd.

С точки зрения специфики языка, наиболее сложным был переход к производительному коду в Chapel, и код в Chapel больше всего изменился: от простых для чтения операций с массивами до использования указателей и управляемых итераций. Но со стороны компилятора было относительно легко добавить --fast и получить большой прирост производительности.

Код на D изменился очень мало, и большая часть производительности была получена за счет выбора компилятора и его флагов оптимизации. Компилятор LDC богат возможностями оптимизации производительности. Он имеет 8 -O уровней оптимизации, но некоторые из них повторяются. Например, -O, -O3 и -O5 идентичны, а других флагов, влияющих на производительность, бесчисленное множество. В данном случае использовались флаги -O5 --boundscheck=off -ffast-math, представляющие собой агрессивные оптимизации компилятора, проверку границ, и LLVM's fast-math, и -mcpu=native для включения инструкций векторизации.

В Julia макросы в рассмотренных ранее изменениях заметно улучшили производительность, но они не были слишком запутанными. Я попробовал изменить уровень оптимизации -O, но это не улучшило производительность.

Качество жизни


В этом разделе рассматриваются относительные плюсы и минусы, связанные с удобством и простотой использования каждого языка. Люди недооценивают усилия, затрачиваемые на повседневное использование языка; необходима значительная поддержка и инфраструктура, поэтому стоит сравнить различные аспекты каждого языка. Читателям, стремящимся избежать TLDR, следует прокрутить до конца данного раздела до таблицы, в которой сравниваются обсуждаемые здесь особенности языка. Было сделано все возможное, чтобы быть как можно более объективным, но сравнение языков программирования является сложным, предвзятым и спорным, поэтому читайте этот раздел с учетом этого. Некоторые рассматриваемые элементы, такие как массивы, рассматриваются с точки зрения Data Science/технических/научных вычислений, а другие являются более общими.

Интерактивность


Программистам нужен быстрый цикл кодирования/компиляции/результата во время разработки, чтобы быстро наблюдать за результатами и выводами для того, чтобы двигаться вперёд либо вносить необходимые изменения. Интерпретатор Julia самый лучший для этого и предлагает гладкую и многофункциональную разработку, а D близок к этому. Этот цикл кодирования/компиляции/результата может быть медленным даже при компиляции небольшого кода. В D есть три компилятора: стандартный компилятор DMD, LLVM-компилятор LDC и GCC-компилятор GDC. В этом процессе разработки использовались компиляторы DMD и LDC. DMD компилирует очень быстро, что очень удобно для разработки. А LDC отлично справляется с созданием быстрого кода. Компилятор Chapel очень медленный по сравнению с ним. В качестве примера запустим Linux time для компилятора DMD и для Chapel для нашего кода матрицы без оптимизаций. Это дает нам для D:
real0m0.545suser0m0.447ssys0m0.101s

Сравним с Chapel:
real0m5.980suser0m5.787ssys0m0.206s

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

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

Документация и примеры


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

Документация Julia наиболее близка по качеству к документации на Python и даёт пользователю очень плавный, детальный и относительно безболезненный переход на язык. Она также имеет богатую экосистему блогов, и темы по многим аспектам языка легкодоступны. Официальная документация D не так хороша и может быть сложной и разочаровывающей, однако существует очень хорошая бесплатная книга Программирование на D, которая является отличным введением в язык, но ни одна единичная книга не может охватить язык программирования целиком и не так много исходных текстов примеров для продвинутых тем. Документация Chapel достаточно хороша для того, чтобы сделать что-то, хотя представленные примеры различаются по наличию и качеству. Часто программисту требуется знать, где искать. Хорошая тема для сравнения библиотеки файлового ввода/вывода в Chapel, D и Julia. Библиотека ввода/вывода Chapel содержит слишком мало примеров, но относительно ясна и проста; ввод/вывод D распределён по нескольким модулям, и документации более сложно следовать; документация по вводу/выводу Julia содержит много примеров, и она ясна и проста для понимания.

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

Поддержка многомерных массивов


Массивы здесь относятся не к массивам в стиле С и С++, доступным в D, а к математическим массивам. Julia и Chapel поставляются с поддержкой массивов, а D нет, но у него есть библиотека Мир, которая содержит многомерные массивы (ndslice). В реализации расчета ядра матрицы я написал свой объект матрицы в D, что несложно, если понимать принцип, но это не то, что хочет делать пользователь. Тем не менее, в D есть линейная библиотека алгебры Lubeck, которая обладает впечатляющими характеристиками производительности и интерфейсами со всеми обычными реализациями BLAS. Массивы Julia, безусловно, самые простые и знакомые. Массивы Chapel сложнее для начального уровня, чем массивы Julia, но они спроектированы для запуска на одноядерных, многоядерных системах и компьютерных кластерах с использованием единого или очень похожего кода, что является хорошей уникальной точкой притяжения.

Мощность языка


Поскольку Julia это динамический язык программирования, некоторые могут сказать: Ну, Julia это динамический язык, который гораздо более разрешительный, чем статические языки программирования, поэтому дебаты закончены, но все гораздо сложнее. В статических системах типов есть свое могущество. У Julia есть система типов, похожая по своей природе на системы типов из статических языков, так что вы можете писать код так, как если бы вы использовали статический язык, но вы можете делать вещи, зарезервированные только для динамических языков. Она имеет высокоразвитый синтаксис общего и мета-программирования, а также мощные макросы. Она также имеет очень гибкую объектную систему и множественную диспетчеризацию. Это сочетание возможностей делает Julia самым мощным языком из трех.

D был задуман как замена C++ и взял очень много от C++ (а также заимствовал из Java), но делает шаблонное программирование и вычисления времени компиляции (CTFE) намного более удобными для пользователя, чем в C++. Это язык с одиночной диспетчеризацией (хотя есть пакет с мультиметодами). Вместо макросов в D есть mixin для строк и шаблонов, которые служат аналогичной цели.

Chapel имеет поддержку дженериков и зарождающуюся поддержку для ООП с одиночной диспетчеризацией, в нем нет поддержки макросов, и в этих вопросах он ещё не так зрел, как D или Julia.

Конкурентность и параллельное программирование


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

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

Julia имеет хорошую поддержку как конкурентности, так и параллелизма.

D имеет промышленно- сильную поддержку конкурентности и параллелизма, хотя его поддержка многопоточности гораздо менее хорошо документирована примерами.

Стандартная библиотека


Насколько хороша стандартная библиотека всех трех языков в целом? Какие задачи она позволяют пользователям легко выполнять? Это сложный вопрос, потому что при этом учитываются качество библиотеки и фактор документирования. Все три языка имеют очень хорошие стандартные библиотеки. В D самая полная стандартная библиотека, но Julia отличная вторая, потом Chapel, но все никогда не бывает так просто. Например, пользователь, желающий написать бинарный ввод/вывод, может найти Julia самой простой для начинающего; она имеет самый простой, понятный интерфейс и документацию, за ней следует Chapel, а затем D. Хотя в моей реализации программы для чтения IDX-файлов, ввод/вывод D был самым быстрым, но зато код Julia было легко написать для случаев, недоступных на двух других языках.

Менеджеры и экосистема пакетов


С точки зрения документации, использования и возможностей, менеджер пакетов D Dub является наиболее полным. D также имеет богатую экосистему пакетов на веб-сайте Dub, зато менеджер пакетов Julia тесно интегрирован с GitHub и является хорошей пакетной системой с хорошей документацией. У Chapel есть менеджер пакетов, но нет высокоразвитой экосистемы.

Интеграция с Cи


Cи- интероперабельность проста в использовании на всех трех языках; Chapel имеет хорошую документацию, но не так популярен, как другие. Документация на языке D лучше, а документация на языке Julia самая полная. Однако, как ни странно, ни в одной документации по языкам нет команд, необходимых для компиляции вашего собственного кода на C и его интеграции с языком, что является недосмотром, особенно когда дело касается новичков. Тем не менее, в D и Julia легко искать и найти примеры процесса компиляции.

Сообщество


Для всех трех языков есть удобные места, где пользователи могут задавать вопросы. Для Chapel, самое простое место это Gitter, для Julia это Discourse (хотя есть и Julia Gitter), а для D это официальный форум сайта. Julia сообщество является наиболее активным, а затем D, а затем Chapel. Я обнаружил, что вы получите хорошие ответы от всех трех сообществ, но вы, вероятно, получите более быстрые ответы по D и Julia.
Chapel D Julia
Компиляция/ Интерактивность Медленная Быстрая Лучшая
Документация & Примеры Детальные Лоскутные Лучшие
Многомерные массивы Да Только родные
(библиотека)
Да
Мощность языка Хорошая Отличная Лучшая
Конкурентность & Параллелизм Отличная Отличная Хорошая
Стандартная библиотека Хорошая Отличная Отличная
Пакетный менеджер & Экосистема Зарождающаяся Лучшая Отличная
Си -Интеграция Отличная Отличная Отличная
Сообщество Маленькое Энергичное Наибольшее
Таблица характеристик качества жизни для Chapel, D & Julia

Резюме


Если вы начинающий программист, пишущий числовые алгоритмы и выполняющий научные вычисления, и хотите быстрого и простого в использовании языка, Julia это ваш лучший выбор. Если вы опытный программист, работающий в той же области, Julia все еще является отличным вариантом. Если вы хотите более традиционный, промышленный, статически скомпилированный, высокопроизводительный язык со всеми свистоперделками, но хотите что-то более продуктивное, безопасное и менее болезненное, чем C++, то D это ваш лучший вариант. Вы можете написать что угодно в D и получить отличную производительность благодаря его компиляторам. Если вам нужно, чтобы вычисления массивов происходили на кластерах, то Chapel, наверное, самое удобное решение.

С точки зрения грубой производительности в этой задаче, D был победителем, явно демонстрируя лучшую производительность в 5 из 9 эталонных задач. Исследование показало, что ярлык Julia как высокопроизводительного языка это нечто большее, чем просто шумиха он обладает собственными достоинствами в сравнении с высококонкурентными языками. Было сложнее, чем ожидалось, получить конкурентоспособную производительность от Chapel команде Chapel потребовалось много исследований, чтобы придумать текущее решение. Тем не менее, по мере того, как язык Chapel взрослеет, мы сможем увидеть дальнейшее улучшение.
Подробнее..

Перевод Алгоритм MADDPG OpenAI

29.06.2020 14:12:48 | Автор: admin
Начинаем неделю с продолжения серии статей, подготовленных специально для базового и продвинутого курсов Математика для Data Science.

В конце статьи, поделимся с вами списком самых интересных материалов по этой теме.




Новый подход


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

  • Нестационарности между независимыми агентами;
  • Экспоненциального роста пространств действий и состояний.


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

Централизованное планирование


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

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

Децентрализованное выполнение


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

OpenAI


Исследователи из OpenAI, Калифорнийского университета в Беркли и Университета Макгилла, представили новый подход к мультиагентным настройкам с помощью Multi-Agent Deep Deterministic Policy Gradient. Такой подход, вдохновленный своим одноагентным аналогом DDPG, использует обучение вида актер-критик и показывает очень многообещающие результаты.

Архитектура


Данная статья предполагает, что вы знакомы с одноагентной версией MADDPG: Deep Deterministic Policy Gradients или DDPG. Чтобы освежить память, вы можете прочитать замечательную статью Криса Юна.

У каждого агента есть пространство наблюдений и непрерывное пространство действий. Также у каждого агента есть три компонента:

  • Сеть актеров, который использует локальные наблюдения для детерминированных действий;
  • Целевая сеть актеров с аналогичным функционалом для стабильного обучения;
  • Сеть критиков, которая использует совместные пары состояние-действие для оценки Q-значений.


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

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


Архитектура MADDPG (Lowe, 2018)

Обучение


Во-первых, MADDPG использует воспроизведение опыта (experience replay) для эффективного off-policy обучения. На каждом промежутке времени агент хранит следующий переход:



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

Обновления критика


Для обновления центрального критика агента мы используем lookahead TD-ошибку:



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

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

Обновления актеров


Подобно одноагентной DDPG мы используем deterministic policy gradient для обновления каждого параметра актера агента.



Где это актер агента.

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

Выводы из политик и ансамбли политик


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



Где мы видим функцию потерь для i-ого агента, оценивающего политику j-ого агента с помощью регуляризатора энтропии. В результате, наше целевое Q-значение становится немного другим, когда мы заменяем действия агента своими прогнозируемыми действиями!



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

Ансамбли политик


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

Градиент политики немного изменяется. Мы берем среднее значение по K подполитикам, используем линейность ожидания и распространяем обновления с помощью функции Q-значения.



Вернемся на шаг назад


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

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


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

Результаты


MADDPG был апробирован во многих средах. Полный обзор его работы можно найти в статье [1]. Здесь мы поговорим только о задаче кооперативной коммуникации.

Обзор среды


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

Сравнение


Для решения этой задачи в статье противопоставляются MADDPG и современные одноагентные методы. С использованием MADDPG видны значительные улучшения.

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

Наконец, ансамбли политик показали очень многообещающие результаты. В статье [1] исследуется влияние ансамблей в конкурентной среде и демонстрируется значительное улучшение производительности по сравнению с агентами с одной политикой.

Заключение


Вот и все. Здесь мы рассмотрели новый подход к мультиагентному обучению с подкреплением. Конечно, существует бесконечное количество методов, относящихся к MARL, однако MADDPG обеспечивает прочный фундамент для методов, которые решают самые глобальные проблемы мультиагентных систем.

Источники


[1] R. Lowe, Y. Wu, A. Tamar, J. Harb, P. Abbeel, I. Mordatch, Multi-Agent Actor-Critic for Mixed Cooperative-Competitive Environments (2018).



Список полезных статей






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


Подробнее..

Из песочницы Кластерный метод решения транспортной задачи

05.07.2020 18:06:24 | Автор: admin

Оптимизация в бизнесе в подавляющем числе случаев связана с применением метода линейного программирования. Метод достаточно понятен. Кроме того, имеется теорема существования и единственности решения.

Однако на практике все обстоит не совсем просто.

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

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

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

Вторая проблема ограничение переменной снизу (x>h>0). Любая реализация метода линейного программирования всегда обеспечит не нулевое значение x. Если x будет в точности равно h, то это означает, что значение переменной x по сути должно быть нулевым. На практике такие фиктивные объемы (эксцесс метода) разбрасывают по содержательным переменным. Следствие такой практики эрозия понятия оптимального решения, что особенно важно, если такое решение одно из многих в цепочке решений.

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

Транспортная задача


Пример соответствует транспортной задаче линейного программирования.
Имеется 5 перевозчиков (задача ставилась для перевозки угля), у которых действует двух тарифный расчет. Границы тарифов и сами тарифы можно менять (они заданы параметрически).


Перевозки задаются как точка-точка (по принятой методике при перевозке угля) и объем.
Общий вид интерфейса.


Область задания перевозок.


Кластерный метод решения


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


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

Чем хорош кластерный метод:

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


При большем количестве перевозок имеем следующую картину (фрагмент).


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

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

Категории

Последние комментарии

© 2006-2020, personeltest.ru