MathAction SandBoxTensorProductPolynomial



SandBoxTensorProductPolynomial
last edited 12 years ago by test1

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

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

We can use the domain constructor Sum SandBoxSum

fricas
(1) -> )lib SUM
>> System error: The value 17359 is not of type LIST

First we can define some recursive operations on the polynomials

fricas
scanPoly(p,n) == _
 (p=0 => 0; mapMonomial(leadingMonomial(p),n)+scanPoly(reductum p,n))
Type: Void
fricas
mapMonomial(p,n) == _
 monomial(coefficient(p,degree p),scanIndex(degree(p),n))$SMP(Integer,Sum(Symbol,Symbol))
Type: Void
fricas
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:

fricas
-- functions are first compiled here
--
scanPoly(x,1)
There are 1 exposed and 3 unexposed library operations named leadingMonomial having 1 argument(s) but none was determined to be applicable. Use HyperDoc Browse, or issue )display op leadingMonomial to learn more about the available operations. Perhaps package-calling the operation or using coercions on the arguments will allow you to apply the operation. Cannot find a definition or applicable library operation named leadingMonomial with argument type(s) Variable(x)
Perhaps you should use "@" to indicate the required return type, or "$" to specify which version of the function you need. FriCAS will attempt to step through and interpret the code. There are 1 exposed and 3 unexposed library operations named leadingMonomial having 1 argument(s) but none was determined to be applicable. Use HyperDoc Browse, or issue )display op leadingMonomial to learn more about the available operations. Perhaps package-calling the operation or using coercions on the arguments will allow you to apply the operation.
Cannot find a definition or applicable library operation named leadingMonomial with argument type(s) Variable(x)
Perhaps you should use "@" to indicate the required return type, or "$" to specify which version of the function you need.

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

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

For example:

fricas
p:=2*x^2+3
Type: Polynomial(Integer)
fricas
q:=5*x*y+7*y+11
Type: Polynomial(Integer)
fricas
r:=tensorPoly(p,q)
There are no library operations named Sum Use HyperDoc Browse or issue )what op Sum to learn if there is any operation containing " Sum " in its name. Cannot find a definition or applicable library operation named Sum 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. FriCAS will attempt to step through and interpret the code. Cannot compile map: mapMonomial We will attempt to interpret the code. Cannot compile map: scanPoly We will attempt to interpret the code. There are no library operations named Sum Use HyperDoc Browse or issue )what op Sum to learn if there is any operation containing " Sum " in its name.
Cannot find a definition or applicable library operation named Sum 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 (1) (2) and (3) of the tensor product:

fricas
w:= 13*y^2+17*y+19
Type: Polynomial(Integer)
fricas
test( tensorPoly(p+q,w) = (tensorPoly(p,w) + tensorPoly(q,w)) )
There are no library operations named Sum Use HyperDoc Browse or issue )what op Sum to learn if there is any operation containing " Sum " in its name. Cannot find a definition or applicable library operation named Sum 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. FriCAS will attempt to step through and interpret the code. There are no library operations named Sum Use HyperDoc Browse or issue )what op Sum to learn if there is any operation containing " Sum " in its name.
Cannot find a definition or applicable library operation named Sum 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.

I suppose that we could give an inductive proof that this implementation of the tensor product of polynomials is correct ... but for now lets take this demonstration as reassurance.

Re-coding the interpreter functions as library package.

spad
)abbrev package TPROD TensorProduct
IE ==> IndexedExponents(VAR)
IEP ==> IndexedExponents(Sum(VAR,VAR))
SMP ==> SparseMultivariatePolynomial(R,Sum(VAR,VAR))
TensorProduct(R:Ring, VAR: OrderedSet, P:PolynomialCategory(R,IE,VAR)): with _\_/: (P,P) -> SMP == add scanIndex(x:IE,n:Integer):IEP == zero? x => 0 monomial(leadingCoefficient(x), _ if n=1 then in1(leadingSupport(x))$Sum(VAR,VAR) _ else in2(leadingSupport(x))$Sum(VAR,VAR) _ ) + scanIndex(reductum(x),n) mapMonomial(p:P,n:Integer):SMP == monomial(coefficient(p,degree p),scanIndex(degree(p),n))$SMP scanPoly(p:P,n:Integer):SMP == p=0 => 0 mapMonomial(leadingMonomial(p),n)+scanPoly(reductum p,n)
_\_/(p:P, q:P) : SMP == scanPoly(p,1)*scanPoly(q,2)
spad
 Compiling FriCAS source code from file 
 /var/lib/zope2.10/instance/axiom-wiki/var/LatexWiki/6318234874982058351-25px007.spad
 using old system compiler.
 TPROD abbreviates package TensorProduct 
