Чудище обло, озорно, огромно, стозевно и лаяй.
В начало поста вынесен эпиграф к книге «Путешествие из Петербурга в Москву» Александра Николаевича Радищева (1749-1802), что в переводе означает "Чудовище тучное, гнусное, огромное, стозевное и лающее". Это, пожалуй, самый точный* "портрет" системы символьных вычислений Maxima после логичности, простоты и превосходной документации Maple.
В инженерной практике очень часто бывает необходимо по-быстрому взять интеграл, продифференцировать длинное и занудное выражение, сложить пару километровых матриц или ещё чего по мелочи. Делать это от руки, хотя и можно, но лениво - вот тут нам и пригодится система компьютерной алгебры Maxima, которая есть в любом уважающем себя дистрибутиве.
Установка Maxima
Скачивать Maxima с варёзных сайтов, в отличие от Maple, не надо (а если всё-таки надо, скачать Maxima бесплатно можно на официальном сайте). В Debian просто устанавливаем:
aptitude install wxmaxima maximaСтоит подчеркнуть, что без wxmaxima, которая предоставляет возможность копирования результатов в LaTeX, автозакрытия двоеточием и форматированным выводом, сама Maxima почти бесполезна и крайне раздражает своим невменяемым интерфейсом - настолько, что чаще сделать всё от руки проще и быстрее.
Графическая оболочка сильно выправляет ситуацию с идиотскими косяками текстового режима и делает Maxima в целом съедобной. В конце команды не забываем написать точку с запятой, если работаем с консольным интерфейсом. В графической среде это сделают за нас.
Выход из Maxima
Это достойно интерфейса одного текстового редактора, который пищит и всё портит. Чтобы выйти из Maxima, нужно дать команду:
quit();Как признаётся даже официальная документация, "This is a bit confusing for new users, but you must type that full command". Почему бы не наступить на горло собственной песне и сделать хотя бы вот это просто и пряморуко, автор понять не в силах. Опять-таки, графический интерфейс всё делает за нас.
Простые вычисления
Вот есть у нас выражение типа x^2 , и мы хотим его вычислять, меняя x. Это достигается следующей хитроумной конструкцией:
(%i2) at (x^2, [x=7]);
(%o2) 49
(%i3)
Или ещё. Если мы хотим упрощать что-то вроде a - b + 2*a то Maxima это надо разжевать, положить в ротик, залить кипяточком и хорошенько пнуть:
(%i19) K(s):= s^2+2;
(%i22) expand(K(s)-s^2);
(%o22) 2
То есть функция eval тут не проходит, обязательно expand. И функцию объявляем с явным прописыванием переменной вот так: K(s):= s^2+2;
Ну и наконец, как выглядит мнимая единица в Maxima? Вот как:
(%i12) (0.1*%i)^2;
(%o12) -0.01
То есть i это в Maxima вот так: %i
Матрицы
Так как по роду приходится иметь дело с линейной алгеброй и (отчасти) символьными вычислениями, приходится иметь дело с оценкой свойств матриц. В силу того, что я ленивый и несколько забывчивый, мне приходится использовать Maxima с её откровенно наркоманским интерфейсом считать матрицы, особенно если они параметрические.
Определение матрицы
(%i16) A: matrix([1,e],[3,4]);
[ 1 e ]
(%o16)
[ ]
[ 3 4 ]
То есть строки набиваются через [], разделение строк и каждого элемента - запятая.
Простейшие операции с матрицами
Например, нужно нам матрицу умножить саму на себя, но это будет параметрическая матрица:
(%i1) A: matrix([a,b],[c,d]);Теперь умножим матрицу саму на себя. Казалось бы, это очевидно: K*K даст желаемый результат:
[ a b ]
(%o1) [ ]
[ c d ]
(%i15) K*K;
[ 2 2 ]
[ a b ]
(%o15)
[ ]
[ 2 2 ]
[ c d ]
Однако это вызывает удивлённую реакцию в формате "что за ...?". Дело в том, что очевидное у пользователей и у программистов Maxima разное, и операция K*K даст нам поэлементное умножение матрицы. А чтобы получить обычное матричное умножение (строка на столбец), используем операцию K.K и получаем:
(%i16) K.K;
[ 2 ]
[ b c + a b d + a b ]
(%o16) [ ]
[ ]
[ c d + a c d + b c ]
искомое умножение матриц. Подсыпаем ещё подосиновиков в турбокальян, и, попыхивая чёрным дымом, медленно двигаемся дальше.
Упрощение\выполнение символических вычислений
Пусть у нас есть перемножение нескольких матриц, ячейки которых содержат параметры. Мы слишком ленивы (и это правильно), чтобы делать это вручную, поэтому попробуем запрячь Maxima на выполнение этого. Например, умножили несколько матриц, и хочется развернуть алгебраическое выражение в каждой ячейке:
(%i21) A*A1.A;
[ c (c c1 + b b1) b (b c1 + b1 c) ]
(%o21) [ ]
[ b (b c1 + b1 c) c (c c1 + b b1) ]
Тут можно бы предположить, что пройдёт вариант с функцией ev если использовать её как detout:
(%i22) ev A*A1.A;
Incorrect syntax: a is not an infix operatorevSpaceA*^
Тут нас облаяли, но и синтаксис:
(%i22) ev(A*A1.A);
[ c (c c1 + b b1) b (b c1 + b1 c) ]
(%o22) [ ]
[ b (b c1 + b1 c) c (c c1 + b b1) ]
желаемого не даёт. А жаль. Впрочем, Капитан Документация спешит на помощь: нужна функция expand:
(%i23) expand(A*A1.A);
[ 2 2 ]
[ c c1 + b b1 c b c1 + b b1 c ]
(%o23) [ ]
[ 2 2 ]
[ b c1 + b b1 c c c1 + b b1 c ]
Это сэкономило нам пять минут ручной работы, но прибавило десять минут поиска в документации. Неплохо, бывало и хуже.
Вычисление детерминанта матрицы в Maxima
Это делается сравнительно длинной командой determinant:
(%i17) determinant(A);
(%o17) 4 - 3 e
Автодополнением в консоли даже не думайте пользоваться: оно всё заменит на ЗАГЛАВНЫЕ БУКВЫ и вычислять откажется, что в общем ставит вопрос вменяемости разработчиков ещё острее.
Производные
Для вычисления производных испольуем функцию diff в формате
diff ( f(x), x, k)где:
- f(x) == дифференцируемая функция
- x == переменная, по которой следует дифференцировать
- k == порядок производной (k=1 - первая производная, k=2 - вторая производная)
(%i14) diff(1/(s+1)^2,s);Вторая производная от той же функции:
2
(%o14) - --------
3
(s + 1)
(%i15) diff(1/(s+1)^2,s,2);Всё работает правильно.
6
(%o15) --------
4
(s + 1)
Преобразование Лапласа
Если вы занимаетесь или изучаете теорию автоматического управления (Control Theory), вам очень даже пригодится прямое и обратное преобразование Лапласа (Laplace Transform)
Для расчёта
(%i8) ilt(1/(1+s^2)^2,s,t);
sin(t) t cos(t)
(%o8) ------ - --------
2 2
(%i6) laplace(1,t,s);
1
(%o6) -
s
Автор недоумевает по поводу отсутствия такой тривиальной вещи в Максиме, как Z-transform. Вроде бы Максиме не полгода, и цифровые контроллеры сейчас вроде как распространены достаточно, чтобы об этом подумать. Но не здесь.
Заключение и дискуссии
В целом: MAXIMA можно пользоваться ТОЛЬКО с графическим интерфейсом, который нужно устанавливать сразу же. Пакет в Debian называется wxmaxima и особенно при первом знакомстве будет очень кстати. Максима страдает обычными опенсорсными болячками: дурная документация и не всегда логичный командный интерфейс. Если же заткнуть нос и уши, поставив wxmaxima, Максимой пользоваться можно с некоторым даже комфортом: вы даже сможете копировать выхлоп Максимы в формате ЛаТеХ.
Ссылки
Имеет место быть, хотя и довольно топорная, но всё-таки официальная документация. В разогретый кальян хорошо бы покрошить ссылки о базовых способах вычислений в Maxima.
У издательства Alt Linux, как выясняется, есть очень неплохая книга Е.А. Чичкарева "Компьютерная математика с Maxima".
Стараниями уважаемых комментаторов нашёлся:
- хороший "10-ти минутный туториал" по Максиме (ин инглиш), есть оный туториал и на русском.
- примеры из книжки Maxima by Example,
- ещё примеры (теперь уже на русском).
- подборка из журнала LinuxFormat про Maxima.
- Maxima доступна и онлайн.
- Расчет лабы по физике в Maxima, решение прикладных задач с помощью Maxima.
- рисование графиков в Maxima через "Gnuplot and VTK"(английский).
- Книжка Maxima для физиков [PS]
У издательства Alt Linux есть очень неплохая книга "Компьютерная математика с Maxima" за авторством Е.А. Чичкарева. Ищется в сети при необходимости)
ОтветитьУдалитьЕсть хороший "10-ти минутный туториал" по Максиме:
ОтветитьУдалитьhttp://math-blog.com/2007/06/04/a-10-minute-tutorial-for-solving-math-problems-with-maxima/
Хорошие примеры лежат тут:
http://www.csulb.edu/~woollett/
и в Кастисе:
http://lib.custis.ru/Maxima
Тарнавскго вы уже наверное видели, но вдруг:
http://wiki.linuxformat.ru/index.php/LXF81:Maxima
А консольная Максима оооочень хороша в больших "многоходовых" расчетах - причем можно посмотреть логи того, что считалось вручную в wxMaxima - и скомпоновать из их .mac-файл, который скормить консольной версии.
maxima -b laminarn.mac
При желании можно законектить это на Тот-Самый-Редактор (ну или emacs) чтобы иметь в одном окне скрипт с подсветкой и всеми прочими плюшками (:set ft=maxima), в другом - результат вычислений - и наращивая ходы одной-двумя кнопками просматривать результаты.
Из очень полезных консольных команд - tex() - которая "делает TeX" - например tex(%); - распечатать предыдущее выражение в техе. Еще можно сразу определить как должна выглядеть переменная в ТеХ-представлении - есть команда texput() - но это тема отдельного разговора.
Словом, зная инструмент - есть где развернуться :)
собственно, пример рабочего скрипта для:
ОтветитьУдалитьhttp://pastebin.com/V7C4nQPs
сохраняется в файл и скармливается консольной максиме:
maxima -b file.mac
в пастебине подсветки для этого формата нет, но в любом продвинутом текстовом редакторе он как правило находится :)
А вот и автор, пришёл насаждать демократию :-)
ОтветитьУдалить@Дрозд Олег комментирует...
У издательства Alt Linux есть очень неплохая книга "Компьютерная математика с Maxima" за авторством Е.А. Чичкарева.
Не знал - добавил в список литературы. Спасибо.
Альтлинукс теперь и книги выпускает? Надо же, удивительное рядом :-)
Ищется в сети при необходимости
Нет варёзу! Мы же честные люди - пойдём и купим :-)
[Тут автор покосился на свою коллекцию научных книг размером в 12Гб, покраснел и начал шаркать ножкой].
@tengu911 комментирует...
Огромное спасибо за ссылки. Про 10-минутный туториал я честно забыл, но добавил в пост (как и другие ссылки). Тут надо заметить, что автор Максиму пользует от случая к случаю, и в основном по мелочам, с упором на теорию управления (которую я к своей адаптивной оптике прилаживаю).
Тарнавскго вы уже наверное видели
Видел, и читал, но не знал, что его выложили в открытый доступ. Добавил в пост.
А консольная Максима оооочень хороша в больших "многоходовых" расчетах
Не спорю, просто консоль у Максимы, которая переводит всё в КАПСЛОК и отказывается выполнять после этого - несколько раздражает.
При желании можно законектить это на Тот-Самый-Редактор
этот у меня для конфигов, а Kate - для души :-)
Из очень полезных консольных команд - tex() - которая "делает TeX"
В принципе, графическая морда всё делает за нас - собственно, тем она и хороша.
Словом, зная инструмент - есть где развернуться :)
Это верно, просто, как уже отмечалось выше, Максима для меня - типа моторной лодки. То есть обычно рыбачу с удочкой, но иногда нужно пойти за дальний кордон, а тут инструкция к применению толщиной с Войну и Мир :-) Приведённое в посте - наиболее часто забываемые вещи.
собственно, пример рабочего скрипта для:
Ох мать честна... :-) Выкладывать такое в пост страшно, но себе на дробокс скачал. Мало ли, пригодится.
И ещё раз спасибо тов.tengu911 за информативные комментарии. Если ещё какие ссылки найдутся - милости просим.
virens, какой вы, однако, полезный человек)
ОтветитьУдалитьесли у меня возникают проблемы с тех, я их решаю в основном этим блогом, если мне нужно осилить максиму, я снова натыкаюсь в гугле на этот блог. Я почти уверен, что следующее, что мне понадобится из околонаучных штук в линуксе, уже описано здесь:)
@dojik комментирует...
ОтветитьУдалитьесли у меня возникают проблемы с тех, я их решаю в основном этим блогом
В общем-то, я тоже так решаю свои ТеХнические проблемы. :-)
Нет, серьёзно. Всё расписано, со ссылками. Удобно. Это и был (и продолжает им быть) лейтмотив этого бложика: дешевле один раз сесть и описать, как что-то делать, чем каждый раз искать решение заново.
Как там говорилось в мультфильме "Крылья, ноги и хвосты"? "Лучше день потерять, зато потом за пять минут долететь".
если мне нужно осилить максиму, я снова натыкаюсь в гугле на этот блог.
:-)
Там вон выше тов.tengu911 ссылок полезных накидал. У него в пэйстбине такой могучий пример лежит, что даже мне страшно его приводить тут.
Я почти уверен, что следующее, что мне понадобится из околонаучных штук в линуксе, уже описано здесь:)
Почему околонаучных? Вполне себе научных. Гнуплот, латех и матлаб - нормальные исследовательские инструменты.
Помимо латеха и октавы, есть у меня в загашниках ещё пост по Scilab. Мне он нравится ещё меньше Максимы, и там много затейливых ругательств :-)
А так да, здесь много постов по мотивам моих приключений с научным софтом. Вообще, бложик с Дебиана плавно перетёк в Гнуплот+Латех. Собственно, это мои основные инструменты. Ну и Матлаб конечно, куда ж без него. Кстати, есть у меня пара постов в черновиках про sparse matrix в MATLAB и про численную линейную алгебру. Надо бы выложить, что ли...
Я не хотел сказать, что это ненаучно, я вложил в это слово смысл "связанный с наукой", а не "псевдонаучный" или что похуже.
ОтветитьУдалитьОгромное упущение статьи: не указано, что на пробу Maxima доступна и онлайн. Прежде, чем выливать ушат помоев на авторов Maxima, нужно ознакомиться с историей создания. Не надо использовать Maxima только как калькулятор и пытаться получить результат парой кликов. Я соглашусь только по поводу странных обозначений, в остальном - Maxima ты не освоил.
ОтветитьУдалитьбез wxmaxima, которая предоставляет возможность копирования результатов в LaTeX, автозакрытия двоеточием и форматированным выводом, сама Maxima почти бесполезна
Maxima - это консольная версия-то? Ну ты и загнул, virens. Про tex(%); уже сказали; поскольку «вывод результата вычисления можно заглушить, завершив команду символом $ вместо ;», то автозакрытие неуместно. А какой еще может быть вывод в консоли, если не в виде псевдографики?
Чтобы выйти из Maxima, нужно дать команду: quit();
Но кто ж так делает? Если в консоли, то просто Ctrl+D.
Если мы хотим упрощать что-то вроде a - b + 2*a то Maxima это надо разжевать, положить в ротик, залить кипяточком и хорошенько пнуть
У меня все работает без магии:
(%i5) a+b+2*a;
(%o5) b + 3 a
И так, между прочим, тоже:
(%i6) K(s):=s^2+2$
(%i7) K(s)-s^2;
(%o7) 2
тоже занимаюсь научными делами отошел от матлаб в сторону С++ +qt+plplot, octave как калькулятор.
ОтветитьУдалитьА максима это вроде ближе к wolfram mathematica, в матлаб кстати тоже есть мощный символьный движок
virens,
ОтветитьУдалить> В Debian просто устанавливаем:
> aptitude install wxmaxima maxima
а мне больше нравится так (maxima подтянется как зависимость):
# apt-get install wxmaxima
iv_vl,
>> Чтобы выйти из Maxima, нужно дать команду: quit();
> Но кто ж так делает? Если в консоли, то просто Ctrl+D.
кстати, был удивлен, что эта комбинация работает во многих консольных программах (например, bc).
Кстати, в KDE4 есть Cantor - фронтенд к различным алгебраическим системам, в том числе и к maxima
ОтветитьУдалитьС какой реализацией коммон лиспа собрана максима у автора?
ОтветитьУдалитьMaxima за 10 минут на русском: http://lugnsk.org/lugnskru/2010/03/wxmaxima-za-10-minut.html
ОтветитьУдалить-на русском:
ОтветитьУдалитьРасчет лабы по физике в Maxima
http://bit.ly/Nzupjh
Решение прикладных задач с помощью Maxima
http://bit.ly/Mmz6Na
Численное решение дифференциальных уравнений
http://bit.ly/NBy5hJ
- на испанском и английском языках по рисованию графиков в Maxima через "Gnuplot and VTK" (Ну и ещё немного сопутствующей информации)
http://riotorto.users.sourceforge.net/index.html
А есть ли графические интерфейсы для Maxima в Windows кроме wxmaxima? Для научных вычислений использую Scilab. Удобно писать небольшие программы для вычислений.
ОтветитьУдалить> есть ли графические интерфейсы для Maxima в Windows кроме wxmaxima?
ОтветитьУдалитьВроде на Tcl/Tk еще что-то есть
В дебиановских пакетах максима собрана с GNU Common Lisp. Не самый лучший выбор мягко говоря.
Про автодополнение в консольной максиме:
http://www.math.utexas.edu/pipermail/maxima/2009/018463.html
>> (%i2) at (x^2, [x=7]);
ОтветитьУдалитьНу уж вот это-то можно проще:
(%i1) x^2, x=7;
(%o1) 49
Причём, этой же конструкцией можно подставлять не только одиночные переменные, но и целые выражения (veryBigFormula, sqrt(x^2-5+9) = d).
Кстати, говорят (http://freetonik.com/sage/), что в Sage можно использовать maxima. Сам не пробовал, потому как необходимости не было, но, судя по роликам, система довольно интересная.
ОтветитьУдалитьЗ.Ы. Что-то в моём Firefox сломалось, не хочет капчу показывать. Соответственно посты не проходят. Из Оперы работает нормально :(
Доброе утро!
ОтветитьУдалитьПишу здесь впервые, но сам пару раз уже пользовался -- хочу немного отдать долг :).
На http://maxima.sourceforge.net/ru/documentation.html
есть ссылка на книгу: Ильина, Силаев Maxima для физиков: http://tex.bog.msu.ru/numtask/max07.ps
Наверное, наиболее подробное изложение среди того, что мне удалось найти. Хотя точка зрения у авторов довольно экстремистская :).
@iv_vl комментирует...
ОтветитьУдалитьОгромное упущение статьи: не указано, что на пробу Maxima доступна и онлайн.
А я и не знал. Исправил, спасибо за подсказку.
Я соглашусь только по поводу странных обозначений
Собственно, на это критика и была нацелена.
@Анонимный комментирует...
отошел от матлаб в сторону С++
В моей области это выливается в неприлично долгое время разработки.
в матлаб кстати тоже есть мощный символьный движок
Если не ошибаюсь, он там тягает Maple.
@Sparcher комментирует...
а мне больше нравится так (maxima подтянется как зависимость):
А мне так не нравится - мало ли каких зависимостей после перекура травы мейнтейнеры насуют? У меня однажды при попытке установить tomboy по зависимостям подтянулся... GRUB! :-)
@overmind88 комментирует...
Кстати, в KDE4 есть Cantor
У меня на КДЕ4 аллергия. Впрочем, спасибо за инфо.
@Анонимный комментирует...
С какой реализацией коммон лиспа собрана максима у автора?
Со сквизёвой :-)
@Анонимный комментирует...
Спасибо за ссылку!
@basilio комментирует...
Мучо грациас за ссылки, Басилио!
ЛУГ Мифи, ну надо же. Хотя оно уже теперь и не мифи, но тем не менее мерси.
@Дмитрий Цымай комментирует...
А есть ли графические интерфейсы для Maxima в Windows кроме wxmaxima?
Честно - не знаю. А что не так с wxmaxima?
Для научных вычислений использую Scilab.
Редкостный глюкодром, особенно в Xcos (оно ни одну сколько-нибудь сложную задачу симулировать не могло). Книг нет, справки тоже. Тогда уже лучше Octave - на Матлаб переучиваться не придётся.
@Анонимный комментирует...
В дебиановских пакетах максима собрана с GNU Common Lisp. Не самый лучший выбор мягко говоря.
Поддерживаю тов.Анонимуса. Консольная максима в дебиане, скажем так, мало съедобна. Что тон поста, в целом, и отражает :-)
Про автодополнение в консольной максиме
Вот в этом весь опенсорц: это не наш велосипед, это всё Лисп!
@Portnov комментирует...
Причём, этой же конструкцией можно подставлять не только одиночные переменные, но и целые выражения
О, спасибо за идею!
@Basil Orlov комментирует...
Кстати, говорят, что в Sage
О да, этот Грендайзер-звездолёт, который ещё даже не заводится, уже давно обещает уделать всех и вся. Который ко всему прочему ещё и на питоне. А пока оно там собирается, мы лучше на древнем (но работающем) MATLAB что-нибудь полезное навяем :-)
Что-то в моём Firefox сломалось, не хочет капчу показывать.
Вырубил на время капчу.
Я её использую, чтобы отбить всяких СЕОшных исчадий с большими членами :-)
@Victor Kuznetsov комментирует...
Пишу здесь впервые, но сам пару раз уже пользовался -- хочу немного отдать долг
Комментарии принимаются ко всем постам, так что не стесняйтесь.
есть ссылка на книгу: Ильина, Силаев
Добавил в ссылки.
Хотя точка зрения у авторов довольно экстремистская
Главное, чтобы понятно было, а то некоторые и конвексную оптимизацию любят объяснять так, что волосы шевелятся не только на голове :-)
Ссылки добавил, пост немного поправил.
Огромное спасибо комментаторам!
Вот ещё до кучи: "MAXIMA HOWTO":
ОтветитьУдалитьhttp://www.uic.unn.ru/~zoav1/writings/maxima-howto.html
Честно говоря, в своё время накопал кучу документации по maxima. Уже даже не помню откуда. До кучи вот на английском языке:
ОтветитьУдалитьDOE-Maxima Reference Manual: www.math.psu.edu/glasner/Max_doc/macref.pdf
Maxima CAS 6: The Draw plugin: http://howtodraw.idham.info/maxima-cas-6-the-draw-plugin/
> Автор недоумевает по поводу отсутствия такой тривиальной вещи в Максиме, как Z-transform
ОтветитьУдалитьaptitude install maxima-share
/etc/init.d/eyes restart
Правильно использовать максиму (и гнуплот) из Емакса. Так же почитайте man info.
ОтветитьУдалитьв емаксе набираем
c-h i
m maxima
s строкапоиска
У wxMaxima большие проблемы с относительно большими числами. Например, 2^(10^4) в wxMaxima это
ОтветитьУдалить199506311688075838488374216268[2951 digits]686391511681774304792596709376
в то время как в консоли и в XMaxima это ожидаемое
19950631168807583848837421626835850838234968318861924548520089498529438830221946631919961684036194597899331129423209124271556491349413781117593785932096323957855730046793794526765246551266059895520550086918193311542508608460618104685509074866089624888090489894838009253941633257850621568309473902556912388065225096643874441046759871626985453222868538161694315775629640762836880760732228535091641476183956381458969463899410840960536267821064621427333394036525565649530603142680234969400335934316651459297773279665775606172582031407994198179607378245683762280037302885487251900834464581454650557929601414833921615734588139257095379769119277800826957735674444123062018757836325502728323789270710373802866393031428133241401624195671690574061419654342324638801248856147305207431992259611796250130992860241708340807605932320161268492288496255841312844061536738951487114256315111089745514203313820202931640957596464756010405845841566072044962867016515061920631004186422275908670900574606417856951911456055068251250406007519842261898059237118054444788072906395242548339221982707404473162376760846613033778706039803413197133493654622700563169937455508241780972810983291314403571877524768509857276937926433221599399876886660808368837838027643282775172273657572744784112294389733810861607423253291974813120197604178281965697475898164531258434135959862784130128185406283476649088690521047580882615823961985770122407044330583075869039319604603404973156583208672105913300903752823415539745394397715257455290510212310947321610753474825740775273986348298498340756937955646638621874569499279016572103701364433135817214311791398222983845847334440270964182851005072927748364550578634501100852987812389473928699540834346158807043959118985815145779177143619698728131459483783202081474982171858011389071228250905826817436220577475921417653715687725614904582904992461028630081535583308130101987675856234343538955409175623400844887526162643568648833519463720377293240094456246923254350400678027273837755376406726898636241037491410966718557050759098100246789880178271925953381282421954028302759408448955014676668389697996886241636313376393903373455801407636741877711055384225739499110186468219696581651485130494222369947714763069155468217682876200362777257723781365331611196811280792669481887201298643660768551639860534602297871557517947385246369446923087894265948217008051120322365496288169035739121368338393591756418733850510970271613915439590991598154654417336311656936031122249937969999226781732358023111862644575299135758175008199839236284615249881088960232244362173771618086357015468484058622329792853875623486556440536962622018963571028812361567512543338303270029097668650568557157505516727518899194129711337690149916181315171544007728650573189557450920330185304847113818315407324053319038462084036421763703911550639789000742853672196280903477974533320468368795868580237952218629120080742819551317948157624448298518461509704888027274721574688131594750409732115080498190455803416826949787141316063210686391511681774304792596709376