Programming Options for Power Expand

• To: mathgroup at christensen.cybernetics.net
• Subject: [mg802] Programming Options for Power Expand
• From: Jack Goldberg <jackgold at math.lsa.umich.edu>
• Date: Fri, 21 Apr 1995 01:41:22 -0400

```I have received a number (1) of requests for my solution
to my own problem:  Enhance PowerExpand so that among
other things it simplifies  ArcTan[Tan[x]] = x.  The
real question is more general:  Should (and can!) one
add options to a built in command?  I do not know the
answer to whether one should.  I am interested in knowing
what is good Mma programming practice in this regard.
Is what I present next poor programming practice?  Why?
(I am most interested in the style, less in how to improve
my code.)

Step(1):
Define rules.  I list a few:

In[1]:  ArcRules = {

ArcTan[ Tan[x_] ] :> x,
ArcTan[ Cot[x_] ] :> Pi/2 - x,

....

ArcCsc[ Sec[x_] ] :> Pi/2 - z}:

The .... refers to all those combinations  ArcYyy[ [Yyy[x_] ] :> x
which I left out to save space.

Step(2)
In[2}:	ArcRules = Dispatch[ArcRules];

( *Don't ask me to justify this step.  I just lifted it out of
Roman Maeder's package "Algebra`Trigonometry`".   *)

Step (3)

In[3]:	 Unprotect[PowerExpand];

In[4]:	PowerExpand[expr_,InverseTrig->True] :=

Module[ {fnt},
fnt = Simplify[ PowerExpand[#//.ArcRules] ]&;
FixedPoint[  fnt,expr ]
]

In[5]: 	Protect[PowerExpand];

Some trial examples:

ex1 = 1 + Log[ArcTan[Tan[Exp[x]]]];
ex2 = 1 + ArcTan[Log[Exp[Tan[x]]]];
ex3 = ArcSin[Sqrt[1-Cos[x]^2]];

PowerExpand without the "option" leave these expressions unaltered.
PowerExpand[ex1,InverseTrig->True] simplifies to 1+x.  The others
work similarly.

I think that I have cheated here.  InverseTrig->True acts like
an option but it strikes me that it is in fact a second argument
to PowerExpand.  But perhaps that's all options are anyway.
Any discussion on the matters raised by this post are appreciated.
I learn even from those I disagree with!
Thanks all.
Jack

P.S.  I hope I made it clear that other rules such as
ArcTanh[ Tanh[x_] ] :> x  can be added to the list in