Introduction xcas & sage

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 :

  • de tutoriels excellents (sur internet pour sage, dans les menus pour xcas) ;
  • d’une autocomplétion efficace : taper tabulation après quelques lettres fournit les fonctions dont c’est le préfixe ;
  • d’une aide intégrée très complète en tapant ? avant le nom d’une commande.

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. 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.

minimum à retenir/archiver cette année

  1. Etre habitué à l’interface et trouver rapidement ce que l’on cherche dans l’aide.
  2. opérations classiques en mode exact, approché, algèbre linéaire, calcul modulaire et polynomial. Notamment, pgcd, couples de Bezout, produit de matrices, noyau (y compris pour un élément de \(M_n(\Z/p\Z)\),
  3. Quelques instructions de programmation: boucles 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.
  4. Quelques instructions graphique de base, et surtout savoir obtenir ces fonctions et leurs options via les menus déroulant. Ex fonctions (paramétriques, implicites, statistiques; ex histogrammes) et géométrie (points, droites…) et options d’affichage via le menu déroulant.

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.

Premiers pas

  1. Comment calculer \(\sqrt[3]{23}\) ?

    solution xcas ⇲ ⇱ solution xcas

    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
    
    solution sage ⇲ ⇱ solution sage

    Il faut passer par les puissances fractionnaires:

    pow(23,1/3)
    23^(1/3)
    
  2. Donner une valeur approchée des résultats précédents (mots-clés evalf ou approx).

    solution xcas ⇲ ⇱ solution xcas
    root(3,23.);evalf(root(3,23.));root(3,approx(23));
    
    solution sage ⇲ ⇱ solution sage
    pow(23,1/3)*1.
    pow(23,1/3).n()
    
  3. 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\).

    solution xcas ⇲ ⇱ solution xcas
    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);
    
    solution sage ⇲ ⇱ solution sage
    pi, e, I
    pi.n(digits=1000)
    pi.n(1000*log(10,2))
    
  4. Faire ?digits. Que faut il faire pour travailler par défaut avec \(1000\) chiffres ?

    solution xcas ⇲ ⇱ solution xcas

    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);
    
    solution sage ⇲ ⇱ solution sage

    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)
    
  1. Trouver la fonction pgcd de deux entiers en utilisant le menu aide.

  2. On pose a:=2017;. Comment libérer la variable a ?

    solution xcas ⇲ ⇱ solution xcas
    a:=2017;
    purge(a);
    a;
    
    solution sage ⇲ ⇱ solution sage
    a = 2017
    restore('a')
    a
    

Listes

  1. Comment ajouter un élément à une liste ? Ajoutez l’élément \(55\) à la liste l:=[1,33,4].

    solution xcas ⇲ ⇱ solution xcas
    l:=[1,33,4];
    augment(l,55);
    
    solution sage ⇲ ⇱ solution sage
    l = [1,33,4]
    l.append(55)
    l += [200]
    
  2. On pose l1:=[1,33,4] et l2:=[11,133,14]. Quelle instruction permet de créer une liste en juxtaposant l1 et l2 ?

    solution xcas ⇲ ⇱ solution xcas
    l1:=[1,33,4];
    l2:=[11,133,14];
    concat(l1,l2);
    
    solution sage ⇲ ⇱ solution sage
    l1 = [1,33,4]
    l2 = [11,133,14]
    l1+l2
    
  1. Tapez seq(, et utilisez cette fonction pour créer la liste des 30 premiers carrés.

    solution xcas ⇲ ⇱ solution xcas
    seq(n^2,n=1..30);
    
    solution sage ⇲ ⇱ solution sage

    Le mécanisme de compréhension de liste permet d’effectuer des séquences

    [ n^2 for n in [1..30] ]
    

    Avertissement

    La syntaxe [1..30] est propre à Sage, en python on utilise range(1,31).

  2. Créez cette même liste à l’aide d’une boucle for.

    solution xcas ⇲ ⇱ solution xcas

    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:=append(l,ii^2);}:; l;
    
    solution sage ⇲ ⇱ solution sage
    l = []
    for n in [1..30]:
      l.append(n^2)
    l
    

