<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Полиномы — Sage Tutorial in Russian v5.9</title> <link rel="stylesheet" href="_static/sage.css" type="text/css" /> <link rel="stylesheet" href="_static/pygments.css" type="text/css" /> <script type="text/javascript"> var DOCUMENTATION_OPTIONS = { URL_ROOT: '', VERSION: '5.9', COLLAPSE_INDEX: false, FILE_SUFFIX: '.html', HAS_SOURCE: true }; </script> <script type="text/javascript" src="_static/jquery.js"></script> <script type="text/javascript" src="_static/underscore.js"></script> <script type="text/javascript" src="_static/doctools.js"></script> <script type="text/javascript" src="_static/translations.js"></script> <link rel="shortcut icon" href="_static/favicon.ico"/> <link rel="top" title="Sage Tutorial in Russian v5.9" href="index.html" /> <link rel="up" title="Тур по Sage" href="tour.html" /> <link rel="next" title="Конечные группы, Абелевы группы" href="tour_groups.html" /> <link rel="prev" title="Линейная алгебра" href="tour_linalg.html" /> <link rel="icon" href="_static/sageicon.png" type="image/x-icon" /> </head> <body> <div class="related"> <h3>Просмотр</h3> <ul> <li class="right" style="margin-right: 10px"> <a href="genindex.html" title="Словарь-указатель" accesskey="I">словарь</a></li> <li class="right" > <a href="py-modindex.html" title="Python Module Index" >модули</a> |</li> <li class="right" > <a href="tour_groups.html" title="Конечные группы, Абелевы группы" accesskey="N">следующий</a> |</li> <li class="right" > <a href="tour_linalg.html" title="Линейная алгебра" accesskey="P">предыдущий</a> |</li> <a href="../index.html"><img src="_static/sagelogo.png" style="vertical-align: middle" title="Sage Logo"></a> <li><a href="index.html">Sage Tutorial in Russian v5.9</a> »</li> <li><a href="tour.html" accesskey="U">Тур по Sage</a> »</li> </ul> </div> <div class="document"> <div class="documentwrapper"> <div class="bodywrapper"> <div class="body"> <div class="section" id="section-poly"> <span id="id1"></span><h1>Полиномы<a class="headerlink" href="#section-poly" title="Ссылка на этот заголовок">¶</a></h1> <p>Данный раздел содержит информацию о том, как создавать и использовать полиномы в Sage.</p> <div class="section" id="section-univariate"> <span id="id2"></span><h2>Полиномы одной переменной<a class="headerlink" href="#section-univariate" title="Ссылка на этот заголовок">¶</a></h2> <p>Есть три способа создания полиномиальных колец.</p> <div class="highlight-python"><div class="highlight"><pre><span class="go">sage: R = PolynomialRing(QQ, 't')</span> <span class="go">sage: R</span> <span class="go">Univariate Polynomial Ring in t over Rational Field</span> </pre></div> </div> <p>Данный способ создаст полиномиальное кольцо и укажет Sage использовать строку ‘t’ в качестве неизвестного при выводе на экран. Однако, это не определяет символ <tt class="docutils literal"><span class="pre">t</span></tt> для использования в Sage, так что нельзя при помощи него ввести полином (как <img class="math" src="_images/math/8a00b57e20a3a538f38897e96329a9e4674c797c.png" alt="t^2+1"/>), принадлежащий <tt class="docutils literal"><span class="pre">R</span></tt>.</p> <p>Другой способ:</p> <div class="highlight-python"><div class="highlight"><pre><span class="go">sage: S = QQ['t']</span> <span class="go">sage: S == R</span> <span class="go">True</span> </pre></div> </div> <p>Этот способ имеет ту же проблему по отношению к <tt class="docutils literal"><span class="pre">t</span></tt>.</p> <p>Третий способ более удобный</p> <div class="highlight-python"><div class="highlight"><pre><span class="go">sage: R.<t> = PolynomialRing(QQ)</span> </pre></div> </div> <p>или</p> <div class="highlight-python"><div class="highlight"><pre><span class="go">sage: R.<t> = QQ['t']</span> </pre></div> </div> <p>или даже</p> <div class="highlight-python"><div class="highlight"><pre><span class="go">sage: R.<t> = QQ[]</span> </pre></div> </div> <p>Этот способ влечет за собой объявление переменной <tt class="docutils literal"><span class="pre">t</span></tt> как неизвестного в полиномиальном кольце так, что ее можно использовать при создании элементов <tt class="docutils literal"><span class="pre">R</span></tt>, как описано ниже. (Заметьте, что третий способ похож на обозначение конструктора в Magma, и, как в Magma, он может быть использован для широкого набора объектов.)</p> <div class="highlight-python"><div class="highlight"><pre><span class="go">sage: poly = (t+1) * (t+2); poly</span> <span class="go">t^2 + 3*t + 2</span> <span class="go">sage: poly in R</span> <span class="go">True</span> </pre></div> </div> <p>Какой бы способ ни использовался для задания полиномиального кольца, можно вычленить неизвестное в виде <img class="math" src="_images/math/3e2e1ce17391902fc85100ef31da75fdb5be701f.png" alt="0^{th}"/> генератора:</p> <div class="highlight-python"><div class="highlight"><pre><span class="go">sage: R = PolynomialRing(QQ, 't')</span> <span class="go">sage: t = R.0</span> <span class="go">sage: t in R</span> <span class="go">True</span> </pre></div> </div> <p>Похожая конструкция используется для комплексных чисел: комплексные числа могут быть рассмотрены как генерированные из вещественных чисел с использованием символа <tt class="docutils literal"><span class="pre">i</span></tt>; из этого следует:</p> <div class="highlight-python"><div class="highlight"><pre><span class="go">sage: CC</span> <span class="go">Complex Field with 53 bits of precision</span> <span class="go">sage: CC.0 # 0-ой генератор CC</span> <span class="go">1.00000000000000*I</span> </pre></div> </div> <p>Для полиномиальных колец можно получить и кольцо, и его генератор, или просто генератор во время создания кольца:</p> <div class="highlight-python"><div class="highlight"><pre><span class="go">sage: R, t = QQ['t'].objgen()</span> <span class="go">sage: t = QQ['t'].gen()</span> <span class="go">sage: R, t = objgen(QQ['t'])</span> <span class="go">sage: t = gen(QQ['t'])</span> </pre></div> </div> <p>Наконец, можно совершить некоторые арифметические опрерации в <img class="math" src="_images/math/b98c8bc06f91190aef10380e94d98b85005c29d9.png" alt="\QQ[t]"/>.</p> <div class="highlight-python"><div class="highlight"><pre><span class="go">sage: R, t = QQ['t'].objgen()</span> <span class="go">sage: f = 2*t^7 + 3*t^2 - 15/19</span> <span class="go">sage: f^2</span> <span class="go">4*t^14 + 12*t^9 - 60/19*t^7 + 9*t^4 - 90/19*t^2 + 225/361</span> <span class="go">sage: cyclo = R.cyclotomic_polynomial(7); cyclo</span> <span class="go">t^6 + t^5 + t^4 + t^3 + t^2 + t + 1</span> <span class="go">sage: g = 7 * cyclo * t^5 * (t^5 + 10*t + 2)</span> <span class="go">sage: g</span> <span class="go">7*t^16 + 7*t^15 + 7*t^14 + 7*t^13 + 77*t^12 + 91*t^11 + 91*t^10 + 84*t^9</span> <span class="go"> + 84*t^8 + 84*t^7 + 84*t^6 + 14*t^5</span> <span class="go">sage: F = factor(g); F</span> <span class="go">(7) * t^5 * (t^5 + 10*t + 2) * (t^6 + t^5 + t^4 + t^3 + t^2 + t + 1)</span> <span class="go">sage: F.unit()</span> <span class="go">7</span> <span class="go">sage: list(F)</span> <span class="go">[(t, 5), (t^5 + 10*t + 2, 1), (t^6 + t^5 + t^4 + t^3 + t^2 + t + 1, 1)]</span> </pre></div> </div> <p>Деление двух полиномов создаст элемент в дробном поле, что будет сделано Sage автоматически.</p> <div class="highlight-python"><div class="highlight"><pre><span class="go">sage: x = QQ['x'].0</span> <span class="go">sage: f = x^3 + 1; g = x^2 - 17</span> <span class="go">sage: h = f/g; h</span> <span class="go">(x^3 + 1)/(x^2 - 17)</span> <span class="go">sage: h.parent()</span> <span class="go">Fraction Field of Univariate Polynomial Ring in x over Rational Field</span> </pre></div> </div> <p>Используя ряды Лорана, можно посчитать разложение в ряд в дробном поле <tt class="docutils literal"><span class="pre">QQ[x]</span></tt>:</p> <div class="highlight-python"><div class="highlight"><pre><span class="go">sage: R.<x> = LaurentSeriesRing(QQ); R</span> <span class="go">Laurent Series Ring in x over Rational Field</span> <span class="go">sage: 1/(1-x) + O(x^10)</span> <span class="go">1 + x + x^2 + x^3 + x^4 + x^5 + x^6 + x^7 + x^8 + x^9 + O(x^10)</span> </pre></div> </div> <p>Если назвать переменную по-другому, можно получить другое одномерное полиномиальное кольцо.</p> <div class="highlight-python"><div class="highlight"><pre><span class="go">sage: R.<x> = PolynomialRing(QQ)</span> <span class="go">sage: S.<y> = PolynomialRing(QQ)</span> <span class="go">sage: x == y</span> <span class="go">False</span> <span class="go">sage: R == S</span> <span class="go">False</span> <span class="go">sage: R(y)</span> <span class="go">x</span> <span class="go">sage: R(y^2 - 17)</span> <span class="go">x^2 - 17</span> </pre></div> </div> <p>Кольцо определяется переменной. Обратите внимание, что создание ещё одного кольца с переменной <tt class="docutils literal"><span class="pre">x</span></tt> не вернет другого кольца.</p> <div class="highlight-python"><div class="highlight"><pre><span class="go">sage: R = PolynomialRing(QQ, "x")</span> <span class="go">sage: T = PolynomialRing(QQ, "x")</span> <span class="go">sage: R == T</span> <span class="go">True</span> <span class="go">sage: R is T</span> <span class="go">True</span> <span class="go">sage: R.0 == T.0</span> <span class="go">True</span> </pre></div> </div> <p>Sage поддерживает кольца степенных рядов и рядов Лорана для любого базисного кольца. В следующем примере создадим элемент из <img class="math" src="_images/math/0d054bcbcbf87b8d03b8105520077d81ab9d442c.png" alt="\GF{7}[[T]]"/> и поделим, чтобы создать элемент из <img class="math" src="_images/math/494316fc12a628e1a24484454c504b0b0a59845e.png" alt="\GF{7}((T))"/>.</p> <div class="highlight-python"><div class="highlight"><pre><span class="go">sage: R.<T> = PowerSeriesRing(GF(7)); R</span> <span class="go">Power Series Ring in T over Finite Field of size 7</span> <span class="go">sage: f = T + 3*T^2 + T^3 + O(T^4)</span> <span class="go">sage: f^3</span> <span class="go">T^3 + 2*T^4 + 2*T^5 + O(T^6)</span> <span class="go">sage: 1/f</span> <span class="go">T^-1 + 4 + T + O(T^2)</span> <span class="go">sage: parent(1/f)</span> <span class="go">Laurent Series Ring in T over Finite Field of size 7</span> </pre></div> </div> <p>Также можно создавать кольца степенных рядов, используя двойные скобки:</p> <div class="highlight-python"><div class="highlight"><pre><span class="go">sage: GF(7)[['T']]</span> <span class="go">Power Series Ring in T over Finite Field of size 7</span> </pre></div> </div> </div> <div class="section" id="id3"> <h2>Полиномы нескольких переменных<a class="headerlink" href="#id3" title="Ссылка на этот заголовок">¶</a></h2> <p>Для работы с полиномами с несколькими переменными, сначала надо объявить полиномиальное кольцо и переменные.</p> <div class="highlight-python"><div class="highlight"><pre><span class="go">sage: R = PolynomialRing(GF(5),3,"z") # здесь 3 - это число переменных</span> <span class="go">sage: R</span> <span class="go">Multivariate Polynomial Ring in z0, z1, z2 over Finite Field of size 5</span> </pre></div> </div> <p>Так же, как и для одномерных полиномов, существует несколько путей:</p> <div class="highlight-python"><div class="highlight"><pre><span class="go">sage: GF(5)['z0, z1, z2']</span> <span class="go">Multivariate Polynomial Ring in z0, z1, z2 over Finite Field of size 5</span> <span class="go">sage: R.<z0,z1,z2> = GF(5)[]; R</span> <span class="go">Multivariate Polynomial Ring in z0, z1, z2 over Finite Field of size 5</span> </pre></div> </div> <p>Чтобы имена переменных состояли из букв, надо использовать следующее:</p> <div class="highlight-python"><div class="highlight"><pre><span class="go">sage: PolynomialRing(GF(5), 'x, y, z')</span> <span class="go">Multivariate Polynomial Ring in x, y, z over Finite Field of size 5</span> </pre></div> </div> <p>Немного арифметики:</p> <div class="highlight-python"><div class="highlight"><pre><span class="go">sage: z = GF(5)['z0, z1, z2'].gens()</span> <span class="go">sage: z</span> <span class="go">(z0, z1, z2)</span> <span class="go">sage: (z[0]+z[1]+z[2])^2</span> <span class="go">z0^2 + 2*z0*z1 + z1^2 + 2*z0*z2 + 2*z1*z2 + z2^2</span> </pre></div> </div> <p>Можно использовать более математическое обозначение, чтобы построить полиномиальное кольцо.</p> <div class="highlight-python"><div class="highlight"><pre><span class="go">sage: R = GF(5)['x,y,z']</span> <span class="go">sage: x,y,z = R.gens()</span> <span class="go">sage: QQ['x']</span> <span class="go">Univariate Polynomial Ring in x over Rational Field</span> <span class="go">sage: QQ['x,y'].gens()</span> <span class="go">(x, y)</span> <span class="go">sage: QQ['x'].objgens()</span> <span class="go">(Univariate Polynomial Ring in x over Rational Field, (x,))</span> </pre></div> </div> <p>Многомерные полиномы внедрены в Sage с использованием словарей Python. Sage использует Singular <a class="reference internal" href="bibliography.html#si">[Si]</a> для вычислений НОД и базиса Грёбнера идеалов.</p> <div class="highlight-python"><div class="highlight"><pre><span class="go">sage: R, (x, y) = PolynomialRing(RationalField(), 'x, y').objgens()</span> <span class="go">sage: f = (x^3 + 2*y^2*x)^2</span> <span class="go">sage: g = x^2*y^2</span> <span class="go">sage: f.gcd(g)</span> <span class="go">x^2</span> </pre></div> </div> <p>Создадим идеал <img class="math" src="_images/math/db7b42a61095556ced1af91db9457c2a5c442b96.png" alt="(f,g)"/>, генерированный из <img class="math" src="_images/math/bb2c93730dbb48558bb3c4738c956c4e8f816437.png" alt="f"/> и <img class="math" src="_images/math/bb2c93730dbb48558bb3c4738c956c4e8f816437.png" alt="f"/> умножением <tt class="docutils literal"><span class="pre">(f,g)</span></tt> на <tt class="docutils literal"><span class="pre">R</span></tt>.</p> <div class="highlight-python"><div class="highlight"><pre><span class="go">sage: I = (f, g)*R; I</span> <span class="go">Ideal (x^6 + 4*x^4*y^2 + 4*x^2*y^4, x^2*y^2) of Multivariate Polynomial</span> <span class="go">Ring in x, y over Rational Field</span> <span class="go">sage: B = I.groebner_basis(); B</span> <span class="go">[x^6, x^2*y^2]</span> <span class="go">sage: x^2 in I</span> <span class="go">False</span> </pre></div> </div> <p>Кстати, базис Грёбнера является не списком, а неизменяемой последовательностью. Это означает, что у него есть универсум, родитель и что он не может быть изменен (что хорошо, поскольку изменение базиса нарушило бы другие операции, использующие базис Грёбнера).</p> <div class="highlight-python"><div class="highlight"><pre><span class="go">sage: B.parent()</span> <span class="go">Category of sequences in Multivariate Polynomial Ring in x, y over Rational</span> <span class="go">Field</span> <span class="go">sage: B.universe()</span> <span class="go">Multivariate Polynomial Ring in x, y over Rational Field</span> <span class="go">sage: B[1] = x</span> <span class="gt">Traceback (most recent call last):</span> <span class="c">...</span> <span class="gr">ValueError</span>: <span class="n">object is immutable; please change a copy instead.</span> </pre></div> </div> <p>Некоторая коммутативная алгебра доступна в Sage и внедрена с помощью Singular. К примеру, можно посчитать примарное разложение и простые соответствующие для <img class="math" src="_images/math/027f4a11d6090f9eac0ce2488df6384dad1263ea.png" alt="I"/>:</p> <div class="highlight-python"><div class="highlight"><pre><span class="go">sage: I.primary_decomposition()</span> <span class="go">[Ideal (x^2) of Multivariate Polynomial Ring in x, y over Rational Field,</span> <span class="go"> Ideal (y^2, x^6) of Multivariate Polynomial Ring in x, y over Rational Field]</span> <span class="go">sage: I.associated_primes()</span> <span class="go">[Ideal (x) of Multivariate Polynomial Ring in x, y over Rational Field,</span> <span class="go"> Ideal (y, x) of Multivariate Polynomial Ring in x, y over Rational Field]</span> </pre></div> </div> </div> </div> </div> </div> </div> <div class="sphinxsidebar"> <div class="sphinxsidebarwrapper"> <h3><a href="index.html">Содержание</a></h3> <ul> <li><a class="reference internal" href="#">Полиномы</a><ul> <li><a class="reference internal" href="#section-univariate">Полиномы одной переменной</a></li> <li><a class="reference internal" href="#id3">Полиномы нескольких переменных</a></li> </ul> </li> </ul> <h4>Предыдущий раздел</h4> <p class="topless"><a href="tour_linalg.html" title="предыдущая глава">Линейная алгебра</a></p> <h4>Следующий раздел</h4> <p class="topless"><a href="tour_groups.html" title="следующая глава">Конечные группы, Абелевы группы</a></p> <h3>На этой странице</h3> <ul class="this-page-menu"> <li><a href="_sources/tour_polynomial.txt" rel="nofollow">Показать исходный текст</a></li> </ul> <div id="searchbox" style="display: none"> <h3>Быстрый поиск</h3> <form class="search" action="search.html" method="get"> <input type="text" name="q" size="18" /> <!-- The shading of the "Go" button should be consistent --> <!-- with the colour of the header and footer. See the file --> <!-- doc/common/themes/sage/theme.conf for colours used by --> <!-- the Sage theme. --> <input type="submit" style="background-color: #B8B9F6" value="Искать" /> <input type="hidden" name="check_keywords" value="yes" /> <input type="hidden" name="area" value="default" /> </form> <p class="searchtip" style="font-size: 90%"> Введите слова для поиска или имя модуля, класса или функции. </p> </div> <script type="text/javascript">$('#searchbox').show(0);</script> </div> </div> <div class="clearer"></div> </div> <div class="related"> <h3>Просмотр</h3> <ul> <li class="right" style="margin-right: 10px"> <a href="genindex.html" title="Словарь-указатель" >словарь</a></li> <li class="right" > <a href="py-modindex.html" title="Python Module Index" >модули</a> |</li> <li class="right" > <a href="tour_groups.html" title="Конечные группы, Абелевы группы" >следующий</a> |</li> <li class="right" > <a href="tour_linalg.html" title="Линейная алгебра" >предыдущий</a> |</li> <a href="../index.html"><img src="_static/sagelogo.png" style="vertical-align: middle" title="Sage Logo"></a> <li><a href="index.html">Sage Tutorial in Russian v5.9</a> »</li> <li><a href="tour.html" >Тур по Sage</a> »</li> </ul> </div> <div class="footer"> © Copyright 2005--2011, The Sage Development Team. При создании использован <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3. </div> <script type="text/javascript"> /*global jQuery, window */ /* Sphinx sidebar toggle. Putting this code at the end of the body * enables the toggle for the live, static, and offline docs. Note: * sage.misc.html.math_parse() eats jQuery's dollar-sign shortcut. */ var jq = jQuery; jq(document).ready(function () { var bar, bod, bg, fg, key, tog, wid_old, wid_new, resize, get_state, set_state; bod = jq('div.bodywrapper'); bar = jq('div.sphinxsidebar'); tog = jq('<div class="sphinxsidebartoggle"></div>'); /* Delayed resize helper. Not perfect but good enough. */ resize = function () { setTimeout(function () { tog.height(bod.height()); }, 100); }; jq(window).resize(function () { resize(); }); /* Setup and add the toggle. See Sphinx v0.5.1 default.css. */ fg = jq('div.sphinxsidebar p a').css('color') || 'rgb(152, 219, 204)'; bg = jq('div.document').css('background-color') || 'rgb(28, 78, 99)'; wid_old = '230px'; wid_new = '5px'; tog.css('background-color', bg) .css('border-width', '0px') .css('border-right', wid_new + ' ridge ' + bg) .css('cursor', 'pointer') .css('position', 'absolute') .css('left', '-' + wid_new) .css('top', '0px') .css('width', wid_new); bod.css('position', 'relative'); bod.prepend(tog); resize(); /* Cookie helpers. */ key = 'sphinxsidebar='; set_state = function (s) { var date = new Date(); /* Expiry in 7 days. */ date.setTime(date.getTime() + (7 * 24 * 3600 * 1000)); document.cookie = key + encodeURIComponent(s) + '; expires=' + date.toUTCString() + '; path=/'; }; get_state = function () { var i, c, crumbs = document.cookie.split(';'); for (i = 0; i < crumbs.length; i += 1) { c = crumbs[i].replace(/^\s+/, ''); if (c.indexOf(key) === 0) { return decodeURIComponent(c.substring(key.length, c.length)); } } return null; }; /* Event handlers. */ tog.mouseover(function (ev) { tog.css('border-right-color', fg); }).mouseout(function (ev) { tog.css('border-right-color', bg); }).click(function (ev) { if (bod.hasClass('wide')) { bod.removeClass('wide'); bod.css('margin-left', wid_old); bar.css('width', wid_old); bar.show(); set_state('visible'); } else { set_state('hidden'); bar.hide(); bar.css('width', '0px'); bod.css('margin-left', wid_new); bod.addClass('wide'); } resize(); }); /* Hide the normally visible sidebar? */ if (get_state() === 'hidden') { tog.trigger('click'); } else { set_state('visible'); } }); </script> </body> </html>