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