Note
La préparation à l’option vous est proposée avec les systèmes de calcul sage ou xcas. Choisissez au cours des deux premières semaines celui que vous souhaitez utiliser.
Chacun de ces deux logiciels jouit de l’existence :
Par ailleurs :
xcas ressemble beaucoup à Maple ;
l’aide xcas contient tout, c’est limite de la triche ;
sage repose entièrement sur le langage Python et a un fonctionnement orienté objet [1] . C’est quelquefois lourd pour définir certains objets dans le bon ensemble, mais très pratique pour obtenir ensuite la liste des méthodes qu’on peut leur appliquer.
[1] | en dehors de quelques adaptations syntaxiques bienvenues c’est une bibliothèque de classes Python implantant les objets mathématiques. |
minimum à retenir/archiver cette année
for
, while
,
suite: seq
. Créer une fonction une procédure, créer une fonction à
partir d’un symbole, passer en mode debug et afficher une variable pas à
pas.Avertissement
Lors du premier lancement, les valeurs par défaut ne coïncident
pas forcément avec vos préférences. Au premier lancement on répond à
quelques questions, on peut ensuite modifier/affiner ses choix dans le
menu Cfg
. Ensuite, sauvez vos préférences grâce au menu. Il faut donc
choisir le mode xcas ou maple, et étudier la configuration du « cas » pour ne
pas mal interpréter les réponses. (On peut l’obtenir rapidement en cliquant
sur
la barre grise entre les boutons SAUVER et STOP)
Les différences entre les modes xcas et maple:
\(i\) et \(I\), les tableaux commencent à \(0\) contre \(1\) le symbole %
est réservé au calcul modulaire pour xcas, au dernier résultat pour
maple. Les commentaires sont //
resp #
. L’instruction
subs
prend ses arguments dans des ordres inversés. (On utilisera donc
plutot subst
)
Pour la configuration du « cas », je conseille de :
cocher radians
, et de décocher: approx
,
complex
, Cmpx_var
, Sqrt
. On travaillera ainsi en mode exact dans
le corps engendré par les coefficients de l’expression, alors que si l’on
coche complex ou Sqrt, on rajoute \(I\) et des racines carrées ce qui ne
permet pas par exemple une factorisation de polynôme sur un corps
prescrit.
Comment calculer \(\sqrt[3]{23}\) ?
Attention pour les utilisateurs de maple, root[3](23)
ne marche pas,
il fait juste racine carrée.
root(3,23);
surd(23,3);//c'est plutot celui ci que l'on trouve dans la doc
Il faut passer par les puissances fractionnaires:
pow(23,1/3)
23^(1/3)
Donner une valeur approchée des résultats précédents (mots-clés
evalf
ou approx
).
root(3,23.);evalf(root(3,23.));root(3,approx(23));
pow(23,1/3)*1.
pow(23,1/3).n()
Trouver la syntaxe des constantes réelles ou complexes \(\pi\), \(e\), \(i\) (où \(i^2=-1\) ). Faire afficher (sans que la précision par défaut soit modifiée pour la suite.) les \(1000\) premières décimales de \(\pi\).
evalf(Pi,1000);approx(Pi,1000);
maple_mode(0);evalf(E);evalf(e);
maple_mode(1);evalf(E);evalf(e);evalf(exp(1));
maple_mode(0);
pi, e, I
pi.n(digits=1000)
pi.n(1000*log(10,2))
Faire ?digits
. Que faut il faire pour travailler par
défaut avec \(1000\) chiffres ?
Attention mettre plusieurs Digits:=
sur une même ligne a l’air de poser problème.
Digits:=1000;
sqrt(2.0);
Digits:=10;
sqrt(3.0);
La seule précision par défaut en sage est la précision machine, de 53 bits pour les flottants. Pour travailler avec 300 bits de précision on peut soit partir de valeurs ayant cette précision et compter sur les règles de calcul, soit déclarer l’ensemble des réels à cette précision
R300 = RealField(300)
R300(pi)
Trouver la fonction pgcd de deux entiers en utilisant le menu aide.
On pose a:=1111;
. Comment libérer la variable a
?
a:=11111;
purge(a);
a;
a = 1111
restore('a')
a
Comment ajouter un élément à une liste ? Ajoutez l’élément \(55\) à la
liste l:=[1,33,4]
.
l:=[1,33,4];
augment(l,55);
l = [1,33,4]
l.append(55)
l += [200]
On pose
l1:=[1,33,4]
et l2:=[11,133,14]
.
Quelle instruction permet de créer une liste en juxtaposant l1
et l2
?
l1:=[1,33,4];
l2:=[11,133,14];
concat(l1,l2);
l1 = [1,33,4]
l2 = [11,133,14]
l1+l2
Tapez seq(
, et utilisez cette fonction pour créer la liste des 30 premiers carrés.
seq(n^2,n=1..30);
Le mécanisme de compréhension de liste permet d’effectuer des séquences:
[ n^2 for n in range(1,31) ]
Créez cette même liste à l’aide d’une boucle for
.
Avertissement
Ne jamais utiliser la variable i
comme indice de boucle ! l’erreur n’est
pas très explicite, mais il s’agit du fait que i
désigne le complexe.
Faire aussi attention que la syntaxe xcas proche du C nécessite quand
même une affectation :=
de la variable.
l:=[];for(ii:=1;ii<=30;ii++){l:=augment(l,ii^2);}:; l;
l = []
for n in xrange(1,31):
l.append(n^2)
l
Définir l’expression symbolique P:=x/(x^2+1)
et la fonction Q(x):=sin(1/x)
(syntaxe
équivalente: Q:=x->sin(1/x)
).
purge(x);// pour etre sur que x est libre.
x=='x';//vaut 1 si x est libre. Car dans ce cas, x coïncide avec le symbole 'x'
P:=x/(x^2+1);
Q:=x->sin(1/x);
x = var('x')
P = x/(x^2+1)
Q(x) = sin(1/x)
Etudiez les types de P
, Q
, Q(x)
, Q(5)
, Q(6/pi)
(on pourra simplifier).
type(P);//un symbole
type(Q);//une fonction
type(Q(x));//un symbole
type(Q(5));//un symbole car sin(1/5) est laisse tel quel
type(normal(Q(6/pi)));// un rationel car c'est une valeur remarquable (si l'on a simplifie)
En sage, tout reste dans le monde des expressions symboliques (à moins de faire volontairement des conversions de type).
type(P), parent(P)
type(Q), parent(Q)
type(Q(x)), parent(Q(x))
type(Q(6/pi)), parent(Q(6/pi))
Q(6/pi) # même si la valeur est simplifiée
Calculer les dérivées de \(P\) et \(Q\).
diff(P,x);
function_diff(Q);
Q';
P.diff(x)
Q.diff()
Calculer la dérivée seconde de \(Q\circ Q\). (On factorisera)
A1:=factor(diff(Q(Q(x)),x,x));//C'est tout de meme plus leger
A2:=factor((function_diff@function_diff)(Q@Q));
A3:=factor((function_diff@@2)(Q@Q));
simplify(A1-A2(x));//0
simplify(A1-A3(x));//0
Q(Q).diff()
Quel est le symbole de composition des fonctions ? Comment obtenir facilement la composée septième de \(Q\) calculée en \(y\) ?
(Q@@7)(y);
y = var('y')
self_compose(Q,7)(y)
(À retenir!) Comment obtenir à partir du symbole \(P\) défini ci dessus, la fonction \(x \mapsto \frac{x}{x^2+1}\) ? En déduire la dérivée de \(\frac{\sin(1/x)}{(\sin(1/x))^2+1}\).
unapply(P,x);// crée la fonction P
simplify(function_diff(unapply(P,x)(Q)));// crée la fonction P et la compose avec Q
simplify(diff(sin(1/x)/(sin(1/x)^2+1),x));//verif
P.function(x)
P.function(x)(Q).diff()
P(x=Q).diff() # plus simple
Quelle est la valeur théorique de
Lorsque l’on a de la chance (ici c’est le cas}, le logiciel peut répondre tout de suite. Il faut cependant être prêt à l’aider. Exemple : calculer la tangente en demandant de développer au sens trigonométrique.
pp1:=44*atan(1/57)+7*atan(1/239)-12*atan(1/682)+24*atan(1/12943);
simplify(pp1); //ou peut-etre tsimplify
Il semble que Sage ne sache pas faire.
pp = 44*atan(1/57)+7*atan(1/239)-12*atan(1/682)+24*atan(1/12943)
pp.simplify()
pp.simplify_trig()
on peut toutefois obtenir
tan(pp).expand_trig().simplify_trig()
pp.n()
ce qui permet de conclure.
Note
Vous pouvez maintenant demander le memento xcas.
Etudiez la composition des fonctions sous xcas avec le symbole @@
.
(Attention aux parenthèses). Calculez
\(\sqrt{\sqrt{\sqrt{\sqrt{65536}}}}\)
(sqrt@@4)(65536);//la composee 4ieme calculee en 65368.
self_compose(sqrt,4)(65536)
Etudiez la fonction element
. (Particulièrement utile en mode
geometrie2d. cf menu deroulant nouvelle figure 2d). Créez le cercle unité
\(C\), et choisissez un point \(m_0\) sur \(C\) d’argument \(3\) grâce à cette
commande.
C:=cercle(0,1);
m0:=element(C,3);
Affectez à a
l’affixe de \(m_0\) et créez la liste de 10 éléments
contenant les points \(m_0,m_1,\dots,m_9\) d’affixe les itérés \(i\)-ièmes de
sqrt
calculés en \(a\).
a:=affixe(m0);
[seq(point((sqrt@@j)(a),display=bleu+epaisseur_point_3+point_etoile),j=0..9)];
@interact
def _(n=(1..17),a=(0,3)):
F = circle( (0,0), 1)
m = exp(I*a)
for k in xrange(10):
m = sqrt(m)
F += point( (real(m),imag(m)) )
F.show()
Sélectionnez le mode pointeur dans le menu déroulant de votre fenêtre de géométrie et déplacez \(m_0\) sur le cercle. Expliquez les choix pour la racine carrée et pourquoi \(m_i\) aura un élément dans le domaine de convergence de la série \(\sum \frac{(z-1)^n}{n}\) et donc que \(m_0\) est dans l’image de la fonction exponentielle.
Afficher le coefficient de \(t^3\) dans la série formelle associée à \(\prod_{i=1}^4\frac{1}{1-a_i.t}\) ?
purge(a,b,c,d,e,t);
P:=((1-a*t)*(1-b*t)*(1-c*t)*(1-d*t))^(-1);
s:=series(P,t=0,3);
On constate que le coefficient de \(t^n\) est la somme de tous les monômes de degré n en les 4 variables a,b,c,d. Ces monômes sont en bijections avec les suites croissantes (au sens large) de n éléments de {1,2,3,4}.
coeff(s,t^3);
On peut faire un développement en série d’une expression
a,b,c,d,e,t = var('a,b,c,d,e,t')
P = 1/((1-a*t)*(1-b*t)*(1-c*t)*(1-d*t))
P.series(t,4)
ou bien introduire l’anneau de séries formelles idoine et calculer dedans à la précision voulue:
a,b,c,d,e = var('a,b,c,d,e')
A = a.parent() # l'anneau contenant les symboles
B.<t> = A[['t']]
P = 1/((1-a*t)*(1-b*t)*(1-c*t)*(1-d*t)+O((t)^4))
P[3] # coeff de t^3
Généraliser l’exemple précédent pour en déduire de manière théorique le nombre d’éléments croissants dans \(\{1,2,3,4\}^n\), puis dans \(\{1,\dots,k\}^n\)
Quel est le cardinal de:
Pour résoudre ce problème on met des poids aux variables. Exemple: a,d de degre 1, b: 3, c: 2, et f: 4. et l’on cherche les monomes de degres 208.
P:=1/((1-a*t)*(1-b*t^3)*(1-c*t^2)*(1-d*t)*(1-f*t^4));
s:=series(P,t=0,4):;
coeff(s,t^4); //Ex on verifie bien que f a un poids de 4
P:=1/((1-t)*(1-t^3)*(1-t^2)*(1-t)*(1-t^4));
s:=series(P,t=0,208):;
coeff(s,t^208);
A.<x> = ZZ[['x']]
P = 1/((1-x)*(1-x^3)*(1-x^2)*(1-x)*(1-x^4)+O(x^300));
P[208]
En adaptant la formule \(\sum_{n>0}p_n.t^n=\Pi_{i=1}^\infty \frac{1}{1-t^i}\) où \(p_n\) est le nombre de partitions [2] de \(n\), calculer \(p_{50}\).
Pour calculer le coefficient de t^n, seuls les termes en 1/(1-t^i) pour i<n+1 du produit vont contribuer, on n’a donc pas besoin du produit infini pour n fixe
P:=n->mul(1/(1-t^j),j=1..n);
On cherche donc le coefficient de \(t^{50}\) dans:
series(P(50),t,0,50);
coeff(series(P(50),t,0,50),t^50);
Remarquer qu’il est plus efficace de calculer le produit modulo \(x^51\).
P = 1/prod( 1-x^k+O(x^51) for k in xrange(1,51))
P[50]
Trouver le coefficient de \(a^3b^2cd^2\) dans \((a+b+c+d)^8\). Vérifier votre
réponse théorique avec la forme développée (utiliser normal
pour
développer un calcul lourd ). (On pourra étudier l’aide de
coeff
pour recupérer le coefficient d’un monôme).
l:=normal((a+b+c+d)^8);
coeff(l,[a,b,c,d],[3,2,1,2]);
binomial(8,3)*binomial(5,2)*binomial(3,1);
B.<a,b,c,d> = ZZ['a,b,c,d']
E = (a+b+c+d)^8
E.coefficient(a^3*b^2*c*d^2)
multinomial([3,2,1,2])
binomial(8,3)*binomial(5,2)*binomial(3,1)*binomial(2,2)
Ce coefficient est appelé coefficient multinomial et vaut
En développant la somme de proche en proche par la formule du binôme on obtient le produit des coefficient binomiaux.
Affectez à a
la valeur \(e^{2i\pi/5}\). Calculez \(a^5\). On peut
dessiner un point par son affixe complexe. Essayer p:=point(1)
. On aimerait
avoir ce point en bleu et grosse croix. Il existe une façon interactive. On tape
point(1,
et l’on va chercher l’option d’attributs (on remarquera le
raccourci clavier pour cette option) dans le menu déroulant pour les
graphiques.
a:=exp(2*i*pi/5);
p:=point(1,display=bleu+epaisseur_point_3+point_etoile);
a = exp(2*I*pi/5)
p = point( (1,0) , color='blue')
On ne peut pas changer la forme du point. Si vraiment on y tient:
scatter_plot([(1,0)],marker='x', edgecolor='blue')
En utilisant seq
, le points \(p\) et \(a\), créez un pentagone régulier.
seq(p*a^j,j=0..4);
[seq(p*a^j,j=0..4)];[seq(p*a^j,j=0..4)]*2;
[seq(p*a^j,j=0..4)]+[1$5];//[seq(p*a^j,j=0..4)]+1; ne translate qu'un element.
Sage ne permet pas d’opérer sur un point via un complexe, on le fait à la main:
point( [ ( real(a^k),imag(a^k) ) for k in xrange(6) ])
Ouvrir un écran de géométrie, dessiner quelques objets interactivement. Comment supprimer un objet ?
Pour supprimer/modifier, il suffit de supprimer/éditer la ligne correspondante
n:=5;
zs:=exp(2*i*Pi/n);
[seq(point(zs^j,affichage=point_width_2),j=0..4)];
segment(point(1),point(zs));//un cote du pentagone
Dessiner une droite \(d\) de vecteur directeur d’affixe \(e^{2i\pi/3}\) passant par \((3,0)\). Dessiner la droite d’équation cartésienne \(2x+3y+1=0\). Modifier la couleur, à la souris ou dans la commande. Dessiner le point \(A\) d’intersection de ces 2 droites.
d1:=droite(point(3),point(3+exp(2*i*Pi/3)),'affichage'=red);
d2:=droite(2*x+3*y+1=0);
A:=inter(d1,d2);
Créer un paramètre \(t\) de \([-5,3]\) grâce à la fonction
element
, et tracer la droite perpendiculaire à \(d\) passant par \((t,0)\)
t:=element(-5..3);
perpendiculaire(point(t),d1);
Programmez l’algorithme
suivant (créez une fonction quodicho
) et testez le en vérifiant avec
l’intruction xcas correspondante. On pourra aussi tester le debugger avec
debug(quodicho(1111333,55))
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | quodicho(a,b):={
local n,aa,bb,g;
n:=0;aa:=1;bb:=1;
while((b*2^n) <= a){
n:=n+1;
}
aa:=2^(n-1);bb:=2^n;
for(k:=1;k<n;k++){
g:=iquo(aa+bb,2);
if(g*b<=a){ aa:=g;}
else{bb:=g;}
}
return(aa);
}:;
|
quodicho(127,33)==iquo(127,33);// doit etre vrai
1 2 3 4 5 6 7 8 9 10 11 12 | def quodicho(a,b):
n = 0
while 2^n*b < a: n+= 1
alpha = 2^(n-1)
beta = 2^n
for k in xrange(1,n):
gamma = (alpha+beta)/2
if gamma*b <= a:
alpha = gamma
else:
beta = gamma
return (alpha,a-b*alpha)
|
quodicho(127,33) == divrem(127,33)
Exprimer \(\cos 5a\) en fonction de \(\cos a\) (où \(a\) est une variable formelle).
purge(a);
trigexpand(cos(5*a));
a = var('a')
sin(5*a).expand_trig()
Calculer \(\int_0^{\frac{\pi}{2}} \frac{\cos 5x}{2+\sin x}dx\), ainsi qu’une primitive \(P\) de \(\frac{\cos 5x}{2+\sin x}\). Dériver \(P\) et vérifiez que c’est correct. (Le jury apprécie l’esprit critique)
normal(int(cos(5*x)/(2+sin(x)),x=0..Pi/2));//simplify ne marche pas ? -209 ln(2) + 209 ln(3) - 254/3 P:=int(cos(5*x)/(2+sin(x)),x);
P:=int(trigexpand(cos(5*x)/(2+sin(x))),x);
simplify(diff(P,x)-cos(5*x)/(2+sin(x))); //NB: normal ne suffit pas.
integrate(cos(5*x)/(2+sin(x)),(x,0,pi/2))
P = integrate(cos(5*x)/(2+sin(x)),x)
P(x=pi/2)-P(x=0)
E = P.diff(x) == cos(5*x)/(2+sin(x)); E
E.test_relation()
E.simplify_trig().test_relation()
Que se passe-t-il avec \(\int \frac{\cos(5*x)}{2+\sin(3*x)}\) et \(\int \frac{1}{2+\sin(5*x)}\) ? Affichez un dessin de la réponse pour vérifier la continuité.
La decomposition en elements simples introduit une extension de corps (que le logiciel ne pourra pas toujours trouver).
I1:=int(cos(5*x)/(2+sin(3*x)));
plot(I1);
// PB SAGE 5.2 le retour de I2 n'est pas continu.
I2:=int(1/(2+sin(5*x)));// Attention a la partie entiere sinon ca n'est pas continu.
plot(I2);
Essayez de simplifier P1:=(x^2-1)/(x-1)
et P2:=-cos(5*x)+16*cos(x)*sin(x)^4-12*cos(x)*sin(x)^2+cos(x)
.
P1:=(x^2-1)/(x-1);
expand(P1);//developpe dans Q(x)
normal(P1),simplify(P1);//les 2 simplifient
P2:=-cos(5*x)+16*cos(x)*sin(x)^4-12*cos(x)*sin(x)^2+cos(x);
expand(P2);
normal(P2);
simplify(P2);
P1 = (x^2-1)/(x-1); P1
P1.simplify_rational()
Factoriser \(x^{12}-1\) dans \(\Z[x]\). En factorisant des polynômes judicieusement choisis, obtenir la valeur du polynôme cyclotomique \(\Phi_{12}\) ?
factor(X^12-1);
phi12 est le facteur qui n’apparait pas dans:
factor(X^6-1);factor(X^4-1);
Z.<x> = ZZ['x']
(x^12-1).factor()
(x^6-1).factor(), (x^4-1).factor()
(x^12-1)/gcd(x^12-1,(x^6-1)*(x^4-1))
On pose \(a=e^{\frac{2i\pi}{12}}\). Vérifiez que \(a^{12}\) vaut bien \(1\) pour xcas. Etudier \(e^{\frac{2i\pi}{9}}\).
Factorisez \(P=(2x+1)^2(x^5-1)/(x-1)\) dans \(\R[x]\) et dans \(\C[x]\). Peut-on espérer un résultat exact ?
P:=(2*x+1)^2*(x^5-1)/(x-1);
complex_mode:=1;factor(P*1.1);factor(approx(P));
complex_mode:=0;factor(P*1.0);factor(approx(P,5));factor(P);
Il faut faire attention, la division habituelle /
envoie dans le
corps des fractions.
Il faut soit refaire de \(P\) un polynôme avant la suite, soit utiliser la
division euclidienne //
.
A.<x> = ZZ['x']
P = (2*x+1)^2*(x^5-1)/(x-1); P;
P.parent()
P = A(P)
P.parent()
P = (2*x+1)^2*(x^5-1)//(x-1); P
P.change_ring(RR).factor()
P.change_ring(CC).factor()
Factoriser \(X^{12}-1\) sur \(\Q[\sqrt{3}]\) et sur \(\Q[\sqrt{3},i]\) et sur \(\Q[e^{2i\pi/9}]\). (On peut tenter de rajouter une liste d’éléments en option de factor)
On peut factoriser en imposant une extension algebrique avec une syntaxe comme dans maple. Mais je ne le trouve pas dans la doc (c’est rare). Exemples:
factor(X^12-1,sqrt(3));
factor(X^12-1,[sqrt(3),i]);
factor(X^12-1,exp(2*i*Pi/9));
selon les versions, cFactor(…,a) est plus sûr si l’on veut être sûr que i a été utilisé. (en fait ça veut plutôt dire Q[I,a] factor)
cFactor(X^12-1,sqrt(3));//est probablement plus sur
P = x^12-1
P.change_ring(QQ[sqrt(3)]).factor()
P.change_ring(QQ[I,sqrt(3)]).factor()
Construire 2 cercles \(C_i(O_i,r_i)\), étudier comment trouver le centre d’une homothétie envoyant \(C_1\) sur \((C_2)\), et en déduire comment construire les tangentes communes aux 2 cercles. Préparer une illustration en vue d’un petit exposé.
Statégie: On cherche le centre o d’une homothetie transformant C1 en C2, ensuite on recupère le point de contact en exprimant qu’il est le sommet d’un triange rectable de base [oO2]. Attention, inter rend un objet de type groupe de points, meme s’il y a unicite, pour choisir un point dans l’intersection on utilise inter_unique
1 2 3 4 5 6 7 8 9 10 | O1:=point(-2);O2:=point(2);r1:=1;
r2:=element(1.2..5,2);//Attention a ne pas faire de cercles de rayons infinis
C1:=cercle(O1,r1);
C2:=cercle(O2,r2);
m:=point(O1+i);droite(O1,m,affichage=dot_line);//un point de C1 non sur (O1O2)
dm:=parallele(O2,droite(O1,m),affichage=dot_line);
n:=inter_unique(dm,C2);
droite(m,n);o:=inter_unique(droite(m,n),droite(O1,O2));
C:=cercle(O2,o,affichage=dot_line);t2:=inter_unique(C,C2)
T:=droite(o,t2,affichage=(red+line_width_2));
|
Effectuer un changement de variable pour que les inégalités \(0<a<b<c\) soient faciles à lire.
purge(a,u,v);
b:=a+u;c:=b+v; //on ordonne a,b,c
a,u,v = var('a,u,v')
b = a + u; c = b + v;
Démontrer en demandant un calcul élémentaire au logiciel que
(Il ne s’agit pas de trouver une instruction du logiciel pour résoudre directement ce problème en tenant compte des hypothèses, mais de poser une question judicieuse pour que la réponse rende la preuve évidente.)
F:=a/(b+c)+b/(a+c)+c/(a+b)-3/2;
le numérateur et le dénominateur n’ont que des coefficients positifs, donc \(F>0\) pour \(0<a, 0<u , 0<v\)
numer(F);
denom(F);
F = a/(b+c)+b/(a+c)+c/(a+b)-3/2
F = F.rational_simplify()
F. numerator()
F.denominator()
[2] | Une partition de \(n\) est une suite décroissante d’éléments de \(\N^*\) de somme n. Par exemple les partitions de \(3\) sont \(1+1+1\),:math:2+1 et \(3\). |