Les types. Sage est un langage typé : quand on utilise une fonction, il faut que les entrées soient de type compatible avec cette fonction. Par exemple, a^b fonctionne si a et b sont des entiers, mais pas si a et b sont deux matrices. Pour connaitre le type d'un élément a, on utilise la commande type(a). Il existe deux variantes du type ''entier''. On les obtient de la façon suivante. a=zz(2) b=int(2) Entier de type 'sage.rings.integer.integer' Entier de type 'int' c=2 Entier de type 'sage.rings.integer.integer' Certaines fonctions ne sont définies que pour un des deux types d'entiers. On passe de l'un à l'autre avec ces mêmes commandes : b=zz(b) a=int(a) b est maintenant un entier de type 'sage.rings.integer.integer' a est maintenant un entier de type 'int' Voici une liste de quelques types classiques : ZZ(4) int(4) 'sage.rings.integer.integer' (entier Sage) 'int' (entier Python) 5/2 'sage.rings.rational.rational' 5,367 'sage.rings.real_mpfr.realliteral' 5*CC(i) L=[7,14,21] true un polynôme en une variable à coefficients entiers 'sage.rings.complex_number.complexnumber' 'list' 'bool' Dans le même ordre d'idée,voici quelques ensembles : 'sage.rings.polynomial.polynomial_integer_dense_flint.polynomial_ integer_dense_flint' NN ZZ QQ RR CC Non negative integer semiring Integer Ring Rational Field Real Field with 53 bits of precision Complex Field with 53 bits of precision
Les booléens et les tests False True faux vrai a==c a!=c a>c a>=c égalité (ok si mélange d'entiers Sage et Python) différence supérieur supérieur ou égal x or y x and y not x x in E x is y ou logique et logique non logique test d'appartenance test d'identité Structure partagée, structure dupliquée Lorsqu'on ''copie'' un élément, deux cas peuvent se présenter : un deuxième élément distinct du premier, mais ayant la même valeur, est créé il n'y a qu'un seul élément, mais celui-ci a deux noms Pour savoir dans quel cas on se trouve, on utilise le test x is y qui répond vrai si x et y désignent le même objet. L1=[1,2,3,4,5,6,7,8,9] L2=L1 L2[5]=10 L1 L1 is L2 En modifiant L2, on a également modifié L1 car L1 et L2 font référence à la même liste. Quelques façons de dupliquer un élément : L1=[1,2,3,4,5,6,7,8,9] L3=L1[:] L3[2]=100 L1 L1 is L3 L3 et L1 sont deux listes distinctes, modifier l'une ne change pas l'autre. L2=L1[:] M2=copy(M1) def copyrec (L): if type(l)==list: return map(copyrec,l) else : return L liste matrice pour dupliquer des listes de plusieurs niveaux.
Quelques opérations élémentaires sur les entiers Sage a**b a^b a/b a//b a%b exponentiation division exacte (le résultat est une fraction ou parfois un entier) quotient de la division euclidienne reste de la division euclidienne /!\ Ces commandes sont valables avec des entiers de type 'sage.rings.integer.integer'. Avec des type 'int', on obtient des résultats différents. ZZ(5)/ZZ(2) 5/2 int(5)/int(2) 2 De manière générale, à un type donné sont associées des méthodes. Une méthode est une fonction dont la syntaxe est différente de ce que vous avez vu jusque là en Maple, Matlab, Scilab ou autre. Par exemples, pour obtenir les diviseurs d'un entier, on fait : 36.divisors() On applique la méthode divisors à l'entier 36, sans paramètres supplémentaires (d'où les parenthèses vides). Certaines méthodes nécessitent d'autres paramètres, comme par exemple 8.inverse_mod(13). Voici une liste non-exhaustives de méthodes disponible sur les entiers : a.ndigits(b) a.divisors() a.prime_divisors() a.factor() a.is_prime() nombre de chiffres en base B (défaut : B=10) les diviseurs de a les diviseurs premiers de a la factorisation de a test de primalité a.is_pseudoprime() test de pseudo-primalité (???) a.next_prime() a.lcm(b) a.gcd(b) le prochain nombre premier (basé sur is_prime) ppcm de a et b pgcd de a et de b
Les listes, séquences, n-uplets, ensembles L=[2,3,5,7,11] L[2] L[m:n] L[p:] L[:p] L[-1] L[3]=13 L+M range(a,b,c) range(a,b) range(b) [a..b] L.remove(x) len(l) définir une liste extraire un élément. On commence à 0. extrait les éléments de m à n-1 à partir de l'indice p jusqu'à l'indice p exclus dernier élément de la liste modifier un élément concaténer deux listes liste d'entier 'int' allant de a à b-1, et de pas c. liste d'entier 'int' allant de a à b-1, et de pas 1. liste d'entier 'int' allant de 0 à b-1, et de pas 1. liste d'entier Sage allant de a à b enlève la première occurrence de x dans la liste L longueur de L Un n-uplet fonctionne comme une liste, mais ne peut être modifié. L=(2,3,5,7,11) définir un n-uplet L[2] extraire un élément. On commence à 0. len(l) longueur de L Une séquence est une liste dont tous les éléments appartiennent à un ensemble commun. Les fonctions sur les listes s'appliquent aux séquences. Il y a deux types d'ensembles : les ensembles Python et les ensembles Sage. s=set([1,2,3,2]) S=Set([1,2,3,2] définir un ensemble Python définir un ensemble Sage On trouvera les fonctions basique comme l'union ou l'intersection en faisant S. ou s. suivi de tabulation.
Les matrices Il y a plusieurs façons de définir une matrice ou un vecteur à coefficients entiers. Voici quelques exemples équivalents. Comme pour les listes, la numérotation des lignes et colonnes commence à 0. M=matrix([[1,2],[3,4]]) M=matrix(2,2,[1,2,3,4]) M=matrix(ZZ,2,2,[1,2,3,4]) matrix(a,n,m,l) v=vector([1,2,3]) M[1,2] M[:,1] M[1,:] définir une matrice A anneau (ou corps) des coefficients n nombre de lignes m nombre de colonnes L liste des coefficients définir un vecteur extraire un coef (ici, ligne 2 et colonne3) extraire une colonne (matrice) extraire une ligne Et voici une liste de méthodes sur les matrices : M.ncols() M.column(i) M.columns() M.base_ring() M.transpose() M.conjugate() M.conjugate_transpose() M.rank() M.trace() M.det() M.determinant() M.inverse() M.LU() M.gram_schmidt() M.minpoly() M.minimal_polynomial() M.minpoly(var='X') nombre de colonnes colonne n i liste des colonnes de M affiche l'anneau des coefficients de M la transposée de M la conjuguée de M la transposé de la conjuguée de M le rang de M la trace de M le déterminant de M l'inverse de M factorisation LU (pas exactement celle vue en MF) orthogonalisation par lignes polynôme minimal. On peut éventuellement préciser la variable. M.charpoly() polynôme caractéristique de M. (idem) M.characteristic_polynomial() M.eigenvalues() M.right_eigenvectors() les valeurs propres de M les vecteurs (+ valeurs) propres de M
M.right_eigenmatrix() M.right_eigenspaces() M.add_multiple_of_column M.swap_column M.rescale_col M.pivots() M.echelon_form() M.rref() M.echelonize() P et D telles que M=P*D*P^(-1) Les sous-espaces propres opérations élémentaires sur les colonnes (voir l'aide pour l'ordre des arguments) Les colonnes contenant des pivots après le pivot de Gauss forme échelonnée forme échelonnée réduite remplace M par sa forme échelonnée
Les polynômes Avant de pouvoir définir un polynôme, il faut définir l'anneau auquel il appartient. A.<X>=PolynomialRing(ZZ) A.<X,Y>=PolynomialRing(K) A=Z[X] A=K[X,Y] On peut ensuite définir un polynôme, qui est automatiquement développé. P=2*(X+2)^2 Voici quelques méthodes sur les polynômes : P.coefficients() P.coeffs() P.list() P.constant_coefficient() P.leading_coefficient() P.exponents() P.variables() P.degree() P.subs(X=5) P(5) P.substitute(X=5) P.is_irreducible() P.gcd(Q) P.lcm(Q) P.roots() P.roots(R) P.complex_roots() P.real_roots() P.real_root_intervals() liste des coeffs non-nuls de P liste des coeffs de P (constant en premier) coefficient constant de P coefficient dominant de P liste des exposants ayant un coefficient non nul n-uplet des indéterminées de P le degré de P évaluer P savoir si P est irreductible pgcd de P et Q ppcm de P et Q affiche les racines de P : -dans l'anneau des coeffs -dans l'anneau spécifié -dans CC -dans RR Donne des intervalles contenant les racines réelles.
Un peu de programmation for indice in liste: instructions if test: instructions if test: instructions_1 instructions_2 if test: instructions_1 elif autre test: instructions_2 instructions_3 initialisation while condition: instructions def fonction (param1, param2): instructions return resultat fonction(valeur1, valeur2) L=[] M=[] for i in [1..10]: L=L+[i^2] M=M+[i^3] L M if a%2==0: print('a est pair') if a%2==0: print('a est pair') print('a est impair') a=randint(1,10) if a==1: print ('echec critique') elif a<7: print ('echec') print ('succes') L=[] i=0 while i^2<=1000: L=L+[i] i=i+1 def LanceUnDe20 (difficulte): a=randint(1,20) if a==1: s='echec critique' elif a==20: s='reussite critique' elif a<difficulte: s='echec' s='reussite' return(a,s) LanceUnDe20(14)