Axiom

Axiom est un logiciel libre de calcul formel.

Une introduction à Axiom

Instruction
Résultat
Type
cos 1.5
cos(1.5)
0.07074
Float
(4/6)::Float 0.6667
Float
%::Fraction Integer 2/3
Fraction Integer
round(2.85) 3.0
Float
truncate(2.85) 2.0
Float
fractionPart(2.85) 0.85
Float
abs(-2) 2
PositiveInteger
sign(-2) -1
Integer
sign(0) 0
NonNegativeInteger

 

Instruction
Description
round(x)  
truncate(x)  
fractionPart(x)  
abs(x)  
sign(x)  
positive?(x)  
negative?(x)  
zero?(x)  
one?(x)  
odd?(x) Impaire?
even?(x) Paire?
prime?(x) Premier?
gcd(x,y)  
lcm(x,y)  
max(x,y)  
min(x,y)  
factorial(x) Factoriel
factor(x) Facteurs premiers
divide(x,y) Quotient et Reste

 

Symbole
Decription

and
/\

Et
or
\/
Ou
not
Négation
quo
Quotient
rem
Reste
<=
plus petit
ou égal
>=
plus grand
ou égal

 

Macro
Description
%i
i
%e
E
%pi
PI
%infinity
Infini
%plusInfinity
Infini positif
%minusInfinity
Infini négatif

 

Instruction
Résultat
Type
(2/3 + %i)
2/3 + %i
Complex Fraction Integer
real(3+2*%i)
3
PositiveInteger
imag(3+2*%i)
2
PositiveInteger
conjugate(3+2*%i)
3 - 2*%i
Complex Integer
factor(2+4*%i)
-%i*(1+%i)^2*(1+2%i)
Factored Complex Integer
%minusInfinity
Infini négatif

 

Instruction
Résultat
Type
p := x*y+1;
eval(p,x=2)

2*y+1

Polynomial Integer
eval(p,[x=2,y=2])
5
Polynomial Integer

 

Instruction
Résultat
Type
x : PrimeField 7
x:=11
4
PrimeField 7
y : IntegerMod 8
y:=3
3
IntegerMod 8
%pi :: Float
3.1415
Float
11 :: PrimeField 7
4
PrimeField 7
p : Polynomial PrimeField 7
p:=(11*x^2+3*x+1)
4*x^2+3*x+1
Polynomial PrimeField 7
(2/3)::Float
0.6666
Float
(2/3)$Float
0.6666
Float
(2/3)@Float
0.6666
Float
5::String
"5"
String
     

X::T conversion explicite de X en type T si possible.

X$T évaluer X avec les opérateurs disponibles pour le type T.

X@T évaluer X en choisissant les opérateurs de sorte que le résultat soit de type T.

, Tuple

; N'affiche pas le résultat (seulement le type).

% Retourne le dernier résultat.
%%(-5) Retourne le 5ième dernier résultat.
%%(17) Retourne le résultat du point n°17.

_ Permet de continuer l'instruction sur la ligne suivante.

-- Début de commentaire sur une ligne.
++ Début de commentaire sur une ligne.

Instruction
Résultat
Type ou description
list(4)
[4]
List PositiveInteger
[2,5,7]
[2,5,7]
List PositiveInteger
append([1,2],[5,6])
[1,2,5,6]
Recopie [1,2] en insérant en tête de [5,6]
cons(7,[1,2])
[7,1,2]
Recopie [7] en insérant en tête de [1,2]
first([2,5,7])
2
first([2,5,7],2)
[2,5]
rest([2,5,7])
[5,7]
Retourne un pointeur sur [5,7]
rest([2,5,7],2)
[7]
Retourne un pointeur sur [7]
empty?([2,5])
false
Boolean
member?(5,[2,5,7])
true
Boolean
reverse([2,5,-1,7])
[7,-1,5,2]
List Integer
sort([2,5,-1,7])
[-1,2,5,7]
List Integer
removeDuplicates([1,2,1,1])
[2,1]
List PositiveInteger
#[1,2,1,1]
4
PositiveInteger
u:=[2,5];
concat!(u,[7]);
u
[2,5,7]
setrest!(u,v)
Modifie la liste u en faisant pointer le reste sur v
u:=[1,5,7,9];
u.3
7
u(3)
7
first rest rest u
7
elt(u,3)
7
last(u)
9
u.last
9
#u
4
Cela boucle s'il y a des boucles
v := [i for i in u]
recopie u dans v
v:=copy(u)
recopie u dans v
[i for i in 1..9 | even?(i)]
[2,4,6,8]
u:=[1..3,7..9]
[1..3,5..9]
expand(u)
[1,2,3,7,8,9]
u:=[1..]
[1..]
expand(u)

