Comment utiliser Collect pour regrouper les termes négatifs?

Aug 23 2020

Par exemple, j'ai: $-d^2-k^{d+1}+d k^d+d+k-1$. Je veux obtenir:$-\left(d^2+k^{d+1}+1\right)+d k^d+d+k$.

Réponses

1 MichaelE2 Aug 23 2020 at 14:30

Exemple de test:

SeedRandom[0];
poly = FromDigits[RandomInteger[{-5, 5}, 10], x]
(*  1 - 5 x + 3 x^2 + x^8 (2 + 5 x) + x^4 (-4 - 3 x + (3 - 5 x) x^2)  *)

Le problème est que si vous séparez les termes ajoutés et soustraits, lors de son évaluation, le signe moins est automatiquement distribué et les termes triés (depuis Plusle Attribute Orderless).

1 + 3 x^2 + 3 x^6 + 2 x^8 + 5 x^9 - (5 x^7 + 3 x^5 + 4 x^4 + 5 x)
(*  1 - 5 x + 3 x^2 - 4 x^4 - 3 x^5 + 3 x^6 - 5 x^7 + 2 x^8 + 5 x^9  *)

Pour le formatage de sortie: vous pouvez empêcher Plusd'être évalué et de trier les monômes. Ceci n'est pas pratique pour un calcul ultérieur - je laisserais simplement le polynôme être réorganisé. Cependant, pour faire une présentation lisible par l'homme, cela peut être fait avec Deferou HoldForm. Voici une façon:

Plus @@ KeyValueMap[
  # /. {False -> #2, True -> -Defer@Evaluate[-#2]} &,
  Total /@ GroupBy[MonomialList[poly], Internal`SyntacticNegativeQ]
  ]
(*  1 + 3 x^2 + 3 x^6 + 2 x^8 + 5 x^9 - (5 x + 4 x^4 + 3 x^5 + 5 x^7)  *)