vermaseren / form

The FORM project for symbolic manipulation of very big expressions
GNU General Public License v3.0
1.13k stars 135 forks source link

argument statement don't work with e_() - bug or feature? #206

Closed FeelUsM closed 6 years ago

FeelUsM commented 7 years ago

Hello.

Why in this code:

FORM 4.1 (May 24 2017, v4.1-20131025-346-gcf71752) 64-bits  Run: Mon Jun 26 15:15:48 2017
    index i,j,k;
    Cfun f;

    local E = f(i)*e_(i,j,k);
    argument;
    id i = j;
    endargument;

    print;
    .end

Time =       0.00 sec    Generated terms =          1
               E         Terms in output =          1
                         Bytes used      =         64

   E =
      f(j)*e_(i,j,k);

  0.00 sec out of 0.00 sec

result is f(j)*e_(i,j,k); but not is f(j)*e_(j,j,k) (=0) ?

vermaseren commented 7 years ago

Hi,

e_ is a tensor. Its arguments can only be indices (or vectors in Schoonschip notation in which it will be linear). The argument environment does not work for tensors. It would not make sense.

What you try to do in the example would be done with Multiply replace(i,j); Of course you just gave an example to show that argument does not work for e. In general you could use: id e(i,i1?,i2?) = e(j,i1,i2); You cannot use id e(i?,?a) = e(j,?a); because of the antisymmetric property of e_. It would not know whether to set ?a to j,k or to k,j with a - sign pending. The fact that in this example that does not make a difference is unimportant. In more complicated patterns it could make a lot of difference. In addition, if you would have a symmetric function S with 10 arguments and you use id S(x?,?a)*…. it may have to try 9! times to see there is no match it the pattern is sufficiently complicated. There is a routine in FORM that tries to catch cases that obviously do not give a match it you apply some intelligence, but it is relatively limited for now. Hence ?a cannot be used in (anti)symmetric functions/tensors. There are limitations to what can be done in a short time.

I hope the above explains some of the limitations. There are of course workarounds. Like: CF E; id e(i1?,...,i3?) = E(i1,…,i3); after which you can do whatever you want. Multiply replace(e,E); does not work, because of the very special status of e in which it is, just like d, not a complete function-like object. That is of course a relict from the past. It will also not work for replace(d_,E);

Jos

On 26 jun. 2017, at 14:19, Feel notifications@github.com wrote:

Hello.

Why in this code:

FORM 4.1 (May 24 2017, v4.1-20131025-346-gcf71752) 64-bits Run: Mon Jun 26 15:15:48 2017 index i,j,k; Cfun f;

local E = f(i)*e_(i,j,k);
argument;
id i = j;
endargument;

print;
.end

Time = 0.00 sec Generated terms = 1 E Terms in output = 1 Bytes used = 64

E = f(j)*e_(i,j,k);

0.00 sec out of 0.00 sec result is f(j)e_(i,j,k); but not is f(j)e_(j,j,k) (=0) ?

— You are receiving this because you are subscribed to this thread. Reply to this email directly, view it on GitHub https://github.com/vermaseren/form/issues/206, or mute the thread https://github.com/notifications/unsubscribe-auth/AFLxEs3T_J4ES0FLOcXfFkDxbFkj28dGks5sH6HogaJpZM4OFO7H.