[1,2,3,4,5,...]

generate(nextPrime,2)
[2,3,5,7,11,...]
InfiniteTuple Integer
generate(nextPrime,2)_
$Stream Integer
[2,3,5,7,11,...]
Stream Integer
[generate(nextPrime,2)]
[2,3,5,7,11,...]
Stream Integer
[i for i in 1.. | prime?(i)]
[2,3,5,7,11,...]
Stream PositiveInteger

 

Instruction
Résultat
Type ou description

f : List Integer -> List Integer
f(x) == [x.2, x.1 + x.2]

void
f([2,3])
[3,5]
List Integer
[generate(f,[1,1])]
[[1,1],[1,2],[2,3],[3,5],...]
Stream List Integer
u := [i.1 for i in [generate(f,[1,1])]]
[1,1,2,3,...]
Stream Integer
u.50
12586269025
PositiveInteger

 

Instruction
Résultat
Type ou description
oneDimensionalArray([1,2,3])
[1,2,3]
OneDimensionalArray PositiveInteger
V : ARRAY1 Integer
V:=new(5,7)
[7,7,7,7,7]
OneDimensionalArray Integer
map(i +-> i+1, V)
[8,8,8,8,8]
OneDimensionalArray Integer
map!(i +-> i+1, V); V
[8,8,8,8,8]
OneDimensionalArray Integer
U:ARRAY1 Integer
U:=[5,6,7]
swap!(U,2,3); U
[5,7,6]
OneDimensionalArray Integer
copyInto!(V,U,2)
[8,5,6,7,8]
OneDimensionalArray Integer
vector([1,2,3])
[1,2,3]
Vector PositiveInteger
"Hello"
"Hello"
String
bits(8,true)
"11111111"
Bits
f : FARRAY INT : new(4,1)
[1,1,1,1]
FlexibleArray Integer

 

Instruction
Description
)clear all Reset
)read input fred.input Lit, compile et éxecute le fichier fred.input

Un block est une succession d'instruction entre parenthèse séparées par des points virgules. Exemple :

(a:=1; b:=2; [a,b])

Ce block retourne [1,2]. Les blocks s'emboitent. Et plusieurs écritures sont possibles. Par exemple :

L:= (a:=1; b:=2; [a,b])

Dans un fichier texte cela pourra s'écrire autrement :

L:=
         a:=1;
         b:=2;
         [a,b]