Expressions et fonctions

  1. 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)).

    solution xcas ⇲ ⇱ solution xcas
    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);
    
    solution sage ⇲ ⇱ solution sage
    x = var('x')
    P = x/(x^2+1)
    Q(x) = sin(1/x)
    
  2. Etudiez les types de P, Q, Q(x), Q(5), Q(6/pi) (on pourra simplifier).

    solution xcas ⇲ ⇱ solution xcas
    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)
    
    solution sage ⇲ ⇱ solution sage

    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
    
  1. Calculer les dérivées de \(P\) et \(Q\).

    solution xcas ⇲ ⇱ solution xcas
    diff(P,x);
    function_diff(Q);
    Q';
    
    solution sage ⇲ ⇱ solution sage
    P.diff(x)
    Q.diff()
    
  2. Calculer la dérivée seconde de \(Q\circ Q\). (On factorisera)

    solution xcas ⇲ ⇱ solution xcas
    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
    
    solution sage ⇲ ⇱ solution sage
    Q(Q).diff()
    
  3. Quel est le symbole de composition des fonctions ? Comment obtenir facilement la composée septième de \(Q\) calculée en \(y\) ?

    solution xcas ⇲ ⇱ solution xcas
    (Q@@7)(y);
    
    solution sage ⇲ ⇱ solution sage
    y = var('y')
    self_compose(Q,7)(y)
    
  4. (À 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}\).

    solution xcas ⇲ ⇱ solution xcas
    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
    
    solution sage ⇲ ⇱ solution sage
    P.function(x)
    P.function(x)(Q).diff()
    P(x=Q).diff() # plus simple
    
  1. Quelle est la valeur théorique de

    \[\begin{split}44\arctan(1/57)+7\arctan(1/239) \\ -12\arctan(1/682)+24\arctan(1/12943) ?\end{split}\]

    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.

    solution xcas ⇲ ⇱ solution xcas
    pp1:=44*atan(1/57)+7*atan(1/239)-12*atan(1/682)+24*atan(1/12943);
    simplify(pp1); //ou peut-etre tsimplify
    
    solution sage ⇲ ⇱ solution sage

    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.

Calcul formel

  1. Exprimer \(\cos 5a\) en fonction de \(\cos a\) (où \(a\) est une variable formelle).

    solution xcas ⇲ ⇱ solution xcas
    purge(a);
    trigexpand(cos(5*a));
    
    solution sage ⇲ ⇱ solution sage
    a = var('a')
    sin(5*a).expand_trig()
    
  2. 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)

    solution xcas ⇲ ⇱ solution xcas
    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);
    
    La forme développée avant l’intégration est plus simple:
    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.
    
    solution sage ⇲ ⇱ solution sage
    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()
    
  3. 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é.

    solution xcas ⇲ ⇱ solution xcas

    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);
    

Développements et factorisations

  1. 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).

    solution xcas ⇲ ⇱ solution xcas
    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);
    
    solution sage ⇲ ⇱ solution sage
    P1 = (x^2-1)/(x-1); P1
    P1.simplify_rational()
    
  2. Factoriser \(x^{12}-1\) dans \(\Z[x]\). En factorisant des polynômes judicieusement choisis, obtenir la valeur du polynôme cyclotomique \(\Phi_{12}\) ?

    solution xcas ⇲ ⇱ solution xcas
    factor(X^12-1);
    

    phi12 est le facteur qui n’apparait pas dans:

    factor(X^6-1);factor(X^4-1);
    
    solution sage ⇲ ⇱ solution sage
    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))
    
  3. On pose \(a=e^{\frac{2i\pi}{12}}\). Vérifiez que \(a^{12}\) vaut bien \(1\) pour xcas. Etudier \(e^{\frac{2i\pi}{9}}\).

  4. 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 ?

    solution xcas ⇲ ⇱ solution xcas
    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);
    
    solution sage ⇲ ⇱ solution sage

    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()
    
  5. 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)

    solution xcas ⇲ ⇱ solution xcas

    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
    
    solution sage ⇲ ⇱ solution sage
    P = x^12-1
    P.change_ring(QQ[sqrt(3)]).factor()
    P.change_ring(QQ[I,sqrt(3)]).factor()
    

