Axiom

Материал из Википедии — свободной энциклопедии
Перейти к: навигация, поиск
Axiom
Тип

система компьютерной алгебры

Разработчик

независимая группа людей

Операционная система

кроссплатформенное программное обеспечение

Лицензия

модифицированная лицензия BSD

Сайт

axiom-developer.org

Axiom на Викискладе

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

История[править | править вики-текст]

Разработка системы была начата в 1971 году группой исследователей IBM под руководством Ричарда Дженкса (англ. Richard Dimick Jenks)[1]. Изначально система называлась Scratchpad. Проект развивался медленно и в основном рассматривался как исследовательская платформа для разработки новых идей в вычислительной математике.

В 90-х система была продана компании Numerical Algorithms Group (NAG), получила название Axiom и стала коммерческим продуктом. Но по ряду причин система не получила коммерческого успеха и была отозвана с рынка в октябре 2001.

NAG решила сделать Axiom свободным программным обеспечением и открыла исходные коды под модифицированной лицензией BSD.

В 2007 у Axiom появились два форка с открытым исходным кодом: OpenAxiom и FriCAS.

Разработка системы продолжается, новые версии выходят каждые два месяца[2].

Философия проекта[править | править вики-текст]

Технология литературного программирования Кнута используется по всему исходному коду. Проект Axiom планирует использовать проверенные технологии (такие как Coq и ACL2) для доказательства корректности алгоритмов.

Особенности[править | править вики-текст]

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

Функция может получить тип в качестве аргумента, и её возвращаемое значение также может быть типом. Например, Fraction — функция, получающая IntegralDomain в качестве аргумента, и возвращающая поле отношений своего аргумента. В качестве другого примера кольцо 4\times 4 матриц действительных чисел может быть построено как SquareMatrix(4, Fraction Integer). Конечно, если работать в этом домене, 1 интерпретируется как единичная матрица и A^-1 позволяет получить обратную матрицу A, если она существует.

Некоторые операции могут иметь одинаковые имена, и тогда типы аргументов и результата используются для определения того, какая операция применяется, подобно тому, как в ООП.

Язык расширений Axiom называется SPAD. Вся математическая база Axiom написана на этом языке. Интерпретатор принимает почти такой же язык.

SPAD в дальнейшем разрабатывался под именем A# и позже Aldor. Последний, кроме того, может быть использован как альтернативный язык расширений. Однако, следует учесть, что он распространяется под другой лицензией.

Примеры[править | править вики-текст]

3j-символы[править | править вики-текст]

Вычисление 3j-символов и коэффициентов Клебша-Гордана.

j3Sum (j1, j2, j3, m1, m2, m3) ==
  maxz := reduce (min, [j1+j2-j3, j1-m1, j2+m2])
  minz := max(0, max ( -(j3-j2+m1), -(j3-j1-m2) ))
  minz > maxz => 0
  maxz < 0    => 0
  sum ( (-1)^(z+j1-j2-m3) / _
    ( factorial(z) * factorial(j1+j2-j3-z) * factorial(j1-m1-z) * _
      factorial(j2+m2-z) * factorial(j3-j2+m1+z) * factorial(j3-j1-m2+z) ), _
    z=minz..maxz)
 
j3 (j1, j2, j3, m1, m2, m3) ==
  m1 + m2 + m3 ~= 0  => 0
  abs(j1 - j2) > j3  => 0
  j1 + j2 < j3       => 0
  abs(m1) > j1       => 0
  abs(m2) > j2       => 0
  abs(m3) > j3       => 0
  not integer? (j1+j2+j3) => 0
  sqrt ( _
    factorial(j1+j2-j3) * factorial(j1-j2+j3) * factorial(-j1+j2+j3) / _
                          factorial(j1+j2+j3+1) * _
        factorial(j1+m1) * factorial(j1-m1) * _
        factorial(j2+m2) * factorial(j2-m2) * _
        factorial(j3+m3) * factorial(j3-m3)
    ) * j3Sum (j1, j2, j3, m1, m2, m3)       
 
clebschGordan (j1, j2, j, m1, m2, m) ==
    (-1)^(j1-j2+m) * sqrt(2*j+1) * j3(j1, j2, j, m1, m2, -m)

Общая теория относительности[править | править вики-текст]

«Аксиома» выводит символы Кристоффеля и тензоры Римана и Риччи в решении Шварцшильда.

x   := vector ['t, 'r, '%theta, '%phi];
dim := #x;
 
%nu     := operator '%nu;
%lambda := operator '%lambda;
lg := matrix [
    [exp(%nu r),       0,         0,    0], _
    [       0,  - exp(%lambda r), 0,    0], _
    [       0,      0,          -r^2,   0], _
    [       0,      0,            0,  -r^2*sin(%theta)^2]  _
    ];
 
ug := inverse lg;
 
grSetup(metric, names) ==
    free x
    free dim
    free lg
    free ug
    x   := names
    dim := #x
    lg  := metric
    ug  := inverse lg
 
sum(list) == reduce (+, list)
 
Christoffel (k,l,i) ==
 (1/2) * sum [ ug(i,m)*(D(lg(k,m), x(l)) + D(lg(m,l), x(k)) - D(lg(k,l), x(m)))
         for m in 1..dim ]
 
Riemann (k,l,m,i) ==
 D(Christoffel(k,m,i), x(l)) -
  D(Christoffel(k,l,i), x(m)) +
   sum [ 
    Christoffel(n,l,i)*Christoffel(k,m,n) -
     Christoffel(n,m,i)*Christoffel(k,l,n)
      for n in 1..dim ]
 
Ricci (i,k) == sum [ Riemann(i,l,k,l) for l in 1..dim ]
 
