Re: Reverse order terms and 0-origin array.
- To: mathgroup at christensen.cybernetics.net
- Subject: [mg1695] Re: [mg1601] Reverse order terms and 0-origin array.
- From: mike johnson <johnson56 at popcorn.llnl.gov>
- Date: Mon, 17 Jul 1995 02:44:26 -0400
- Organization: Lawrence Livermore Nat'l Lab
Richard Mercer <richard at seuss.math.wright.edu> wrote:
>> 1) When I type Expand[(x+1)^2], Mathematica returns 1 +
>> 2x + x^2. Can receive the result in the reverse order,
>> i.e., x^2 + 2x + 1 ?
>
>Although I have made Mathematica jump through many hoops in 5 years of
>programming, the most frustrating failure has been my inability to provide the
>option to have polynomials print out in traditional order...
Sorry for missing this query the first time around. I have used the following
for several years when working with angular momentum selection rules, which
involve products and ratios of polynomials. The principles are pretty simple:
(1) Change only the output format, not the internal one, (2) get a list of the
terms in each factor (if a product, etc.), (3) Reorder the terms based on the
size of their exponents. I have never taken the time to put this into a real
MMA package.
(* 12/7/93 maj (with a lot of help from Robby Villegas @ WRI tech support)
Routines for reordering (output format only) polynomials,
products of polynomials, and ratios of polynomials so that
highest exponents occur first.
reOrderPoly[expr,var]
reOrderPolyProd[expr,var] (includes above)
reOrderPolyRatio[expr,var] (includes both above) *)
Clear[DegreeSortTerms]
Clear[OrderlessPlus]
Clear[reOrderPolyRatio]
Clear[reOrderPoly]
Clear[OrderlessTimes]
Clear[reOrderPolyProd]
Clear[termsList]
Clear[facList]
termsList[sum_Plus] := Level[sum, {1}]
termsList[singleton_] := {singleton}
facList[product_Times] := Level[product, {1}]
facList[singleton_] := {singleton}
DegreeSortTerms[expr_,var_] :=
Module[{terms = termsList[expr]},
Sort[terms, (Exponent[#1, var] >
Exponent[#2,var]) &]
]
Format[ OrderlessPlus[terms___] ] := terms /; Length[{terms}] == 1
Format[ OrderlessPlus[terms___] ] :=
HoldForm[Plus[terms]] /; Length[{terms}] > 1
reOrderPoly[oneTerm_,var_] := oneTerm /; !PolynomialQ[#, var]
reOrderPoly[oneTerm_,var_] :=
OrderlessPlus @@ DegreeSortTerms[oneTerm, var] /;
PolynomialQ[#, var]
Format[ OrderlessTimes[terms___] ] := terms /; Length[{terms}] == 1
Format[ OrderlessTimes[terms___] ] := HoldForm[Times[terms]] /;
Length[{terms}] > 1
reOrderPolyProd[product_,var_] :=
OrderlessTimes @@ Map[reOrderPoly[#,var] &, facList[product]]
reOrderPolyRatio[rational_,var_] :=
reOrderPolyProd[rational,var] /; Denominator[rational] == 1
reOrderPolyRatio[rational_,var_] :=
Divide @@ Map[reOrderPolyProd[#,var] &,
Through[{Numerator,Denominator}[rational]] ]
SetAttributes[reOrderPoly,Listable]
SetAttributes[reOrderPolyProd,Listable]
SetAttributes[reOrderPolyRatio,Listable]
(* EXAMPLE *)
expr1 = (j+3j^2+4)(4j+5j^5+j^3)/(3(j^3+2+j^2)(5+j))
2 3 5
(4 + j + 3 j ) (4 j + j + 5 j )
--------------------------------
2 3
3 (5 + j) (2 + j + j )
reOrderPolyRatio[expr1,j]
2 5 3
(3 j + j + 4) (5 j + j + 4 j)
--------------------------------
3 2
3 (j + 5) (j + j + 2)
Mike Johnson, Lawrence Livermore National Lab