l'indentation est importante, l'expression a:=1 en dessous, doit être après la parenthèse (. Et la parenthèse fermante doit être après le début de "sqr" et avant le début de "a:=1". Et les assertions a:=1;b:=2;c:=a+b;c doivent débuter paraillement.

sqrt(1.0 +
         a:=1
         b:=2
         c:=a+b
         c
       )

L'opérateur : sert à définir le type d'une variable. Par exemple

x : Fraction Integer

définie x comme une fraction d'entier. Pour les fonctions, la méthode est la même sauf que les arguments de la fonction sont placés entre parenthèses et le type de retour est placé après le symbole `` ->''. Par exemples :

f : ()->Integer
g : (Integer) -> List Integer
h : (Integer, PositiveInteger) -> Integer

f() ==1
g(a) == [a,a+a,a*a]
h(x,a) == x^a

Lorsque la fonction n'a qu'un argument, l'appel peut se faire sans parenthèse. Exemple "g 5" ou "g(5)"
Exemple d'instruction pour sortire du corps de la fonction avec un résultat : return a +b+1
Exemple d'instruction if-then-else :

h :=2.0
if h >3.1 then
        1.0
     else
        z:=sin(h)
        max(z,0.5)

Le "else" doit être décalé du "if". Le teste doit être une expression booléenne (utiliser la conversion @Boolean si nécessaire).

Exemple de boucle :

i := 1
repeat
    if i > 4 then break
    output(i)
    i := i + 1

Ctrl C permet d'interompre l'execution d'une boucle sans fin.

Instruction
Description
return x sort de la fonction avec le résultat x
break sort de la boucle
iterate passe à l'itération suivante de la boucle
output(x) affiche x
repeat Boucle
while b repeat
Boucle while
while b and c repeat
while b while c repeat
Boucle while
for i in [1,2,7] repeat Boucle for
for i in 5..1 by -1 repeat
Boucle for,by
for i in 1.. | odd(i) repeat
for i in 1.. while odd(i) repeat
boucle for, tel que
boucle for, tant que

Introduction à Axiom (et en comparant quelques fois avec Mupad)

Axiom
Résultat
Mupad
Résultat
integrate(cos(a*x),x) sin(a*y)/a int(cos(a*x),x) sin(a*y)/a
digits(4) Calcul les nombres sur 4 chiffres. DIGITS:=4 Calcul les nombres flotants sur 4 chiffres.
solve(x^2-x-1, 0.0001) [x= - 0.618,x= 1.618] numeric::solve(x^2-x-1,x=1) [x= 1.618]
radix(1000,36) RS int2text(1000,36) "RS"
draw(sin(x)*cos(y), x=-5..5,y=-5..5)   plotfunc3d(sin(x)*cos(y),x=-5..5,y=-5..5)  

p(0) == 1
p(1) == x
p(n) == x*p(n-1) - p(n-2)
p(4)




x^4 - 3*x^2 + 1
   
coefficient(p(100),x,4) 270725 coeff(p(100),x,n)  
D(p(4)) 4*x^3 - 6*x D(p(4))  
[x^2 for x in 1..4] [1,4,9,16] [x^2 $ x = 1..4] [1,4,9,16]
a==[x^2 for x in 1..] [1,4,9,16,25,36,49,64,81,100,...]
   
a(7) 49 a[4] 16
a==series(exp(x),x=0)   a:=series(exp(x),x=0)  
coefficient(a,3) 1/6 coefficient(a,3)
coefficient(a,x,3)
1/6
a==matrix [ [x,0], [1,y] ]      
inverse(a)
a^(-1)
     

 

Instruction
Résultat
Type ou descrition
S:=[x^3+y+1=0, y^2=4]   Système d'équatio de type "List Equation Polynomial Integer"
solve(S,1/100) [[y=2,x=369/256],[y=-2,x=1]] Résoudre S avec 2 chiffres de précision.
Et en utilisant l'arithmétique des nombres rationnels comme approximation.
radicalSolve(S)   Résoud S avec les solutions exprimées en radicaux.
     

 

Instruction
Résultat
Type ou description
M := [ [x,0],[0,2*x] ]::Matrix(POLY(FRAC(INT)))
Matrix Polynomial Fraction Integer
x:=52
52
PositiveInteger
x
52
PositiveInteger
'x
x
Variable x
p := r^2 + 2/3
r^2 + 2/3
Polynomial Fraction Integer
p::Fraction Polynomial Integer
(3r^2+2)/3
Fraction Polynomial Integer
[u,v]
[u,v]
List OrderedVariableList [u,v]
x:=factor(12)
2^2*3
Factored Integer
x:=x+2
2*7
Factored Integer
x::Integer
14
Integer
r:=10/21
10/21
Fraction Integer
map(factor,r)
2*5/(3*7)
Fraction Factored Integer
12@SingleInteger
SingleInteger
Un entier qui tient sur 32 bits.
37/22::Float
1.6818181818     
Float
decimal(37/22)
     __
1.681
DecimalExpansion
a:=rootOf(a^3+a+1,a)
a
Expression Integer
(a+1)^10
a^2 + 200*a + 136
Expression Integer
1/(1-a) 1/(1-a)
Expression Integer
ratDenom(%) (a^2+a+2)/3
Expression Integer

 

Instruction
Description
)display all Affiche tout ce que l'utilisateur a définie dans l'espace de travail ainsi que les macros.
   

 

Instruction
Résultat
Type ou description
bits(8,true)
"11111111"
Bits

m:=matrix[[1,1,1],[x,y,x],[y,x,y]]

Polynomial Fraction Integer
m(3,3)
y
Polynomial Integer
factor determinant m
Factored Polynomial Integer
fac(n) == if n < 3 then n else n * fac(n - 1)
fac 5

120
fa(n) == (a := 1; for i in 2..n repeat a := a*i; a)
fa 5

120
f(n) == reduce(*,list(2..n))
f 5

120
t: (Float -> Float, Float) -> Float
t(f,x) == f(x)*x
t(sin,2)

