latex(Resultat) vs. fprint(Sortie,latex(Resultat))

Librairie C++ de calcul formel/ C++ symbolic computation library

Modérateur : xcasadmin

Répondre
aldus
Messages : 22
Inscription : dim. janv. 24, 2016 6:59 am

latex(Resultat) vs. fprint(Sortie,latex(Resultat))

Message par aldus » dim. janv. 24, 2016 8:22 am

Bonjour !

J'utilise LuaLatex et CMathLuaLatex pour rédiger des devoirs "variables" à l'attention de mes élèves. Je dois donc faire des calculs pour chaque copie.

J'ai observé un problème dans la gestion des signes : j'affiche en sortie d'un normal( ... ) ceci par exemple : x² - - 2x + -2 , ce qui n'est pas terrible comme présentation. Je n'ai pas de problème avec les mêmes instructions et avec la même bibliothèque Giac mais attaquée cette fois par l'interface XCAS.

Christophe Devalland s'est penché sur la question et a identifié une différence de comportement entre latex(Resultat) (qui n'a pas ce problème) alors que fprint(Sortie,latex(Resultat)) l'a. Pour lui, ce serait un problème interne à giac lié à la fonction fprint.

Est-ce soluble ?

P.S. exemple de code générant les -- et +- :

Code : Tout sélectionner

\documentclass[french]{article}
\usepackage{luacode}% pour LuaLaTex

\begin{document}

