Anneaux de base

Nous illustrons la prise en main de quelques anneaux de base avec Sage. Par exemple, RationalField() ou QQ désigneront dans ce qui suit au corps des nombres rationnels :

sage: RationalField()
Rational Field
sage: QQ
Rational Field
sage: 1/2 in QQ
True
>>> from sage.all import *
>>> RationalField()
Rational Field
>>> QQ
Rational Field
>>> Integer(1)/Integer(2) in QQ
True
RationalField()
QQ
1/2 in QQ

Le nombre décimal 1.2 est considéré comme un élément de QQ, puisqu’il existe une application de coercition entre les réels et les rationnels :

sage: 1.2 in QQ
True
>>> from sage.all import *
>>> RealNumber('1.2') in QQ
True
1.2 in QQ

Néanmoins, il n’y a pas d’application de coercition entre le corps fini à 3 éléments et les rationnels :

sage: c = GF(3)(1)   # c est l'élément 1 du corps fini à 3 éléments
sage: c in QQ
False
>>> from sage.all import *
>>> c = GF(Integer(3))(Integer(1))   # c est l'élément 1 du corps fini à 3 éléments
>>> c in QQ
False
c = GF(3)(1)   # c est l'élément 1 du corps fini à 3 éléments
c in QQ

De même, bien entendu, la constante symbolique \(\pi\) n’appartient pas aux rationnels :

sage: pi in QQ
False
>>> from sage.all import *
>>> pi in QQ
False
pi in QQ

Le symbole I représente la racine carrée de \(-1\); i est synonyme de I. Bien entendu, I n’appartient pas aux rationnels :

sage: i  # i^2 = -1
I
sage: i in QQ
False
>>> from sage.all import *
>>> i  # i^2 = -1
I
>>> i in QQ
False
i  # i^2 = -1
i in QQ

À ce propos, d’autres anneaux sont prédéfinis en Sage : l’anneau des entiers relatifs ZZ, celui des nombres réels RR et celui des nombres complexes CC. Les anneaux de polynômes sont décrits dans Polynômes.

Passons maintenant à quelques éléments d’arithmétique.

sage: a, b = 4/3, 2/3
sage: a + b
2
sage: 2*b == a
True
sage: parent(2/3)
Rational Field
sage: parent(4/2)
Rational Field
sage: 2/3 + 0.1       # coercition automatique avant addition
0.766666666666667
sage: 0.1 + 2/3       # les règles de coercition sont symétriques en Sage
0.766666666666667
>>> from sage.all import *
>>> a, b = Integer(4)/Integer(3), Integer(2)/Integer(3)
>>> a + b
2
>>> Integer(2)*b == a
True
>>> parent(Integer(2)/Integer(3))
Rational Field
>>> parent(Integer(4)/Integer(2))
Rational Field
>>> Integer(2)/Integer(3) + RealNumber('0.1')       # coercition automatique avant addition
0.766666666666667
>>> RealNumber('0.1') + Integer(2)/Integer(3)       # les règles de coercition sont symétriques en Sage
0.766666666666667
a, b = 4/3, 2/3
a + b
2*b == a
parent(2/3)
parent(4/2)
2/3 + 0.1       # coercition automatique avant addition
0.1 + 2/3       # les règles de coercition sont symétriques en Sage

Il y a une subtilité dans la définition des nombres complexes. Comme mentionné ci-dessus, le symbole i représente une racine carrée de \(-1\), mais il s’agit d’une racine carrée formelle de \(-1\), comme élément d’un corps de nombres quadratique. L’appel CC(i) renvoie la racine carrée de \(-1\) comme nombre complexe en virgule flottante.

sage: i = CC(i)       # nombre complexe en virgule flottante
sage: z = a + b*i
sage: z
1.33333333333333 + 0.666666666666667*I
sage: z.imag()        # partie imaginaire
0.666666666666667
sage: z.real() == a   # coercition automatique avant comparaison
True
sage: QQ(11.1)
111/10
>>> from sage.all import *
>>> i = CC(i)       # nombre complexe en virgule flottante
>>> z = a + b*i
>>> z
1.33333333333333 + 0.666666666666667*I
>>> z.imag()        # partie imaginaire
0.666666666666667
>>> z.real() == a   # coercition automatique avant comparaison
True
>>> QQ(RealNumber('11.1'))
111/10
i = CC(i)       # nombre complexe en virgule flottante
z = a + b*i
z
z.imag()        # partie imaginaire
z.real() == a   # coercition automatique avant comparaison
QQ(11.1)