R:= rule(sqrt(a)*sqrt(b)==sqrt(a,b))
R (sqrt(x)*sqrt(y))

p: UP(x,INT)
p:=x+1

UnivariatePolynomial(x,Integer)
m: MPOLY([x,y],INT)
m:= x+y

MultivariatePolynomial([x,y],Integer)
 
m :: DMP([y,x],INT)
ordre lexicographique des monomes
m:: HDMP([y,x],INT)
limit(g,x=0)
series(sin(a*x),x=0)
UnivariatePuiseuxSeries(Expression Integer,x,0)
exp(%)
UnivariatePuiseuxSeries(Expression Integer,x,0)
f:=taylor(exp(x))
UnivariateTaylorSeries(Expression Integer,x,0)
eval(f,1.0)
Stream Expression Float
D(f,x)   Dérivé selon x.
D(f,4)   4ième dérivé selon x.
D(f,[x,y,x])   dérivé partielle en x puis y puis x
F:=operator 'F
F
BasicOperator
G:=operator 'G G BasicOperator
F(G(x),F(x,y))   Expression Integer
eval(%,'G, x+->sin(x)) F(sin(x),F(x,y)) Expression Integer
integrate(cos(a*x),x) sin(a*x)/a Union(Expression Integer,...)
complexIntegrate(1/(x^2+1))   Expression Complex Integer

 

Instruction
Résultat
Type ou description
f:=operator 'f
f
BasicOperator
e:= D(f(x),x) + f(x) = 1
Equation Expression Integer
solve(e,f,x)
Union(Record(particular: Expression Integer,basis: List Expression Integer),...)
solve(e,f,x).basis
List Expression Integer
e1:=D(F(t),t) = F(t)+1
e2:=D(G(t),t) = G(t)-F(t)
 
serieSolve([e1,e2],[F,G],t=0,[F(0)=1,G(0)=0])
List UnivariateTaylorSeries(Expression Integer,t,0)
solve([x=y*x+1,y*y=1],1/100)
 
complexSolve([x=y*x+1,y*y=1],1/100)
 
radicalSolve ([x=y*x+1,y*y=1],[x,y])
 

 

Instruction
Type ou description
)clear all  
)clear value x  
)clear properties x  
)read fich.input Lit et éxecute le fichier fich.input
)what operations integrate Affiche les opérations ayant "integrate" dans leur nom
)undo n revient à la ligne n.
)undo -n revient n ligne en arrière.
)undo n before revient à la ligne n, avant son éxecution.

 

Instruction
Type ou description
draw(sin(x),x=0..10)  
draw(log(x),x=0..10, coordonates==polar)  
List (List (Matrix (Polynomial (Complex (Fraction (Integer)))))) Domain
factor(2 :: Complex(Integer)) Factored Complex Integer
(x,y):Integer
x: Integer; y:Integer
   

 

Abréviation
Domain ou
Domain Constructor
COMPLEX Complex
DFLOAT DoubleFloat
EXPR Expression
FLOAT Float
FRAC Fraction
INT Integer
MATRIX Matrix
NNI NonNegativeInteger
PI PositiveInteger
POLY Polynomial
STRING String
UP UnivariatePolynomial
Instruction
Type ou description
)abbreviation query Integer Affiche l'abréviation de Integer
)abb q Integer Affiche l'abréviation de Integer
)abb q INT Affiche le terme ayant comme abréviation INT
)what packages INT Affiche les packages qui ont INT dans leur nom ou dans leur abréviation.

Déclaration de type ou de mode pour une variable ou plusieurs variables à la fois :

x : INT
y : POLY(?)
(x,y) : FRAC(?)

