Re: Conditions on patterns in Flat functions
- To: mathgroup at smc.vnet.net
- Subject: [mg13401] Re: [mg13332] Conditions on patterns in Flat functions
- From: David Withoff <withoff>
- Date: Thu, 23 Jul 1998 03:32:44 -0400
- Sender: owner-wri-mathgroup at wolfram.com
> Hi all, I have a problem with conditions on patterns in flat functins, > here is an example: > > > In[1]:= CosPlusISin[expr_]:= expr //. { > ((a_. Cos[th_] + b_. Sin[th_] /; b === I a ) :> a E^(I th)), > ((a_. Cos[th_] + b_. Sin[th_] /; b === - I a ) :> a E^(-I th)) > } > > In[2]:= 4 Cos[x]+4 I Sin[x] > > Out[2]= 4 Cos[x] + 4 I Sin[x] > > In[3]:= CosPlusISin[%] > > I x > Out[3]= 4 E > > In[4]:= test=4 Cos[x]+4 I Sin[x] + something > > Out[4]= something + 4 Cos[x] + 4 I Sin[x] > > In[5]:= CosPlusISin[test] > > Out[5]= something + 4 Cos[x] + 4 I Sin[x] > > The solutions I found: > > In[10]:= CosPlusISin1[expr_]:= expr //. { > ((a_. Cos[th_] + b_. Sin[th_] +c___ /; b === I a ) :> > a E^(I th)+c), > ((a_. Cos[th_] + b_. Sin[th_] +c___ /; b === - I a ) :> > a E^(-I th)+c) > } > > In[11]:= CosPlusISin2[expr_]:= expr //. { > ((a_. Cos[th_] + b_. Sin[th_] +c_. /; b === I a ) :> a > E^(I th)+c), > ((a_. Cos[th_] + b_. Sin[th_] +c_. /; b === - I a ) :> a > E^(-I th)+c) > } > > In[12]:= CosPlusISin1[test] > > I x > Out[12]= 4 E + something > > In[13]:= CosPlusISin2[test] > > I x > Out[13]= 4 E + something > > The questions: > > Which solution of the two is better, and why does the original idea not > work since Plus is Flat ? > > Tobias The original idea didn't work because the left-hand side of the rule CosPlusISin[expr_]:= expr //. { ((a_. Cos[th_] + b_. Sin[th_] /; b === I a ) :> a E^(I th)), ((a_. Cos[th_] + b_. Sin[th_] /; b === - I a ) :> a E^(-I th)) } is a Condition pattern rather than an expression with a head of Plus. One way to address that concern is to put the condition on the right-hand side of the rule. In[1]:= CosPlusISin[expr_]:= expr //. { (a_. Cos[th_] + b_. Sin[th_]) :> a E^(I th) /; b === I a, (a_. Cos[th_] + b_. Sin[th_]) :> a E^(-I th) /; b === -I a } In[2]:= CosPlusISin[something + 4 Cos[x] + 4 I Sin[x]] I x Out[2]= 4 E + something There is also a built-in function that does this: In[3]:= TrigToExp[something + 4 Cos[x] + 4 I Sin[x]] I x Out[3]= 4 E + something Dave Withoff Wolfram Research