Comment trier / extraire les pouvoirs positifs et négatifs sous forme de liste?

Aug 18 2020

J'ai l'expression suivante

expr = x1^d1 * x2^d2 * x3^d3;

d1,d2,d3peut contenir des valeurs / expressions négatives, c'est-à-dire qu'en général, ce d1,d2,d3ne sont pas des valeurs numériques. Dire

d1 = 4 d;
d2 = -5 e;
d3 =  -6 d;
with assumption d, e are positive.

Question: Est-il possible de créer deux listes, l'une contenant un exposant positif et l'autre avec un exposant négatif?

Mon essai actuel est d'utiliser Exponentpour chacun de ces termes et de les tester pour le positif et le négatif.

Réponses

3 BobHanlon Aug 18 2020 at 01:42
$Version

(* "12.1.1 for Mac OS X x86 (64-bit) (June 19, 2020)" *)

Clear["Global`*"]

expr = x1^d1*x2^d2*x3^d3;

exponents = 
 Cases[expr, x_^p_. :> p, 1] /. {d1 -> 4 d, d2 -> -5 e, d3 -> -6 d}

(* {4 d, -5 e, -6 d} *)

pos = Assuming[{d > 0, e > 0}, Select[exponents, Simplify[# > 0] &]]

(* {4 d} *)

neg = Assuming[{d > 0, e > 0}, Select[exponents, Simplify[# < 0] &]]

(* {-5 e, -6 d} *)
1 kglr Sep 02 2020 at 05:45

Vous pouvez également utiliser Internal`SyntacticNegativeQavec GeneralUtilities`SelectDiscard, GroupBy, Cases, DeleteCases, Selectou Pickcomme suit:

expr = x1^d1*x2^d2*x3^d3
x1^(4 d) x2^(-5 e) x3^(-6 d)
exponents = Exponent[expr, {x1, x2, x3}]
{4 d, -5 e, -6 d}
{neg, pos} = GeneralUtilities`SelectDiscard[Internal`SyntacticNegativeQ] @ exponents

{neg, pos} = GroupBy[exponents, Internal`SyntacticNegativeQ] /@ {True, False}

{neg, pos} = Cases[#@_?Internal`SyntacticNegativeQ]@exponents & /@ 
   {Identity, Except}

{neg, pos} = DeleteCases[#@_?Internal`SyntacticNegativeQ] @ exponents & /@ 
   {Except, Identity}

{neg, pos} = Select[#@*Internal`SyntacticNegativeQ]@exponents & /@ 
   {Identity, Not}

{neg, pos} = Pick[exponents, 
    Internal`SyntacticNegativeQ /@ exponents, #] & /@ {True, False}

tous donnent

 {{-5 e, -6 d}, {4 d}}