MathGroup Archive 2000

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

Search the Archive

MultiLinear and Linear function

  • To: mathgroup at smc.vnet.net
  • Subject: [mg25540] MultiLinear and Linear function
  • From: "Arturas Acus" <acus at itpa.lt>
  • Date: Sat, 7 Oct 2000 03:35:43 -0400 (EDT)
  • Sender: owner-wri-mathgroup at wolfram.com

Dear group,

Here was a question how to make a function linear. Below is the 
solution 
from (I think Noncommutative Algebra package, but not sure):

SetLinear[a__] := (Function[x, x[0] := 0;
          x[y_ + z_] := x[y] + x[z];
          x[c_ y_] := c x[y] /; NumberQ[c];
          x[y_/c_] := (1/c) x[y] /; NumberQ[c];
          x[c_] := c x[1] /; NumberQ[c] && Not[TrueQ[c == 1]];
          x[-y_] := -x[y];
          LinearQ[x] = True;] /@ {a});
          
It works fine, but is only applied to function of multiple variables.
Bolow is my solution for MultiLinear function. It works, but is not 
so
elegant as example bekow. Probably anybody knows a better approach?

makePattern[x_, y_, {n_Integer, {m_Integer}}] := 
  Module[{z, p1, p2}, p1 = Table[Unique[], {n - 1}]; 
    p2 = Table[Unique[], {z, n + 1, m}]; 
    ReplaceAll[
      Function[y, 
        x[Sequence @@ Flatten[Pattern[#, Blank[]] & /@ p1], y, 
          Sequence @@ Flatten[Pattern[#, Blank[]] & /@ p2]]], 
      Pattern -> myPattern]]
      
SetMultiLinear[
    s__Symbol, {i_Integer, {l_Integer}}] := (Function[x, 
          Module[{pureF, locvar},
              pureF = makePattern[x, locvar, {i, {l}}]; 
              SetDelayed @@ {ReplaceAll[
                    Evaluate[pureF[y_ + z_], myPattern -> Pattern]], 
                  ReplaceAll[Evaluate[pureF[y] + pureF[z]], 
                    myPattern[a_, Blank[]] :> a]};
              
              SetDelayed @@ {ReplaceAll[
                    Evaluate[pureF[c_*y_], myPattern -> Pattern]], 
                  ReplaceAll[Evaluate[c*pureF[y]], 
                      myPattern[a_, Blank[]] :> a] /; NumberQ[c]};
              
              SetDelayed @@ {ReplaceAll[
                    Evaluate[pureF[y_/c_], myPattern -> Pattern]], 
                  ReplaceAll[Evaluate[(1/c)*pureF[y]], 
                      myPattern[a_, Blank[]] :> a] /; NumberQ[c]};
              
              SetDelayed @@ {ReplaceAll[
                    Evaluate[pureF[c_], myPattern -> Pattern]], 
                  ReplaceAll[Evaluate[c*pureF[1]], 
                      myPattern[a_, Blank[]] :> a] /; 
                    NumberQ[c] && Not[TrueQ[c === 1]]};
              LinearQ[x, {i, {l}}] = True;
              ];
          ] /@ {s}) /; Greater[l, 1]
          
          
SetMultiLinear[s__Symbol, {All, {l_Integer}}] := 
  Map[SetMultiLinear[s, {#, {l}}] &, Range[l]]          
          
          
Example of usage: Make   Commutator and AntiCommutator linear 
functions of both variables:
SetMultiLinear[Commutator,AntiCommutator,{All,{2}}].

Make f be linear in 3-th its argument of total 5:
SetMultiLinear[f,{3,{5}}].

      
Better solution welcome


                                     
Dr. Arturas Acus
Institute of Theoretical
Physics and Astronomy
Gostauto 12, 2600,Vilnius
Lithuania 


E-mail: acus at itpa.lt
   Fax: 370-2-225361
   Tel: 370-2-612906


  • Prev by Date: Re: Re:Mapping down two lists
  • Next by Date: Re: ? D[f,{x,n}]
  • Previous by thread: Re: advanced keystroke remapping
  • Next by thread: Re: MultiLinear and Linear function