%%%%%%%%%%%% CmathLuaTeX %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\directlua{dofile('/home/administrateur/Projets-QCM/Transversal/CmathLuaTeX.lua')}
\newcommand\Cmath[1]{\luadirect{tex.print(Cmath2LaTeX('\detokenize{#1}'))}}
\newcommand\XcasOld[1]{$\Cmath{xcas(#1)}$}
\newcommand\Xcas[1]{$\luaexec{tex.print(Cmath2LaTeX('xcas('..#1..')'))}$}% fournir la commande à l'intérieur de xcas entre quotes


\Xcas{'restart'}


\luaexec{%
xaA=-4
xbA=3
aA=-0.2;bA=-(aA)*(xaA+xbA);cA=aA*xaA*xbA % attention à -aA
}% end \luaexec

\begin{enumerate}
\item $\luadirect{str='xcas(factor(x^2-('..xaA..')))';tex.print(Cmath2LaTeX(str))}$%OK
\item \Xcas{'normal(-2*(x-('..xaA..'))*(x-('..xbA..')))'} % manuel, long, délicat et peu lisible
\item \Xcas{string.format('normal(\%s*(x-(\%s))*(x-(\%s)))',-2,xaA,xbA)} % avec string.format ; avec les variables de l'espace lua
\item \Xcas{string.format('normal(\%s*x^2+\%s*x+\%s)',aA,bA,cA)}
\item \Xcas{string.format('factor(\%s*x^2+\%s*x+\%s)',aA,bA,cA)}
\item \Xcas{string.format('canonical_form(\%s*x^2+\%s*x+\%s)',aA,bA,cA)}
\item \Xcas{string.format('f(x):=\%s * x^2+\%s * x+\%s',aA,bA,cA)}\Xcas{'f(x)'}
\item \Xcas{'normal(f(x))'}
\end{enumerate}
\end{document}

parisse
Messages : 5740
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Re: latex(Resultat) vs. fprint(Sortie,latex(Resultat))

Message par parisse » lun. janv. 25, 2016 1:28 pm

Il me faudrait un exemple reproductible avec xcas ou icas. Je viens d'essayer depuis Xcas, f:=fopen("test"); fprint(f,latex(x^2-(-2*x)+1)); fclose(f) et il n'y a pas de -- dans le fichier test. J'ai regarde dans le source de fprint, les arguments ne sont pas quotes.

aldus
Messages : 22
Inscription : dim. janv. 24, 2016 6:59 am

Re: latex(Resultat) vs. fprint(Sortie,latex(Resultat))

Message par aldus » mar. janv. 26, 2016 8:01 pm

J'ai "réussi" à créer le problème en Xcas:

Code : Tout sélectionner

factor(-.2*x^2-(-.2)*x+2.4)
-0.2*(x+-4.000000000000)*(x+3.0)
Pourquoi écrire --0.2 ? C'est l'effet du remplacement d'une variable dans ... -.2*x^2-lua_variable*x+2.4 avec lua_variable=-.2.
Il semblerait que --2 dont tout le monde sait que cela fait +3 ou 3 ne soit pas géré. Il semble même que --2 crée une erreur sous Xcas.

parisse
Messages : 5740
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Re: latex(Resultat) vs. fprint(Sortie,latex(Resultat))

Message par parisse » mer. janv. 27, 2016 7:40 am

De memoire, c'est parce que -- est l'operateur de decrementation, et la grammaire de l'interpreteur l'accepte en postfixe mais pas en infixe.
Je suis en train de faire une modif dans la sortie latex pour gerer votre exemple.

aldus
Messages : 22
Inscription : dim. janv. 24, 2016 6:59 am

Re: latex(Resultat) vs. fprint(Sortie,latex(Resultat))

Message par aldus » dim. févr. 14, 2016 2:29 pm

Re-bonjour, avec beaucoup de retard.

Est-ce un problème spécifique à fprint() ou à latex(), comme initialement envisagé, quand le problème peut-être recréé sur l'interface XCas ?
Ne serait-ce du coup plus fondamental que çà, dans Giac lui-même.
Cela pourrait être lié au fait qu'il y a peu de chance que quelqu'un rentre qu'à la main --x par exemple. Cela n'arrive que parce que dans une variable texte j'ai "-"..laVariable (avec la syntaxe de concaténation .. de lua) avec "-x" dans laVariable, ce qui produit --x . D'où la "nouveauté" de la situation/problème.

parisse
Messages : 5740
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Re: latex(Resultat) vs. fprint(Sortie,latex(Resultat))

Message par parisse » dim. févr. 14, 2016 5:25 pm

Avez-vous teste si le probleme persiste avec la version mise a jour?

aldus
Messages : 22
Inscription : dim. janv. 24, 2016 6:59 am

Re: latex(Resultat) vs. fprint(Sortie,latex(Resultat))

Message par aldus » mer. févr. 17, 2016 2:59 am

J'ai vu passé une mise à jour de Giac. Donc je dois être à jour. Version XCAS 1.2.2 (sans autre précision de build). Version giac 1.2.2 (sans autre précision de build).

Voici les résultats de mes essais, sous Xcas et sous lualatex :

Essais sous Xcas :
-(-2) : 2
-(+2) : -2
+-2 : -2
-+2 ; -2
--2 : undef
- - 2 : 2
++2 : undef
+ +2 : 2
normal(-.2*x^2--0.2*x+-0.2) : undef
normal(-.2*x^2- -0.2*x+-0.2) : -0.2*x^2+0.2*x-0.2 (x^2 pour représenter ici x avec un exposant 2)

Essais sous luatex :
avec aA=-0.2;bA=aA;cA=aA
\Xcas{string.format('normal(\%s*x^2+\%s*x+\%s)',aA,bA,cA)} : -0.2.x^2+-0.2.x-0.2
\Xcas{string.format('normal(\%s*x^2+ \%s*x+\%s)',aA,bA,cA)} : -0.2.x^2+-0.2.x-0.2
\Xcas{string.format('normal(\%s*x^2-\%s*x+\%s)',aA,bA,cA)} : undef
\Xcas{string.format('normal(\%s*x^2- \%s*x+\%s)',aA,bA,cA)} : -0.2.x^2+0.2.x-0.2

avec aA=-0.2;bA=-(aA);cA=aA
\Xcas{string.format('normal(\%s*x^2+\%s*x+\%s)',aA,bA,cA)} : -0.2.x^2+0.2.x-0.2
\Xcas{string.format('normal(\%s*x^2+ \%s*x+\%s)',aA,bA,cA)} : -0.2.x^2+0.2.x-0.2
\Xcas{string.format('normal(\%s*x^2-\%s*x+\%s)',aA,bA,cA)} : -0.2.x^2+-0.2.x-0.2
\Xcas{string.format('normal(\%s*x^2- \%s*x+\%s)',aA,bA,cA)} : -0.2.x^2+-0.2.x-0.2

En synthèse :
--2 n'est pas accepté, que ce soit dans la version - monadique (--2) ou dyadique (1--2) (Xcas comme lualatex)
ce problème peut être résolu (bypass/astuce) en ajoutant un espace entre les deux signes : - -2 et 1- -2 OK (Xcas comme lualatex)
différence entre Xcas et lualatex : normal(-.2*x^2+ -0.2*x+-0.2) donne -0.2.x^2-0.2.x-0.2 quand lualatex donne -0.2.x^2+-0.2.x-0.2 (présence gênante du +-0.2 dès qu'on a deux signes différents +-, + -, - +)

parisse
Messages : 5740
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Re: latex(Resultat) vs. fprint(Sortie,latex(Resultat))

Message par parisse » mer. févr. 17, 2016 12:10 pm

En effet j'ai rajoute du code pour que Xcas et icas affichent ...-nombre au lieu de ...+-nombre et ...+nombre au lieu de ...--nombre.
Je ne pense pas qu'il soit possible de reconnaitre facilement -- comme une forme particuliere de l'operateur binaire +, mais si quelque specialiste de bison/flex y arrive sans casser le reste je suis preneur.

aldus
Messages : 22
Inscription : dim. janv. 24, 2016 6:59 am

Re: latex(Resultat) vs. fprint(Sortie,latex(Resultat))

Message par aldus » ven. févr. 19, 2016 5:36 pm

parisse a écrit :En effet j'ai rajoute du code pour que Xcas et icas affichent ...-nombre au lieu de ...+-nombre et ...+nombre au lieu de ...--nombre.
Si je comprends bien, dans la répartition des rôles entre giac et Xcas/icas, c'est au niveau de Xcas/icas que se gère la transformation de 1+-3 en 1-3. Cela veut dire que ce n'est pas giac qui s'en occupe. Cela me surprend en fait. Car j'imaginais que giac produisait des expressions "correctes" sans avoir a être retravaillées par les interfaces.

Evidemment, cela n'arrange pas mes affaires, accédant directement à giac via lualatex. Snif !

Que puis-je faire ?

parisse
Messages : 5740
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Re: latex(Resultat) vs. fprint(Sortie,latex(Resultat))

Message par parisse » ven. févr. 19, 2016 6:39 pm

Si je comprends bien votre code
\Xcas{string.format('normal(\%s*x^2+\%s*x+\%s)',aA,bA,cA)} : -0.2.x^2+-0.2.x-0.2
xcas n'est pas implique dans la creation de la chaine, ensuite la commande \Xcas execute la commande par le noyau giac, et vous recuperez une chaine generee par giac. Il faudrait voir comment est imprimee la chaine renvoyee par le noyau giac, il n'y a pas de raisons que ca ne puisse pas etre traitee comme par icas en mode interactif.
Savez-vous quelle fonction de giac lualatex appelle?

aldus
Messages : 22
Inscription : dim. janv. 24, 2016 6:59 am

Re: latex(Resultat) vs. fprint(Sortie,latex(Resultat))

Message par aldus » sam. févr. 20, 2016 1:12 am

Remarque : \Xcas est une commande Latex qui va appeler la procédure de CMathLuaLatex, rien à voir avec l'interface Xcas.

Si j'ai bien compris le fonctionnement de CMathLuaLatex, un fichier giac.in est construit, envoyé à giac qui en retour fournit un fichier giac.out. De plus une archive est réalisée dans giac.sav.

Exemples :

extrait du code latex :

Code : Tout sélectionner

\luaexec{%
aA=-0.2;bA=-(aA);cA=aA % définit les variables
}% end \luaexec

\Xcas{string.format('normal(\%s*x^2-\%s*x+\%s)',aA,bA,cA)} % demande la forme normale - les %s sont remplacés respectivement par aA, bA, et cA
exemple de giac.in :

Code : Tout sélectionner

unarchive("/tmp/giac.sav"):;
purge(Resultat);
som:=sommet(quote(normal(-0.2*x^2-0.2*x+-0.2)));
if(som=='sto' or som=='supposons'){
  normal(-0.2*x^2-0.2*x+-0.2);
  Resultat:='""'} else {
  Resultat:=(normal(-0.2*x^2-0.2*x+-0.2))};
if(Resultat=='Resultat'){
  Resultat:="Erreur Xcas"};
Sortie:=fopen("/tmp/giac.out");
if(true){
  fprint(Sortie,Unquoted,latex(Resultat));
} else {
  fprint(Sortie,Unquoted,Resultat);
};
fclose(Sortie);
archive("/tmp/giac.sav"):;
exemple de giac.out :

Code : Tout sélectionner

-0.2\cdot x^{2}+-0.2\cdot x-0.2
(on remarque la présence de +- )

parisse
Messages : 5740
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Re: latex(Resultat) vs. fprint(Sortie,latex(Resultat))

Message par parisse » sam. févr. 20, 2016 7:29 am

Ok, je crois que je peux corriger.

aldus
Messages : 22
Inscription : dim. janv. 24, 2016 6:59 am

Re: latex(Resultat) vs. fprint(Sortie,latex(Resultat))

Message par aldus » sam. févr. 20, 2016 8:33 am

8)

aldus
Messages : 22
Inscription : dim. janv. 24, 2016 6:59 am

Re: latex(Resultat) vs. fprint(Sortie,latex(Resultat))

Message par aldus » ven. mars 25, 2016 7:38 pm

Bonsoir,

Super, ça marche pour tous les exemples cités avec luaLatex.

Bizarrement, avec l'interface Xcas, factor(-.2*x^2-(-.2)*x+2.4) donne -0.2*(x+-4.000000000000)*(x+3.0), alors que je suis sur la même machine et que les bibliothèque Giac devraient être les mêmes.

En tous cas pour luaLatex ça semble bien marcher . Merci !

Répondre