Dénombrement et séries génératrices

  1. Afficher le coefficient de \(t^3\) dans la série formelle associée à \(\prod_{i=1}^4\frac{1}{1-a_i.t}\) ?

    solution xcas ⇲ ⇱ solution xcas
    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);
    
    solution sage ⇲ ⇱ solution sage

    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
    
  2. 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\)

  3. Quel est le cardinal de:

    \[\{(x_1,\dots,x_5)\in\N^5 | x_1+3x_2+2x_3+x_4+4x_5=208\}\]
    solution xcas ⇲ ⇱ solution xcas

    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);
    
    solution sage ⇲ ⇱ solution sage
    A.<x> = ZZ[['x']]
    P = 1/((1-x)*(1-x^3)*(1-x^2)*(1-x)*(1-x^4)+O(x^300));
    P[208]
    
  4. Montrer que le nombre de manières de former 10€, 20€,… avec des pièces de 50 centimes, 1€ et 2€ est toujours un carré parfait.

  1. En adaptant la formule \(\sum_{n>0}p_n.t^n=\Pi_{i=1}^\infty \frac{1}{1-t^i}\)\(p_n\) est le nombre de partitions [1] de \(n\), calculer \(p_{50}\).

    solution xcas ⇲ ⇱ solution xcas

    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);
    
    solution sage ⇲ ⇱ solution sage

    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 range(1,51))
    P[50]
    
  2. 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).

    solution xcas ⇲ ⇱ solution xcas
    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);
    
    solution sage ⇲ ⇱ solution sage
    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

    \[\frac{8!}{3!2!1!2!}\]

    En développant la somme de proche en proche par la formule du binôme on obtient le produit des coefficient binomiaux.

Editeur de programme

  1. 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)).

    Division euclidienne, recherche dichotomique

    Entree : \(a\geq 0\) et \(b>0\)
    Sortie : le quotient et le reste de la division de \(a\) par \(b\)
    \(n\leftarrow 0\)
    Tant que \(2^nb\leq a\) :
    \(n\leftarrow n+1\)
    \(\alpha\leftarrow 2^{n-1}\)
    \(\beta\leftarrow 2^n\)
    Pour \(k\) de \(1\) jusque \(n-1\) :
    \(\gamma=\frac{\alpha+\beta}{2}\)
    Si \(\gamma b\leq a\) :
    \(\alpha\leftarrow\gamma\)
    Sinon \(\beta \leftarrow\gamma\)
    Retour : \(q=\alpha\) et \(r=a-bq\)
    solution xcas ⇲ ⇱ solution xcas
     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
    
    solution sage ⇲ ⇱ solution sage
     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)
    

Démonstration en calcul formel

  1. Effectuer un changement de variable pour que les inégalités \(0<a<b<c\) soient faciles à lire.

    solution xcas ⇲ ⇱ solution xcas
    purge(a,u,v);
    b:=a+u;c:=b+v; //on ordonne a,b,c
    
    solution sage ⇲ ⇱ solution sage
    a,u,v = var('a,u,v')
    b = a + u; c = b + v;
    
  2. Démontrer en demandant un calcul élémentaire au logiciel que

    \[3/2\leq \frac{a}{b+c} + \frac{b}{a+c} + \frac{c}{a+b}\]

    (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.)

    solution xcas ⇲ ⇱ solution xcas
    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);
    
    solution sage ⇲ ⇱ solution sage
    F = a/(b+c)+b/(a+c)+c/(a+b)-3/2
    F = F.rational_simplify()
    F. numerator()
    F.denominator()
    
[1]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\), \(2+1\) et \(3\).