Система компьютерной алгебры Sage: краткое введение
Е.А. Бордаченкова, А.А. Панфёров
Введение
Эссе адресовано читателям, впервые встречающимся с системами компьютерной алгебры. Система Sage  удобная среда для того, чтобы получить первый опыт работы в области компьютерной алгебры. Существуют веб-интерфейсы для работы с Sage, поэтому загружать и устанавливать систему, чтобы попробовать её возможности и получить первое впечатление, не требуется.
Sage - история, цели, особенности
   Система Sage (точное название SageMath)  система компьютерной алгебры, охватывающая различные области математики. Sage может производить алгебраические преобразования выражений (упрощение, разложение на множители), решать уравнения, выполнять дифференцирование и интегрирование функций, работать с векторами и матрицами. 
   В 2005 г. Вильям Штейн начал проект Sage. Проект продолжает развиваться, сейчас в нём принимают участие сотни разработчиков. Создатели считают, что систему Sage будут использовать учащиеся старших классов и студенты университетов, преподаватели и учёные, занимающиеся компьютерной алгеброй. 
   Система Sage – свободно распространяемое (бесплатное) открытое программное обеспечение. Целью проекта являлось создание альтернативы закрытым коммерческим системам, таким, как Magma, Maple, Mathematika и Matlab. Систему Sage можно скачать бесплатно с сайта проекта, составляющие Sage программы не содержит лицензированного кода и не имеют защиты от копирования. Открытость кода Sage означает, что исходные тексты доступны для просмотра; В. Штейн пишет, что в системе "нет ничего, что Вы не могли бы посмотреть или изменить". Именно такой подход позволил привлечь к работе над системой Sage множество программистов из разных стран. 
   Следующая идея, лежащая в основе проекта Sage, состоит в том, чтобы максимально использовать существующие математические пакеты, вместо программирования всех алгоритмов с нуля. В Sage интегрировано более 100 специализированных и универсальных пакетов (например, GAP, PARI/GP, Singular, Maxima). Таким образом система быстро получила функциональную мощность.
   Рабочий язык разработки системы  Питон (Python). Использование универсального популярного языка программирования, поддержанного большим количеством библиотек, ещё одна концепция, лежащая в основе Sage. Язык Питон является бесплатным, что важно для проекта Sage. Он широко используется в различных областях (базы данных, статистика, машинное обучение), так что пользователь Sage получает дополнительный бонус в виде знакомства с языком, который пригодится ему в профессиональной жизни. Однако, язык системы SageMath более широкий, чем Питон, Sage предоставляет средства, которых нет в Питоне. Реализовано это с помощью встроенного в Sage компилятора Cyton.  Так же компилятор позволяет  комбинировать текст на Питоне с библиотеками, написанными на С, С++, Фортране и использовать фрагменты  кода, написанные на языке Lisp.
