Come utilizzare Collect per raggruppare i termini negativi?

Aug 23 2020

Ad esempio, ho: $-d^2-k^{d+1}+d k^d+d+k-1$. Voglio ottenere:$-\left(d^2+k^{d+1}+1\right)+d k^d+d+k$.

Risposte

1 MichaelE2 Aug 23 2020 at 14:30

Esempio di prova:

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

Il problema è che se si separano i termini aggiunti e sottratti, quando viene valutato, il segno meno viene automaticamente distribuito e i termini ordinati (poiché Plusha il 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  *)

Per la formattazione dell'output: è possibile impedire la Plusvalutazione e l'ordinamento dei monomi. Questo è scomodo per ulteriori calcoli: lascerei semplicemente che il polinomio venga riordinato. Tuttavia, per creare una presentazione leggibile dall'uomo, può essere eseguita con Defero HoldForm. Ecco un modo:

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