Математика. Настоящий учебник посвящен системе Mathematica прикладному пакету компьютерной алгебры, при помощи которого можно решать любые задачи, в которых в той или иной форме встречается математика
Скачать 4.43 Mb.
|
Итак, что должен знать тот же мистер Майер, американский мил- лионер, если он является начинающим митьком? 12 Именно в таком порядке: мы только потому знаем, верно ли то, что мы говорим, что мы точно знаем, что именно мы говорим. С другой стороны, мы только потому знаем, что мы говорим, что мы абсолютно точно знаем, о чем именно мы говорим. В ответ на весь слабоумный бред, который по этому поводу несли философы от Гегеля до Виттгенштейна, в этой главе мы констатируем, что у математики есть субстрат. Более того, из этого субстрата она и произрастает. 45 Ниже приводятся новые митьковские слова, выражения м цита- ты, которые м-ру Майеру необходимо выучить для полноценного общения с окружающими. В общении с согражданами м-р Майер может произносить большинство выражений по английски. Алек- сандр Флоренский любезно сделал перевод на то, что он считает английским языком. Хотя этот перевод даже увеличивает при- митивистскую мощь митьковских выражений, он заставил меня прибегать к обратному переводу. Владимир Шинкарев. Митьки В настоящей главе мы описываем работу с системой Mathematica как с продвинутым научным калькулятором. Мы объясняем, как проводятся все обычные вычисления с числами, многочленами, рациональными дробя- ми, элементарными функциями, векторами, матрицами, и т.д. Основные излагаемые в этой главе темы включают: • Решение всех обычных вычислительных задач школьной математики: арифметические операции, алгебраические преобразования, решение урав- нений и неравенств, а также систем уравнений и неравенств, исследование функций. • Построение графиков функций одной и двух переменных, парамет- рических графиков и графиков неявных функций, графическое решение неравенств и простейшая двумерная графика. • Решение всех обычно излагаемых на младших курсах университетов задач так называемой “высшей математики”: ряды, произведения и пре- делы, дифференцирование и интегрирование функций одной и нескольких переменных • Решение всех обычно излагаемых на младших курсах университетов задач линейной алгебры: решение систем линейных уравнений, умноже- ние и обращение матриц, вычисление определителей, собственных чисел и собственных векторов и т.д. Примеры подобраны так, чтобы после беглого знакомства с содер- жанием этой главы — даже не вникая в детали — школьник или сту- дент младших курсов был в состоянии самостоятельно решать при помощи системы Mathematica все встречающиеся ему в курсе математики вычислительные задачи. С другой стороны, мы приложили все усилия к тому, чтобы большин- ство приводимых нами примеров были математически осмысленными и содержательными. Они призваны либо проиллюстрировать уже зна- комые читателю явления, либо познакомить его с такими классическими объектами и фактами, которые с большой вероятностью встретятся ему при проведении самостоятельных вычислений. В отличие от многих наших коллег, настойчиво изгоняющих из препода- вания математики всякую конкретику, мы не видим абсолютно никакого вреда в том, чтобы начинающий как можно раньше услышал о золотом 46 сечении, биномиальных коэффициентах, числах Стирлинга, числах Бер- нулли, числах Фибоначчи, числах Каталана, гармонических числах, много- членах Бернулли, гауссовых многочленах, многочленах Чебышева, цикло- томических многочленах, гамма-функции Эйлера, дзета-функции Римана, фигурах Лиссажу, эллиптических кривых, плоскости Фано, кватернионах и октавах, формуле Фаа ди Бруно, функциях Бесселя, функциях Эйри, интегральном логарифме, интегральной экспоненте, интегральных синусе и косинусе, полилогарифме, гипергеометрических функциях, интегралах Френеля, стандартных матричных единицах, матрицах Картана, матрице Гильберта, якобиевых матрицах, определителе Вандермонда, определителе Коши, и десятках других важнейших вещей. Все это классические объ- екты, которые возникают в самой математике и ее приложениях в сотнях самых различных контекстов. Наша собственная позиция прямо противоположна: мы считаем, что зна- ние определителя Вандермонда гораздо важнее знакопеременной формулы для определителя в общем случае. Более того, мы выскажем уже совер- шенно крамольную мысль, что не только для физика, но и для любого математика-неспециалиста, знание полутора десятков классических диф- ференциальных уравнений, структуры и поведения их решений, гораздо важнее всех теорем существования и единственности решений в общем слу- чае, вместе взятых. Математика — чрезвычайно конкретная наука и любые общие факты только тогда становятся общими фактами, когда они опираются на глубокое понимание примеров, конкретных частных случа- ев, притом на такое понимание, которое может быть в целом и во всех деталях доведено до исчерпывающего ответа и объяснено школьнику ше- стого класса. Кроме всего прочего, большинство этих конкретных объектов с необходимостью появляются уже на самых первых шагах в компьютер- ной математике и анализе алгоритмов — и каждый, кто хочет профес- сионально использовать вычисления, должен быть готов к тому, что мир настоящей математики намного богаче и увлекательнее того скуд[оум]ного набора общих фраз, к которым сводятся курсы “элементарной” и “высшей” математики. Несколько слов о том, чего нет в этой главе. Мы не обсуждаем ком- пьютерные доказательства геометрических теорем. Дело в том, что хотя с технической точки зрения это совсем несложно, при этом требуется прин- ципиально другой уровень алгебраической культуры (знакомство хотя бы с рудиментами коммутативной алгебры и алгебраической геометрии, бази- сами Гребнера, etc.) Кроме того, мы лишь коротко упоминаем ряд важней- ших общих тем, традиционно вообще не входящих в курсы математики для нематематиков, таких, как комбинаторика, теория чисел и алгебра (вычис- ления в группах, кольцах, etc.) и ряд более специальных тем, излагаемых на старших курсах: теория вероятностей, оптимизация, etc. Впрочем, неко- торые темы из алгебры, комбинаторики и теории чисел ненавязчиво звучат в нашем учебнике — по крайней мере в той степени, в которой это абсо- лютно необходимо при обсуждении собственно программистских вопросов. 47 § 1. Арифметика Arithmetic is being able to count up to twenty without taking off your shoes. Mickey Mouse Системы компьютерной алгебры обесценивают большинство традицион- ных вычислительных навыков, которым обучают в школьном курсе ма- тематики. Все задачи школьной математики, вычисления с целыми, ра- циональными, вещественными и комплексными числами, алгебраические манипуляции, решение уравнений и неравенств, а также систем уравнений и неравенств, построение графиков функций, тригонометрические преоб- разования, геометрические построения выполняются этими системами за тысячные доли секунды, а доказательство теорем элементарной геометрии — за несколько секунд. • Вычисления с целыми числами. На самом примитивном уровне Mathematica является очень мощным калькулятором, работающим с числами неограниченной разрядности, притом работающим с ними го- раздо эффективнее, чем подавляющее большинство специализированных численных приложений!!! Сейчас мы предложим Mathematica вычислить 180(2 127 −1) 2 + 1 (это самое большое простое число известное к началу 1952 года, оно было открыто Миллером и Уиллером на компьютере EDSAC1): In[1]:=180*(2^127-1)^2+1 Out[1]=521064401567922879406069432539095585333589 8483908056458352183851018372555735221 В арифметических вычислениях знаки +, - и / имеют обычный смысл, од- нако обратите внимание на использование * и ^ для обозначения умножения и возведения в степень. Фактически разрядность ариф- метических вычислений лимитируется только объемом памяти, так как даже на пределе этого объема вычисления занимают доли секунды. На- пример, возведение 2 в степень 1 000 000 000 — дающее число с 301 029 996 знаками — еще в начале 2000-х занимало на нашем компьютере лишь чет- верть секунды. А вот еще один очень поучительный диалог, в котором мы спрашиваем, равны ли два числа и получаем ответ, что они действительно равны: In[2]:=2682440^4+15365639^4+18796760^4==20615673^4 Out[2]=True Иными словами, действительно 2682440 4 + 15365639 4 + 18796760 4 = 20615673 4 . Эти четыре числа, найденные в 1988 году Ноамом Элкисом 13 , представля- ют собой контрпример к гипотезе Эйлера, который по аналогии с гипотезой 13 N.D.Elkies, On A 4 + B 4 + C 4 = D 4 . — Math. Comput., 1988, vol.51, p.825–835. 48 Ферма предположил, что уравнение x 4 + y 4 + z 4 = w 4 не имеет решений в ненулевых целых числах. Обратите внимание на использование двойного знака равенства ==, который трактуется как уравнение, в данном случае вопрос о том, равна левая часть правой, или нет. A parte: довольно уди- вительно, что Эйлер задал столь наивный вопрос, ведь ему было известно не только наименьшее решение уравнения x 4 + y 4 = z 4 + w 4 в целых числах: 59 4 + 158 4 = 635318657 = 133 4 + 134 4 , но и параметрические семейства таких решений. Интересно, что уравнение u 5 + v 5 + x 5 + y 5 = w 5 тоже имеет решение в совсем маленьких числах: 27 5 + 84 5 + 110 5 + 133 5 = 61917364224 = 144 5 , хотя, по-видимому, найти вручную даже такое совсем маленькое решение довольно трудно. • Вычисления с рациональными числами. Разумеется, вычисления с рациональными числами ничуть не сложнее вычислений с целыми чис- лами — в действительности, это и есть вычисления с парами целых чисел. Вот, например, таблица первых 20 чисел Бернулли B n 14 : In[3]:=Table[BernoulliB[n], {n,1,20}] Out[3]= {-1/2,1/6,0,-1/30,0,1/42,0,-1/30,0,5/66,0,-691/2730,0, 7/6,0,-3617/510,0,43867/798,0,-174611/330 } А вот их сумма и произведение чисел с четными номерами In[4]:=Sum[BernoulliB[n], {n,1,20}] Out[4]=-932396477/1939938 In[5]:=Product[BernoulliB[n], {n,2,20,2}] Out[5]=-19144150084038739/940848823474560000 Обратите внимание на естественные названия операций: таблица называ- ется Table, сумма — Sum, произведение — Product. При некотором навыке и небольшом знании английского языка в большинстве случаев Вы будете в состоянии угадать название любой команды Mathematica с одной, двух, максимум трех попыток. Если команда, осуществляющая интегрирование, не называется Integral, то она просто обязана называться Integrate. Об- ратите внимание также на естественную форму итератора: {n,1,20} — сумма по n от 1 до 20; {n,2,20,2} — произведение по n от 2 до 20 с шагом 2. Эта форма знакома Вам из языка C. Для разнообразия Maple использует форму итератора, принятую в Pascal, а именно, n=1..20. 14 Здесь и далее в нашем учебнике результаты расчета Out[*] представляются в виде InputForm - таком же как и In[*]. Это удобно для использования результата “как есть” в последующих преобразованиях. В пакете Mathematica изменение вида представления содержимого ячейки доступно пользователю через через меню Cell-Convert To... (см. § 3) или через контекстное меню - щелчок правой кнопкой мыши в пределах ячейки. 49 • Вычисления с вещественными числами. Особенностью системы Mathematica по сравнению с обычными системами численных вычислений является использование вычислений бесконечной точности. Это значит, что никаких округлений при вычислениях с точными веществен- ными числами такими, как √ 2, e и π — или, на языке Mathematica, Sqrt[2], E, Pi — не производится. Если нам нужно десятичное прибли- жение числа x с точностью до n значащих цифр, мы можем просто спросить N[x,n]. При помощи Mathematica мы можем проделать любое вычисление с вещественными числами, которое можно было бы проделать при помо- щи научного калькулятора с неограниченным количеством разрядов — и много более того. У многих школьников, когда они впервые знакомятся с числами π и e, возникает вопрос, что больше, e π или π e ? Как мы только что объяснили, попытка непосредственно вычислить E^Pi и Pi^E и посмотреть на то, что получится, не приведет к успеху, так как Mathematica трактует эти числа как точные вещественные числа, а какие там у точных чисел десятичные знаки? Однако Mathematica умеет сравнивать точные веще- ственные числа. Ввод E^Pi>Pi^E дает значение True. Конечно, мы можем посмотреть и на любое количество десятичных разрядов, ну, скажем, для начала на 20: In[6]:= {N[E^Pi,20],N[Pi^E,20]} Out[6]= {23.140692632779269006,22.459157718361045473} Мы оформили это вычисление в виде списка, так как хотели увидеть оба ответа вместе. Бесконечная точность совершенно необходима для того, чтобы контро- лировать явление, известное в компьютерной алгебре как high-precision fraud 15 . Дело в том, что недостаточная точность часто приводит к по- явлению артефактов 16 . Известно много поразительных примеров, когда значения двух естественно заданных функций совпадают с точностью до тысяч и даже миллионов знаков после запятой, так что никакие прибли- женные вычисления не позволяют сказать, равны эти значения или нет. Вот один из самых знаменитых примеров — число e π √ 163 , настолько близ- ко к целому, что даже вычисление 12 знаков после запятой не позволяет сказать, что это число не целое: In[7]:=NumberForm[N[Exp[Pi*Sqrt[163]],30], ExponentFunction->(Null&)] Out[7]=262537412640768743.999999999999 Для профессионалов заметим, что этот факт ошеломителен лишь на пер- вый взгляд, после секундного раздумья каждый компетентный математик 15 J.M.Borwein, P.B. Borwein, Strange series and high precision fraud. — Amer. Math. Monthly, 1992, vol.99, N.7, p.622–640. 16 Артефактом в компьютерной алгебре называется ошибочный результат или наблю- даемое явление, не отвечающее существу рассматриваемой задачи, порожденные недо- статочной точностью вычисления и/или использованием в процессе вычисления плохих алгоритмов (ошибочных, неустойчивых или очень медленно сходящихся). 50 должен увидеть его связь с тем фактом, что кольцо Z[ √ −163] является кольцом главных идеалов!!! И действительно, числа e π √ 67 и e π √ 43 тоже чрезвычайно близки к целым, хотя, конечно, и не с такой изумительной точностью. Мы уже знаем, что Sqrt[163] обозначает √ 163, где Sqrt — стандартное сокращение от Square Root, принятое в большинстве языков программирования, Exp[x], естественно, обозначает экспоненту e x , а функ- ция N[x,30] показывает нам первые тридцать десятичных знаков числа x. Использование функции NumberForm и опции ExponentFunction->(Null&) нужно только для того, чтобы Mathematica не пыталась выражать эти чис- ла в научной форме, с разделением мантиссы и порядка. Мы могли бы с таким же успехом напечатать просто N[Exp[Pi*Sqrt[163]],30], но тогда, конечно, ответ имел бы менее наглядную форму, 2.62537412640768743999999999999 × 10 17 , в которой нужно было бы еще мысленно сдвинуть десятичную точку на 17 позиций вправо. Однако небольшое дальнейшее увеличение точности показывает, что это число, все-таки, не целое: In[8]:=NumberForm[N[Exp[Pi*Sqrt[163]],40],ExponentFunction->(Null&)] Out[8]=262537412640768743.9999999999992500725972 В приведенных выше примерах мы ограничивались небольшим количе- ством десятичных знаков. В действительности Mathematica может рабо- тать с сотнями тысяч или миллионами десятичных знаков. Время, нужное для вычисления первого миллиона знаков π, e и √ 2 или первых ста ты- сяч знаков e π , π e и √ 2 √ 3 , исчисляется несколькими секундами или, в худ- шем случае (профессиональным вычислителям предлагается угадать, ка- кой случай худший!), десятком секунд. Но не пытайтесь выводить все эти знаки на экран, так как форматирование вывода занимает гораздо больше времени, чем само вычисление!!! Таким образом, единственным реальным ограничением для дальнейшего увеличения разрядности становится опера- тивная память используемого Вами компьютера. • Вычисления с комплексными числами. Ясно, что вычисления с комплексными числами ничуть не сложнее — а на самом деле часто проще! — чем с вещественными. Комплексное число z ∈ C можно задавать, напри- мер, в алгебраической форме z = x + iy, где x, y ∈ R суть его вещественная и мнимая части, соответственно, а i — мнимая единица, i 2 = 1. Нас не должно удивлять, что в Mathematica следует печатать z=x+I*y — мы уже привыкли, что имена всех внутренних объектов начинаются с за- главной буквы. Если Mathematica уверена, что x и y вещественные числа (например, если она знает, что это вещественные числа или если мы специ- фицировали домен, которому принадлежат x и y, и этот домен содержится в домене вещественных чисел), то она истолковывает их как вещественную и мнимую часть z: In[9]:=z=E+I*Pi; {Re[z],Im[z],Abs[z],Arg[z],Conjugate[z]} Out[9]= {E,Pi, √ E^2+Pi^2,ArcTan h Pi E i ,E+I*Pi } 51 Снова мы видим, что в Mathematica все функции называются так, как они на самом деле называются: ◦ Re[z] — вещественная часть z, ◦ Im[z] — мнимая часть z, ◦ Abs[z] — модуль z (абсолютная величина), ◦ Arg[z] — аргумент z, ◦ Conjugate[z] — сопряженное к z комплексное число, и т.д. Именно высочайшая степень предсказуемости и согласованность язы- ка системы Mathematica с обычным математическим языком облегчают ее использование по сравнению со всеми остальными системами сопоставимой силы и относятся к числу ее главных достоинств. Ясно, однако, что Ma- thematica ориентируется на англоязычную терминологию и типографские традиции. Так, например, в этом примере мы видим, что arctg(x) обозна- чается через arctan(x) или, на языке системы ArcTan[x] — каждый корень, входящий в состав многосложного слова, пишется с заглавной буквы. В школьной математике принято заучивать значения основных тригоно- метрических функций углов 60 o , 45 o и 30 o . Между тем есть еще один столь же замечательный угол, а именно, 36 o , значения основных тригонометриче- ских функций в котором являются квадратичными иррациональностями. Иными словами, как знали еще древние греки, круг можно разделить на 5 — или, что то же самое, на 10 — равных частей при помощи циркуля и линейки. Определим комплексное число η, вещественная часть которого равна cos(π/5), а мнимая — sin(π/5): In[10]:=eta=Cos[Pi/5]+I*Sin[Pi/5] Out[10]= 1 2 *I* r 1 2 *(5- √ 5)+ 1 4 *(1+ √ 5) Попробовав вычислить η 2 мы не получим ничего интересного: In[11]:=eta^2 Out[11]= 1 2 *I* r 1 2 *(5- √ 5)+ 1 4 *(1+ √ 5) 2 Дело в том, что — и мы многократно столкнемся с этим в дальнейшем! — ни одна интеллигентная система компьютерной алгебры не проводит преобразований, если она не уверена, что их применение упростит форму исходного выражения. В частности, она автоматически не применяет дис- трибутивность ни в ту ни в другую сторону или, пользуясь школьным жар- гоном, не раскрывает скобок и не выносит общие множители. В тот момент, когда Вы поймете, почему системы компьютерной алгебры устроены таким образом, Вы сделаете решающий шаг к пониманию того, как добиться от системы ответа на любой вопрос в интересующей Вас форме. В частности, для комплексных чисел — и комплексных функций! – в системе имеется функция ComplexExpand, которая заставляет искать вещественную и мни- мую часть. Поэтому если Вы хотите увидеть η 2 в алгебраической форме, нужно просить чуть настойчивее: 52 In[12]:=ComplexExpand[eta^2] Out[12]=- 1 4 + √ 5 4 +I* 1 4 * r 1 2 *(5- √ 5)+ 1 4 * r 5 2 *(5- √ 5) ! Теперь Вас, вероятно, уже не удивит, что спросив ComplexExpand[eta^5] мы получим -1. § 2. Многочлены и рациональные дроби Чуда не вижу я тут. Генерал-лейтенант Захаржевский В урне той дно просверлив, воду провел чрез нее. Алексей Константинович Толстой, Царскосельская статуя Каждый, кто заглядывал в ее внутреннее устройство, знает, что серд- цевину системы Mathematica составляют вычисления с многочле- нами от нескольких переменных. Здесь Mathematica в своей стихии и заведомо превосходит остальные системы общего назначения — nobody can beat me in the kitchen. Начнем с чего-нибудь совсем простенького. • Вычисления с многочленами. Любая новая переменная, которой до сих пор не присваивалось значения, рассматривается системой как неза- висимая переменная. Например, если мы до сих пор не присваивали значений x, y, z, u, v, w, то мы можем использовать их как независимые по- линомиальные переменные. В действительности, конечно, в предыдущем параграфе мы уже присвоили z значение, так что если мы хотим снова использовать ее как переменную, мы должны удалить ее значения и опре- деление посредством ClearAll[z] или, может быть, даже посредством ра- дикального Remove[z]. Если мы этого не сделаем, система будет подстав- лять вместо z ее старое значение E+I*Pi, а это, видимо, совсем не то, что мы хотели. Самая страшная тайна компьютерной алгебры состоит в том, что использование старых значений переменных является основ- ным источником ошибок!!! Если нам не хватает букв латинского алфа- вита, мы можем использовать в качестве имени переменной любое слово, скажем, xx, xxx, xy, strength, dexterity, constitution, wisdom, intel- ligence, charisma, hitpoints, armourclass, experience, bandwidth, и т.д. Иногда, например, если Вы обзовете переменную length, depth или power, система будет слегка встревожена (slightly alarmed), так как будет счи- тать, что Вы хотели обратиться к какой-то из ее встроенных функций, но сделали опечатку, набрав строчную букву вместо заглавной. Однако после того, как Вы один раз проигнорируете ее жалобу, она внесет это новое имя в глобальный контекст и в дальнейшем уже не будет проявлять по это- му поводу никаких признаков беспокойства. Основное правило грамотного программирования состоит в том, чтобы присваивать локальным и ча- сто встречающимся переменным короткие имена, а глобальным и редко встречающимся переменным — длинные имена. Если Вам не хватает букв, Вы можете использовать цифры, например, x1,x2,x3,x4 могут обозначать x 1 , x 2 , x 3 , x 4 . Единственное правило, которого при этом 53 нужно придерживаться, состоит в том, что имя переменной не может на- чинаться с цифры. Однако имейте в виду, что если Вам нужно несколько десятков, сотен или тысяч однородных переменных, то их следует оформ- лять в виде массива Array или списка List, Table — мы сами обычно так и поступаем уже с тремя или четырьмя переменными! С многочленами можно проделывать все обычные операции: ◦ арифметические операции, ◦ деление с остатком PolynomialQuotient, PolynomialRemainder, Poly- nomialMod, PolynomialReduce, ◦ композицию (подстановку многочлена в многочлен), ◦ отыскание наибольшего общего делителя PolynomialGCD и наименьше- го общего кратного PolynomialLCM, и т.д. Кроме того, с многочленами можно проделывать различные струк- турные манипуляции такие как ◦ разложение по степеням какой-то из переменных Expand, ◦ разложение на множители Factor, и т.д. Приведем несколько совсем простых примеров. • Операции над многочленами. Проиллюстрируем операции над многочленами на примере круговых многочленов Φ n (x). Напомним, что Φ n (x) = Y (x − ε i ), где произведение берется по всем первообразным корням ε i из 1 степени n. Эти многочлены естественно возникают в сотнях различных вычисле- ний, как в самой алгебре и теории чисел, так и в многочисленных прило- жениях, связанных с теорией конечных полей, включая Computer Science, теорию передачи информации и криптографию. В Mathematica n-й круго- вой многочлен Φ n (x) называется Cyclotomic[n,x]. Взглянем на несколько — для круглого счета 16 — первых круговых многочленов: In[13]:=Do[Print[Cyclotomic[n,x]], {n,0,15}] Out[13]=1 -1+x 1+x 1+x+x^2 1+x^2 1+x+x^2+x^3+x^4 1-x+x^2 1+x+x^2+x^3+x^4+x^5+x^6 1+x^4 1+x^3+x^6 1-x+x^2-x^3+x^4 54 1+x+x^2+x^3+x^4+x^5+x^6+x^7+x^8+x^9+x^10 1-x^2+x^4 1+x+x^2+x^3+x^4+x^5+x^6+x^7+x^8+x^9+x^10+x^11+x^12 1-x+x^2-x^3+x^4-x^5+x^6 1-x+x^3-x^4+x^5-x^7+x^8 Команда Print выводит результат каждого индивидуального вычисления в отдельной строке — иными словами, вставляет \newline после каждого выражения. Она применяется, если мы хотим посмотреть на результаты нескольких вычислений в одной клетке, но не хотим при этом явно структу- рировать их в виде списка. Обратите внимание на организацию цикла при помощи команды Do с обычной в языке C формой итератора {n,0,15} — по n от 0 до 15 (с шагом 1). Мы могли бы достичь того же результата следую- щим образом: вначале породить список циклотомических многочленов при помощи обсуждаемой в § 10 команды Table, а потом проскан(д)ировать (Scan) элементы этого списка командой Print: In[14]:=Scan[Print,Table[Cyclotomic[n,x], {n,0,15}]] Попробуем теперь перемножить два круговых многочлена. Беззастен- чивое вычисление Cyclotomic[5,x]*Cyclotomic[6,x] ничего не даст, так как Mathematica не раскрывает скобок автоматически. Правильная форма вопроса, если мы хотим получить ответ, разложенный по степеням x, должна включать структурную команду Expand: In[15]:=Expand[Cyclotomic[5,x]*Cyclotomic[6,x]] Out[15]=1+x^2+x^3+x^4+x^6 Деление многочленов от одной переменной осуществляется при помощи команд PolynomialQuotient — неполное частное и PolynomialRemainder — остаток. Остаток можно найти и при помощи более общих команд Poly- nomialMod или PolynomialReduce, предназначенных для нахождения остат- ка многочленов от нескольких переменных по модулю нескольких много- членов. Вот пример деления с остатком: In[16]:=PolynomialQuotient[Cyclotomic[11,x],Cyclotomic[5,x],x] Out[16]=x+x^6 In[17]:=PolynomialRemainder[Cyclotomic[11,x],Cyclotomic[5,x],x] Out[17]=1 Обратите внимание на синтаксис: команды деления многочленов от од- ной переменной PolynomialQuotient и PolynomialRemainder вызываются с тремя аргументами, в формате PolynomialQuotient[f,g,x], где f — де- лимое, g — делитель, а x — переменная, по которой производится деление. • Структурные манипуляции. Из школы все помнят формулу для (x+y) n известную под кодовым названием “бином Ньютона”. Но кто, кроме профессиональных математиков, видел мультиномиальную формулу Лейбница для (x 1 + . . . + x m ) n , за исключением, может быть, случая (x + y + z) 3 ? Вот один из первых интересных примеров. Как мы уже знаем, 55 попытка вычислить (w+x+y+z)^4 не приведет к успеху, так как Mathema- tica автоматически не раскрывает скобок. Это значит, что мы должны попросить ее сделать это: In[18]:=Expand[(w+x+y+z)^4] Out[18]=w^4+4*w^3*x+6*w^2*x^2+4*w*x^3+x^4+ 4*w^3*y+12*w^2*x*y+12*w*x^2*y+4*x^3*y+6*w^2*y^2+ 12*w*x*y^2+6*x^2*y^2+4*w*y^3+4*x*y^3+y^4+ 4*w^3*z+12*w^2*x*z+12*w*x^2*z+4*x^3*z+ 12*w^2*y*z+24*w*x*y*z+12*x^2*y*z+12*w*y^2*z+ 12*x*y^2*z+4*y^3*z+6*w^2*z^2+12*w*x*z^2+ 6*x^2*z^2+12*w*y*z^2+12*x*y*z^2+6*y^2*z^2+ 4*w*z^3+4*x*z^3+4*y*z^3+z^4 А сейчас мы предложим системе проделать эту операцию в обратную сторону. Из школы все помнят “формулы сокращенного умножения” x 2 − y 2 = (x − y)(x + y) и x 3 − y 3 = (x − y)(x 2 + xy + y 2 ), но как раскладывается на множители что-нибудь чуть большей степени, ну хотя бы x 100 − y 100 ? Нет ничего проще: In[19]:=Factor[x^100-y^100] Out[19]=(x-y)(x+y)(x^2+y^2) (x^4-x^3*y+x^2*y^2-x*y^3+y^4) (x^4+x^3*y+x^2*y^2+x*y^3+y^4) (x^8-x^6*y^2+x^4*y^4-x^2*y^6+y^8) (x^20-x^15*y^5+x^10*y^10-x^5*y^15+y^20) (x^20+x^15*y^5+x^10*y^10+x^5*y^15+y^20) (x^40-x^30*y^10+x^20*y^20-x^10*y^30+y^40) • Многочлены от нескольких переменных. Эйлер заметил, что произведение двух сумм четырех квадратов снова является суммой четырех квадратов: (x 2 1 + x 2 2 + x 2 3 +x 2 4 )(y 2 1 + y 2 2 + y 2 3 + y 2 4 ) = (x 1 y 1 − x 2 y 2 − x 3 y 3 − x 4 y 4 ) 2 + (x 1 y 2 + x 2 y 1 + x 3 y 4 − x 4 y 3 ) 2 + (x 1 y 3 + x 3 y 1 − x 2 y 4 + x 4 y 2 ) 2 + (x 1 x 4 + x 4 y 1 + x 2 y 3 − x 3 y 2 ) 2 В 1842 году Гамильтон осознал, что это замечательное тождество, извест- ное как тождество Эйлера, можно принять за определение умножения четверок вещественных чисел, которое превращает R 4 в алгебру с делением H, известную как тело кватернионов. Попробуем проверить тождество Эйлера с помощью системы Mathematica. Для этого совершенно бесхит- ростно предложим ей провести следующее вычисление: In[20]:=z1=x1*y1-x2*y2-x3*y3-x4*y4; z2=x1*y2+x2*y1+x3*y4-x4*y3; z3=x1*y3+x3*y1-x2*y4+x4*y2; z4=x1*y4+x4*y1+x2*y3-x3*y2; z1^2+z2^2+z3^2+z4^2 56 Out[20]=(x4*y1-x3*y2+x2*y3+x1*y4)^2+(x3*y1+x4*y2+x1*y3-x2*y4)^2+ (x2*y1+x1*y2-x4*y3+x3*y4)^2+(x1*y1-x2*y2-x3*y3-x4*y4)^2 Постараемся понять, что произошло. Во-первых, мы определили новые переменные z 1 , z 2 , z 3 , z 4 , стоящие в скобках в правой части тождества Эй- лера, и задали их выражение через исходные переменные x 1 , x 2 , x 3 , x 4 и y 1 , y 2 , y 3 , y 4 . После этого мы предложили системе вычислить z 2 1 +z 2 2 +z 2 3 +z 2 4 , но она просто подставила сюда выражения z i через x i и y i . Мы уже встре- чались с этим явлением. Дело в том, что система не уверена, приведет ли раскрытие скобок к более короткому выражению, и ждет нашего явного указания сделать это. Обратите внимание, что различные выражения внутри одного ввода должны разделяться точкой с запятой. Конеч- но, мы можем заставить систему раскрыть скобки при помощи команды Expand, но тогда она оставит результат в виде суммы одночленов. После этого мы можем применить к этой сумме одночленов команду Factor и она попробует разложить их на целочисленные множители. Однако про- ще всего довериться ее собственному эстетическому чувству и посредством какой-либо из команд Simplify, FullSimplify или Refine предложить ей упростить выражение z 2 1 + z 2 2 + z 2 3 + z 2 4 . В этом случае она будет пытать- ся применить к этому выражению известные ей преобразования и искать среди получающихся результатов самый простой. Первая же попытка при- водит к тождеству Эйлера: In[21]:=Simplify[z1^2+z2^2+z3^2+z4^2] Out[21]=(x1^2+x2^2+x3^2+x4^2)*(y1^2+y2^2+y3^2+y4^2) Вот еще одно замечательное тождество, тождество Лиувилля, кото- рое было одним из основных шагов в доказательстве того, что каждое на- туральное число является суммой 53 четвертых степеней: In[22]:=Factor[Expand[(x+y)^4+(x+z)^4+(x+w)^4+(y+z)^4+ (y+w)^4+(z+w)^4+(x-y)^4+(x-z)^4+ (x-w)^4+(y-z)^4+(y-w)^4+(z-w)^4]] Out[22]=6(w^2+x^2+y^2+z^2)^2 • Многочлены Чебышева. В школьном курсе тригонометрии встреча- ются формулы cos(2ϕ) = 2 cos(x) 2 −1 и cos(3ϕ) = 4 cos(x) 3 −3 cos(ϕ). Одним из самых важных классических объектов математики являются многочле- ны Чебышева первого рода T n , при помощи которых cos(nϕ) выражает- ся через cos(ϕ). По определению, cos(nϕ) = T n (cos(ϕ)). Таким образом, T 0 (x) = 1, T 1 (x) = x и, как мы только что вспомнили, T 2 (x) = 2x 2 − 1 и T 3 (x) = 4x 3 − 3x. Естественно, многочлены Чебышева описаны в ядре си- стемы Mathematica и, по аналогии с BernoulliB, мы можем ожидать, что они называются ChebyshevT. Посмотрим на многочлены Чебышева T 5 (x) и T 7 (x), чтобы немного уменьшить количество печатаемых символов, введем для ChebyshevT[x,n] сокращение T[x,n]: In[23]:=T[n ,x ]:=ChebyshevT[n,x]; {T[5,x],T[7,x]} Out[23]= {5*x-20*x^3+16*x^5,7*x+56*x^3-112*x^5+64*x^7} 57 В этом тексте встречаются несколько ключевых синтаксических моментов, которые подробнейшим образом обсуждаются в дальнейшем, тем не ме- нее сразу поясним их. В первой строчке мы определяем T[n,x], при этом бланк после неизвестной означает, что это фиктивная неизвестная, вместо которой можно подставить произвольное значение или любую дру- гую неизвестную. Если вместо T[n ,x ] мы написали бы просто T[n,x], система знала бы, чему равно T[n,x], но не чему равно T[m,y]. С другой стороны, отложенное присваивание := означает, что правая часть Cheby- shevT[n,x] вычисляется не в тот момент, когда выполнено присваивание, а каждый раз при вызове очережного значения T[n,x]. После этого мы видим уже знакомую нам точку с запятой ; разделяющую выражения или команды. После этого мы вызываем список {T[5,x],T[7,x]} состоящий из многочленов Чебышева T 5 (x) и T 7 (x). Мы не могли бы напечатать про- сто T[5,x]; T[7,x], так как при этом увидели бы только многочлен T 7 (x). Подставим теперь T 7 (x) в T 5 (x): In[24]:=T[5,T[7,x]] Out[24]=5*(-7*x+56*x^3-112*x^5+64*x^7)- 20*(-7*x+56*x^3-112*x^5+64*x^7)^3+ 16*(-7*x+56*x^3-112*x^5+64*x^7)^5 Как всегда, Mathematica не раскрывает скобки! Ну что же, попросим ее сделать это: In[25]:=Expand[T[5,T[7,x]]] Out[25]=-35*x+7140*x^3-434112*x^5+12403200*x^7- 202585600*x^9+2106890240*x^11-14910300160*x^13+ 74977509376*x^15-275652608000*x^17+754417664000*x^19- 1551944908800*x^21+2404594483200*x^23-2789329600512*x^25+ 2384042393600*x^27-1456262348800*x^29+601295421440*x^31- 150323855360*x^33+17179869184*x^35 Если то, что получилось, удивительно похоже на многочлен Чебышева T 35 (x), то это потому, что это и есть многочлен Чебышева T 35 (x) — it looks like a church, it smells like a church, it is a church. Иными словами, если мы подставим в только что полученное выражение cos(ϕ) вместо x, то мы получим cos(35ϕ). Теперь Вас уже наверное, не особенно удивит, если и Expand[T[7,T[5,x]]] даст тот же результат. В этом можно убедиться также применив к многочлену T[35,x] функ- цию Decompose, раскладывающую многочлен в композицию неразложимых многочленов: In[26]:=Decompose[T[35,x],x] Out[26]= {7*x-56*x^3+112*x^5-64*x^7,-5*x+20*x^3-16*x^5} Вообще то, в данном случае нам просто крупно повезло. Попробуйте обра- зовать композицию T 2 и T 3 , а потом разложить ее при помощи Decompose и посмотрите, что получится! 58 Вообще, T m (T n (x)) = T n (T m (x)) причем в смысле, который легко уточ- нить 17,18,19,20 , это единственная нетривиальная система многочленов над C с таким свойством. Только не говорите нам про f n (x) = x n , мы же сказали, нетривиальная! • Вычисления с рациональными дробями. Известно, что любое рациональное число представимо в виде суммы трех кубов рациональных чисел. Это вытекает, например, из следующего тождества, независимо от- крытого в 1825 году Райли и в 1930 году Ричмондом 21 : x = x 3 − 3 6 3 2 x 2 + 3 4 x + 3 6 3 + −x 3 + 3 5 x + 3 6 3 2 x 2 + 3 4 x + 3 6 3 + 3 3 x 2 + 3 5 x 3 2 x 2 + 3 4 x + 3 6 3 Попытка доказать это тождество просто напечатав In[27]:=((x^3-3^6)/(3^2x^2+3^4x+3^6))^3+ ((-x^3+3^5x+3^6)/(3^2x^2+3^4x+3^6))^3+ ((3^3x^2+3^5x)/(3^2x^2+3^4x+3^6))^3 не приведет к успеху, так как Mathematica автоматически не раскрыва- ет скобок. Однако в Mathematica имеется несколько функций таких, как Expand, ExpandNumerator, ExpandDenominator, ExpandAll, Factor, Cancel, Together, Apart и т.д., которые позволяют проделывать все обычные струк- турные манипуляции над дробями. Попробовав, например, привести эти дроби к общему знаменателю In[28]:=Together[((x^3-3^6)/(3^2x^2+3^4x+3^6))^3+ ((-x^3+3^5x+3^6)/(3^2x^2+3^4x+3^6))^3+ ((3^3x^2+3^5x)/(3^2x^2+3^4x+3^6))^3] мы сразу получим ответ x. Разумеется, к тому же результату приведет и упрощение этого выражения при помощи Simplify, FullSimplify или Refine. Интересно, что хотя это вычисление и может быть проведено че- ловеком — оно и было первые два раза проведено человеком!!! — тем не менее, вряд ли многие математики захотят проводить подобное вычисле- ние по своей воле без какой-то великой цели. Косвенным подтверждением этого является тот факт, что в книге 22 , специально посвященной суммам кубов, эта формула приведена с ошибкой (в последнем слагаемом пропу- щен множитель 3 3 при x 2 , а в качестве множителя при x там же напечатано 17 J.F.Ritt, Prime and composite polynomials. — Trans. Amer. Math., Soc., 1922, vol.23, p.51–66. 18 J.F.Ritt, Permutable rational functions. — Trans. Amer. Math., Soc., 1923, vol.25, p.399–448. 19 В.О.Бугаенко, Коммутирующие многочлены. — Математическое Просвещение, Сер.3, N.1, c.140–163. 20 В.В.Прасолов, О.В,Шварцман, Азбука римановых поверхностей. — М., Фазис, 1999, с.1–142; стр.75–85. 21 L.E.Dickson, History of the theory of numbers, vol.II. — Chelsea, 1952, p.1–802. 22 Ю.И.Манин, Кубические формы. —М., Наука, 1972, с.1–304. 59 3 4 вместо 3 5 ), причем эта ошибка воспроизведена в обзоре 23 . Тем самым, авторы сами эту формулу не проверяли, что, впрочем, неудивительно, ес- ли учесть, что при этом вычислении получаются коэффициенты наподобие 387420489, 129140163 или 28697814. § 3. Алгебраические уравнения Alles vergangliches ist nur ein Gleichnis. — Все преходящее есть всего лишь уравнение 24 Johann Wolfgang von Goethe, Faust I Решение уравнений и неравенств, а также систем уравнений и нера- венств является sanctum sanctorum школьной математики. Mathematica может успешно справиться с любой задачей, с которой могут справиться школьник, школьный учитель математики, преподаватель педвуза и любой репетитор над репетиторами. • Алгебраические уравнения от одной неизвестной. Основной ко- мандой для решения алгебраических и сводящихся к ним уравнений в си- стеме Mathematica является Solve. Эта команда допускает вызов в разных форматах и настройку большого числа опций, а ее реализация занимает около 500 страниц кода, поэтому здесь мы изложим только простейшие при- меры ее использования. В случае решения одного уравнения f (x) = g(x) относительно одной неизвестной x команда Solve вызывается в следующем формате Solve[f[x]==g[x],x]. Вот простейший пример использования этой команды. In[29]:=Solve[Sqrt[x^2+1]==x+2,x] Out[29]= {{x->-3/4}} Как всегда, начнем с обсуждения синтаксиса: ◦ Обратите внимание на то, что при записи уравнения всегда ис- пользуется только предикат == Equal, но ни в коем случае не предикат === SameQ и, тем более, не оператор = Set!!! Вычисление In[30]:=Solve[Sqrt[x^2+1]===x+2,x] даст ответ {}. В самом деле, спрашивая Solve[f[x]==g[x],x] мы интере- суемся, при каких x значения функций f и g в точке x совпадают. В то же время спрашивая Solve[f[x]===g[x],x] мы интересуемся, при каких x внутренние представления функций f и g совпадают в языке систе- мы. Ну и при каких x, по Вашему Sqrt[x^2+1] и x+2 могут совпадать 23 Ю.И.Манин, А.А.Панчишкин, Введение в теорию чисел. — Соврем. Проблема Математики, т.49, М., ВИНИТИ, 1990, с.1–348; стр.191. 24 В кольце Z/mZ. Как всегда, канонический русский перевод “Все преходящее есть только символ” полностью извращает смысл сказанного. На самом деле Gleichnis может быть чем угодно: сравнением, подобием, несовершенной тенью, иносказанием — но никак не символом. Наоборот, символ есть как то, как бы проекцией чего является Gleichnis. 60 как выражения? Да ни при каких! С другой стороны, попытка вычислить Solve[Sqrt[x^2+1]=x+2,x] сразу приведет к сообщению об ошибке, так как здесь мы пытаемся присвоить новое значение внутренней (защищенной!!!) функции Sqrt. Итак, уравнение всегда записывается в виде f[x]==g[x]. ◦ В школьной математике существует устойчивая традиция обозначать параметры буквами a, b, c, d, . . . , а неизвестные буквами x, y, z, u, v, w. Однако было бы нелепо ожидать, чтобы система Mathematica использо- вала подобное соглашение — символ есть символ, хоть символом его назови, хоть как. Это значит, что если уравнение содержит един- ственный символ, то этот символ и будет с необходимостью истолкован как неизвестная, так что в этом случае команду Solve можно вызывать с одним аргументом, в формате Solve[f[x]==f[y]]: In[31]:=Solve[x^3+3*x^2-3*x+1==0] Out[31]= {{x->-1-2^(1/3)-2^(2/3)}, {x->-1+(1-I*Sqrt[3])/2^(1/3)+(1+I*Sqrt[3])/2^(2/3)}, {x->-1+(1-I*Sqrt[3])/2^(2/3)+(1+I*Sqrt[3])/2^(1/3)}} ◦ В то же время, если уравнение содержит несколько символов, то ука- зание на то, который из них рассматривается как переменная, абсолютно необходимо. Если это не сделать, то система будет решать уравнение от- носительно того символа, который — с ее точки зрения — идет первым в записи этого уравнения. Это значит, что (в зависимости от истории сессии и настроек ядра) в качестве неизвестной в уравнении ax 2 + bx + c = 0 обыч- но будет рассматриваться a или c, но отнюдь не x! При попытке провести вычисление In[32]:=Solve[a*x^2+b*x+c==0] результатом будет сообщение об возможной ошибке: Solve: Equations may not give solutions for all "solve" variables сообщающее нам, что мы пытаемся найти четыре неизвестных из един- ственного уравнения, и следующий аутпут: Out[32]= {{c->-b*x-a*x^2}} Таким образом, чтобы решить уравнение ax 2 + bx + c = 0 относительно x, нужно задавать системе вопрос в форме Solve[a*x^2+b*x+c==0,x], где x явно декларируется в качестве неизвестной. ◦ Кроме того, обратите внимание на формат ответа! Найденные корни выражаются в форме правил подстановки x->c, с тем, чтобы их можно было подставлять в другие выражения, не модифицируя при этом значения самого x (которое остается независимой переменной). По этому поводу стоит заметить, что в Mathematica имеется еще од- на команда решения алгебраических уравнений от одной неизвестной, а именно Roots, которая выражает набор корней уравнения как объединение наборов корней более простых уравнений. При этом ответ записывается 61 как дизъюнкция этих более простых уравнений — и, тем самым, в боль- шинстве случаев, которые могут реально встретиться начинающему, как дизъюнкция линейных уравнений. Использование команды Roots по свое- му синтаксису ничем не отличается от использования команды Solve для одной неизвестной: Roots[f[x]==g[x],x]. Следующий пример иллюстрирует использование команды Roots для ре- шения алгебраического уравнения: In[33]:=Roots[x^2+x+1/x+1/x^2==4,x] Out[33]=x==1/2(-3-Sqrt[5])||x==1/2(-3+Sqrt[5])||x==1||x==1 Чтобы перевести этот ответ в форму списка правил подстановки, порожда- емую командой Solve, необходимо применить к нему форматную команду ToRules. Несмотря на более привычную форму ответа, возвращаемого ко- мандой Roots, при решении уравнений в вещественных или комплексных числах в большинстве ситуаций предпочтительно пользоваться более об- щими командами Solve, при помощи которой можно решать уравнения от нескольких неизвестных, и Reduce, решающей или упрощающей в том же стиле, что Roots, любые уравнения, как алгебраические, так и транс- цендентные, а также неравенства, логические суждения и т.д. С другой стороны, команда Roots использует чисто алгебраические алгоритмы (те же, что Factor и Decompose) и оказывается незаменимой во многих си- туациях, когда Solve бессильна (конечные поля, модулярная арифметика, вычисления в кольцах и т.д.). Увидев пустой ответ, не забудьте внимательно пересчитать скобки!!! А именно: ◦ Ответ в форме {} означает, что у уравнения нет решений. Например, мы получим такой ответ, предложив системе проделать следующее упра- нение: Solve[1==0,x]. ◦ Ответ в форме {{}} означает, что любое допустимое значение аргу- мента служит решением уравнения. Мы получим такой ответ предложив системе вычислить Solve[(x-1)(x+1)==x^2-1,x]. • Уравнения степени ≤ 4. Уравнения степени ≤ 4 команды Solve и Roots решают в школьном стиле — т.е. в радикалах, возвращая формулы в духе Кардано и Феррари. Вот, скажем, как выглядят корни многочлена Тэйлора 1 + x + x 2 /2 + x 3 /6 порядка 3 для экспоненты: In[34]:=Solve[Sum[x^i/i!, {i,0,3}]==0,x] Out[34]= {{x->-1-1/(-1+Sqrt[2])^(1/3)+(-1+Sqrt[2])^(1/3)}, {x->-1-1/2*(-1+Sqrt[2])^(1/3)*(1-I*Sqrt[3]) +(1+I*Sqrt[3])/(2*(-1+Sqrt[2])^(1/3)) }, {x->-1+(1-I*Sqrt[3])/(2*(-1+Sqrt[2])^(1/3)) -1/2*(-1+Sqrt[2])^(1/3)*(1+I*Sqrt[3]) }} В тех случаях, когда системе удается решить в таком же стиле урав- нения более высоких степеней, она делает это. Посмотрим, как система 62 борется с уравнением x 5 + x − c = 0, которое, вообще говоря, в радикалах не решается. Более того, как хорошо известно, при помощи преобразова- ния Чирнгаузена решение любого алгебраического уравнения степени 5 сводится к уравнению такого вида, называемому уравнением Бринга— Джерарда 25 . Для того, чтобы чуть упростить вид входящих в решение радикалов, вынести общие множители и пр., поверх команды Solve реко- мендуется применять команду Simplify — но, как будет объяснено ниже, вообще говоря, не команду FullSimplify: In[35]:=Simplify[Solve[x^5+x-1==0,x]] Out[35]= {{x->(-1)^(1/3)},{x->-(-1)^(2/3)}, {x->1/6*(-2+2^(2/3)*(25-3*Sqrt[69])^(1/3)+ 2^(2/3)*(25+3*Sqrt[69])^(1/3) }, {x->-1/3-1/6*(1+I*Sqrt[3])*(1/2*(25-3*Sqrt[69]))^(1/3) +1/6*I*(I+Sqrt[3])*(1/2*(25+3*Sqrt[69]))^(1/3) }, {x->-1/3+1/6*I*(1+I*Sqrt[3])*(1/2*(25-3*Sqrt[69]))^(1/3) -1/6*(I+Sqrt[3])*(1/2*(25+3*Sqrt[69]))^(1/3) }} Заметим, что формулы с радикалами легко отключить, задав в теле команд опции Cubics->False или Quartics->False (по умолчанию обе эти опции поставлены на True). Еще одной чрезвычайно интересной и полезной опцией, которую допус- кает команда Roots при решении алгебраических уравнений с рациональ- ными коэффициентами, является Modulus. Значением модуля может быть любое целое число (по умолчанию Modulus->0). Это значит, что включив в тело команды опцию Modulus->m, мы ищем решение уравнения в кольце Z/mZ классов вычетов по модулю m. In[36]:=Roots[3*x^2+5==0,x,Modulus->17] Out[36]=x==2||x==15 Стоит подчеркнуть, что при помощи команды Solve без довольно деликат- ной перенастройки проделать подобное упражнение не просто. • Корни алгебраических уравнений. Почему мы не рекомендуем применять команду Full Simplify? Дело в том, что система пытается привести выражение к наиболее простому виду, а никакого более простого описания корня c алгебраического уравнения, чем само это — или какое-то другое алгебраическое уравнение, корнем которого является c — в общем случае не существует. Иными словами, утверждение, что f (c) = 0 для неко- торого многочлена f , возможно в сочетании с какими-то утверждениями о локализации корня c и/или изоляции корней, является в подавляющем большинстве случаев гораздо лучшим описанием числа c с вычислитель- ной точки зрения, чем любое другое его описание!!! Например, вычислив Solve[x^5+x-2==0,x], даже после упрощения ответа при помощи Simpli- fy, Вы натолкнетесь на полторы–две страницы радикалов. Но полностью упростив это выражение, Вы увидите следующее: 25 В.В.Прасолов, Ю.П.Соловьев, Эллиптические кривые и алгебраические уравнения. — М., Факториал, 1997, с.1–288; стр.222–225. 63 In[37]:=FullSimplify[Solve[x^5+x-2==0,x]] Out[37]= {{x->1},{x->Root[2+#1+#1^2+#1^3+#1^4&,3]}, {x->Root[2+#1+#1^2+#1^3+#1^4&,4]}, {x->Root[2+#1+#1^2+#1^3+#1^4&,1]}, {x->Root[2+#1+#1^2+#1^3+#1^4&,2]}, Прокомментируем вначале форму ответа. Команда Root[f,i] возвращает i-й корень алгебраического уравнения f (x) = 0. Нам нет нужды сейчас точно описывать порядок, в котором Mathematica учитывает корни. В первом приближении можно считать, что она руководствуется следующими правилами: ◦ Вещественные корни предшествуют комплексным и упорядочиваются естественным образом; ◦ Сопряженные комплексные корни приводятся парами и упорядочи- ваются лексикографически: вначале по вещественной части, а потом по мнимой части того корня из пары, который лежит в верхней полуплоско- сти. При этом если все коэффициенты исходного уравнения были числами, по- лученные при помощи применения команды Root объекты тоже рассмат- риваются как числа, иными словами, к ним можно применять все обычные операции над числами, сравнивать их, вычислять приближенные значения и т.д. Новым и весьма необычным для начинающих моментом в использовании команды Root является то, что многочлен f задается в формате чистой или анонимной функции. Вызов i-го корня многочлена f = a n x n + . . . + a 1 x + a 0 может быть произведен в одном из следующих эквивалентных форматов: ◦ Root[Function[x,a n*x^n+...+a 1*x+a 0],i] ◦ Root[a n*#^n+...+a 1*#+a 0&,i] Первый из этих форматов (функциональный, формат чистой функции) рассматривается как основной способ внутреннего представления выраже- ния, включающего объекты типа Root, в языке системы. Мы настоятельно рекомендуем начинающему пользоваться именно этим форматом, несмотря на чуть большую длину получающихся при этом текстов. Второй формат (операторный, формат анонимной функции) рассматри- вается системой как сокращение первого. Его назначение состоит только в том, чтобы слегка уменьшить длину ввода за счет использования следую- щих операторов: ◦ Оператор # или, в полной форме Slot, обозначает аргумент чистой функции, которому мы не хотим присваивать никакого индивидуального имени (отсюда название анонимная функция — в этом случае не только сама функция, но и ее аргументы не имеют индивидуальных имен); ◦ Если у анонимной функции несколько аргументов, то они будут вызы- ваться как #1, #2, #3, и так далее, по мере появления; 64 ◦ Оператор & есть просто сокращение для Function, и обозначает при- менение чистой функции. Вернемся теперь к смыслу последнего результата. Он означает, что си- стема уверена в том, что никакого “более простого” описания корней c 6= 1 уравнения x 5 + x − 1 = 0, чем как корни уравнения x 4 + x 3 + x 2 + x + 2 = 0, не существует. Иными словами, она предпочитает использовать имен- но это описание (а не полустраничное выражение каждого корня в виде комбинации радикалов) в вычислениях и советует нам делать то же самое. Во многих случаях она с самого начала считает, что у каких-то чисел нет вообще никакого более простого описания, чем как корни того уравнения, которое мы пытаемся решить! В этом случае она выражает корни этого уравнения как корни этого уравнения: In[38]:=FullSimplify[Solve[x^5+x-3==0,x]] Out[38]= {{x->Root[-3+#1+#1^5&,1]},{x->Root[-3+#1+#1^5&,2]}, {x->Root[-3+#1+#1^5&,3]},{x->Root[-3+#1+#1^5&,4]}, {x->Root[-3+#1+#1^5&,5]} Что, конечно, ничуть не мешает ей знать приближенные численные значе- ния этих корней и использовать их в других вычислениях по нашей просьбе: In[39]:=Table[N[Root[-3+#1+#1^5&,i]], {i,1,5}] Out[39]= {1.133,-1.04188-0.82287*I,-1.04188+0.82287*I, 0.475381-1.1297*I, 0.475381+1.1297*I } С другой стороны, мы можем всегда (когда это возможно!) заставить систе- му записать формулу в радикалах, применив к объектам типа Root команду ToRadicals. Более того, система сама делает это для уравнений степени ≤ 2: In[40]:=f:=Function[x,a*x^2+b*x+c]; {Root[f,1],Root[f,2]} Out[40]= {-b/(2*a)-1/2*Sqrt[(b^2-4*a*c)/a^2], -b/(2*a)+1/2*Sqrt[(b^2-4*a*c)/a^2] } Для вычислений с алгебраическими числами чрезвычайно полезна ко- манда RootReduce, которая пытается переписать сложное выражение, со- держащее корни уравнения, в терминах единственного корня этого (или какого-то другого!) уравнения. • Что значит решить уравнение? Тому, кто не задумывался над тем, что значит решить уравнение, этот вопрос, скорее всего, покажется чисто схоластическим. Между тем, для каждого, кто реально проводит вычисле- ния, этот вопрос становится абсолютно конкретным и неотвратимым. В самом деле, с младших классов школы нас приучили никуда особен- но не вникая писать, что корни уравнения x 2 − 2 = 0 равны x = ± √ 2 и называть это решением уравнения. Да, но что такое √ 2? Ведь если вернуться к истокам, то √ 2 как раз и определяется как (единственный) положительный корень уравнения x 2 − 2 = 0. Да, но где живет этот ко- рень? Коэффициенты нашего исходного уравнения рациональны, но √ 2 не является рациональным числом. Любое фактическое вычисление с √ 2 65 либо является приближенным, либо сводится к тому, что мы возводим его в квадрат и проводим вычисление с рациональными числами!! Тем самым, любое точное вычисление с √ 2 основано непосредственно на том факте, что √ 2 2 − 2 = 0, т.е. на том, что √ 2 является корнем уравнения x 2 − 2 = 0. Ни- какого более простого описания у числа √ 2 нет. Вся школьная премудрость о решении квадратного уравнения x 2 − c = 0 сводится к тому, что мы за- являем, что корнем этого уравнения является корень уравнения x 2 − c = 0. Иными словами, под влиянием школьной математики нам мнится, что мы умеем решать квадратные уравнения и не умеем решать уравнений пятой степени, ну, хотя бы, x 5 + x − 3 = 0. Однако с нашей точки зрения статус уравнений x 2 −с = 0 и x 5 + x −с = 0 абсолютно одинаков и никакой концептуальной разницы между ними нет. Для каждого из них — да и вообще для любого алгебраического уравнения разумной степени — мы можем за доли секунды приближенно найти корни с любой точностью. В то же время в смысле арифметики ни одно из этих уравнений — без введения дополнительных функций — точно не решается. С алгоритмической точки зрения вычисление значения квадратного корня основано на разложении в ряд и ничем не отличается от вычисления зна- чения любой другой аналитической функции. Единcтвенное отличие носит чисто психологический характер и состоит в том, что мы ввели специаль- ный значок √ c для положительного корня первого из этих уравнений √ c = 1 + 1 2 (c − 1) − 1 8 (c − 1) 2 + 1 16 (c − 1) 3 − 5 128 (c − 1) 4 + . . . и долго учились им манипулировать. Если бы мы ввели специальный зна- чок, ну хотя бы ¶(c), для функции Ламберта—Эйзенштейна, выража- ющей положительный корень второго из этих уравнений ¶(c) = c − c 5 + 10 c 9 2! − 15 · 14 c 13 3! + 20 · 19 · 18 c 17 4! − · · · . и в течение такого же времени упражнялись в манипуляциях с этим знач- ком 26,27 , а потом с преобразованием Чирнгаузена, позволяющим свести решение любого уравнений пятой степени к последовательности арифме- тических операций и применения √ , 3 √ и ¶, то у нас сформировалось бы отчетливое — и, в целом, вполне обоснованное — убеждение, что мы умеем решать уравнения пятой степени. Тот же вопрос, но, конечно, с еще большей остротой, встает при попыт- ке решения трансцендентных уравнений. Что такое π? По определению это наименьший положительный корень уравнения sin(x) = 0. Пользу- ясь соотношениями между основными тригонометрическими функциями и теоремами сложения несложно доказать, что тогда π будет и корнем 26 S.J.Patterson, Eisenstein and the quintic equation. — Historia Math, vol.17, 1990, p.132–140. 27 J.Stillwell, Eisenstein's footnote. — Math. Intelligencer, v.17, N.2, 1995, p.58–62. 66 уравнений cos(x) = −1, cos(x/2) = 0, sin(x/2) = 1 и тому подобные фак- ты. Но все равно в конце дня (in the final analysis, at the end of the day) выясняется, что π никогда не было ничем, кроме наименьшего поло- жительного корня уравнения sin(x) = 0. В своем знаменитом учебнике 28 Эдмунд Ландау определяет π как наименьшее положительное число та- кое, что cos(π/2) = 0 (определение 61) и доказывает, что тогда sin(π) = 0 |