------------------------------------------------------------------------
 initializing NRLIB TPROD for TensorProduct 
 compiling into NRLIB TPROD 
 compiling local scanIndex : (IndexedExponents VAR,Integer) -> IndexedExponents Sum(VAR,VAR)
 Internal Error
 Error while instantiating type SumVARVAR

fricas
test( p\/q = r )
There are 2 exposed and 1 unexposed library operations named \/ having 2 argument(s) but none was determined to be applicable. Use HyperDoc Browse, or issue )display op \/ to learn more about the available operations. Perhaps package-calling the operation or using coercions on the arguments will allow you to apply the operation.
Cannot find a definition or applicable library operation named \/ with argument type(s) Polynomial(Integer) Polynomial(Integer)
Perhaps you should use "@" to indicate the required return type, or "$" to specify which version of the function you need.

Here's another way to write this - maybe better this way as first step to express associativity of the tensor product.

spad
)abbrev package TPROD2 TensorProduct2
IE1 ==> IndexedExponents(VAR1)
IE2 ==> IndexedExponents(VAR2)
S ==> Sum(VAR1,VAR2)
IEP ==> IndexedExponents(S)
SMP ==> SparseMultivariatePolynomial(R,S)
TensorProduct2(R:Ring, VAR1: OrderedSet, VAR2: OrderedSet, P:PolynomialCategory(R,IE1,VAR1), Q:PolynomialCategory(R,IE2,VAR2)): with _\_/: (P,Q) -> SMP == add scanIndex1(x:IE1):IEP == zero? x => 0 monomial(leadingCoefficient(x), in1(leadingSupport(x))$S) + scanIndex1(reductum(x)) scanIndex2(x:IE2):IEP == zero? x => 0 monomial(leadingCoefficient(x), in2(leadingSupport(x))$S) + scanIndex2(reductum(x)) mapMonomial1(p:P):SMP == monomial(coefficient(p,degree p),scanIndex1(degree(p)))$SMP mapMonomial2(q:Q):SMP == monomial(coefficient(q,degree q),scanIndex2(degree(q)))$SMP scanPoly1(p:P):SMP == p=0 => 0 mapMonomial1(leadingMonomial(p))+scanPoly1(reductum p) scanPoly2(q:Q):SMP == q=0 => 0 mapMonomial2(leadingMonomial(q))+scanPoly2(reductum q)
_\_/(p:P, q:Q) : SMP == scanPoly1(p)*scanPoly2(q)
spad
 Compiling FriCAS source code from file 
 /var/lib/zope2.10/instance/axiom-wiki/var/LatexWiki/4565958775469301848-25px009.spad
 using old system compiler.
 TPROD2 abbreviates package TensorProduct2 
------------------------------------------------------------------------
 initializing NRLIB TPROD2 for TensorProduct2 
 compiling into NRLIB TPROD2 
 compiling local scanIndex1 : IndexedExponents VAR1 -> IndexedExponents Sum(VAR1,VAR2)
 Internal Error
 Error while instantiating type SumVAR1VAR2

fricas
test( p\/q = r )
There are 2 exposed and 1 unexposed library operations named \/ having 2 argument(s) but none was determined to be applicable. Use HyperDoc Browse, or issue )display op \/ to learn more about the available operations. Perhaps package-calling the operation or using coercions on the arguments will allow you to apply the operation.
Cannot find a definition or applicable library operation named \/ with argument type(s) Polynomial(Integer) Polynomial(Integer)
Perhaps you should use "@" to indicate the required return type, or "$" to specify which version of the function you need.

Associativity of the tensor product means these two expressions should be identical:

fricas
(p\/q)\/w
There are 2 exposed and 1 unexposed library operations named \/ having 2 argument(s) but none was determined to be applicable. Use HyperDoc Browse, or issue )display op \/ to learn more about the available operations. Perhaps package-calling the operation or using coercions on the arguments will allow you to apply the operation.
Cannot find a definition or applicable library operation named \/ with argument type(s) Polynomial(Integer) Polynomial(Integer)
Perhaps you should use "@" to indicate the required return type, or "$" to specify which version of the function you need.




Subject: Be Bold !!
( 15 subscribers )
Please rate this page:

AltStyle によって変換されたページ (->オリジナル) /