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

Edit detail for SandBoxTensorProductPolynomial revision 2 of 12

1 2 3 4 5 6 7 8 9 10 11 12
Editor: Bill Page
Time: 2008/08/24 07:08:22 GMT-7
Note: compile functions

added:
-- functions are first compiled here
--

http://en.wikipedia.org/wiki/Tensor_product

A tensor product is "the most general bilinear operation" available in a specified domain of computation, satisfying:

LatexWiki Image 
LatexWiki Image 
LatexWiki Image 

We can use the domain constructor Sum [SandBoxSum]?

axiom
)lib SUM
Sum is now explicitly exposed in frame initial Sum will be automatically loaded when needed from /var/zope2/var/LatexWiki/SUM.NRLIB/code.o

First we can define some recursive operations on the polynomials

axiom
scanPoly(p,n) == _
  (p=0 => 0; mapMonomial(leadingMonomial(p),n)+scanPoly(reductum p,n))
Type: Void
axiom
mapMonomial(p,n) == _
  monomial(coefficient(p,degree p),scanIndex(degree(p),n))$SMP(Integer,Sum(Symbol,Symbol))
Type: Void
axiom
scanIndex(p,n) == _
  (zero? p => 0$IndexedExponents(Sum(Symbol,Symbol)); _
    monomial(leadingCoefficient(p), _
      if n=1 then in1(leadingSupport(p))$Sum(Symbol,Symbol) _
             else in2(leadingSupport(p))$Sum(Symbol,Symbol) _
    )$IndexedExponents(Sum(Symbol,Symbol))+ _
      scanIndex(reductum(p),n))
Type: Void

For example:

axiom
-- functions are first compiled here
--
scanPoly(x,1)
axiom
Compiling function scanIndex with type (IndexedExponents Symbol,
      Integer) -> IndexedExponents Sum(Symbol,Symbol) 
; (DEFUN |*2;scanIndex;1;initial| ...) is being compiled.
;; The variable |*2;scanIndex;1;initial;MV| is undefined.
;; The compiler will assume this variable is a global.
axiom
Compiling function mapMonomial with type (Polynomial Integer,Integer
      ) -> SparseMultivariatePolynomial(Integer,Sum(Symbol,Symbol)) 
; (DEFUN |*2;mapMonomial;1;initial| ...) is being compiled.
;; The variable |*2;mapMonomial;1;initial;MV| is undefined.
;; The compiler will assume this variable is a global.
axiom
Compiling function scanPoly with type (Polynomial Integer,Integer)
       -> SparseMultivariatePolynomial(Integer,Sum(Symbol,Symbol)) 
; (DEFUN |*2;scanPoly;3;initial| ...) is being compiled.
;; The variable |*2;scanPoly;3;initial;MV| is undefined.
;; The compiler will assume this variable is a global.
axiom
Compiling function scanPoly with type (Polynomial Integer,Integer)
       -> SparseMultivariatePolynomial(Integer,Sum(Symbol,Symbol)) 
;;; *** |*2;scanPoly;3;initial| REDEFINED ; (DEFUN |*2;scanPoly;3;initial| ...) is being compiled. ;; The variable |*2;scanPoly;3;initial;MV| is undefined. ;; The compiler will assume this variable is a global.
axiom
Compiling function scanPoly with type (Variable x,Integer) -> 
      SparseMultivariatePolynomial(Integer,Sum(Symbol,Symbol)) 
; (DEFUN |*2;scanPoly;1;initial| ...) is being compiled.
;; The variable |*2;scanPoly;1;initial;MV| is undefined.
;; The compiler will assume this variable is a global.
LatexWiki Image(1)
Type: SparseMultivariatePolynomial?(Integer,Sum(Symbol,Symbol))

injects the polynomial x in to the tensor product. So now the full tensor product is just:

axiom
tensorPoly(p,q) == _
  scanPoly(p,1)*scanPoly(q,2)
Type: Void

For example:

axiom
p:=2*x^2+3
LatexWiki Image(2)
Type: Polynomial Integer
axiom
q:=5*x*y+7*y+11
LatexWiki Image(3)
Type: Polynomial Integer
axiom
r:=tensorPoly(p,q)
axiom
Compiling function tensorPoly with type (Polynomial Integer,
      Polynomial Integer) -> SparseMultivariatePolynomial(Integer,Sum(
      Symbol,Symbol)) 
; (DEFUN |*2;tensorPoly;1;initial| ...) is being compiled.
;; The variable |*2;tensorPoly;1;initial;MV| is undefined.
;; The compiler will assume this variable is a global.
LatexWiki Image(4)
Type: SparseMultivariatePolynomial?(Integer,Sum(Symbol,Symbol))