Простейшая работа с системой Sage
   Самый простой способ познакомиться с системой Sage  использовать web-интерфейс Sage Cell Server (https://sagecell.sagemath.org). 
   Если ввести в адресной строке браузера вышеуказанный адрес,  откроется страница, примерный вид которой изображён на рисунке 1.
   
Рис. 1
   Работа в системе Sage происходит в режиме диалога: пользователь вводит команду, система даёт ответ. На рисунке 1 в верхнем поле написано выражение. При нажатии на кнопку Evaluate (вычислить), Sage выводит результат 24 в нижнем поле. 
   Можно ввести несколько команд (выражений) в отдельных строках (как видно на рисунке, слева в поле ввода стоят номера строк 1, 2, 3). В этом случае Sage выполнит команды последовательно, но в поле вывода будет напечатан результат последней команды.   
   В дальнейшем для записи примеров будем использовать следующую запись, изображающую сессию работы с Sage из командной строки:

   sage: 2*17-10

   24

В начале первой строки стоит "sage:"   это приглашение системы ввести команду; после приглашения выписана команда пользователя. Во второй строке находится ответ, который напечатала система. Сессию работы с Sage (ввод нескольких команд с ответами системы) будем изображать в виде последовательности пар строк

   sage: 2*17-10

   24

   sage: 2*(17-10)

   14 
   При записи выражений используются обычные знаки +, -, * (умножение), / и скобки. Для обозначения операции возведения в степень есть значок ^

   sage: (1-3)^3

   -8

   Вычисления выполняются точно, например, выражение 15/9 вычисляется до точного рационального числа 5/3 , а не до приближённого 1.66666666666667. Если нужно получить приближённое значение в виде числа с точкой, можно применить функцию numerical_approx 

   sage: 15/9

   5/3

   sage: numerical_approx(15/9)

   1.66666666666667   

   sage: 2^100

   1267650600228229401496703205376 

   sage: numerical_approx(2^100)

   1.26765060022823e30

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

   sage: numerical_approx((125/7, digits=25))

   17.85714285714285714285714  

   Операции // и % дают частное и остаток при делении целых чисел 

   sage: (-10)//7

   -2

     sage: (-10)%7

   4

   Имеется возможность разложить число на простые множители  

   sage: factor(15^2)

   3^2*5^2

   В Sage доступны обычные константы (вещественные и комплексные) pi, e, i (мнимая 1)  

    sage: sin(pi/2)

    1

    sage: sin(pi/4)

    1/2*sqrt(2)

      sage: i^2

    -1

    sage: ln(e)

    1

   Как в других языках программирования, в Sage используются переменные. Запись значения в переменную выполняется командой присваивания =

   sage: a=25-4

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

   sage: a=25-4

   sage: a

   21

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

   sage: a=25-4 ; a

   21

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

   sage: a=25-4 ; a

   21

   sage: a=a//5

   4 

   Особенно полезна система Sage для работы с символьными выражениями, содержащими переменные (в математическом, а не программистском смысле), такими как $(x+y)*(x-y)$ или $z^2+2z+1$.  Прежде, чем использовать такие символические переменные, их необходимо декларировать следующим образом  

   sage: z=var('z')

   sage: 6*z^2+18*z

   6*z^2+18*z

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

   sage: (6*z^2+18*z)/6

   z^2+3*z

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

   sage: y=6*z^2+18*z ; y

   6*z^2+18*z

   sage: y/6

   z^2+3*z

   sage: y/z

   6*(z^2+3*z)/z

В примере декларирована переменная y со значением 6*z^2+18*z. Вычисляя значение выражения y/6, Sage разделил оба слагаемых на знаменатель. Однако, при вычислении y/z сокращения на z не произошло, зато был вынесен общий множитель 6. 

   Записи z=var('z') и var('z') почти эквивалентны. Разница в том, что var('z') заставляет Sage напечатать символическую переменную, созданную функцией, тогда как оператор присваивания не вызывает никакой печати. 

   Если нужно создать несколько переменных, можно написать несколько var либо использовать сокращённый способ записи

   sage: x=var('x') ; y=var('y') ; z=var('z')

   sage: x^2+y*z

   x^2+y*z

   sage: var('a, b, c')

   (a, b, c)

   sage: a^2+b*c

   a^2+b*c

    После выполнения команды var('a, b, c') Sage напечатала созданные переменные. 

   Система Sage умеет рисовать графики. Команда plot изображает график вещественной функции на заданном интервале. Команда plot3d изображает трёхмерный график вещественной функции двух переменных. Ниже даны примеры вызовов этих команд.

   sage: var('x, y')

   sage: plot(2*x^2-3, x, -1, 5)

   sage: plot3d(x^2+y^2, (x, -1, 1), (y, -1, 1))

«< Работа с многочленами »>
  Для работы с многочленами в Sage необходимо сначала определить кольцо многочленов, для чего достаточно указать имена переменных и основное поле (кольцо) коэффициентов. Для коэффициентов можно использовать предопределённые кольца, например, ZZ (кольцо целых чисел), QQ (поле рациональных чисел), RR (поле вещественных чисел), GF($n$) (конечное поле размера $n$) и др.
  Есть несколько способов задания кольца многочленов. Наиболее простой из них следующий:
   sage: R.<t> = QQ['t']
При этом переменную t можно будет использовать для задания многочленов из кольца R.
  Имена переменных, указанные при создании кольца, используются для вывода на экран. Они не обязаны совпадать с именами переменных, используемых для задания многочленов.
  Аналогично определяются и многочлены нескольких переменных. Например,
   sage: S.<x,y,z> = RR['x,y,z']
   sage: S
   Multivariate Polynomial Ring in x, y, z over Real Field with 53 bits of precision
  Выполним некоторые элементарные символьные операции над многочленами:
   sage: poly = (t+1) * (t+2); poly
   t^2 + 3*t + 2
   sage: f = 2*t^7 + 3*t^2 - 15/19
   sage: f^2
   4*t^14 + 12*t^9 - 60/19*t^7 + 9*t^4 - 90/19*t^2 + 225/361
   sage: cyclo = R.cyclotomic_polynomial(7); cyclo
# многочлен деления круга
   t^6 + t^5 + t^4 + t^3 + t^2 + t + 1
   sage: g = 7 * cyclo * t^5 * (t^5 + 10*t + 2)
   sage: g
   7*t^16 + 7*t^15 + 7*t^14 + 7*t^13 + 77*t^12 + 91*t^11 + 91*t^10 + 84*t^9 + 84*t^8 + 84*t^7 + 84*t^6 + 14*t^5
   sage: F = factor(g); F
   (7) * t^5 * (t^5 + 10*t + 2) * (t^6 + t^5 + t^4 + t^3 + t^2 + t + 1)
   sage: F.unit() # коэффициент в разложении на множители
   7
   sage: list(F) # список неприводимых множителей и их степеней
   [(t, 5), (t^5 + 10*t + 2, 1), (t^6 + t^5 + t^4 + t^3 + t^2 + t + 1, 1)]

  Для работы с многочленами Sage использует различные пакеты (другие системы компьютерной алгебры). Так, функции cyclotomic_polynomial и factor, приведенные выше, на самом деле вызывают аналогичные функции из PARI. Код функции factor для многочленов от нескольких переменных использует Singular.
  Примеры вычисления наибольшего общего делителя двух многочленов:
   sage: gcd (x^3-1, x^2-1)
   x - 1
   sage: R3.<x,y,z> = QQ['x,y,z']
   sage: f = 3*x^2*(x+y)
   sage: g = 9*x*(y^2 - x^2)
   sage: f.gcd(g)
   x^2 + x*y
   sage: R4.<x> = GF(2)['x']
   sage: f = (x^3 - x + 1)*(x + x^2); f
   x^5 + x^4 + x^3 + x
   sage: g = (x^3 - x + 1)*(x + 1)
   sage: f.gcd(g)
   x^4 + x^3 + x^2 + 1

  Аналогично кольцам многочленов можно строить кольца степенных рядов и рядов Лорана.
Также в Sage реализована поддержка колец многочленов Оре.
«< Работа с матрицами »>
  Для создания матрицы используется функция matrix (или её синоним Matrix), в которую передаются размеры матрицы или её элементы:
   sage: A = matrix(3) # создаем нулевую квадратную матрицу размера 3x3
   sage: B = matrix(3,4) # создаем нулевую матрицу размера 3x4
   sage: C = matrix([[1,2,3],[3,2,1],[1,1,1]]) # конкретная матрица
В последнем примере элементы матрицы задаются явно в виде списка строк.
  Иногда бывает полезно указать, какому кольцу принадлежат элементы матрицы. Для этого соответствующее кольцо указывается в качестве первого параметра:
   sage: AZ = matrix(ZZ, [[2,0], [0,1]])
   sage: AQ = matrix(QQ, [[2,0], [0,1]])
   sage: AR = matrix(RR, [[2,0], [0,1]])
  Наряду с матрицами, Sage позволяет работать и с векторами. Для создания вектора используется функция vector:
   sage: v1 = vector([1,1,-4])
   sage: v2 = vector([2,3,4])
При создании матрицы можно задавать список её строк, используя векторы:
   sage: A = matrix([v1, v2])
   sage: A
   [1, 1,-4]
   [2, 3, 4]

  Рассмотрим элементарные вычисления с матрицами и векторами:
   sage: A = matrix([[1,2,3],[3,2,1],[1,1,1]])
   sage: w = vector([1,1,-4])
   sage: w*A # умножить вектор-строку на матрицу
   (0, 0, 0)
   sage: A*w # умножить матрицу на вектор-столбец
   (-9, 1, -2)

Таким образом, форма вектора (вектор-столбец или вектор-строка) определяется в каждой конкретной операции отдельно.
  Для обращение к элементам матрицы или вектора используются квадратные скобки, нумерация начинается с нуля. При этом можно обращаться как к конкретному элементу матрицы, так и к целой строке (которая является вектором):
   sage: A = matrix([[1,2,3],[4,5,6]])
  
sage: A[0,0] = -5
   sage: A[1]
   (4, 5, 6)
   sage: A[1] = vector([-1,-2,-3])
  
sage: A
   [-5 2 3]
   [-1 -2 -3]

  Для получения столбцов матрицы можно воспользоваться методом columns(), который возвращает список векторов, являющихся столбцами:
   sage: A.columns()
   [(-5, -1), (2, -2), (3, -3)]
  Для операций транспонирования, вычисления ранга, следа и определителя используются методы transpose(), rank(), trace() и det() соответственно. Для вычисления обратной матрицы, достаточно её возвести в степень $-1$.
  Для решения матричных уравнений применяются методы solve_right (для решения уравнений вида $AX=Y$) и solve_left (для решения уравнений вида $XA=Y$).