login  home  contents  what's new  discussion  bug reports     help  links  subscribe  changes  refresh  edit

Edit detail for SandBoxTensorProduct revision 5 of 9

1 2 3 4 5 6 7 8 9
Editor: Bill Page
Time: 2009/05/13 08:05:16 GMT-7
Note: corrections

changed:
-**On Date: Thu, 14 May 2009 21:46:06 +0200 Franz Lehner wrote:**
**Date: Fri, 15 May 2009 21:03:00 +0200 Franz Lehner wrote:**

removed:
-There seems to be some confusion with free modules.

changed:
-FreeModule1 is of category FreeModuleCat,
-its Rep however is FreeModule.
FreeModuleCat does not require OrderedSet, but FreeModule does.
FreeModule1 is of category FreeModuleCat, its Rep however is FreeModule.

removed:
-

removed:
-

changed:
-TensorProduct(R:CommutativeRing, B1:SetCategory, B2:SetCategory,M1:FreeModuleCat(R,B1),M2:FreeModuleCat(R,B2)): TPcat == TPimp where 
-    TPcat == Join(TensorProductCategory(R,M1,M2),FreeModuleCat(R,Product(B1,B2))) 
TensorProduct(R : CommutativeRing, B1 : OrderedSet, B2 : OrderedSet, _
    M1 : FreeModuleCat(R, B1), M2 : FreeModuleCat(R, B2)): TPcat == TPimp where
    TPcat == Join(TensorProductCategory(R,M1,M2),FreeModuleCat(R,Product(B1,B2))) with
             if M1 has Algebra(R) and M2 has Algebra(R) then Algebra(R)

changed:
-    TPimp == FreeModule1(R,Product(M1,M2)) add 
-       -- Representation
-       -- Rep == FreeModule1(R,Product(M1,M2))
-       Rep == List TERM
    TPimp == FreeModule1(R, Product(B1, B2)) add

changed:
-
-       -- One should expect the following 3 functions to be inherited from FreeModule1
-       -- but there are problems if these are omitted.
-       outTerm(r:R, s:B1xB2):OutputForm ==
-            r=1  => s::OutputForm
-            r::OutputForm * s::OutputForm
-       coerce(a:%):OutputForm ==
-            empty? (a pretend Rep) => (0$R)::OutputForm
-            reduce(_+, reverse_! [outTerm(t.c, t.k) for t in (a pretend Rep)])$List(OutputForm)
-       leadingMonomial(x:%):B1xB2 == (x pretend Rep).first.k
-
-       product(x1:M1,x2:M2):% == 
-            zero? x1 or zero? x2 => return 0
-            x1l:List TERM1 := ListOfTerms x1
-            x2l:List TERM2 := ListOfTerms x2
-            res:List Rep := [[[makeprod(s1.k,s2.k),s1.c*s2.c ] for s2 in x2l] for s1 in x1l]
-            (reduce(concat,res)) pretend %
       product(x1:M1,x2:M2):% ==
           zero? x1 or zero? x2 => return 0
           ltx1:List TERM1 := ListOfTerms x1
           ltx2:List TERM2 := ListOfTerms x2
           res : List TERM := []
           for s1 in ltx1 repeat
               for s2 in ltx2 repeat
                   res := concat!(res,[makeprod(s1.k, s2.k), s1.c*s2.c]$TERM)
           res pretend %
       if M1 has Algebra(R) and M2 has Algebra(R) then 
         (x1:% * x2:%):% ==
              res : % := 0
              for t1 in ListOfTerms x1 repeat
                 for t2 in ListOfTerms x2 repeat 
                    -- the coefficients
                    t1c:R := t1.c
                    t2c:R := t2.c
                    -- the basis elements
                    t1k:B1xB2 := t1.k
                    t2k:B1xB2 := t2.k
                    t1a: M1 := monom(selectfirst t1k,1)
                    t1b: M2 := monom(selectsecond t1k,1)
                    t2a: M1 := monom(selectfirst t2k,1)
                    t2b: M2 := monom(selectsecond t2k,1)
                    res:= res +  t1.c*t2.c *product(t1a*t2a,t1b*t2b)
              res

