Axiom

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

Axiom
Тип система компьютерной алгебры
Разработчик независимая группа людей
Написана на Лисп
Операционная система кроссплатформенное программное обеспечение
Последняя версия
Лицензия модифицированная лицензия BSD
Сайт axiom-developer.org
 Медиафайлы на Викискладе

История

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

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

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

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

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

Философия проекта

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

Особенности

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

Функция может получить тип в качестве аргумента, и её возвращаемое значение также может быть типом. Например, Fraction — функция, получающая IntegralDomain в качестве аргумента, и возвращающая поле отношений своего аргумента. В качестве другого примера кольцо матриц действительных чисел может быть построено как 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.[5]

Примечания

Ссылки

This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.