Services & Resources / Wolfram Forums
-----
 /
MathGroup Archive
2005
*January
*February
*March
*April
*May
*June
*July
*August
*September
*October
*November
*December
*Archive Index
*Ask about this page
*Print this page
*Give us feedback
*Sign up for the Wolfram Insider

MathGroup Archive 2005

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

Search the Archive

Re: Wick like theorem and "symbolic" compilation

  • To: mathgroup at smc.vnet.net
  • Subject: [mg61105] Re: [mg61062] Wick like theorem and "symbolic" compilation
  • From: "David Park" <djmp at earthlink.net>
  • Date: Mon, 10 Oct 2005 02:40:07 -0400 (EDT)
  • Sender: owner-wri-mathgroup at wolfram.com

Alexander,

Well, the following is 10 times faster. I use KSetPartitions from
Combinatorica, select out the desired terms and use Union to eliminate
duplicates.

Needs["DiscreteMath`Combinatorica`"]

WickTheorem2[args__] /; Length[List @@ args] > 1 :=
  Module[{w = List @@ args, n, subterms, work, i},
    n = Length[w];
    Do[work = Cases[KSetPartitions[w, i], {___, {_, _}, ___}];
      work = Map[If[Length[#] == 2, Wick @@ #, Sequence @@ #] &, work, {2}];
      subterms[i] = Map[Times @@ # &, work, {1}], {i, 2, n - 1}];
    args + Plus @@ Union[Flatten[Table[subterms[i], {i, 2, n - 1}]]]
    ]

The original WickTheorem took 8.02 seconds on my computer and the
WickTheorem2 took 0.71 seconds on the timing test. Both theorems generated
764 terms.

But it's not over until Carl Woll and a few other people reply.

David Park
djmp at earthlink.net
http://home.earthlink.net/~djmp/


From: Alexander [mailto:beginning.physst at mail.ru]
To: mathgroup at smc.vnet.net

Dear MathGroup!

I wrote simple programm to perform "Wick" expanding.
Here is the code:

(*St1 - basic function to extract couples of fields from a given list*)

st1[x_] := If[Length[
    x] === 2, Wick[Sequence @@ x], Plus @@
      ReplaceList[List @@ (x), {e___, a_, c___,
      b_, d___} -> Wick[a, b] e c d]];

(* Some transformation rules for this function *)

st1[x_Wick y_] := x st1[y];
st1[a_ + b_] := st1[a] + st1[b];

(* Formatting rules *)

\!\(\(Format[Wick[x_, y_]] := \(x\ y\)\&^;\)\)

(* Final function *)

WickTheorem[x_] := Expand[Plus @@ FixedPointList[st1, x]] //. a_ +
          b_Integer c_ -> a + c;

Simple example, showing how it works:

In[6]:= WickTheorem[a b c d]

Out[6]:= \!\(\*FormBox[
  RowBox[{\(a\ b\ c\ d\), "+",
    RowBox[{"c", " ",
      FormBox[\(\(a\ b\)\&^\),
        "TraditionalForm"], " ", "d"}], "+",
    RowBox[{"b", " ",
      FormBox[\(\(a\ c\)\&^\),
        "TraditionalForm"], " ", "d"}], "+",
    RowBox[{"a", " ",
      FormBox[\(\(b\ c\)\&^\),
        "TraditionalForm"], " ", "d"}], "+",
    RowBox[{"b", " ", "c", " ",
      FormBox[\(\(a\ d\)\&^\),
        "TraditionalForm"]}], "+",
    RowBox[{
      FormBox[\(\(a\ d\)\&^\),
        "TraditionalForm"], " ",
      FormBox[\(\(b\ c\)\&^\),
        "TraditionalForm"]}], "+",
    RowBox[{"a", " ", "c", " ",
      FormBox[\(\(b\ d\)\&^\),
        "TraditionalForm"]}], "+",
    RowBox[{
      FormBox[\(\(a\ c\)\&^\),
        "TraditionalForm"], " ",
      FormBox[\(\(b\ d\)\&^\),
        "TraditionalForm"]}], "+",
    RowBox[{"a", " ", "b", " ",
      FormBox[\(\(c\ d\)\&^\),
        "TraditionalForm"]}], "+",
    RowBox[{
      FormBox[\(\(a\ b\)\&^\),
        "TraditionalForm"], " ",
      FormBox[\(\(c\ d\)\&^\),
        "TraditionalForm"]}]}], TraditionalForm]\)

Maybe there is more simple and elegant realization of this theorem than
my code ???

Second question is about optimization.

In current realization, on my Cleleron 1700 (with 128Mb of ram) using
Mathematica 5.1 for Windows, I have following timings:

In[7]:= WickTheorem[a b c d e f w t] // Timing // Print["Time = ", #[[
    1]], ", Length = ", Length[#[[2]]]] &
Out[7]:= Time = 10.688 Second, Length = 764

So, in final expression there was 764 terms and it takes ~10 seconds to
evaluate them. Input expression contains only 8 fields, with 9 fields
computation takes a relatively long time,about 600 seconds.

Why so long?
And what are the ways to reduce this time ?

I have tried to use CompileEvaluate from Experimental package, but this
doesn't reduce evaluation time greatly.

Resuming, second question sounds like:
Should I rewrite the program in more elegant and efficient way to
reduce
evaluation time or there is "symbolic" compilation technique to do
that?

Thanks for your help!

Alexander.



  • Prev by Date: Re: StyleBox["A","MB"],RowBox[{"rrow3D",... inserted into Arrow3D[...]
  • Next by Date: Re: Wick like theorem and "symbolic" compilation
  • Previous by thread: Re: Wick like theorem and "symbolic" compilation
  • Next by thread: Re: Wick like theorem and "symbolic" compilation