Drexel dragonThe Math ForumDonate to the Math Forum



Search All of the Math Forum:

Views expressed in these public forums are not endorsed by Drexel University or The Math Forum.


Math Forum » Discussions » Software » comp.soft-sys.math.mathematica

Topic: Pattern with powers
Replies: 7   Last Post: Aug 8, 2013 12:02 AM

Advanced Search

Back to Topic List Back to Topic List Jump to Tree View Jump to Tree View   Messages: [ Previous | Next ]
Daniel Lichtblau

Posts: 1,761
Registered: 12/7/04
Re: Pattern with powers
Posted: Aug 2, 2013 2:49 AM
  Click to see the message monospaced in plain text Plain Text   Click to reply to this topic Reply

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




Point your RSS reader here for a feed of the latest messages in this topic.

[Privacy Policy] [Terms of Use]

© Drexel University 1994-2014. All Rights Reserved.
The Math Forum is a research and educational enterprise of the Drexel University School of Education.