home *** CD-ROM | disk | FTP | other *** search
- #############################################################################
- ##
- #A polyfld.g GAP library Frank Celler
- ##
- #A @(#)$Id: polyfld.g,v 3.5 1993/02/09 14:25:55 martin Rel $
- ##
- #Y Copyright 1990-1992, Lehrstuhl D fuer Mathematik, RWTH Aachen, Germany
- ##
- ## This file contains functions for polynomials over fields.
- ##
- #H $Log: polyfld.g,v $
- #H Revision 3.5 1993/02/09 14:25:55 martin
- #H made undefined globals local
- #H
- #H Revision 3.4 1993/02/04 13:47:12 fceller
- #H added '/' and 'EuclideanQuotient'
- #H
- #H Revision 3.3 1992/11/16 12:23:18 fceller
- #H added Laurent polynomials
- #H
- #H Revision 3.2 1992/06/01 07:32:24 fceller
- #H Initial GAP 3.2 release
- #H
- ##
-
-
- #############################################################################
- ##
- #F InfoPoly1(...) . . . . . . . . . . . infomation function for polynomials
- #F InfoPoly2(...) . . . . . . . . . . . . . debug function for polynomials
- ##
- if not IsBound(InfoPoly1) then InfoPoly1 := Ignore; fi;
- if not IsBound(InfoPoly2) then InfoPoly2 := Ignore; fi;
-
-
- #############################################################################
- ##
-
- #V FieldPolynomialRingOps . . . . . . . . . . . . full polynomial ring ops
- ##
- FieldPolynomialRingOps := Copy( PolynomialRingOps );
- FieldPolynomialRingOps.name := "FieldPolynomialRingOps";
-
-
- #############################################################################
- ##
- #F FieldPolynomialRingOps.StandardAssociate( <R>, <f> ) . . . . normed pol
- ##
- FieldPolynomialRingOps.StandardAssociate := function( R, f )
- return f * f.coefficients[ Length( f.coefficients ) ]^-1;
- end;
-
-
- #############################################################################
- ##
- #F FieldPolynomialRingOps.Mod( <R>, <f>, <g> ) . . . . . . . . . . use 'mod'
- ##
- FieldPolynomialRingOps.Mod := function( R, f, g )
- return f mod g;
- end;
-
-
- #############################################################################
- ##
- #F FieldPolynomialRingOps.EuclideanQuotient( <R>, <f>, <g> ) . . . . <l>/<r>
- ##
- FieldPolynomialRingOps.EuclideanQuotient := function ( R, f, g )
- local m, n, i, k, c, q, R, val;
-
- # <f> and <g> must have the same field
- if f.baseRing <> g.baseRing then
- Error( "<f> and <g> must have the same base ring" );
- fi;
- R := f.baseRing;
-
- # if <f> is zero return it
- if 0 = Length(f.coefficients) then
- return f;
- fi;
-
- # check the value of the valuation of <f> and <g>
- if f.valuation < g.valuation then
- return false;
- fi;
- val := f.valuation - g.valuation;
-
- # Try to divide <f> by <g>
- q := [];
- n := Length( g.coefficients );
- m := Length( f.coefficients ) - n;
- f := ShallowCopy( f.coefficients );
- if IsField(R) then
- for i in [0 .. m ] do
- c := f[m-i+n] / g.coefficients[n];
- for k in [ 1 .. n ] do
- f[m-i+k] := f[m-i+k] - c * g.coefficients[k];
- od;
- q[m-i+1] := c;
- od;
- else
- for i in [0 .. m ] do
- c := Quotient( R, f[m-i+n], g.coefficients[n] );
- if c = false then return false; fi;
- for k in [ 1 .. n ] do
- f[m-i+k] := f[m-i+k] - c * g.coefficients[k];
- od;
- q[m-i+1] := c;
- od;
- fi;
-
- # return the polynomial
- return Polynomial( R, q, val );
-
- end;
-
-
- #############################################################################
- ##
-
- #V FieldLaurentPolynomialRingOps . . . . . . . . . full polynomial ring ops
- ##
- FieldLaurentPolynomialRingOps := Copy( LaurentPolynomialRingOps );
- FieldLaurentPolynomialRingOps.name := "FieldLaurentPolynomialRingOps";
-
-
- #############################################################################
- ##
- #F FieldLaurentPolynomialRingOps.StandardAssociate( <R>, <f> ) . normed pol
- ##
- FieldLaurentPolynomialRingOps.StandardAssociate := function( R, f )
- local l;
-
- l := f.coefficients[Length(f.coefficients)];
- return Polynomial( R.baseRing, f.coefficients*l^-1 );
- end;
-
-
- #############################################################################
- ##
- #F FieldLaurentPolynomialRingOps.Mod( <R>, <f>, <g> ) . . . . . . use 'mod'
- ##
- FieldLaurentPolynomialRingOps.Mod := function( R, f, g )
- local F, G, r;
-
- # construct <F>, <G> such that <F>*x^i = <f> and <G>*x^j = <g>
- F := Polynomial( f.baseRing, f.coefficients, 0 );
- G := Polynomial( g.baseRing, g.coefficients, 0 );
-
- # compute <r> such that <F> = h * <G> + <r>
- r := Mod( PolynomialRing(R.baseRing), F, G );
-
- # now (<F>*x^i) = h*x^(i-j) * (<G>*x^j) + <r>*x^i
- return Polynomial( R.baseRing, r.coefficients, r.valuation+f.valuation );
-
- end;
-
-
- #############################################################################
- ##
- #F FieldLaurentPolynomialRingOps.EuclideanQuotient( <R>, <l>, <r> ) <l>/<r>
- ##
- FieldLaurentPolynomialRingOps.EuclideanQuotient := function ( R, f, g )
- local m, n, i, k, c, q, R, val;
-
- # get the base ring
- R := R.baseRing;
-
- # if <f> is zero return it
- if 0 = Length(f.coefficients) then
- return f;
- fi;
-
- # get the value of the valuation of <f> / <g>
- val := f.valuation - g.valuation;
-
- # Try to divide <f> by <g>
- q := [];
- n := Length( g.coefficients );
- m := Length( f.coefficients ) - n;
- f := ShallowCopy( f.coefficients );
- if IsField(R) then
- for i in [0 .. m ] do
- c := f[m-i+n] / g.coefficients[n];
- for k in [ 1 .. n ] do
- f[m-i+k] := f[m-i+k] - c * g.coefficients[k];
- od;
- q[m-i+1] := c;
- od;
- else
- for i in [0 .. m ] do
- c := Quotient( R, f[m-i+n], g.coefficients[n] );
- if c = false then return false; fi;
- for k in [ 1 .. n ] do
- f[m-i+k] := f[m-i+k] - c * g.coefficients[k];
- od;
- q[m-i+1] := c;
- od;
- fi;
-
- # return the result
- return Polynomial( R, q, val );
-
- end;
-
-
- #############################################################################
- ##
-
- #E Emacs . . . . . . . . . . . . . . . . . . . . . . . local emacs variables
- ##
- ## Local Variables:
- ## mode: outline
- ## outline-regexp: "#F\\|#V\\|#E"
- ## eval: (local-set-key "\t" 'indent-for-tab-command)
- ## eval: (hide-body)
- ## End:
- ##
-