[Date Index]
[Thread Index]
[Author Index]
Re: efficient programming problem
*To*: mathgroup at smc.vnet.net
*Subject*: [mg84154] Re: efficient programming problem
*From*: DrMajorBob <drmajorbob at bigfoot.com>
*Date*: Wed, 12 Dec 2007 01:14:29 -0500 (EST)
*References*: <3584443.1197383067825.JavaMail.root@m35>
*Reply-to*: drmajorbob at bigfoot.com
Maybe you should use your own "product" function; you can always change it
to Times when everything else is done. (And you don't need Unevaluated.)
Your application may need more rules or a more general version of the
second rule I added for "prod", but maybe this will get you down the road
a bit:
Clear[wick, pair, prod]
prod[___, 0, ___] = 0;
prod[pair[z1_[w_], z2_[x_]], pair[z3_[y_], z4_[z_]]] /;
z == x + 1 && z2 == z4 :=
prod[pair[z1[w], z2[z]], pair[z3[y], z4[x]]]
wick[a_, b_] := pair[a, b];
wick[a_, b__] :=
Sum[prod[pair[a, {b}[[i]]], wick @@ Delete[{b}, i]], {i,
Length@{b}}];
pair[c[_], c[_]] := 0
pair[d[_], d[_]] := 0
wick[c[1], c[2], d[3], d[4]] /. prod -> Times
2 pair[c[1], d[4]] pair[c[2], d[3]]
Bobby
On Tue, 11 Dec 2007 05:12:35 -0600, Michael Weyrauch
<michael.weyrauch at gmx.de> wrote:
> Hello,
>
> I am generating a sum of a product of "pairs" using the following rules
> (partly stolen from an earlier post of Carl Woll in this group.)
>
> wick[a_, b_] := pair[a, b];
>
> wick[a_, b__] := Sum[Expand[pair[a, =
> {b}[[i]]]*Delete[Unevaluated[wick[b]], i]], {i, Length[{b}]}];
>
> pair[c[_], c[_]] := 0
>
> pair[d[_], d[_]] := 0
>
> So, when I evaluate
>
> wick[c[1], c[2], d[3], d[4]]
>
> I get
>
> pair[c[1], d[4]]*pair[c[2], d[3]] + pair[c[1], d[3]]*pair[c[2], d[4]]
>
> which is the desired sum of product of pairs.
>
> Now, I would like to implement an additional rule which holds for my
> pairs, namely that it is allowed to interchange the parameters
> (1,2) or (3,4), so that the above sum of pairs simplifies e.g. to
>
> 2*pair[c[1], d[4]]*pair[c[2], d[3]]
>
> A more complicated example would be to evaluate
>
> wick[c[1], c[2], d[3], d[4], c[5], c[6], d[7], d[8]]
>
> which produces a sum of 24 products of pairs. Now if I again implement
> the additional rule that one is allowed to interchange (1,2)
> or (3,4) or (5,6) ( and so on) one obtains only a sum of 3 products of =
> pairs which reads
>
> 4*pair[c[1], d[3]]*pair[c[2], d[4]]*pair[c[5], d[7]]*pair[c[6], d[8]] +
>
> 16*pair[c[1], d[7]]*pair[c[2], d[3]]*pair[c[5], d[8]]*pair[d[4], c[6]] +
>
> 4*pair[c[1], d[7]]*pair[c[2], d[8]]*pair[d[3], c[5]]*pair[d[4], c[6]]
>
> I am looking for a method which implements this (1,2) (3,4) (5,6)...
> interchange symmetry in a memory and time efficient way, so
> that Mathematica directly produces the correctly "reduced" sum of
> products of pairs as exemplified above for simple cases.
>
> I have now tried two implementations, but both use too much memory and
> time (this is relevant of course only for much longer
> examples which contain say 4 times as many c[] and d[] in wick[] than
> the examples given), since my methods essentially first
> generate the some of all products of pairs generated by the rules given
> in the beginning of this post and then analyze the sum of
> terms and reduce them according to the additional interchange symmetry.
>
> It would be better if this reduction of terms could be done during the
> recursive generation of the sum of products of pairs. Ideas
> in this direction would be welcome...
>
> Thanks, Michael
>
>
>
--
DrMajorBob at bigfoot.com
Prev by Date:
**Re: how to speed up lenghty formulas??**
Next by Date:
**Re: Export figures with tooltips**
Previous by thread:
**efficient programming problem**
Next by thread:
**Re: efficient programming problem**
| |