{VERSION 6 0 "IBM INTEL NT" "6.0" } {USTYLETAB {CSTYLE "Maple Input" -1 0 "Courier" 0 1 255 0 0 1 0 1 0 0 1 0 0 0 0 1 }{CSTYLE "2D Math" -1 2 "Times" 0 1 0 0 0 0 0 0 2 0 0 0 0 0 0 1 }{CSTYLE "2D Output" 2 20 "" 0 1 0 0 255 1 0 0 0 0 0 0 0 0 0 1 } {CSTYLE "_cstyle66" -1 256 "Courier" 1 12 255 0 0 1 0 1 0 2 1 2 0 0 0 1 }{CSTYLE "" -1 257 "" 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 258 "" 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 }{PSTYLE "Normal" -1 0 1 {CSTYLE "" -1 -1 "Times" 1 12 0 0 0 1 2 2 2 2 2 2 1 1 1 1 }1 1 0 0 0 0 1 0 1 0 2 2 0 1 }{PSTYLE "Text Output" -1 6 1 {CSTYLE "" -1 -1 "Cour ier" 1 10 0 0 255 1 2 2 2 2 2 1 2 1 3 1 }1 1 0 0 0 0 1 0 1 0 2 2 0 1 } {PSTYLE "Maple Output" -1 11 1 {CSTYLE "" -1 -1 "Times" 1 12 0 0 0 1 2 2 2 2 2 2 1 1 1 1 }3 3 0 0 0 0 1 0 1 0 2 2 0 1 }{PSTYLE "Normal" -1 256 1 {CSTYLE "" -1 -1 "Times" 1 12 0 0 0 1 2 2 2 2 2 2 1 1 1 1 }3 1 0 0 0 0 1 0 1 0 2 2 0 1 }{PSTYLE "_pstyle134" -1 257 1 {CSTYLE "" -1 -1 "Times" 1 12 0 0 0 1 2 2 2 2 2 2 1 1 1 1 }1 1 0 0 0 0 2 0 2 0 2 2 0 1 }} {SECT 0 {EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 3153 "# Date: July 20, 2 007\nrestart:\n#\n# This is the source code file of the \"GfG - Groebn er for Grassmann\" package\n# File: Groebner.for.Grassmann_M10.23vii07 .mws\n#\n# Copyright (c) Rafal Ablamowicz & Bertfried Fauser\n# \+ 2006-2007, all rights reserved.\n#\n########################## #####################################################\n# \+ #\n# D ISCLAIMER: \+ #\n# \+ #\n# THERE IS NO WARRANTY FOR THE GROEBNER FOR GRASSMA NN PACKAGE TO THE EXTENT #\n# PERMITTED BY APPLICABLE LAW. EXCEPT WH EN OTHERWISE STATED IN WRITING THE #\n# COPYRIGHT HOLDERS AND/OR OT HER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT #\n# WARRANTY OF AN Y KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT #\n# LIM ITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR \+ #\n# A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PE RFORMANCE #\n# OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROV E DEFECTIVE, YOU #\n# ASSUME THE COST OF ALL NECESSARY SERVICI NG, REPAIR OR CORRECTION. #\n# \+ #\n##################### ##########################################################\n#\n# If y ou want to use this code or parts of it under a GPL LICENCE, please\n# contact the authors:\n# rablamowicz tntech.edu \+ or \n# fauser spock.physik.uni-konstanz.de\n#\n#\n# +++ The pac kage extends the Clifford and Bigebra packages.\n# +++ It computes Gro ebner bases for Grassmann algebras.\n#\n# +++ Main functions are:\n# - -- Orders:\n# -- Lex : Lexicographical ordering e1>e2, e1 we3>e1we3we4 ...\n# -- InvLex : Inverse Lexicographical orde ring\n# -- RevLex : Reverse Lexicographical ordering\n# \+ -- InvRevLex : Inverse Reverse Lexicographical ordering\n# -- D eg[] : Degree ordering, needs an argument to become a total ord er (admissible), \n# for example Deg[Lex] and Deg[InvLex] are admissible orders.\n# -- InvDeg[...] : Inverse D egree ordering \n#\n# --- GGbasis : computes a Groe bner basis\n# --- minGGbasis : transforms a Groebner basis into \+ a minimal Groebner basis \n#\n#\n# --- GDivide : GDivide imp lements the Grassmann division algorithm\n# --- CommonFactor : Com monFactor extracts (including a sign) a common factor in \n# \+ a pair of Grassmann monomials A=A' &w C, B= C &w B' -> C \n# --- GLCM : GLCM (Grassmann Least Common Multiple) take s as input a pair of \n# Grassmann monomials [A,B] and returns a (signed) list [A',C,B'] so that \n# \+ &w(A',C,B') <>0 and A=A' &w C and B=C &w B' \n# --- GSpol y : GSpoly computes the Grassmann Spolynom of two Grassmann \+ polynomials\n# --- GReduce : GReduce reduces a Grassmann poly nomial w.r.t a list of Grassmann polynomials\n#\n# +++ TYPES:\n# --- n o new types for this package... \n#\n#\n" }}{PARA 0 "> " 0 " " {MPLTEXT 1 0 471 "GfG:=module()\n################################### \n##\n## -- list of exports\n##\nexport version,\n tilde,makeal pha,leftmost,rightmost,\n Lex,InvLex,RevLex,InvRevLex,Deg,InvDeg ,\n isadmissible, \n LMon,LTerm,LCoeff,multideg,\n G Divide,CommonFactor,GLCM,GSpoly,GReduce,\n GGbasis,minGGbasis\n \+ ;\n###################################\n##\n## -- list of local routines\n## \nlocal init,exit;\noption package, \n load=init, \n unload=exit;\n" }}{PARA 0 "" 0 "" {TEXT -1 11 "0. Version\n" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 1166 "version:= proc()\noptions `Copy right (c) 2006-2007 by Rafal Ablamowicz and Bertfried Fauser. All righ ts reserved.`;\ndescription `Last revised: July 23, 2007`;\nprint(`+++ ++++++++++++++++++++++++++++++++++++++++`);\nprint(`GfG - Groebner for Grassmann - A Maple 10 Package for Groebner Bases for Grassmann Algeb ras`); \nprint(`Last revised: July 23, 2007 (Source file: Groebner.for .Grassmann_M10.23vii07.mws)`);\nprint(`Copyright 2006-2007 by Rafal Ab lamowicz (*) and Bertfried Fauser ($)`);\nprint(``);\nprint(`(*) Depar tment of Mathematics, Box 5054`);\nprint(` Tennessee Technological \+ University, Cookeville, TN 38505`);\nprint(` tel: USA (931) 372-366 2, fax: USA (931) 372-6353`);\nprint(` rablamowicz@tntech.edu`);\np rint(` http://math.tntech.edu/rafal/Cliff10/`);\nprint(``);\nprint( `($) Universit\"at Konstanz, Fachbereich Physik, Fach M678`);\nprint(` 78457 Konstanz, Germany`);\nprint(` Bertfried.Fauser@uni-konsta nz.de`);\nprint(` http://clifford.physik.uni-konstanz.de/~fauser/`) ; \nprint(` http://math.tntech.edu/rafal/Cliff10/`);\nprint(``);\n print(`++++++++++++This is GfG - Groebner for Grassmann for Maple 10 v ersion 0.2++++++++++++`);\nend proc:\n" }}{PARA 0 "" 0 "" {TEXT -1 318 "1. Procedure 'tilde' takes a Grassmann polynomial X, that is, an \+ expression of `type/clipolynom`, or, `type/climon`, or `type/clibasmon ` and returns a new polynomial tilde(X) with the same monomial terms e xcept that the coefficients got inverted. For example, if X = 2*e1 +32 *e1we2, then tilde(X) = 1/2*e1+1/32*e1we2.\n" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 355 "tilde:=proc(f::\{clipolynom,climon,clibasmon\}) loca l p;\noptions `Copyright (c) 2006-2007 by Rafal Ablamowicz and Bertfri ed Fauser. All rights reserved.`;\nif type(f,clibasmon) then return f \+ elif\n type(f,climon) then \n p:=op(Clifford:-cliterms(f)):\n \+ return coeff(f,p)^(-1)*p;\nelse\n return `+`(op(map('procnam e',[op(f)])))\nend if;\nend proc:\n" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 1 "\n" }}{PARA 0 "" 0 "" {TEXT -1 251 "2. Procedure 'makealpha' assign s to a 'climon' or 'clibasmon' a vector of length 9 with entries 0 and 1. If a location i, 1<= i <= 9, has 1, then e_i is present in the 'cl ibasmon' or 'climon'. If that location has 0, then the generator e_i i s absent.\n" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 348 "makealpha:=proc(m:: \{clibasmon,climon\}) local p,v,i;\noptions `Copyright (c) 2006-2007 b y Rafal Ablamowicz and Bertfried Fauser. All rights reserved.`;\nv:=Ve ctor[row](9,0,datatype=integer):\np:=Clifford:-extract(m,'integers'); \nif p=[] then return v \nelse \n for i from 1 to nops(p) do\n \+ v[p[i]]:=1;\n end do;\nreturn v;\nend if;\nend proc:\n" }} {PARA 0 "> " 0 "" {MPLTEXT 1 0 1 "\n" }}{PARA 0 "" 0 "" {TEXT -1 163 " 3. Procedure 'leftmost' finds and returns the first leftmost nonzero e ntry in a vector of length 9, if present, or, it returns 0 if the vect or is the zero vector.\n" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 303 "leftmo st:=proc(v::Vector) local i,flag:\noptions `Copyright (c) 2006-2007 by Rafal Ablamowicz and Bertfried Fauser. All rights reserved.`;\nif eva lb(v=Vector(9,0)) then return 0 end if:\nflag:=false:\nfor i from 1 to 9 while not flag do\n if v[i]<>0 then flag:=true; return v[i] end \+ if;\nend do;\nend proc:\n" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 1 "\n" }} {PARA 0 "" 0 "" {TEXT -1 159 "4. Procedure 'rightmost' finds and retur ns the rightmost nonzero entry in a vector of length 9, if present, or , it returns 0 if the vector is the zero vector.\n" }}{PARA 0 "> " 0 " " {MPLTEXT 1 0 310 "rightmost:=proc(v::Vector) local i,flag:\noptions \+ `Copyright (c) 2006-2007 by Rafal Ablamowicz and Bertfried Fauser. All rights reserved.`;\nif evalb(v=Vector(9,0)) then return 0 end if:\nfl ag:=false:\nfor i from 9 to 1 by -1 while not flag do\n if v[i]<>0 \+ then flag:=true; return v[i] end if;\nend do;\nend proc:\n" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 0 "" }}{PARA 0 "" 0 "" {TEXT -1 198 "\n5. Proce dures shown below provide various monomial orders on monomials in the \+ Grassmann algebra /\\ generated by non-commuting e1,e2,...,e9, where e i &w ej = 0 if i = j and = - ej &w ei if i <>j. \n\n" }{TEXT 257 11 "D efinition:" }{TEXT -1 1 " " }{TEXT 258 219 "We say that an order T on \+ Grassmann monomials is admissible if\n\n1. m > 1 for every monomial m \+ in the Grassmann basis\n2. If m_2 > m_1 then m_l m_2 m_r > m_l m_1 m_r for every m_1, m_2, m_l, and m_r in the Grassmann basis" }{TEXT -1 3159 "\n\nNOTE: Not all of these orders below are admissible, for exam ple, RevLex, InvRevLex, and InvDeg[Lex] orders are NOT admissible beca use they violate the first condition that m > 1 for every m in the Gra ssmann basis. The remaining orders are admissible. Check procedure 'is admissible'\n\nLet a monomial m = e^alpha = (e1^alpha1 &w e2^alpha2) & w (...) &w (e9^alpha9) where alpha = [alpha1, alpha2, ..., alpha9]. Of course, each alphai = 0 or 1 as ei^alphai = &w(ei,ei,...,ei) = 0 if a lphai >=2. We also agree that ei^0 = Id in the Grassmann algebra /\\. \+ We will refer to the list alpha also as a vector. \n\nIn the following let m1 = e^alpha and m2 = e^beta.\n\n'Lex(m1,m2)' returns true if eit her the difference vector alpha - beta is the zero vector or the leftm ost non-zero entry in alpha - beta is positive, in which case we say m 1 >= m2. Otherwise it returns false, in which case we say that m1 < m2 . For example, it gives a lexicographic order on generators e1>e2>...> e9 (NOT ADMISSIBLE in general but admissible in Grassmann algebra).\n \n'InvLex(m1,m2)' returns true if either the difference vector alpha \+ - beta is the zero vector or the rightmost non-zero entry in alpha - b eta is positive, in which case we say m1 >= m2. Otherwise it returns f alse, in which case we say that m1 < m2. For example, it gives the inv erse lexicographic order on generators e9>e8>...>e1 (NOT ADMISSIBLE in general and not admissible in Grassmann algebra) \n\n'RevLex(m1,m2)' \+ returns true if either the difference vector alpha - beta is the zero vector or the rightmost non-zero entry in alpha - beta is negative, i n which case we say m1 >= m2. Otherwise it returns false, in which cas e we say that m1 < m2. For example, it gives the reverse lexicographic order on generators e1>e2>...>e9 (NOT ADMISSIBLE in general and not a dmissible in Grassmann algebra) \n\n'InvRevLex(m1,m2)' returns true i f either the difference vector alpha - beta is the zero vector or the \+ leftmost non-zero entry in alpha - beta is negative, in which case we \+ say m1 >= m2. Otherwise it returns false, in which case we say that m1 < m2. For example, it gives the reverse lexicographic order on genera tors e1>e2>...>e9 (NOT ADMISSIBLE in general but admissible in Grassm ann algebra) \n\n'Deg' procedure takes as index (parameter) any of the above monomial orders T and uses that order to resolve total degree t ies: It first computes a degree (grade) of two monomial terms m1, m2, \+ and it returns true if the total degree |m1| > |m2|. When |m1| < |m2| \+ it returns false, and when the degrees are equal |m1| = |m2|, it uses \+ the order T to determine the order. (NOT ADMISSIBLE in general but ad missible in Grassmann algebra)\n\n'InvDeg' procedure takes as index (p arameter) any of the above monomial orders T and uses that order to re solve total degree ties: It first computes a degree (grade) of two mon omial terms m1, m2, and it returns false if the total degree |m1| > |m 2|. When |m1| < |m2| it returns true, and when the degrees are equal | m1| = |m2|, it uses the order T to determine the order. (NOT ADMISSIBL E in general but admissible in Grassmann algebra for all orders T exc ept InvDeg[Lex] is not admissible)\n" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 1352 "Lex:=proc(m1::\{clibasmon,climon\},m2::\{clibasmon,climon\}) l ocal a1,a2;\noptions `Copyright (c) 2006-2007 by Rafal Ablamowicz and \+ Bertfried Fauser. All rights reserved.`;\na1,a2:=makealpha(m1),makealp ha(m2);\nif LinearAlgebra:-Equal(a1,a2) then return true end if;\nif l eftmost(a1-a2)>0 then return true else return false end if;\nend proc: \n\nInvLex:=proc(m1::\{clibasmon,climon\},m2::\{clibasmon,climon\}) lo cal a1,a2;\noptions `Copyright (c) 2006-2007 by Rafal Ablamowicz and B ertfried Fauser. All rights reserved.`;\na1,a2:=makealpha(m1),makealph a(m2);\nif LinearAlgebra:-Equal(a1,a2) then return true end if;\nif ri ghtmost(a1-a2)>0 then return true else return false end if;\nend proc: \n\nRevLex:=proc(m1::\{clibasmon,climon\},m2::\{clibasmon,climon\}) lo cal a1,a2;\noptions `Copyright (c) 2006-2007 by Rafal Ablamowicz and B ertfried Fauser. All rights reserved.`;\na1,a2:=makealpha(m1),makealph a(m2);\nif LinearAlgebra:-Equal(a1,a2) then return true end if;\nif ri ghtmost(a1-a2)<0 then return true else return false end if;\nend proc: \n\nInvRevLex:=proc(m1::\{clibasmon,climon\},m2::\{clibasmon,climon\}) local a1,a2;\noptions `Copyright (c) 2006-2007 by Rafal Ablamowicz an d Bertfried Fauser. All rights reserved.`;\na1,a2:=makealpha(m1),makea lpha(m2);\nif LinearAlgebra:-Equal(a1,a2) then return true end if;\nif leftmost(a1-a2)<0 then return true else return false end if;\nend pro c:" }{TEXT -1 0 "" }{MPLTEXT 1 0 1 "\n" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 814 "Deg:=proc(m1::\{clibasmon,climon\},m2::\{clibasmon,climon\}) \+ local a1,a2,order;\noptions `Copyright (c) 2006-2007 by Rafal Ablamowi cz and Bertfried Fauser. All rights reserved.`;\n a1,a2:=makealpha(m 1),makealpha(m2);\n order:=op(1,procname);\n if add(a1[i],i=1..9) \+ < add(a2[i],i=1..9) then return false end if;\n if add(a1[i],i=1..9) > add(a2[i],i=1..9) then return true end if;\n order(m1,m2);\nend p roc:\n\nInvDeg:=proc(m1::\{clibasmon,climon\},m2::\{clibasmon,climon\} ) local a1,a2,order;\noptions `Copyright (c) 2006-2007 by Rafal Ablamo wicz and Bertfried Fauser. All rights reserved.`;\n a1,a2:=makealpha (m1),makealpha(m2);\n order:=op(1,procname);\n if add(a1[i],i=1..9 ) < add(a2[i],i=1..9) then return true end if;\n if add(a1[i],i=1..9 ) > add(a2[i],i=1..9) then return false end if;\n order(m1,m2);\nend proc:\n" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 0 "" }}{PARA 0 "" 0 "" {TEXT -1 591 "6. Procedure 'isadmissible' takes as input a list of Gra ssmann monomials (in CLIFFORD, they are of type 'clibasmon', and one o f the monomial orders. It returns true of the order as admissible and \+ false if it is not admissible. Note, that this procedure has a remembe r table to speed up computations but this remember table is forgotten \+ when Maple is closed. A local function in this procedure called 'Fwedg e' is essentially the same as Clifford:-wedge except that it has a rem ember table and remembers products of Grassmann monomials. Its remembe r table is also erased when Maple is closed.\n" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 1553 "isadmissible:=proc(cbas::list(clibasmon),morder) lo cal Fwedge,L,flagM,m1,m2,flag12,flag,ml,mr,mlm1mr,mlm2mr;\noptions `Co pyright (c) 2006-2007 by Rafal Ablamowicz and Bertfried Fauser. All ri ghts reserved.`,\nremember;\n#######################################\n # Checking condition m > Id for every m\n############################# ##########\nL:=sort(cbas,morder);\nflagM:=evalb(L[nops(L)]=Id);\nif fl agM=false then return false end if;\n################################# ####################################################\n# Checking condi tion if m1 < m2 then mlm1mr < mlm2mr for every m1,m2,ml,mr in /\\R^n. \n#################################################################### #################\nfor m1 in cbas while flagM do\nfor m2 in cbas while flagM do\n#############################\nflag12:=morder(m1,m2);\nflag :=true:\n#############################\nFwedge:=proc(x,y,z) local p;\n option remember;\n Clifford:-wedge(x,y,z);\nend proc:\n ############################\nfor ml in cbas while flag do\n fo r mr in cbas while flag do\n mlm1mr:=Fwedge(ml,m1,mr):\n \+ if mlm1mr<>0 then\n mlm2mr:=Fwedge(ml,m2,mr):\n if mlm2mr<>0 then\n mlm1mr:=op(Cliffor d:-cliterms(mlm1mr)):\n mlm2mr:=op(Clifford:-cliterms (mlm2mr)):\n flag:=evalb(morder(mlm1mr,mlm2mr)=flag12 ):\n end if;\n end if;\nend do; end do;\nflag M:=flag;\n#############################\nend do; end do;\nif flagM the n \n return flagM else return flagM #,[ml,m1,m2,mr] \nend if;\nend p roc:\n" }}{PARA 0 "" 0 "" {TEXT -1 192 "7. Procedure 'LMon' gives the \+ leading monomial in a Grassmann polynomial with respect to the order e ntered as a second argument. One possible order is 'Lex' (lexicographi c lex e1>e2>...>en). \n" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 421 "LMon:=p roc(f::\{clibasmon,climon,clipolynom\},morder) local L,ff;\noptions `C opyright (c) 2006-2007 by Rafal Ablamowicz and Bertfried Fauser. All r ights reserved.`;\nif type(f,clibasmon) then return f \n elif type(f ,climon) then return op(Clifford:-cliterms(f)) \n elif type(f,clipol ynom) then\n ff:=Clifford:-clicollect(f):\n L:=sort([op( Clifford:-cliterms(ff))],morder);\n return L[1];\nend if;\nend \+ proc:" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 1 "\n" }}{PARA 0 "" 0 "" {TEXT -1 189 "8. Procedure 'LTerm' gives the leading term in a Grassma nn polynomial with respect to the order entered as a second argument. \+ One possible order is 'Lex' (lexicographic lex e1>e2>...>en). \n" }} {PARA 0 "> " 0 "" {MPLTEXT 1 0 400 "LTerm:=proc(f::\{clibasmon,climon, clipolynom\},morder) local ff,L,c;\noptions `Copyright (c) 2006-2007 b y Rafal Ablamowicz and Bertfried Fauser. All rights reserved.`;\nif ty pe(f,\{clibasmon,climon\}) then return f \n elif type(f,clipolynom) \+ then\n ff:=Clifford:-clicollect(f):\n L:=sort([op(Cliffo rd:-cliterms(ff))],morder);\n c:=coeff(ff,L[1]);\n retur n c*L[1];\nend if;\nend proc:" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 0 "" } }{PARA 0 "" 0 "" {TEXT -1 210 "\n9. Procedure 'LCoeff' gives the coeff icient of the leading term in a Grassmann polynomial with respect to t he order entered as a second argument. One possible order is 'Lex' (le xicographic lex e1>e2>...>en). \n" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 457 "LCoeff:=proc(f::\{clibasmon,climon,clipolynom\},morder) local ff, L,c;\noptions `Copyright (c) 2006-2007 by Rafal Ablamowicz and Bertfri ed Fauser. All rights reserved.`;\nif type(f,clibasmon) then return 1 \n elif type(f,climon) then return coeff(f,op(Clifford:-cliterms(f)) ) \n elif type(f,clipolynom) then\n ff:=Clifford:-clicollect( f):\n L:=sort([op(Clifford:-cliterms(ff))],morder);\n c: =coeff(ff,L[1]);\n return c\nend if;\nend proc:\n" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 1 "\n" }}{PARA 0 "" 0 "" {TEXT -1 961 "10. Proced ure 'CommonFactor' finds a common Grassmann factor in two Grassmann mo nomials x and y. If the overlap between the two monomials is empty, th e procedure returns the identity element Id. Note that common factor o f monomials x and y may differ in sign from the common factor of y and x. \n\n'CommonFactor' is Grassmann's original 'regressive' product, w hich he computed in his first extension theory A1 using the 'rule of t he common factor'. Here 'CommonFactor makes use of two aspects of a G raded Hopf algebra, we can compute the meet (dual of join=wedge) in a \+ Grassmann algebra using the volume element. Thereby depending on the d imension. Common factor looks into the smallest Grassmann algebra whic h contains the monomials x and y and extracts the coefficient of the h ighest grade element (volume form). In this way, the common factor fun ction becomes independent of an 'ambient dimension' and loses its weak dependence on the (weight of) the metric. " }}{PARA 0 "" 0 "" {TEXT -1 0 "" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 575 "CommonFactor:=proc(x::\{ clibasmon,climon\},y::\{clibasmon,climon\}) local f,f1,f2,term,maxdeg; \noptions `Copyright (c) 2006-2007 by Rafal Ablamowicz and Bertfried F auser. All rights reserved.`,\nremember;\n f:=(x,y,z)->&t(x,z,y); \+ \n term:=Bigebra:-`&map`(eval(subs(`&t`=f,&t(Bigebra:-`&gco`(x),y))) ,2,Clifford:-wedge);\n f1:=(x,y)->x: f2:=(x,y)->y:\n maxdeg:=max(C lifford:-maxgrade(eval(subs(`&t`=f1,term))),\n Clifford: -maxgrade(eval(subs(`&t`=f2,term))));\n f:=(x,y)->if Clifford:-maxgr ade(y) " 0 "" {MPLTEXT 1 0 1 "\n" }}{PARA 0 "" 0 "" {TEXT -1 1366 "11. Procedure GDivide divides a Grassmann polynomial p1 by another Grassmann polynomial p2 in the admissible order 'MonOrder' entered as a second argument. The user needs to know first whether th is monomial order is admissible (use procedure 'isadmissible' first). \+ This procedure returns the remainder r of the division of p1 by p2 tha t is, a polynomial r such that p1 = wedge(q,p2) + r where r is a poly nomial such that GDivide(r,p2) = r, that is, r cannot be further reduc ed by dividing it by p2.\n\nNote that GDivide and GLCM (defined below) and later functions possibly too, need the reversion. The reversion i s a map into the opposite algebra and introduces signs due to the gene ration of the algebra by left multiplication turned into right multipl ication. The natural order of the opposite algebra would possibly be a decreasing order on the indices like e32, e421, e321 etc. One should keep in mind that ordering may be reversed when we use a contravarian t functor like /\\ --F--> /\\^op.\n\nWhen extending Groebner for Gras smann to Clifford algebras, all GDivide, GLCM, etc., functions will th en need the correct (possibly containing antisymmetric) parts either ! \n\nThis procedure may be used with an optional fourth argument of typ e 'symbol': If used that way, it returns the remainedr r and the quoti ent q as a sequence r,q (that is, r first and q second).\n\n " }} {PARA 0 "> " 0 "" {MPLTEXT 1 0 1101 "GDivide:=proc(p1::\{clipolynom,cl imon,clibasmon\},p2::\{clipolynom,climon,clibasmon\},MonOrder) local l st,cf,term,poslist,res,i,r,n,cbas,q,eq,sol,c;\noptions `Copyright (c) \+ 2006-2007 by Rafal Ablamowicz and Bertfried Fauser. All rights reserve d.`;\n lst:=sort(convert(Clifford:-cliterms(p1),list),MonOrder);\n \+ cf,term:=LCoeff(p2,MonOrder),LMon(p2,MonOrder);\n res:=[];\n \+ for i from 1 to nops(lst) do\n res:=[op(res),Clifford:-LC(Cliffor d:-reversion(term,linalg[diag](1$9)),lst[i],linalg[diag](1$9))];\n \+ end do:\n r:=p1-add(coeff(p1,lst[i])/cf*Clifford:-wedge(p2,res[i]), i=1..nops(lst));\nif nargs=3 then return r end if:\nif not type(args[4 ],symbol) then error `fourth optional argument must be of type symbol` end if:\n#####################################\n#Compute the quotient q\n#####################################\nn:=max(Clifford:-maxindex(p 1),Clifford:-maxindex(p2));\ncbas:=Clifford:-cbasis(n):\nq:=add(c[i]*c bas[i],i=1..nops(cbas));\neq:=Clifford:-clicollect(p1-Clifford:-wedge( q,p2)-r);\nsol:=op(Clifford:-clisolve(eq,[seq(c[i],i=1..nops(cbas))])) ;\nq:=subs(sol,q);\nreturn r,q;\nend proc:\n" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 1 "\n" }}{PARA 0 "" 0 "" {TEXT -1 1067 "12. Procedure GLC M is the Grassmann LCM of two Grassmann monomials of type 'climon' or \+ 'clibasmon'. It uses the fact that AP = Clifford:-RC(A,reversion(C)), \+ where Clifford:-RC is the right contraction of A by C: It contracts ou t the right factor C, that is, A = AP &w C. Similarly, it extracts in \+ the same way the C factor from the lft in B, that is, B = C &w BP, whe re C is the common factor (overlap of indices) of A and B. It returns \+ a list [AP, C, BP]. In the special case of no overlap, it returns C = \+ Id, that is, [A,Id,B].\n\nNote: We temporarily set B = diag(1$9) so th at each basis vector e_i would contact to 1, that is, LC(e_i,e_j) = RC (e_i,e_j) = 1, when i = j, and 0, when i <> j.\n\nWarning: GLCM return s signed factors of the least common multiple of monomials m1 and m2 \+ \n\nActually a Grassmann algebra is a graded commutative algebra! Henc e a bimodule is graded commutative isomorphic to a left or right modul e. In this sense, a Grassmann algebra behaves like a (graded) commutat ive algebra. The sign accounts for the right action written as left ac tion! \n" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 384 "GLCM:=proc(A::\{clibas mon,climon\},B::\{clibasmon,climon\}) local C,AP,BP;\noptions `Copyrig ht (c) 2006-2007 by Rafal Ablamowicz and Bertfried Fauser. All rights \+ reserved.`;\n C:=CommonFactor(A,B);\n AP:=Clifford:-RC(A,Clifford: -reversion(C,linalg[diag](1$9)),linalg[diag](1$9));\n BP:=Clifford:- LC(Clifford:-reversion(C,linalg[diag](1$9)),B,linalg[diag](1$9));\n \+ [AP,C,BP];\nend proc:\n" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 1 "\n" }} {PARA 0 "" 0 "" {TEXT -1 499 "13. Procedure 'GSpoly' computes the S-po lynomial of two Grassmann polynomials w.r.t. the monomial order MonOrd er given as the third argument. We make use of the fact that Grassmann algebra is almost commutative and we can act (up to a sign) by multip lication from one side only. We will, therefore, get only one S-polyno mial. Output is 0 (one polynomial is a factor of the other or the two \+ polynomials are monomials) otherwise it returns the nonzero part where the leading monomials are cancelled.\n\n" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 417 "GSpoly:=proc(p1::\{clipolynom,climon,clibasmon\},p2: :\{clipolynom,climon,clibasmon\},MonOrder) local lm1,lm2,lst,cf1,cf2; \noptions `Copyright (c) 2006-2007 by Rafal Ablamowicz and Bertfried F auser. All rights reserved.`;\n cf1,lm1:=LCoeff(p1,MonOrder),LMon(p1 ,MonOrder);\n cf2,lm2:=LCoeff(p2,MonOrder),LMon(p2,MonOrder);\n ls t:=GLCM(lm1,lm2);\n Clifford:-wedge(p1,lst[3])/cf1-Clifford:-wedge(l st[1],p2)/cf2;\nend proc:\n" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 1 "\n" } }{PARA 0 "" 0 "" {TEXT -1 300 "14. Procedure 'GReduce' takes a Grassma nn polynomial p and divided it by a list of polynomials [p1,...,pn], i n that order, for the monomial order MonOrder given as the third argum ent. It is a recursive application of GDivide. It returns the remainde r of the division of p by the list [p1,p2,...,pn].\n" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 346 "GReduce:=proc(p::\{clipolynom,climon,clibasmon \},plst::list(\{clipolynom,climon,clibasmon\}),MonOrder) local i,r;\no ptions `Copyright (c) 2006-2007 by Rafal Ablamowicz and Bertfried Faus er. All rights reserved.`;\n if p=0 then return 0 end if;\n r:=p:\n \+ for i from 1 to nops(plst) while r<>0 do\n r:=GDivide(r,plst[i],M onOrder)\n end do:\nend proc:\n" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 1 " \n" }}{PARA 0 "" 0 "" {TEXT -1 245 "15. Procedure 'GGbasis' computes a Groebner basis for the ideal generated by the elements of the list F \+ of Grassmann polynomials with respect to a monomial order MonOrder whi ch has to be admissible, say Deg[Lex]. Check procedure 'isadmissible'. \n" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 894 "GGbasis:=proc(F::list(\{clip olynom,climon,clibasmon\}),MonOrder) local Floc,N,N2,i,j,flag1,flag2,s poly,f;\noptions `Copyright (c) 2006-2007 by Rafal Ablamowicz and Bert fried Fauser. All rights reserved.`;\n#-- normalize the LMons in the l ist F\n#-- since nonzero coefficients make troubles in some comparison s....\nf:=(x)->x/LCoeff(x,MonOrder):\nFloc:=map(f,F):\nN:=nops(Floc); \nflag1:=evalb(N>1);\ni:=1:\nwhile flag1 do\n flag2:=true:\n N:=nops (Floc);\n for j from i+1 while flag2 do\n spoly:=GReduce(GSpoly( Floc[i],Floc[j],MonOrder),Floc,MonOrder);\n if spoly<>0 then\n \+ spoly:=f(spoly); \n if not member(+spoly,convert(Floc,se t)) then \n Floc:=[op(Floc),spoly]; \n end if;\n \+ end if;\n N2:=nops(Floc);\n flag2:=evalb(j " 0 "" {MPLTEXT 1 0 1 "\n" }}{PARA 0 "" 0 "" {TEXT -1 406 " 16. Procedure 'minGGbasis' computes a minimal (?) Groebner basis out o f a given Groebner basis G that has been generated from a list F of Gr assmann polynomials with respect to a monomial order MonOrder which ha s to be admissible, say Deg[Lex]. Check procedure 'isadmissible'. Thus , first compute a Groebner basis G for the MonOrder and then compute, \+ using G and MonOrder again, the minimal Groebner basis.\n" }}{PARA 0 " > " 0 "" {MPLTEXT 1 0 514 "minGGbasis:=proc(G::list(\{clipolynom,climo n,clibasmon\}),MonOrder) local keepinG,i,p,lp,Gp,lGp,r,co;\noptions `C opyright (c) 2006-2007 by Rafal Ablamowicz and Bertfried Fauser. All r ights reserved.`;\nkeepinG:=[]:\nfor i from 1 to nops(G) do\n p:=G[i] ;\n lp:=LMon(p,MonOrder);\n Gp:=remove(member,G,\{p\}):\n lGp:=map( LMon,Gp,MonOrder);\n r:=map(GReduce,lp,lGp,MonOrder);\n if r<>0 then \n co:=LCoeff(p,MonOrder);\n p:=p/co;\n ke epinG:=[op(keepinG),p] \n end if;\nend do:\nreturn keepinG;\nend proc :" }{TEXT -1 0 "" }}{PARA 0 "" 0 "" {TEXT -1 0 "" }}{PARA 0 "" 0 "" {TEXT -1 190 "17. Procedure 'multideg' returns the multidegree of a po lynomial f with respect to the order specified by the second argument. One possible order is 'Lex' (lexicographic lex e1>e2>...>en) \n" }} {PARA 0 "> " 0 "" {MPLTEXT 1 0 210 "multideg:=proc(f::\{clibasmon,clim on,clipolynom\},morder) local p:\noptions `Copyright (c) 2006-2007 by \+ Rafal Ablamowicz and Bertfried Fauser. All rights reserved.`;\n retu rn makealpha(LMon(f,morder)); \nend proc:" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 1 "\n" }}{PARA 0 "" 0 "" {TEXT -1 45 "18. Procedure 'init ' is automatically loaded." }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 997 "init :=proc() \n# global `convert/set_to_pts`;\n local x,y,i,j;\n prin tf(\"GfG - Groebner for Grassmann 0.2 beta (July 23, 2007) says Hello. ..\\n\");\n printf(\"22 functions exported\\n\");\n printf(\"===>I f you find this packages useful, please let us know about your derived work. see\\n\");\n printf(\"===>You can contact us at http://math.t ntech.edu/rafal/ or http://clifford.physik.uni-konstanz.de/~fauser/\\n \");\n##\n# `convert/set_to_pts`:=proc(S) \n# local L,locsort: \n# L:=convert(S,list):\n# locsort:=(a,b)->lexorder(lhs(a) ,lhs(b));\n# L:=sort(L,locsort);\n# map(rhs,L);\n# end p roc:\n##\nwith(Clifford):\nprintf(\"Clifford package with %d functions loaded...\\n\",nops(%));\n#with(Cliplus):\n#printf(\"Cliplus package \+ with %d functions loaded...\\n\",nops(%));\nwith(Bigebra):\nprintf(\"B igebra package with %d functions loaded...\\n\",nops(%));\nend proc: \+ \n\nexit:=proc()\n printf(\"GfG - Groebner for Grassmann 0.2 beta ( July 23, 2007) says good bye...\",%s\\n);\nend proc:\nend module:" }} {PARA 6 "" 1 "" {TEXT -1 70 "GfG - Groebner for Grassmann 0.2 beta (Ju ly 23, 2007) says good bye..." }}{PARA 6 "" 1 "" {TEXT -1 67 "GfG - Gr oebner for Grassmann 0.2 beta (July 23, 2007) says Hello..." }}{PARA 6 "" 1 "" {TEXT -1 21 "22 functions exported" }}{PARA 6 "" 1 "" {TEXT -1 85 "===>If you find this packages useful, please let us know about \+ your derived work. see" }}{PARA 6 "" 1 "" {TEXT -1 106 "===>You can co ntact us at http://math.tntech.edu/rafal/ or http://clifford.physik.un i-konstanz.de/~fauser/" }}{PARA 6 "" 1 "" {TEXT -1 44 "Clifford packag e with 84 functions loaded..." }}{PARA 6 "" 1 "" {TEXT -1 83 "Increase verbosity by infolevel[`function`]=val -- use online help > ?Bigebra[ help]" }}{PARA 6 "" 1 "" {TEXT -1 43 "Bigebra package with 33 function s loaded..." }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 0 "" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 0 "" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 0 "" }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 0 "" }}{PARA 0 " " 0 "" {TEXT -1 0 "" }}{PARA 0 "" 0 "" {TEXT -1 0 "" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 24 "savelibname:=libname[1];" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#>%,savelibnameGQ7C:\\Maple10/Cliffordlib6\"" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 60 "#march('create',savelibname,500);\n #march('list',libname[1]);" }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 84 "Do \+ not execute the next command unless \"savelibname\" above returns \".. ./Cliffordlib\"" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 15 "savelib( 'GfG');" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 16 "restart:restart: " }}{PARA 6 "" 1 "" {TEXT -1 70 "GfG - Groebner for Grassmann 0.2 beta (July 23, 2007) says good bye..." }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 10 "with(GfG):" }}{PARA 6 "" 1 "" {TEXT -1 67 "GfG - Groe bner for Grassmann 0.2 beta (July 23, 2007) says Hello..." }}{PARA 6 " " 1 "" {TEXT -1 21 "22 functions exported" }}{PARA 6 "" 1 "" {TEXT -1 85 "===>If you find this packages useful, please let us know about you r derived work. see" }}{PARA 6 "" 1 "" {TEXT -1 106 "===>You can conta ct us at http://math.tntech.edu/rafal/ or http://clifford.physik.uni-k onstanz.de/~fauser/" }}{PARA 6 "" 1 "" {TEXT -1 44 "Clifford package w ith 84 functions loaded..." }}{PARA 6 "" 1 "" {TEXT -1 83 "Increase ve rbosity by infolevel[`function`]=val -- use online help > ?Bigebra[hel p]" }}{PARA 6 "" 1 "" {TEXT -1 43 "Bigebra package with 33 functions l oaded..." }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 89 "#test for Cliff ords functionality\ncmul(e1,e2);\n#test for Bigebras functionality\n&g co(e1);" }}{PARA 6 "" 1 "" {TEXT -1 122 "Cliplus has been loaded. Defi nitions for type/climon and type/clipolynom now include &C and &C[K]. \+ Type ?cliprod for help." }}{PARA 11 "" 1 "" {XPPMATH 20 "6#,&%&e1we2G \"\"\"*&&%\"BG6$F%\"\"#F%%#IdGF%F%" }}{PARA 11 "" 1 "" {XPPMATH 20 "6# ,&-%#&tG6$%#IdG%#e1G\"\"\"-F%6$F(F'F)" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 0 "" }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 33 "Cookeville/Ko nstanz July 23, 2007" }}}}{MARK "11 0 0" 0 }{VIEWOPTS 1 1 0 1 1 1803 1 1 1 1 }{PAGENUMBERS 0 1 2 33 1 1 }