{VERSION 5 0 "IBM INTEL LINUX" "5.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 } {PSTYLE "Normal" -1 0 1 {CSTYLE "" -1 -1 "" 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }0 0 0 -1 -1 -1 0 0 0 0 0 0 -1 0 }{PSTYLE "Text Output" -1 2 1 {CSTYLE "" -1 -1 "Courier" 1 10 0 0 255 1 0 0 0 0 0 1 3 0 3 0 }1 0 0 -1 -1 -1 0 0 0 0 0 0 -1 0 }{PSTYLE "Heading 1" 0 3 1 {CSTYLE "" -1 -1 "" 1 18 0 0 0 0 0 1 0 0 0 0 0 0 0 0 }1 0 0 0 8 4 0 0 0 0 0 0 -1 0 } {PSTYLE "Heading 2" 3 4 1 {CSTYLE "" -1 -1 "" 1 14 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }0 0 0 -1 8 2 0 0 0 0 0 0 -1 0 }{PSTYLE "" 2 6 1 {CSTYLE "" -1 -1 "" 0 1 0 0 0 0 0 0 0 0 0 0 2 0 0 0 }0 0 0 -1 -1 -1 0 0 0 0 0 0 -1 0 }{PSTYLE "Warning" 2 7 1 {CSTYLE "" -1 -1 "" 0 1 0 0 255 1 0 0 0 0 0 0 1 0 0 0 }0 0 0 -1 -1 -1 0 0 0 0 0 0 -1 0 }{PSTYLE "Error" 7 8 1 {CSTYLE "" -1 -1 "" 0 1 255 0 255 1 0 0 0 0 0 0 0 0 0 0 }0 0 0 -1 -1 -1 0 0 0 0 0 0 -1 0 }{PSTYLE "Maple Output" 0 11 1 {CSTYLE "" -1 -1 " " 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }3 3 0 -1 -1 -1 0 0 0 0 0 0 -1 0 } {PSTYLE "" 11 12 1 {CSTYLE "" -1 -1 "" 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }1 0 0 -1 -1 -1 0 0 0 0 0 0 -1 0 }} {SECT 0 {EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 8 "restart;" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 0 "" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 14 "with(Domains);" }}{PARA 6 "" 1 "" {TEXT -1 64 "------ ---------------- Domains version 1.0 ---------------------" }}{PARA 6 "" 1 "" {TEXT -1 64 "Initially defined domains are Z and Q the integer s and rationals" }}{PARA 6 "" 1 "" {TEXT -1 64 "Abbreviations, e.g. DU P for DenseUnivariatePolynomial, also made" }}{PARA 7 "" 1 "" {TEXT -1 90 "Warning, the protected names Array, Matrix and Vector have been redefined and unprotected\n" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#7(%&Ar rayG%'MatrixG%.MatrixInverseG%'VectorG%%initG%%showG" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 0 "" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 0 "" }}}{SECT 1 {PARA 3 "" 0 "" {TEXT -1 23 "Defining the Field Z/p. " }}{EXCHG {PARA 0 "" 0 "" {TEXT -1 95 "The following command defines \+ the field Z / 31.\nI chose to name it F, use what ever you want. " }} {PARA 0 "" 0 "" {TEXT -1 80 "It constructs a module with a multitude o f operations that will be useful to us." }}{PARA 0 "" 0 "" {TEXT -1 68 "Notice there is a colon not a semicolon at the end of the command. " }}{PARA 0 "" 0 "" {TEXT -1 59 "Using a semicolon gives you more in formation than you want!" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 14 "F := Zm od(31):" }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 0 "" }}{PARA 0 "" 0 "" {TEXT -1 57 "To see the functions that are available in the module ... " }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 0 "" }{TEXT -1 0 "" }{MPLTEXT 1 0 20 "show(F, operations);" }}{PARA 6 "" 1 "" {TEXT -1 0 "" }}{PARA 6 " " 1 "" {TEXT -1 35 "` Signatures for constructor F`" }}{PARA 6 "" 1 "" {TEXT -1 58 "` note: operations prefixed by -- are not avai lable`" }}{PARA 6 "" 1 "" {TEXT -1 0 "" }}{PARA 6 "" 1 "" {TEXT -1 29 "` * : (Integers,F) -> F`" }}{PARA 6 "" 1 "" {TEXT -1 23 "` \+ * : (F,F*) -> F`" }}{PARA 6 "" 1 "" {TEXT -1 23 "` + : (F,F*) -> \+ F`" }}{PARA 6 "" 1 "" {TEXT -1 18 "` - : F -> F`" }}{PARA 6 "" 1 "" {TEXT -1 22 "` - : (F,F) -> F`" }}{PARA 6 "" 1 "" {TEXT -1 29 "` / : (F,Integers) -> F`" }}{PARA 6 "" 1 "" {TEXT -1 22 "` \+ / : (F,F) -> F`" }}{PARA 6 "" 1 "" {TEXT -1 13 "` 0 : F`" }} {PARA 6 "" 1 "" {TEXT -1 13 "` 1 : F`" }}{PARA 6 "" 1 "" {TEXT -1 29 "` <> : (F,F) -> Boolean`" }}{PARA 6 "" 1 "" {TEXT -1 28 "` = : (F,F) -> Boolean`" }}{PARA 6 "" 1 "" {TEXT -1 33 "` Abs oluteDegree : Integers`" }}{PARA 6 "" 1 "" {TEXT -1 33 "` Charact eristic : Integers`" }}{PARA 6 "" 1 "" {TEXT -1 30 "` Coerce : In tegers -> F`" }}{PARA 6 "" 1 "" {TEXT -1 36 "` Div : (F,F) -> Uni on(F,FAIL)`" }}{PARA 6 "" 1 "" {TEXT -1 37 "` EuclideanNorm : F - > Integers`" }}{PARA 6 "" 1 "" {TEXT -1 41 "` Factor : F -> [F,[[ F,Integers]*]]`" }}{PARA 6 "" 1 "" {TEXT -1 21 "` Gcd : F* -> F` " }}{PARA 6 "" 1 "" {TEXT -1 31 "` Gcdex : (F,F,Name) -> F`" }} {PARA 6 "" 1 "" {TEXT -1 36 "` Gcdex : (F,F,Name,Name) -> F`" }} {PARA 6 "" 1 "" {TEXT -1 27 "` Generator : () -> F`" }}{PARA 6 " " 1 "" {TEXT -1 29 "` Index : Integers -> F`" }}{PARA 6 "" 1 "" {TEXT -1 43 "` Input : Expression -> Union(F,FAIL)`" }}{PARA 6 " " 1 "" {TEXT -1 20 "` Inv : F -> F`" }}{PARA 6 "" 1 "" {TEXT -1 34 "` IsGenerator : F -> Boolean`" }}{PARA 6 "" 1 "" {TEXT -1 21 "` Lcm : F* -> F`" }}{PARA 6 "" 1 "" {TEXT -1 30 "` Lookup : F -> Integers`" }}{PARA 6 "" 1 "" {TEXT -1 43 "` MultiplicativeO rder : F -> Integers`" }}{PARA 6 "" 1 "" {TEXT -1 23 "` Normal : \+ F -> F`" }}{PARA 6 "" 1 "" {TEXT -1 32 "` Output : F -> Expressio n`" }}{PARA 6 "" 1 "" {TEXT -1 36 "` Powmod : (F,Integers,F) -> F `" }}{PARA 6 "" 1 "" {TEXT -1 28 "` Prime : F -> Boolean`" }} {PARA 6 "" 1 "" {TEXT -1 29 "` Quo : (F,F,Name) -> F`" }}{PARA 6 "" 1 "" {TEXT -1 24 "` Quo : (F,F) -> F`" }}{PARA 6 "" 1 "" {TEXT -1 24 "` Random : () -> F`" }}{PARA 6 "" 1 "" {TEXT -1 42 " ` RelativelyPrime : (F,F) -> Boolean`" }}{PARA 6 "" 1 "" {TEXT -1 29 "` Rem : (F,F,Name) -> F`" }}{PARA 6 "" 1 "" {TEXT -1 24 "` Rem : (F,F) -> F`" }}{PARA 6 "" 1 "" {TEXT -1 23 "` Size : \+ Integers`" }}{PARA 6 "" 1 "" {TEXT -1 47 "` SmallerEuclideanNorm \+ : (F,F) -> Boolean`" }}{PARA 6 "" 1 "" {TEXT -1 42 "` Sqrfree : F -> [F,[[F,Integers]*]]`" }}{PARA 6 "" 1 "" {TEXT -1 36 "` Type : Expression -> Boolean`" }}{PARA 6 "" 1 "" {TEXT -1 21 "` Unit : \+ F -> F`" }}{PARA 6 "" 1 "" {TEXT -1 33 "` UnitNormal : F -> [F,F, F]`" }}{PARA 6 "" 1 "" {TEXT -1 27 "` Universe : () -> F*`" }} {PARA 6 "" 1 "" {TEXT -1 29 "` ^ : (F,Integers) -> F`" }}{PARA 6 "" 1 "" {TEXT -1 0 "" }}{PARA 0 "" 0 "" {TEXT -1 0 "" }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 95 "Here are some simple arithmetic operations. A s you can see the syntax is a little cumbersome." }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 27 "F[`+`](21,14);\nF[`*`](6,7);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#\"\"%" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#\"#6" }}} {EXCHG {PARA 0 "" 0 "" {TEXT -1 0 "" }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 62 "I like to alias the operations that are of most use to us. \+ " }}{PARA 0 "" 0 "" {TEXT -1 24 "First basic arithmetic.\n" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 88 "alias(Fadd= F[`+`], Fmul=F[`*`], Finv=F[`In v`],\n Fdiv= F[`/`], Fexp=F[`^`]);\n" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 23 "Fadd(3,30);\nFmul(2,17);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6.%%FaddG%%FmulG%%FexpG%%FeqlG%&FneqlG%%FordG%%FdivG%%Fin vG%%FgenG%'FisgenG%%FranG%$FwtG" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#\" \"#" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#\"\"$" }}}{EXCHG {PARA 0 "" 0 " " {TEXT -1 0 "" }}{PARA 0 "" 0 "" {TEXT -1 99 "Now a check to see if t wo elements are equal; or not equal. Notice that an integer is not re duced " }}{PARA 0 "" 0 "" {TEXT -1 103 "before checking. You need to \+ use Coerce or Input to ensure that something is reduced to range 0,.. ,31" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 90 "alias(Feql=F[`=`], Fneql=F[` <>`]);\nFeql(50,19);\nF[`Coerce`](50);\nFeql(F[`Coerce`](50),19);" }} {PARA 11 "" 1 "" {XPPMATH 20 "6*%%FaddG%%FmulG%%FexpG%%FeqlG%&FneqlG%% FordG%%FdivG%%FinvG" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#%&falseG" }} {PARA 11 "" 1 "" {XPPMATH 20 "6#\"#>" }}{PARA 11 "" 1 "" {XPPMATH 20 " 6#%%trueG" }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 70 "Now, several things \+ concerning the multiplicative structure of Z / 31." }}{PARA 0 "" 0 "" {TEXT -1 43 "Ford(i); gives the multiplicative order," }}{PARA 0 " " 0 "" {TEXT -1 128 "Fgen(); produces a primitive element (generator of the multiplicative group).\nFisgen(i); is T if is primitive and F \+ otherwise." }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 99 "alias(Ford=F[`Multipl icativeOrder`],\n Fgen = F[`Generator`],\n Fisgen = F[`IsGen erator`]);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6,%%FaddG%%FmulG%%FexpG%%F eqlG%&FneqlG%%FordG%%FdivG%%FinvG%%FgenG%'FisgenG" }}{PARA 0 "> " 0 " " {MPLTEXT 1 0 72 "a:=Fgen(); \n Ford(a); \n Ford(5); \n Ford(0); \+ \nFisgen(3);\n Fisgen(0);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#>%\"aG\" #<" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#\"#I" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#\"\"$" }}{PARA 8 "" 1 "" {TEXT -1 59 "Error, (in F[Mult iplicativeOrder]) argument cannot be zero\n" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#%%trueG" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#%&falseG" }} }{EXCHG {PARA 0 "" 0 "" {TEXT -1 8 "Finally," }}{PARA 0 "" 0 "" {TEXT -1 116 "Fran(); to produce a random element of Z / 31.\nFwt(i); gi ves the Hamming weight. Fwt(0)=0 and Fwt(i)=1 if i<>0." }}{PARA 0 "> \+ " 0 "" {MPLTEXT 1 0 50 "alias(Fran=F[`Random`], Fwt = F[`EuclideanNorm `]);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6.%%FaddG%%FmulG%%FexpG%%FeqlG%& FneqlG%%FordG%%FdivG%%FinvG%%FgenG%'FisgenG%%FranG%$FwtG" }}}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 0 "" }}}{SECT 0 {PARA 3 "" 0 "" {TEXT -1 35 "Creating a Polynomial Ring over Z/p" }}{EXCHG {PARA 0 "> " 0 " " {MPLTEXT 1 0 23 "R := DUP(Zmod(31),x):\n\n" }{TEXT -1 47 "As with F \+ we will alias our useful operations.\n" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 274 "alias(Radd=R[`+`], Rmul=R[`*`], Rinv=R[`Inv`],\n Rd iv =R[`Div`], Rexp=R[`^`]);\nalias(Reql=R[`=`], Rneql=R[`<>`]);\nalia s(Rord=R[`MultiplicativeOrder`],\n Rgen = R[`Generator`],\n \+ Risgen = R[`IsGenerator`]);\nalias(Rran=R[`Random`], Rwt = R[`Euclidea nNorm`]);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6'%%RaddG%%RmulG%%RinvG%%Rd ivG%%RexpG" }}{PARA 11 "" 1 "" {XPPMATH 20 "6)%%RaddG%%RmulG%%RinvG%%R divG%%RexpG%%ReqlG%&RneqlG" }}{PARA 11 "" 1 "" {XPPMATH 20 "6,%%RaddG% %RmulG%%RinvG%%RdivG%%RexpG%%ReqlG%&RneqlG%%RordG%%RgenG%'RisgenG" }} {PARA 11 "" 1 "" {XPPMATH 20 "6.%%RaddG%%RmulG%%RinvG%%RdivG%%RexpG%%R eqlG%&RneqlG%%RordG%%RgenG%'RisgenG%%RranG%$RwtG" }}}{EXCHG {PARA 0 " " 0 "" {TEXT -1 182 "With polynomial rings we have to be careful about how we define particular elements. \nYou have to tell Maple to think of an expression as an element of R.\nUse Rin() for that purpose" }} {PARA 0 "> " 0 "" {MPLTEXT 1 0 94 "Radd(3+5*x+2*x^2,5); #This is wron g\nRadd(R[`Input`](3+5*x+2*x^2),R[`Input`](5)); #This works." }}{PARA 11 "" 1 "" {XPPMATH 20 "6#,(\"\")\"\"\"*&\"\"&F%)%\"xG\"\"#F%F%*&F*F%) F)\"\"%F%F%" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#,(\"\")\"\"\"*&\"\"&F%% \"xGF%F%*&\"\"#F%)F(F*F%F%" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 23 "alias(Rin = R[Input]):\n" }{TEXT -1 144 "The polynomial need not b e written in a particular form. \nIt DOES need to be a polynomial in x , since we defined the indeterminate in R to be x." }{MPLTEXT 1 0 54 " \na := Rin(37+5*x^2+x);\nb := Rin(x+5*x^3+3);\nRadd(a,b);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#>%\"aG,(\"\"'\"\"\"%\"xGF'*&\"\"&F')F(\"\"#F'F' " }}{PARA 11 "" 1 "" {XPPMATH 20 "6#>%\"bG,(%\"xG\"\"\"*&\"\"&F')F&\" \"$F'F'F+F'" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#,*\"\"*\"\"\"*&\"\"#F%% \"xGF%F%*&\"\"&F%)F(F'F%F%*&F*F%)F(\"\"$F%F%" }}}{EXCHG {PARA 0 "" 0 " " {TEXT -1 70 "The list of available and useful operations is longer t han for Z / p. " }}{PARA 0 "" 0 "" {TEXT -1 71 "Have a look if you wan t, but I will use the ones I think are important." }}{PARA 0 "" 0 "" {TEXT -1 60 "You might want to alias them if you end up using them a l ot." }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 22 "#show(R, operations):\n" }}} {SECT 0 {PARA 4 "" 0 "" {TEXT -1 26 "Accessing the coefficients" }} {EXCHG {PARA 0 "" 0 "" {TEXT -1 67 "A few simple functions to access t he coefficients of elements of R." }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 92 "R[`Degree`](b);\nR[`Coeff`](b,2);\nR[`ArrayCoeffs`](n);\nR[`ListCo effs`](b);\nR[`SetCoeffs`](a);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#\"\" $" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#\"\"!" }}{PARA 12 "" 1 "" {XPPMATH 20 "6#-%&ARRAYG6$7#;\"\"!F(7#/6#F(%\"nG" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#7&\"\"$\"\"\"\"\"!\"\"&" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#<%\"\"\"\"\"&\"\"'" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 140 "R[`Ldegree`](b);#Degree of leading term\nR[`Lcoeff`](b); #The coe ff of the leading term.\nR[`Tcoeff`](b); #Coeff of lowest degree nonze ro term" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#\"\"!" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#\"\"&" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#\"\"$" }}}} {SECT 0 {PARA 4 "" 0 "" {TEXT -1 26 "Division and factorization" }} {EXCHG {PARA 0 "" 0 "" {TEXT -1 51 "When dividing one polynomial by an other you can use" }}{PARA 0 "" 0 "" {TEXT -1 91 "Rdvi(b,a) (which is an alias for R[`Div`]) it returns FAIL if the a is not a factor of b ." }}{PARA 0 "" 0 "" {TEXT -1 74 "R[`Quo`] and R[`Rem`] act just like \+ the standard Maple function (see Help)" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 14 "R[`Div`](b,a);" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 0 " " }}{PARA 11 "" 1 "" {XPPMATH 20 "6#%%FAILG" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 14 "R[`Quo`](b,a);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6# ,&\"\"'\"\"\"%\"xGF%" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 108 "q \+ := R[`Quo`](b,a, r); #The quotient\nr; #The remain der\nRadd(Rmul(q,a), r); #Check!\nb;" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 43 "r := R[`Rem`](b,a,q);\nq;\nRadd(Rmul(q,a),r);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#>%\"qG,&\"\"'\"\"\"%\"xGF'" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#,&\"#H\"\"\"*&\"#?F%%\"xGF%F%" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#,(%\"xG\"\"\"*&\"\"&F%)F$\"\"$F%F%F)F%" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#,(%\"xG\"\"\"*&\"\"&F%)F$\"\"$F%F%F)F%" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#>%\"rG,&\"#H\"\"\"*&\"#?F'%\"xGF'F'" }} {PARA 11 "" 1 "" {XPPMATH 20 "6#,&\"\"'\"\"\"%\"xGF%" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#,(%\"xG\"\"\"*&\"\"&F%)F$\"\"$F%F%F)F%" }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 80 "Factorization of polynomials and computat ion of the gcd or lcm works as desired." }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 94 "R[`Factor`](a);\nR[`RelativelyPrime`](a,b);\nR[`Gcd`](a,b);\nR [`Lcm`](a,b);\nR[`Gcdex`](a,b,r,s);\n" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#7$\"\"&7$7$,&%\"xG\"\"\"\"#:F)F)7$,&F(F)\"#5F)F)" }}{PARA 11 "" 1 " " {XPPMATH 20 "6#%%trueG" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#\"\"\"" }} {PARA 11 "" 1 "" {XPPMATH 20 "6#,.\"#G\"\"\"*&\"#9F%%\"xGF%F%*&\"#=F%) F(\"\"#F%F%*&\"#?F%)F(\"\"$F%F%*&\"#DF%)F(\"\"%F%F%*$)F(\"\"&F%F%" }} {PARA 11 "" 1 "" {XPPMATH 20 "6#\"\"\"" }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 77 "The final command makes r and s hold the polynomials that will give the gcd.\n" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 32 "r, s;\nRad d(Rmul(r,a),Rmul(s,b));" }}{PARA 11 "" 1 "" {XPPMATH 20 "6$,(\"\"#\"\" \"*&\"#:F%%\"xGF%F%*&\"#EF%)F(F$F%F%,&\"# " 0 "" {MPLTEXT 1 0 0 "" }}}}{PARA 0 "" 0 "" {TEXT -1 0 "" }}{SECT 0 {PARA 4 "" 0 "" {TEXT -1 65 "Creating polynomials in R; Evaluating polynomials ; The derivative" }}{EXCHG {PARA 0 "" 0 "" {TEXT -1 69 "You can create polynomials using Rin(), as descirbed above, or using " }}{PARA 0 "" 0 "" {TEXT -1 118 "R[`Monomial`] which takes a degree as argument. \n R[`Random`] takes an optional argument, which prescribes the degree." }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 38 "R[`Monomial`](3);\np := R[`Random `](7);" }}{PARA 0 "" 0 "" {TEXT -1 0 "" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#*$)%\"xG\"\"$\"\"\"" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#>%\"pG,2 \"#5\"\"\"*&\"\"'F'%\"xGF'F'*&\"\"(F')F*\"\"#F'F'*&F&F')F*\"\"$F'F'*& \"\"&F')F*\"\"%F'F'*&\"# " 0 "" {MPLTEXT 1 0 16 "R[`Shift`](p,2);" }}{PARA 11 "" 1 "" {XPPMATH 20 " 6#,2*$)%\"xG\"\"#\"\"\"\"#5*&\"\"'F()F&\"\"$F(F(*&\"\"(F()F&\"\"%F(F(* &F)F()F&\"\"&F(F(*&F4F()F&F+F(F(*&\"# " 0 "" {MPLTEXT 1 0 44 "R[`Eval`](a,1);\nR[`PolyEval `](a, Rin(x^2));\n" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#\"#7" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#,(\"\"'\"\"\"*$)%\"xG\"\"#F%F%*&\"\"&F%)F(\" \"%F%F%" }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 84 "You can also apply the formal derivative, and the difference operator (f(x+1)-f(x))." }}} {EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 41 "R[`Diff`](a);\nR[`Difference Operator`](a);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#,&\"\"\"F$*&\"#5F$% \"xGF$F$" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#,&\"\"'\"\"\"*&\"#5F%%\"xG F%F%" }}}}{PARA 0 "" 0 "" {TEXT -1 0 "" }}}{SECT 0 {PARA 3 "" 0 "" {TEXT -1 30 "Linear Algebra over R = Z/p[x]" }}{EXCHG {PARA 0 "> " 0 " " {MPLTEXT 1 0 0 "" }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 112 "Normally I like to use the new Maple package LinearAlgebra instead of the older one linalg. Unfortunately, in" }}{PARA 0 "" 0 "" {TEXT -1 125 "the \+ Domains package, the key term Matrix is redefined, an I think that con flicts with the use of matrices in LinearAlgebra. " }}{PARA 0 "" 0 " " {TEXT -1 0 "" }}{PARA 0 "" 0 "" {TEXT -1 61 "So we will use linalg, \+ and matrix. First include the package" }}{PARA 0 "" 0 "" {TEXT -1 0 " " }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 13 "with(linalg);" }}{PARA 7 "" 1 "" {TEXT -1 80 "Warning, the protected names norm and trace hav e been redefined and unprotected\n" }}{PARA 12 "" 1 "" {XPPMATH 20 "6# 7^r%.BlockDiagonalG%,GramSchmidtG%,JordanBlockG%)LUdecompG%)QRdecompG% *WronskianG%'addcolG%'addrowG%$adjG%(adjointG%&angleG%(augmentG%(backs ubG%%bandG%&basisG%'bezoutG%,blockmatrixG%(charmatG%)charpolyG%)choles kyG%$colG%'coldimG%)colspaceG%(colspanG%*companionG%'concatG%%condG%)c opyintoG%*crossprodG%%curlG%)definiteG%(delcolsG%(delrowsG%$detG%%diag G%(divergeG%(dotprodG%*eigenvalsG%,eigenvaluesG%-eigenvectorsG%+eigenv ectsG%,entermatrixG%&equalG%,exponentialG%'extendG%,ffgausselimG%*fibo nacciG%+forwardsubG%*frobeniusG%*gausselimG%*gaussjordG%(geneqnsG%*gen matrixG%%gradG%)hadamardG%(hermiteG%(hessianG%(hilbertG%+htransposeG%) ihermiteG%*indexfuncG%*innerprodG%)intbasisG%(inverseG%'ismithG%*issim ilarG%'iszeroG%)jacobianG%'jordanG%'kernelG%*laplacianG%*leastsqrsG%)l insolveG%'mataddG%'matrixG%&minorG%(minpolyG%'mulcolG%'mulrowG%)multip lyG%%normG%*normalizeG%*nullspaceG%'orthogG%*permanentG%&pivotG%*poten tialG%+randmatrixG%+randvectorG%%rankG%(ratformG%$rowG%'rowdimG%)rowsp aceG%(rowspanG%%rrefG%*scalarmulG%-singularvalsG%&smithG%,stackmatrixG %*submatrixG%*subvectorG%)sumbasisG%(swapcolG%(swaprowG%*sylvesterG%)t oeplitzG%&traceG%*transposeG%,vandermondeG%*vecpotentG%(vectdimG%'vect orG%*wronskianG" }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 113 "Since we will be multiplying matrices whose entries are in the Domain R, we need to write our own procedure for " }}{PARA 0 "" 0 "" {TEXT -1 22 "matrix \+ multiplication." }}{PARA 0 "" 0 "" {TEXT -1 0 "" }}}{EXCHG {PARA 0 "> \+ " 0 "" {MPLTEXT 1 0 374 "Mmul := proc(M,N)\nlocal i, j, k, W;\n\nif co ldim(M) <> rowdim(N)\n then print(\"not correct dimensions on your ma trices\"); \n break;\nfi;\nW := matrix(rowdim(M), coldim(N));\nfor i \+ from 1 to rowdim(M) do\n for k from 1 to coldim(N) do\n W[i,k] := \+ Rin(0);\n for j from 1 to coldim(M) do\n W[i,k] := Radd(W[i,k ], Rmul(M[i,j],N[j,k]));\n od;\n od;\nod;\nRETURN(W);\nend proc;" }{TEXT -1 0 "" }}{PARA 0 "" 0 "" {TEXT -1 0 "" }}{PARA 12 "" 1 "" {XPPMATH 20 "6#>%%MmulGf*6$%\"MG%\"NG6&%\"iG%\"jG%\"kG%\"WG6\"F.C&@$0- %'coldimG6#9$-%'rowdimG6#9%C$-%&printG6#QHnot~correct~dimensions~on~yo ur~matricesF.[>8'-%'matrixG6$-F7F4-F3F8?(8$\"\"\"FIFE%%trueG?(8&FIFIFF FJC$>&FA6$FHFL-%$RinG6#\"\"!?(8%FIFIF2FJ>FO-%%RaddG6$FO-%%RmulG6$&F56$ FHFV&F96$FVFL-%'RETURNG6#FAF.F.F." }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 19 "Here is an example." }}{PARA 0 "" 0 "" {TEXT -1 0 "" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 148 "M := matrix(2,2,[[Rin(1), Rin(0)], [Rin(x), Rin(1)]]);\nN := matrix(2,3,[[Rin(x), Rin(x), Rin(3)], [Rin(4 ), \n Rin(x+1), Rin(x^2)]]);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#>%\"MG-%'matrixG6#7$7$\"\"\"\"\"!7$%\"xGF*" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#>%\"NG-%'matrixG6#7$7%%\"xGF*\"\"$7%\"\"%,&F*\" \"\"F/F/*$)F*\"\"#F/" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 15 "Z : = Mmul(M,N);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#>%\"ZG%\"WG" }}} {EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 9 "print(Z);" }}{PARA 11 "" 1 " " {XPPMATH 20 "6#-%'matrixG6#7$7%%\"xGF(\"\"$7%,&\"\"%\"\"\"*$)F(\"\"# F-F-,(F-F-F(F-F.F-,&F(F)F.F-" }}}{EXCHG {PARA 0 "" 0 "" {TEXT -1 106 " Now write the matrix version of the Euclidean Algorithm to find the li near combination of two elements of " }}{PARA 0 "" 0 "" {TEXT -1 21 "R which give the gcd." }}}}}{MARK "9" 0 }{VIEWOPTS 1 1 0 1 1 1803 1 1 1 1 }{PAGENUMBERS 0 1 2 33 1 1 }