Collectを使用して否定的な用語をグループ化する方法は?

Aug 23 2020

たとえば、私は持っています: $-d^2-k^{d+1}+d k^d+d+k-1$。私は手に入れたい:$-\left(d^2+k^{d+1}+1\right)+d k^d+d+k$

回答

1 MichaelE2 Aug 23 2020 at 14:30

テスト例:

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

問題は、加算された項と減算された項を分離すると、評価時にマイナス記号が自動的に分散され、項がソートされることです(にが含まれてPlusいるため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  *)

出力フォーマットの場合:Plus単項式が評価およびソートされないようにすることができます。これは、さらに計算するには不便です—多項式を並べ替えるだけです。ただし、人間が読める形式のプレゼンテーションを作成する場合は、Deferまたはを使用して行うことができますHoldForm。これが1つの方法です:

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