removed:
-\end{axiom}
-The code seems to work partially, at least elements are created,
-but most of the other functions are not accessible. Eq:
-
-\begin{axiom}
-leadingMonomial t
-\end{axiom}
-
-\begin{axiom}
-numberOfMonomials t
-\end{axiom}
-
-The last output shows that t was really created and the above errors
-are due to malfunction of the inheritance mechanism.
-
-**Questions:**
-
-
-1. The missing functions are probably due to the mixup of categories.
-   Why does the compiler not complain?
-   
-2. Is there a way to extract the basis automatically from FreeModule?
-   Typing TensorProduct(R,B1,B2,M,N) every time is tedious.
-   That would need functions returning domains I guess.
-
-3. Is it difficult to implement a rep/per mechanism? 
-   The current magic is rather mysterious,
-   moreover the error messages of the compiler are somewhat cryptic.
-   I had a hard time interpreting the message::
-
-     >> Apparent user error:
-         NoValueMode
-	     is an unknown mode
-
-   before I split::
-
-     reduce(concat,[[[makeprod(s1.k,s2.k),s1.c*s2.c ]@TERM for s2 in x2l] for s1 in x1l]) pretend %
-   
-   into two lines::
-   
-     res:List Rep := [[[makeprod(s1.k,s2.k),s1.c*s2.c ]@TERM for s2 in x2l] for s1 in x1l]
-     (reduce(concat,res)) pretend %
-
-4. After TensorProduct ... == FreeModule1(R,Product(M1,M2)) add ...,
-   is it better to use::
-
-     Rep == FreeModule1(R,Product(M1,M2)) 
-
-   or rather::
-
-     Rep == List TERM 
-
-   as I did?
-
-**On Date: Fri, 15 May 2009 03:23:33 +0200 (CEST) Waldek Hebisch wrote:**
-
-The following seem to work OK:
-
-\begin{axiom}
-)clear completely
-\end{axiom}
-
-\begin{spad}
-)abbrev package TENSORD TensorProduct
-TensorProduct(R : CommutativeRing, B1 : OrderedSet, B2 : OrderedSet, _
-    M1 : FreeModuleCat(R, B1), M2 : FreeModuleCat(R, B2)): TPcat == TPimp where 
-    TPcat == Join(TensorProductCategory(R,M1,M2),FreeModuleCat(R,Product(B1,B2))) 
-    TERM1 == Record(k: B1, c: R)
-    TERM2 == Record(k: B2, c: R)
-    B1xB2 == Product(B1,B2)
-    TERM  == Record(k: B1xB2, c: R)
-    TPimp == FreeModule1(R, Product(B1, B2)) add 
-       import Rep, TERM1, TERM2, TERM, B1xB2
-
-       product(x1:M1,x2:M2):% ==
-           zero? x1 or zero? x2 => return 0
-	   x1l:List TERM1 := ListOfTerms x1
-	   x2l:List TERM2 := ListOfTerms x2
-	   res : % := 0
-	   for s1 in x1l repeat
-               for s2 in x2l repeat
-                   res := res + monom(makeprod(s1.k, s2.k), s1.c*s2.c)
-           res
-\end{spad}
-
-Note that both B1 and B2 is required to be OrderedSet, and I use
-just FreeModule1(R, Product(B1, B2))
-
-Note that the version I wrote does not use pretend.  My version
-may be quite slow -- if this is a problem than one can build a
-list using cons and add pretend.  However, list must be created
-in correct order, otherwise functions from FreeMonoid would
-work incorrectly.
-
-\begin{axiom}
-M:=FreeModule1(Integer,Symbol)
-N:=FreeModule1(Integer,Symbol)
-a1:='a1::M
-a2:='a2::M
-b1:='b1::N
-b2:='b2::N
-MxN:=TensorProduct(Integer,Symbol,Symbol,M,N);
-t:=product(2*a1+3*a2,5*b1+7*b2)$MxN;
-t

Date: Fri, 15 May 2009 21:03:00 +0200 Franz Lehner wrote:

Attached is a prototype for tensor products. It is free modules over commutative rings.

FreeModule? is defined in poly.spad with a local category. FreeModuleCat? is defined in xpoly.spad. FreeModuleCat? does not require OrderedSet?, but FreeModule? does. FreeModule1? is of category FreeModuleCat?, its Rep however is FreeModule?.

fricas
(1) -> <spad>
fricas
)abbrev category TENSORC TensorProductCategory
TensorProductCategory(R:CommutativeRing, M : Module(R), N : Module(R)):Category == Module(R) with
    product: (M, N) -> %
fricas
)abbrev category TENSORP TensorProductProperty
TensorProductProperty(R:CommutativeRing, M : Module(R), N : Module(R), _
      MxN : TensorProductCategory(R, M, N), S : Module(R)): Category == with
    eval: (MxN, (M, N) -> S) -> S
fricas
)abbrev package TENSORD TensorProduct
TensorProduct(R : CommutativeRing, B1 : OrderedSet, B2 : OrderedSet, _
    M1 : FreeModuleCat(R, B1), M2 : FreeModuleCat(R, B2)): TPcat == TPimp where
    TPcat == Join(TensorProductCategory(R,M1,M2),FreeModuleCat(R,Product(B1,B2))) with
             if M1 has Algebra(R) and M2 has Algebra(R) then Algebra(R)
    TERM1 == Record(k: B1, c: R)
    TERM2 == Record(k: B2, c: R)
    B1xB2 == Product(B1,B2)
    TERM  == Record(k: B1xB2, c: R)
    TPimp == FreeModule1(R, Product(B1, B2)) add
       import Rep, TERM1, TERM2, TERM, B1xB2
       product(x1:M1,x2:M2):% ==
           zero? x1 or zero? x2 => return 0
           ltx1:List TERM1 := ListOfTerms x1
           ltx2:List TERM2 := ListOfTerms x2
           res : List TERM := []
           for s1 in ltx1 repeat
               for s2 in ltx2 repeat
                   res := concat!(res,[makeprod(s1.k, s2.k), s1.c*s2.c]$TERM)
           res pretend %
       if M1 has Algebra(R) and M2 has Algebra(R) then 
         (x1:% * x2:%):% ==
              res : % := 0
              for t1 in ListOfTerms x1 repeat
                 for t2 in ListOfTerms x2 repeat 
                    -- the coefficients
                    t1c:R := t1.c
                    t2c:R := t2.c
                    -- the basis elements
                    t1k:B1xB2 := t1.k
                    t2k:B1xB2 := t2.k
                    t1a: M1 := monom(selectfirst t1k,1)
                    t1b: M2 := monom(selectsecond t1k,1)
                    t2a: M1 := monom(selectfirst t2k,1)
                    t2b: M2 := monom(selectsecond t2k,1)
                    res:= res +  t1.c*t2.c *product(t1a*t2a,t1b*t2b)
              res</spad>