Instruction
Résultat
Type ou description
r : Record(a:String, b:Integer) := ["toto",5]
[a = "toto", b = 5]
Record(a: String, b: Integer)
u := divide(5,2)
[quotient= 2,remainder= 1]
Record(quotient: Integer,remainder: Integer)
u.quotient
u(quotient)
u('quotient)
2
2
2
 
u.remainder
1
 
u.quotient := 10
10
 
u
[quotient=10,remainder=1]
Record(quotient: Integer,remainder: Integer)
s:= 'quotient
quotient
Variable quotient.
u.s
10
 
r:=["yo",9]
[a="yo",b=9]
Record(a: String, b: Integer)

 

Instruction
Résultat
Type ou description
f(x) : Void == output x*x::String
Void
f(5)
"25"
Void
g(x : Union(Integer,String,Float)) : Void ==
  output
    x case Integer => "Integer branch"
    x case String => "String branch"
    "Float branch"
g(5)
"Integer branch"
Void
g("toto")
"String branch"
Void
g(1.5)
"Float branch"
Void
x : Union(Integer,String,Float) := 5
x
5
Union(Integer,...)
typeOf x
Union(Integer,String,Float)
Domain
exquo(6,2) 3 Union(Integer,...)
exquo(5,2) "failed" Union(failed,...)
typeOf exquo(5,2) typeOf exquo(5,2) Domain
y : Union(i:Integer,s:String) := 5    
y case i true  
y case s false  
y.i 5 PositiveInteger
y 5 Union(i:Integer,...)
z : Any := 5 5 PositiveInteger
typeOf z Any Domain
m : SquareMatrix(2,POLY COMPLEX FRAC INT)
m:=matrix [ [x*%i,y^2+1],[3*%i*y - x,1-x*y] ]
   
m1 := m :: SquareMatrix(2, FRAC POLY COMPLEX INT)    
m2 := m :: POLY(?)    
x:Integer:=5    
y:=[x] [5] List Integer
y:=[x pretend PI]] [5] List PositiveInteger
(2/3) $Float   utilise / de Float
(2/3) @Float   Utilise un / qui produit un Float
h := matrix [ [8,6],[-4,9] ]    
map(inv $Fraction(Integer),h)    
map(inv,h)    

 

Instruction
Type ou description
)what operation Complex Affiche les opérations qui ont Complex dans leur nom.
)what domain matrix Affiche les domains qui ont matrix dans leur nom.
)what package gauss Affiche les packages qui ont gauss dans leur nom.
)show Any Affiche les opérations qui proviennent du domaine Any
)display operation complex Affiche les opérations qui ont Complex dans leur nom.
)abb q COMRING Affiche le terme ayant comme abréviation COMRING
)history )write dom Sauvegarde toutes les saisies qui ont été faite dans dom.input.
)set output fortran on  
)set output fortran fich écrit sur fich.sfort
)set output algebra on  
)set output tex on  
)set streams calculate n Les suites infinies n'affichent que les n premier termes.

a:=1
b==a
a:=2
b




2
(x,y):=(y,x) permute les valeurs de x et de y
x+->x*x+1 AnonymousFunction
(x,y)->x*y+2*x AnonymousFunction
macro u == sin  
macro u == (x=x+1; y=y*y)  
macro u(x) == (y=sin(x);cos(x))  
f(x: Integer): Integer == x+1 FunctionCalled f
g : Integer->Integer
g(x)==x+1
FunctionCalled g
h(x) == x+1 FunctionCalled h
sin x ==1  
sin(2) 1
sin(2)$Float 0.9092974268
   
   

 

Instruction
Résultat
Type ou description
f(0) == 1
f(n | n > 0) == n * f(n - 1)
f(n) == error "factoriel d'un negatif "
   
)display value f Definition:
    f 0 == 1
    f (n | 0 < n) == n f(n - 1)
    f n == error(factoriel d'un negatif )
 
p:=x^2*y+z+1
function(p,f,x)
function(p,g,x,y)
function(p,h,[x,y,z])
   
s(x,y)==(free a; a:=x*y+1; [a,a])   free a; signifie que a est une variable globale
h == (x: INT,y: INT): FRAC INT +-> x/y    
     
     
     
     

 

 

 

# The x is analyzed and its default type is
Variable(x).

# The 2 is analyzed and its default type is
PositiveInteger.

# The 3 is analyzed and its default type is
PositiveInteger.

# Because the arguments to ``/'' are integers, Axiom
gives the expression 2/3 a default target type of
Fraction(Integer).

# Axiom looks in PositiveInteger for ``/''.
It is not found.

# Axiom looks in Fraction(Integer) for ``/''.
It is found for arguments of type Integer.

# The 2 and 3 are converted to objects of type
Integer (this is trivial) and ``/'' is applied,
creating an object of type Fraction(Integer).

# No ``+'' for arguments of types Variable(x) and
Fraction(Integer) are found in either domain.

# Axiom resolves
resolve
(see ugTypesResolve )
the types and gets Polynomial (Fraction (Integer)).

# The x and the 2/3 are converted to objects of this
type and + is applied, yielding the answer, an object of type
Polynomial (Fraction (Integer)).