MathGroup Archive 2013

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: Pattern with powers

  • To: mathgroup at smc.vnet.net
  • Subject: [mg131476] Re: Pattern with powers
  • From: danl at wolfram.com
  • Date: Fri, 2 Aug 2013 02:50:25 -0400 (EDT)
  • Delivered-to: l-mathgroup@mail-archive0.wolfram.com
  • Delivered-to: l-mathgroup@wolfram.com
  • Delivered-to: mathgroup-outx@smc.vnet.net
  • Delivered-to: mathgroup-newsendx@smc.vnet.net
  • References: <ktaj20$llc$1@smc.vnet.net> <ktcnaf$r2b$1@smc.vnet.net>

On Wednesday, July 31, 2013 11:14:07 PM UTC-5, Dr. Wolfgang Hintze wrote:
> Am Mittwoch, 31. Juli 2013 10:49:04 UTC+2 schrieb Alexei Boulbitch:
> 
> > I must admit that I am an absolute beginner in patterns, as I cannot cope with a little problem with patterns consisting of powers of variables x and y.
> 
> > 
> > Specifically, I would like to select from a list all terms of the form
> 
> > 	c x^u y^v (numerical coefficient c times x to the power u times y to the power v)
> 
> 
> > where u and v are allowed to take the values 0 and 1.
> 
> > How can I do this using Cases?
> 
> > 
> 
> > I have already accomplished the first non trivial step using _. (blank followed by a dot) in order to get first powers of the variables:
> 
> > 
> 
> > ls = List@@Expand[5 (x + y)^3]
> 
> > 
> 
> > {5*x^3, 15*x^2*y, 15*x*y^2, 5*y^3}
> 
> > 
> 
> > Example 1
> 
> > a = 2; Cases[ls, (_.)*x^(u_.)*y^(v_.) /; u >= a && v < a]
> 
> > gives 
> 
> > {15*x^2*y}
> 
> > but misses the term
> 
> > 5*x^3
> 
> > Example 2: this would be the form I would like most
> 
> > Cases[ls, (_.)*x^_?(#1 >= a & )*y^_?(#1 < a & )]
> 
> > gives 
> 
> > {}
> 
> > Here even I didn't get the dot behind the blank before the test, so it misses first powers.
> 
> > Thanks in advance for any help. 
> 
> > Best regards,
> 
> > 
> 
> > Wolfgang 
> 
> > 
> 
> > Hi, Wolfgang,
> 
> > Your explanation is not quite clear. Have a look: 
> 
> > 
> 
> > Clear[a, u, v, b];
> 
> > a = 2; 
> 
> > Cases[ls, (Times[_, x, Power[y, v_]] /;
> 
> >     v <= a) | (Times[_, Power[x, u_]] /; u >= a)]
> 
> > {5 x^3, 15 x^2 y, 15 x y^2}
> 
> > Is it, what you are after? Or this:
> 
> > Clear[a, u, v, b];
> 
> > a = 2; 
> 
> > Cases[ls, (Times[_, x, Power[y, v_]] /; 
> 
> >     v < a) | (Times[_, Power[x, u_]] /; u >= a)] 
> 
> > {5 x^3, 15 x^2 y}
> 
> > ??
> 
> > Have fun, Alexei
> 
> > Alexei BOULBITCH, Dr., habil.
> 
> 
> Alexei,
> 
> 
> 
> thanks for your message.  
> 
> As I tried to explain, I wish to extract from the list ls all terms of the form 
> 
> c x^u y^v, with c a numerical factor, u and v integers subject to the conditions u>=a and v<a with integer a>0. 
> 
> I have no problem as long as all terms in the list are "true" powers, i.e. as long as u>=2, v>=2.
> 
> Therefore I asked for a solution which also covers the values 0 and 1 for the powers.
> 
> Your first solution contains the wrong conditions, and the second one fails for a term  x^2 y^3 which is selected by your proposal but it shouldn't be selected because v>2.
> 
> Best regards,
> 
> Wolfgang

Powers of zero, that is, missing factors, will be difficult to handle via patterns. A more natural choice, in my view, would be to define predicate functions. Here is an example.

In[19]:= s = List @@ Expand[5 (x + y)^3]

Out[19]= {5 x^3, 15 x^2 y, 15 x y^2, 5 y^3}

In[20]:= a = 1;

In[21]:= Select[s, Exponent[#, x] >= a && Exponent[#, y] <= a &]

Out[21]= {5 x^3, 15 x^2 y}

Obviously this can also be done with Cases, but that seems a bit more awkward to me.

In[22]:= Cases[s, aa_ /; Exponent[aa, x] >= a && Exponent[aa, y] <= a]

Out[22]= {5 x^3, 15 x^2 y}

Since "natural" and "awkward" are in the mind of the beholder, one might well hold an opinion the reverse of my own.

Daniel Lichtblau
Wolfram Research



  • Next by Date: Re: Fitting a Complicated Function
  • Next by thread: Cases or Select?