fricas
Compiling FriCAS source code from file 
      /var/lib/zope2.10/instance/axiom-wiki/var/LatexWiki/7772204117579672776-25px001.spad
      using system compiler.
   TENSORC abbreviates category TensorProductCategory 
------------------------------------------------------------------------
   initializing NRLIB TENSORC for TensorProductCategory 
   compiling into NRLIB TENSORC 
;;; *** |TensorProductCategory| REDEFINED Time: 0 SEC.
finalizing NRLIB TENSORC Processing TensorProductCategory for Browser database: --->/usr/local/lib/fricas/target/x86_64-linux-gnu/../../src/algebra/TENSCAT.spad-->TensorProductCategory(constructor): Not documented!!!! --->/usr/local/lib/fricas/target/x86_64-linux-gnu/../../src/algebra/TENSCAT.spad-->TensorProductCategory((product (% M N))): Not documented!!!! --->/usr/local/lib/fricas/target/x86_64-linux-gnu/../../src/algebra/TENSCAT.spad-->TensorProductCategory: Missing Description ; compiling file "/var/aw/var/LatexWiki/TENSORC.NRLIB/TENSORC.lsp" (written 24 OCT 2026 06:46:22 PM):
; wrote /var/aw/var/LatexWiki/TENSORC.NRLIB/TENSORC.fasl ; compilation finished in 0:00:00.004 ------------------------------------------------------------------------ TensorProductCategory is now explicitly exposed in frame initial TensorProductCategory will be automatically loaded when needed from /var/aw/var/LatexWiki/TENSORC.NRLIB/TENSORC
TENSORP abbreviates category TensorProductProperty ------------------------------------------------------------------------ initializing NRLIB TENSORP for TensorProductProperty compiling into NRLIB TENSORP
;;; *** |TensorProductProperty| REDEFINED Time: 0 SEC.
finalizing NRLIB TENSORP Processing TensorProductProperty for Browser database: --->/usr/local/lib/fricas/target/x86_64-linux-gnu/../../src/algebra/TENSPRP.spad-->TensorProductProperty(constructor): Not documented!!!! --->/usr/local/lib/fricas/target/x86_64-linux-gnu/../../src/algebra/TENSPRP.spad-->TensorProductProperty((eval (S MxN (Mapping S M N)))): Not documented!!!! --->/usr/local/lib/fricas/target/x86_64-linux-gnu/../../src/algebra/TENSPRP.spad-->TensorProductProperty: Missing Description ; compiling file "/var/aw/var/LatexWiki/TENSORP.NRLIB/TENSORP.lsp" (written 24 OCT 2026 06:46:22 PM):
; wrote /var/aw/var/LatexWiki/TENSORP.NRLIB/TENSORP.fasl ; compilation finished in 0:00:00.000 ------------------------------------------------------------------------ TensorProductProperty is now explicitly exposed in frame initial TensorProductProperty will be automatically loaded when needed from /var/aw/var/LatexWiki/TENSORP.NRLIB/TENSORP
TENSORD abbreviates package TensorProduct ------------------------------------------------------------------------ initializing NRLIB TENSORD for TensorProduct compiling into NRLIB TENSORD Semantic Errors: [1] FreeModuleCat is not a known type
Warnings: [1] FreeModuleCat has no value
****** comp fails at level 1 with expression: ****** ((|FreeModuleCat| R (|Product| B1 B2))) ****** level 1 ****** x:= (FreeModuleCat R (Product B1 B2)) m:= $EmptyMode f:= ((((M2 # #) (M1 # #) (B2 # #) (B1 # #) ...)))
>> Apparent user error: cannot compile (FreeModuleCat R (Product B1 B2))

fricas
M:=FreeModule1(Integer,Symbol)
There are no library operations named FreeModule1 Use HyperDoc Browse or issue )what op FreeModule1 to learn if there is any operation containing " FreeModule1 " in its name.
Cannot find a definition or applicable library operation named FreeModule1 with argument type(s) Type Type
Perhaps you should use "@" to indicate the required return type, or "$" to specify which version of the function you need.

Demonstrating the axioms of the tensor product:

fricas
x:M
M is not a valid type.