scalarCurvature () == sum [ sum [
                       ug(i,k) * Ricci(i,k)
                        for i in 1..dim ]  for k in 1..dim ]
 
lRiemann (i,i,l,m) == 0
lRiemann (i,k,l,l) == 0
lRiemann (i,k,l,m | i > k) == - lRiemann (k,i,l,m)
lRiemann (i,k,l,m | l > m) == - lRiemann (i,k,m,l)
lRiemann (i,k,l,m) == sum [ lg(i,n) * Riemann(k,l,m,n) for n in 1..dim ]
 
showChristoffel () ==
 for k in 1..dim repeat
  for l in 1..k repeat
   for i in 1..dim repeat
    if Christoffel(k,l,i) ~= 0 then
        k > l => output infix ('=, [script('%Gamma,[[k-1,l-1],[i-1]]), _
                      script('%Gamma,[[l-1,k-1],[i-1]]), _
                      Christoffel(k,l,i)::OUTFORM])
        k = l => output infix ('=, _
                  [script('%Gamma,[[k-1,l-1],[i-1]]), _
                   Christoffel(k,l,i)::OUTFORM])
 
showRicci () ==
 for i in 1..dim repeat
   for k in 1..i repeat
    if Ricci(i,k) ~= 0 then
        i = k => output infix ('=, [subscript('R,[i-1,k-1]), Ricci(i,k)::OUTFORM])
        i > k => output infix ('=, [subscript('R,[i-1,k-1]), _
                                    subscript('R,[k-1,i-1]), _
                                    Ricci(i,k)::OUTFORM])
 
showRiemann () ==
 for k in 1..dim repeat
  for l in 1..dim repeat
   for m in 1..dim repeat
    for i in 1..dim repeat
     if Riemann(k,l,m,i) ~= 0 then
        output infix ('=, _
          [script('R, [[k-1,l-1,m-1 ], [i-1]]), Riemann(k,l,m,i)::OUTFORM])
(21) -> showChristoffel()
   Compiling function sum with type List Expression Integer -> 
      Expression Integer 
   Compiling function Christoffel with type (PositiveInteger,
      PositiveInteger,PositiveInteger) -> Expression Integer 
   Compiling function showChristoffel with type () -> Void 
                %nu(r)   ,
              %e      %nu (r)
         1
   %Gamma   = ---------------
         0,0      %lambda(r)
               2%e
                            ,
                         %nu (r)
         0          0
   %Gamma   = %Gamma   = -------
         1,0        0,1     2
                     ,
              %lambda (r)
         1
   %Gamma   = -----------
         1,1       2
         2          2    1
   %Gamma   = %Gamma   = -
         2,1        1,2  r
         1            r
   %Gamma   = - ------------
         2,2      %lambda(r)
                %e
         3          3    1
   %Gamma   = %Gamma   = -
         3,1        1,3  r
         3          3    cos(%theta)
   %Gamma   = %Gamma   = -----------
         3,2        2,3  sin(%theta)
                             2
         1      r sin(%theta)
   %Gamma   = - --------------
         3,3       %lambda(r)
                 %e
         2
   %Gamma   = - cos(%theta)sin(%theta)
         3,3
                                                                   Type: Void
(22) -> Ricci(3,3)
   Compiling function Riemann with type (PositiveInteger,
      PositiveInteger,PositiveInteger,PositiveInteger) -> Expression 
      Integer 
   Compiling function Ricci with type (PositiveInteger,PositiveInteger)
       -> Expression Integer 
 
               ,              ,         %lambda(r)
         - r%nu (r) + r%lambda (r) + 2%e           - 2
 
   (22)  ---------------------------------------------
                            %lambda(r)
                         2%e
                                                     Type: Expression Integer

Галерея[править | править вики-текст]

Документация[править | править вики-текст]

Axiom — литературная программа. Исходный код доступен в наборе томов на сайте: axiom-developer.org. Эти тома содержат актуальный исходный код системы.

На данный момент доступны следующие документы:

  • Общее оглавление
  • Volume 0: Axiom Jenks and Sutor — Основной учебник
  • Volume 1: Axiom Tutorial — Простое введение
  • Volume 2: Axiom Users Guide — Подробные примеры использования доменов (незавершённый)
  • Volume 3: Axiom Programers Guide — Руководство в примерах для написания программ (незавершённый)
  • Volume 4: Axiom Developers Guide — Короткие наброски на темы, специфичные для разработчиков (незавершённый)
  • Volume 5: Axiom Intepreter — Исходый код интерпретатора Axiom (незавершённый)
  • Volume 6: Axiom Command — Исходый код системных команд и скриптов (незавершённый)
  • Volume 7: Axiom Hyperdoc — Исходный код и разъяснения браузера справки X11 Hyperdoc
  • Volume 8: Axiom Graphics — Исходый код подсистемы X11 Graphics
  • Volume 9: Axiom Compiler — Исходый код компилятора Spad (незавершённый)
  • Volume 10: Axiom Algebra Implementation — Наброски особенностей реализации (незавершённый)
  • Volume 11: Axiom Browser — Исходные страницы внешнего интерфейса Axiom для браузера Firefox
  • Volume 12: Axiom Crystal — Исходный код внешнего интерфейса Axiom Crystal (незавершённый)

Видео[править | править вики-текст]

Важной целью проекта Axiom является предоставление документации. В ноябре 2008 года проект анонсировал первое из серии обучающих видео, которые также доступны на сайте: axiom-developer.org. Первое видео рассказывает о источниках информации о Axiom.[3]

Примечания[править | править вики-текст]

Ссылки[править | править вики-текст]