mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			823 lines
		
	
	
		
			27 KiB
		
	
	
	
		
			GDScript3
		
	
	
	
	
	
			
		
		
	
	
			823 lines
		
	
	
		
			27 KiB
		
	
	
	
		
			GDScript3
		
	
	
	
	
	
#############################################################################
 | 
						|
##
 | 
						|
#W  vspc.gd                     GAP library                     Thomas Breuer
 | 
						|
##
 | 
						|
##
 | 
						|
#Y  Copyright (C)  1997,  Lehrstuhl D für Mathematik,  RWTH Aachen,  Germany
 | 
						|
#Y  (C) 1998 School Math and Comp. Sci., University of St Andrews, Scotland
 | 
						|
#Y  Copyright (C) 2002 The GAP Group
 | 
						|
##
 | 
						|
##  This file declares the operations for vector spaces.
 | 
						|
##
 | 
						|
##  The operations for bases of free left modules can be found in the file
 | 
						|
##  <F>lib/basis.gd<F>.
 | 
						|
##
 | 
						|
 | 
						|
 | 
						|
#############################################################################
 | 
						|
##
 | 
						|
#C  IsLeftOperatorRing(<R>)
 | 
						|
##
 | 
						|
##  <ManSection>
 | 
						|
##  <Filt Name="IsLeftOperatorRing" Arg='R' Type='Category'/>
 | 
						|
##
 | 
						|
##  <Description>
 | 
						|
##  </Description>
 | 
						|
##  </ManSection>
 | 
						|
##
 | 
						|
DeclareSynonym( "IsLeftOperatorRing",
 | 
						|
    IsLeftOperatorAdditiveGroup and IsRing and IsAssociativeLOpDProd );
 | 
						|
#T really?
 | 
						|
 | 
						|
 | 
						|
#############################################################################
 | 
						|
##
 | 
						|
#C  IsLeftOperatorRingWithOne(<R>)
 | 
						|
##
 | 
						|
##  <ManSection>
 | 
						|
##  <Filt Name="IsLeftOperatorRingWithOne" Arg='R' Type='Category'/>
 | 
						|
##
 | 
						|
##  <Description>
 | 
						|
##  </Description>
 | 
						|
##  </ManSection>
 | 
						|
##
 | 
						|
DeclareSynonym( "IsLeftOperatorRingWithOne",
 | 
						|
    IsLeftOperatorAdditiveGroup and IsRingWithOne
 | 
						|
    and IsAssociativeLOpDProd );
 | 
						|
#T really?
 | 
						|
 | 
						|
 | 
						|
#############################################################################
 | 
						|
##
 | 
						|
#C  IsLeftVectorSpace( <V> )
 | 
						|
#C  IsVectorSpace( <V> )
 | 
						|
##
 | 
						|
##  <#GAPDoc Label="IsLeftVectorSpace">
 | 
						|
##  <ManSection>
 | 
						|
##  <Filt Name="IsLeftVectorSpace" Arg='V' Type='Category'/>
 | 
						|
##  <Filt Name="IsVectorSpace" Arg='V' Type='Category'/>
 | 
						|
##
 | 
						|
##  <Description>
 | 
						|
##  A <E>vector space</E> in &GAP; is a free left module
 | 
						|
##  (see <Ref Func="IsFreeLeftModule"/>) over a division ring
 | 
						|
##  (see Chapter <Ref Chap="Fields and Division Rings"/>).
 | 
						|
##  <P/>
 | 
						|
##  Whenever we talk about an <M>F</M>-vector space <A>V</A> then <A>V</A> is
 | 
						|
##  an additive group (see <Ref Func="IsAdditiveGroup"/>) on which the
 | 
						|
##  division ring <M>F</M> acts via multiplication from the left such that
 | 
						|
##  this action and the addition in <A>V</A> are left and right distributive.
 | 
						|
##  The division ring <M>F</M> can be accessed as value of the attribute
 | 
						|
##  <Ref Func="LeftActingDomain"/>.
 | 
						|
##  <P/>
 | 
						|
##  Vector spaces in &GAP; are always <E>left</E> vector spaces,
 | 
						|
##  <Ref Filt="IsLeftVectorSpace"/> and <Ref Filt="IsVectorSpace"/> are
 | 
						|
##  synonyms.
 | 
						|
##  </Description>
 | 
						|
##  </ManSection>
 | 
						|
##  <#/GAPDoc>
 | 
						|
##
 | 
						|
DeclareSynonym( "IsLeftVectorSpace",
 | 
						|
    IsLeftModule and IsLeftActedOnByDivisionRing );
 | 
						|
 | 
						|
DeclareSynonym( "IsVectorSpace", IsLeftVectorSpace );
 | 
						|
 | 
						|
InstallTrueMethod( IsFreeLeftModule,
 | 
						|
    IsLeftModule and IsLeftActedOnByDivisionRing );
 | 
						|
 | 
						|
 | 
						|
#############################################################################
 | 
						|
##
 | 
						|
#F  IsGaussianSpace( <V> )
 | 
						|
##
 | 
						|
##  <#GAPDoc Label="IsGaussianSpace">
 | 
						|
##  <ManSection>
 | 
						|
##  <Func Name="IsGaussianSpace" Arg='V'/>
 | 
						|
##
 | 
						|
##  <Description>
 | 
						|
##  The filter <Ref Filt="IsGaussianSpace"/> (see <Ref Sect="Filters"/>)
 | 
						|
##  for the row space (see <Ref Func="IsRowSpace"/>)
 | 
						|
##  or matrix space (see <Ref Func="IsMatrixSpace"/>) <A>V</A>
 | 
						|
##  over the field <M>F</M>, say,
 | 
						|
##  indicates that the entries of all row vectors or matrices in <A>V</A>,
 | 
						|
##  respectively, are all contained in <M>F</M>.
 | 
						|
##  In this case, <A>V</A> is called a <E>Gaussian</E> vector space.
 | 
						|
##  Bases for Gaussian spaces can be computed using Gaussian elimination for
 | 
						|
##  a given list of vector space generators.
 | 
						|
##  <Example><![CDATA[
 | 
						|
##  gap> mats:= [ [[1,1],[2,2]], [[3,4],[0,1]] ];;
 | 
						|
##  gap> V:= VectorSpace( Rationals, mats );;
 | 
						|
##  gap> IsGaussianSpace( V );
 | 
						|
##  true
 | 
						|
##  gap> mats[1][1][1]:= E(4);;   # an element in an extension field
 | 
						|
##  gap> V:= VectorSpace( Rationals, mats );;
 | 
						|
##  gap> IsGaussianSpace( V );
 | 
						|
##  false
 | 
						|
##  gap> V:= VectorSpace( Field( Rationals, [ E(4) ] ), mats );;
 | 
						|
##  gap> IsGaussianSpace( V );
 | 
						|
##  true
 | 
						|
##  ]]></Example>
 | 
						|
##  </Description>
 | 
						|
##  </ManSection>
 | 
						|
##  <#/GAPDoc>
 | 
						|
##
 | 
						|
DeclareFilter( "IsGaussianSpace", IsVectorSpace );
 | 
						|
 | 
						|
InstallTrueMethod( IsGaussianSpace,
 | 
						|
    IsVectorSpace and IsFullMatrixModule );
 | 
						|
 | 
						|
InstallTrueMethod( IsGaussianSpace,
 | 
						|
    IsVectorSpace and IsFullRowModule );
 | 
						|
 | 
						|
 | 
						|
#############################################################################
 | 
						|
##
 | 
						|
#C  IsDivisionRing( <D> )
 | 
						|
##
 | 
						|
##  <#GAPDoc Label="IsDivisionRing">
 | 
						|
##  <ManSection>
 | 
						|
##  <Filt Name="IsDivisionRing" Arg='D' Type='Category'/>
 | 
						|
##
 | 
						|
##  <Description>
 | 
						|
##  A <E>division ring</E> in &GAP; is a nontrivial associative algebra
 | 
						|
##  <A>D</A> with a multiplicative inverse for each nonzero element.
 | 
						|
##  In &GAP; every division ring is a vector space over a division ring
 | 
						|
##  (possibly over itself).
 | 
						|
##  Note that being a division ring is thus not a property that a ring can
 | 
						|
##  get, because a ring is usually not represented as a vector space.
 | 
						|
##  <P/>
 | 
						|
##  The field of coefficients is stored as the value of the attribute
 | 
						|
##  <Ref Func="LeftActingDomain"/> of <A>D</A>.
 | 
						|
##  </Description>
 | 
						|
##  </ManSection>
 | 
						|
##  <#/GAPDoc>
 | 
						|
##
 | 
						|
DeclareSynonymAttr( "IsDivisionRing",
 | 
						|
        IsMagmaWithInversesIfNonzero
 | 
						|
    and IsLeftOperatorRingWithOne
 | 
						|
    and IsLeftVectorSpace
 | 
						|
    and IsNonTrivial
 | 
						|
    and IsAssociative
 | 
						|
    and IsEuclideanRing );
 | 
						|
 | 
						|
 | 
						|
#############################################################################
 | 
						|
##
 | 
						|
#A  GeneratorsOfLeftVectorSpace( <V> )
 | 
						|
#A  GeneratorsOfVectorSpace( <V> )
 | 
						|
##
 | 
						|
##  <#GAPDoc Label="GeneratorsOfLeftVectorSpace">
 | 
						|
##  <ManSection>
 | 
						|
##  <Attr Name="GeneratorsOfLeftVectorSpace" Arg='V'/>
 | 
						|
##  <Attr Name="GeneratorsOfVectorSpace" Arg='V'/>
 | 
						|
##
 | 
						|
##  <Description>
 | 
						|
##  For an <M>F</M>-vector space <A>V</A>,
 | 
						|
##  <Ref Attr="GeneratorsOfLeftVectorSpace"/> returns a list of vectors in
 | 
						|
##  <A>V</A> that generate <A>V</A> as an <M>F</M>-vector space.
 | 
						|
##  <Example><![CDATA[
 | 
						|
##  gap> GeneratorsOfVectorSpace( FullRowSpace( Rationals, 3 ) );
 | 
						|
##  [ [ 1, 0, 0 ], [ 0, 1, 0 ], [ 0, 0, 1 ] ]
 | 
						|
##  ]]></Example>
 | 
						|
##  </Description>
 | 
						|
##  </ManSection>
 | 
						|
##  <#/GAPDoc>
 | 
						|
##
 | 
						|
DeclareSynonymAttr( "GeneratorsOfLeftVectorSpace",
 | 
						|
    GeneratorsOfLeftOperatorAdditiveGroup );
 | 
						|
 | 
						|
DeclareSynonymAttr( "GeneratorsOfVectorSpace",
 | 
						|
    GeneratorsOfLeftOperatorAdditiveGroup );
 | 
						|
 | 
						|
 | 
						|
#############################################################################
 | 
						|
##
 | 
						|
#A  CanonicalBasis( <V> )
 | 
						|
##
 | 
						|
##  <#GAPDoc Label="CanonicalBasis">
 | 
						|
##  <ManSection>
 | 
						|
##  <Attr Name="CanonicalBasis" Arg='V'/>
 | 
						|
##
 | 
						|
##  <Description>
 | 
						|
##  If the vector space <A>V</A> supports a <E>canonical basis</E> then
 | 
						|
##  <Ref Attr="CanonicalBasis"/> returns this basis,
 | 
						|
##  otherwise <K>fail</K> is returned.
 | 
						|
##  <P/>
 | 
						|
##  The defining property of a canonical basis is that its vectors are
 | 
						|
##  uniquely determined by the vector space.
 | 
						|
##  If canonical bases exist for two vector spaces over the same left acting
 | 
						|
##  domain (see <Ref Func="LeftActingDomain"/>) then the equality of
 | 
						|
##  these vector spaces can be decided by comparing the canonical bases.
 | 
						|
##  <P/>
 | 
						|
##  The exact meaning of a canonical basis depends on the type of <A>V</A>.
 | 
						|
##  Canonical bases are defined for example for Gaussian row and matrix
 | 
						|
##  spaces (see <Ref Sect="Row and Matrix Spaces"/>).
 | 
						|
##  <P/>
 | 
						|
##  If one designs a new kind of vector spaces
 | 
						|
##  (see <Ref Sect="How to Implement New Kinds of Vector Spaces"/>) and
 | 
						|
##  defines a canonical basis for these spaces then the
 | 
						|
##  <Ref Attr="CanonicalBasis"/> method one installs
 | 
						|
##  (see <Ref Func="InstallMethod"/>)
 | 
						|
##  must <E>not</E> call <Ref Func="Basis"/>.
 | 
						|
##  On the other hand, one probably should install a <Ref Func="Basis"/>
 | 
						|
##  method that simply calls <Ref Attr="CanonicalBasis"/>,
 | 
						|
##  the value of the method
 | 
						|
##  (see <Ref Sect="Method Installation"/> and
 | 
						|
##  <Ref Sect="Applicable Methods and Method Selection"/>)
 | 
						|
##  being <C>CANONICAL_BASIS_FLAGS</C>.
 | 
						|
##  <Example><![CDATA[
 | 
						|
##  gap> vecs:= [ [ 1, 2, 3 ], [ 1, 1, 1 ], [ 1, 1, 1 ] ];;
 | 
						|
##  gap> V:= VectorSpace( Rationals, vecs );;
 | 
						|
##  gap> B:= CanonicalBasis( V );
 | 
						|
##  CanonicalBasis( <vector space over Rationals, with 3 generators> )
 | 
						|
##  gap> BasisVectors( B );
 | 
						|
##  [ [ 1, 0, -1 ], [ 0, 1, 2 ] ]
 | 
						|
##  ]]></Example>
 | 
						|
##  </Description>
 | 
						|
##  </ManSection>
 | 
						|
##  <#/GAPDoc>
 | 
						|
##
 | 
						|
DeclareAttribute( "CanonicalBasis", IsFreeLeftModule );
 | 
						|
 | 
						|
 | 
						|
#############################################################################
 | 
						|
##
 | 
						|
#F  IsRowSpace( <V> )
 | 
						|
##
 | 
						|
##  <#GAPDoc Label="IsRowSpace">
 | 
						|
##  <ManSection>
 | 
						|
##  <Func Name="IsRowSpace" Arg='V'/>
 | 
						|
##
 | 
						|
##  <Description>
 | 
						|
##  A <E>row space</E> in &GAP; is a vector space that consists of
 | 
						|
##  row vectors (see Chapter <Ref Chap="Row Vectors"/>).
 | 
						|
##  </Description>
 | 
						|
##  </ManSection>
 | 
						|
##  <#/GAPDoc>
 | 
						|
##
 | 
						|
DeclareSynonym( "IsRowSpace", IsRowModule and IsVectorSpace );
 | 
						|
 | 
						|
 | 
						|
#############################################################################
 | 
						|
##
 | 
						|
#F  IsGaussianRowSpace( <V> )
 | 
						|
##
 | 
						|
##  <ManSection>
 | 
						|
##  <Func Name="IsGaussianRowSpace" Arg='V'/>
 | 
						|
##
 | 
						|
##  <Description>
 | 
						|
##  A row space is <E>Gaussian</E> if the left acting domain contains all
 | 
						|
##  scalars that occur in the vectors.
 | 
						|
##  Thus one can use Gaussian elimination in the calculations.
 | 
						|
##  <P/>
 | 
						|
##  (Otherwise the space is non-Gaussian.
 | 
						|
##  We will need a flag for this to write down methods that delegate from
 | 
						|
##  non-Gaussian spaces to Gaussian ones.)
 | 
						|
##  <!-- reformulate this when it becomes documented -->
 | 
						|
##  </Description>
 | 
						|
##  </ManSection>
 | 
						|
##
 | 
						|
DeclareSynonym( "IsGaussianRowSpace", IsGaussianSpace and IsRowSpace );
 | 
						|
 | 
						|
 | 
						|
#############################################################################
 | 
						|
##
 | 
						|
#F  IsNonGaussianRowSpace( <V> )
 | 
						|
##
 | 
						|
##  <ManSection>
 | 
						|
##  <Func Name="IsNonGaussianRowSpace" Arg='V'/>
 | 
						|
##
 | 
						|
##  <Description>
 | 
						|
##  If an <M>F</M>-vector space <A>V</A> is in the filter
 | 
						|
##  <Ref Func="IsNonGaussianRowSpace"/> then this expresses that <A>V</A>
 | 
						|
##  consists of row vectors (see <Ref Func="IsRowVector"/>) such
 | 
						|
##  that not all entries in these row vectors are contained in <M>F</M>
 | 
						|
##  (so Gaussian elimination cannot be used to compute an <M>F</M>-basis
 | 
						|
##  from a list of vector space generators),
 | 
						|
##  and that <A>V</A> is handled via the mechanism of nice bases
 | 
						|
##  (see <Ref ???="..."/>) in the following way.
 | 
						|
##  Let <M>K</M> be the field spanned by the entries of all vectors in
 | 
						|
##  <A>V</A>.
 | 
						|
##  Then the <Ref Attr="NiceFreeLeftModuleInfo"/> value of <A>V</A> is
 | 
						|
##  a basis <M>B</M> of the field extension <M>K / ( K \cap F )</M>,
 | 
						|
##  and the <Ref Func="NiceVector"/> value of <M>v \in <A>V</A></M>
 | 
						|
##  is defined by replacing each entry of <M>v</M> by the list of its
 | 
						|
##  <M>B</M>-coefficients, and then forming the concatenation.
 | 
						|
##  <P/>
 | 
						|
##  So the associated nice vector space is a Gaussian row space
 | 
						|
##  (see <Ref Func="IsGaussianRowSpace"/>).
 | 
						|
##  </Description>
 | 
						|
##  </ManSection>
 | 
						|
##
 | 
						|
DeclareHandlingByNiceBasis( "IsNonGaussianRowSpace",
 | 
						|
    "for non-Gaussian row spaces" );
 | 
						|
 | 
						|
 | 
						|
#############################################################################
 | 
						|
##
 | 
						|
#F  IsMatrixSpace( <V> )
 | 
						|
##
 | 
						|
##  <#GAPDoc Label="IsMatrixSpace">
 | 
						|
##  <ManSection>
 | 
						|
##  <Func Name="IsMatrixSpace" Arg='V'/>
 | 
						|
##
 | 
						|
##  <Description>
 | 
						|
##  A <E>matrix space</E> in &GAP; is a vector space that consists of matrices
 | 
						|
##  (see Chapter <Ref Chap="Matrices"/>).
 | 
						|
##  </Description>
 | 
						|
##  </ManSection>
 | 
						|
##  <#/GAPDoc>
 | 
						|
##
 | 
						|
DeclareSynonym( "IsMatrixSpace", IsMatrixModule and IsVectorSpace );
 | 
						|
 | 
						|
 | 
						|
#############################################################################
 | 
						|
##
 | 
						|
#F  IsGaussianMatrixSpace( <V> )
 | 
						|
##
 | 
						|
##  <ManSection>
 | 
						|
##  <Func Name="IsGaussianMatrixSpace" Arg='V'/>
 | 
						|
##
 | 
						|
##  <Description>
 | 
						|
##  A matrix space is Gaussian if the left acting domain contains all
 | 
						|
##  scalars that occur in the vectors.
 | 
						|
##  Thus one can use Gaussian elimination in the calculations.
 | 
						|
##  <P/>
 | 
						|
##  (Otherwise the space is non-Gaussian.
 | 
						|
##  We will need a flag for this to write down methods that delegate from
 | 
						|
##  non-Gaussian spaces to Gaussian ones.)
 | 
						|
##  </Description>
 | 
						|
##  </ManSection>
 | 
						|
##
 | 
						|
DeclareSynonym( "IsGaussianMatrixSpace", IsGaussianSpace and IsMatrixSpace );
 | 
						|
 | 
						|
 | 
						|
#############################################################################
 | 
						|
##
 | 
						|
#F  IsNonGaussianMatrixSpace( <V> )
 | 
						|
##
 | 
						|
##  <ManSection>
 | 
						|
##  <Func Name="IsNonGaussianMatrixSpace" Arg='V'/>
 | 
						|
##
 | 
						|
##  <Description>
 | 
						|
##  If an <M>F</M>-vector space <A>V</A> is in the filter
 | 
						|
##  <Ref Func="IsNonGaussianMatrixSpace"/>
 | 
						|
##  then this expresses that <A>V</A> consists of matrices
 | 
						|
##  (see <Ref Func="IsMatrix"/>)
 | 
						|
##  such that not all entries in these matrices are contained in <M>F</M>
 | 
						|
##  (so Gaussian elimination cannot be used to compute an <M>F</M>-basis
 | 
						|
##  from a list of vector space generators),
 | 
						|
##  and that <A>V</A> is handled via the mechanism of nice bases
 | 
						|
##  (see <Ref ???="..."/>) in the following way.
 | 
						|
##  Let <M>K</M> be the field spanned by the entries of all vectors in <A>V</A>.
 | 
						|
##  The <Ref Attr="NiceFreeLeftModuleInfo"/> value of <A>V</A> is irrelevant,
 | 
						|
##  and the <Ref Func="NiceVector"/> value of <M>v \in <A>V</A></M>
 | 
						|
##  is defined as the concatenation of the rows of <M>v</M>.
 | 
						|
##  <P/>
 | 
						|
##  So the associated nice vector space is a (not necessarily Gaussian)
 | 
						|
##  row space (see <Ref Func="IsRowSpace"/>).
 | 
						|
##  </Description>
 | 
						|
##  </ManSection>
 | 
						|
##
 | 
						|
DeclareHandlingByNiceBasis( "IsNonGaussianMatrixSpace",
 | 
						|
    "for non-Gaussian matrix spaces" );
 | 
						|
 | 
						|
 | 
						|
#############################################################################
 | 
						|
##
 | 
						|
#A  NormedRowVectors( <V> ) . . .  normed vectors in a Gaussian row space <V>
 | 
						|
##
 | 
						|
##  <#GAPDoc Label="NormedRowVectors">
 | 
						|
##  <ManSection>
 | 
						|
##  <Attr Name="NormedRowVectors" Arg='V'/>
 | 
						|
##
 | 
						|
##  <Description>
 | 
						|
##  For a finite Gaussian row space <A>V</A>
 | 
						|
##  (see <Ref Func="IsRowSpace"/>, <Ref Func="IsGaussianSpace"/>),
 | 
						|
##  <Ref Attr="NormedRowVectors"/> returns a list of those nonzero
 | 
						|
##  vectors in <A>V</A> that have a one in the first nonzero component.
 | 
						|
##  <P/>
 | 
						|
##  The result list can be used as action domain for the action of a matrix
 | 
						|
##  group via <Ref Func="OnLines"/>, which yields the natural action on
 | 
						|
##  one-dimensional subspaces of <A>V</A>
 | 
						|
##  (see also <Ref Func="Subspaces"/>).
 | 
						|
##  <Example><![CDATA[
 | 
						|
##  gap> vecs:= NormedRowVectors( GF(3)^2 );
 | 
						|
##  [ [ 0*Z(3), Z(3)^0 ], [ Z(3)^0, 0*Z(3) ], [ Z(3)^0, Z(3)^0 ], 
 | 
						|
##    [ Z(3)^0, Z(3) ] ]
 | 
						|
##  gap> Action( GL(2,3), vecs, OnLines );
 | 
						|
##  Group([ (3,4), (1,2,4) ])
 | 
						|
##  ]]></Example>
 | 
						|
##  </Description>
 | 
						|
##  </ManSection>
 | 
						|
##  <#/GAPDoc>
 | 
						|
##
 | 
						|
DeclareAttribute( "NormedRowVectors", IsGaussianSpace );
 | 
						|
 | 
						|
 | 
						|
#############################################################################
 | 
						|
##
 | 
						|
#A  TrivialSubspace( <V> )
 | 
						|
##
 | 
						|
##  <#GAPDoc Label="TrivialSubspace">
 | 
						|
##  <ManSection>
 | 
						|
##  <Attr Name="TrivialSubspace" Arg='V'/>
 | 
						|
##
 | 
						|
##  <Description>
 | 
						|
##  For a vector space <A>V</A>, <Ref Attr="TrivialSubspace"/> returns the
 | 
						|
##  subspace of <A>V</A> that consists of the zero vector in <A>V</A>.
 | 
						|
##  <Example><![CDATA[
 | 
						|
##  gap> V:= GF(3)^3;;
 | 
						|
##  gap> triv:= TrivialSubspace( V );
 | 
						|
##  <vector space over GF(3), with 0 generators>
 | 
						|
##  gap> AsSet( triv );
 | 
						|
##  [ [ 0*Z(3), 0*Z(3), 0*Z(3) ] ]
 | 
						|
##  ]]></Example>
 | 
						|
##  </Description>
 | 
						|
##  </ManSection>
 | 
						|
##  <#/GAPDoc>
 | 
						|
##
 | 
						|
DeclareSynonymAttr( "TrivialSubspace", TrivialSubmodule );
 | 
						|
 | 
						|
 | 
						|
#############################################################################
 | 
						|
##
 | 
						|
#F  VectorSpace( <F>, <gens>[, <zero>][, "basis"] )
 | 
						|
##
 | 
						|
##  <#GAPDoc Label="VectorSpace">
 | 
						|
##  <ManSection>
 | 
						|
##  <Func Name="VectorSpace" Arg='F, gens[, zero][, "basis"]'/>
 | 
						|
##
 | 
						|
##  <Description>
 | 
						|
##  For a field <A>F</A> and a collection <A>gens</A> of vectors,
 | 
						|
##  <Ref Func="VectorSpace"/> returns the <A>F</A>-vector space spanned by
 | 
						|
##  the elements in <A>gens</A>.
 | 
						|
##  <P/>
 | 
						|
##  The optional argument <A>zero</A> can be used to specify the zero element
 | 
						|
##  of the space; <A>zero</A> <E>must</E> be given if <A>gens</A> is empty.
 | 
						|
##  The optional string <C>"basis"</C> indicates that <A>gens</A> is known to
 | 
						|
##  be linearly independent over <A>F</A>, in particular the dimension of the
 | 
						|
##  vector space is immediately set;
 | 
						|
##  note that <Ref Func="Basis"/> need <E>not</E> return the basis formed by
 | 
						|
##  <A>gens</A> if the string <C>"basis"</C> is given as an argument.
 | 
						|
##  <!-- crossref. to <C>FreeLeftModule</C> as soon as the modules chapter
 | 
						|
##       is reliable!-->
 | 
						|
##  <Example><![CDATA[
 | 
						|
##  gap> V:= VectorSpace( Rationals, [ [ 1, 2, 3 ], [ 1, 1, 1 ] ] );
 | 
						|
##  <vector space over Rationals, with 2 generators>
 | 
						|
##  ]]></Example>
 | 
						|
##  </Description>
 | 
						|
##  </ManSection>
 | 
						|
##  <#/GAPDoc>
 | 
						|
##
 | 
						|
DeclareGlobalFunction( "VectorSpace" );
 | 
						|
 | 
						|
 | 
						|
#############################################################################
 | 
						|
##
 | 
						|
#F  Subspace( <V>, <gens>[, "basis"] )  . subspace of <V> generated by <gens>
 | 
						|
#F  SubspaceNC( <V>, <gens>[, "basis"] )
 | 
						|
##
 | 
						|
##  <#GAPDoc Label="Subspace">
 | 
						|
##  <ManSection>
 | 
						|
##  <Func Name="Subspace" Arg='V, gens[, "basis"]'/>
 | 
						|
##  <Func Name="SubspaceNC" Arg='V, gens[, "basis"]'/>
 | 
						|
##
 | 
						|
##  <Description>
 | 
						|
##  For an <M>F</M>-vector space <A>V</A> and a list or collection
 | 
						|
##  <A>gens</A> that is a subset of <A>V</A>,
 | 
						|
##  <Ref Func="Subspace"/> returns the <M>F</M>-vector space spanned by
 | 
						|
##  <A>gens</A>; if <A>gens</A> is empty then the trivial subspace
 | 
						|
##  (see <Ref Func="TrivialSubspace"/>) of <A>V</A> is returned.
 | 
						|
##  The parent (see <Ref Sect="Parents"/>) of the returned vector space
 | 
						|
##  is set to <A>V</A>.
 | 
						|
##  <P/>
 | 
						|
##  <Ref Func="SubspaceNC"/> does the same as <Ref Func="Subspace"/>,
 | 
						|
##  except that it omits the check whether <A>gens</A> is a subset of
 | 
						|
##  <A>V</A>.
 | 
						|
##  <P/>
 | 
						|
##  The optional string <A>"basis"</A> indicates that <A>gens</A> is known to
 | 
						|
##  be linearly independent over <M>F</M>.
 | 
						|
##  In this case the dimension of the subspace is immediately set,
 | 
						|
##  and both <Ref Func="Subspace"/> and <Ref Func="SubspaceNC"/> do
 | 
						|
##  <E>not</E> check whether <A>gens</A> really is linearly independent and
 | 
						|
##  whether <A>gens</A> is a subset of <A>V</A>.
 | 
						|
##  <!-- crossref. to <C>Submodule</C> as soon as the modules chapter
 | 
						|
##       is reliable!-->
 | 
						|
##  <Example><![CDATA[
 | 
						|
##  gap> V:= VectorSpace( Rationals, [ [ 1, 2, 3 ], [ 1, 1, 1 ] ] );;
 | 
						|
##  gap> W:= Subspace( V, [ [ 0, 1, 2 ] ] );
 | 
						|
##  <vector space over Rationals, with 1 generators>
 | 
						|
##  ]]></Example>
 | 
						|
##  </Description>
 | 
						|
##  </ManSection>
 | 
						|
##  <#/GAPDoc>
 | 
						|
##
 | 
						|
DeclareSynonym( "Subspace", Submodule );
 | 
						|
 | 
						|
DeclareSynonym( "SubspaceNC", SubmoduleNC );
 | 
						|
 | 
						|
 | 
						|
#############################################################################
 | 
						|
##
 | 
						|
#O  AsVectorSpace( <F>, <D> ) . . . . . . . . .  view <D> as <F>-vector space
 | 
						|
##
 | 
						|
##  <#GAPDoc Label="AsVectorSpace">
 | 
						|
##  <ManSection>
 | 
						|
##  <Oper Name="AsVectorSpace" Arg='F, D'/>
 | 
						|
##
 | 
						|
##  <Description>
 | 
						|
##  Let <A>F</A> be a division ring and <A>D</A> a domain.
 | 
						|
##  If the elements in <A>D</A> form an <A>F</A>-vector space then
 | 
						|
##  <Ref Oper="AsVectorSpace"/> returns this <A>F</A>-vector space,
 | 
						|
##  otherwise <K>fail</K> is returned.
 | 
						|
##  <P/>
 | 
						|
##  <Ref Oper="AsVectorSpace"/> can be used for example to view a given
 | 
						|
##  vector space as a vector space over a smaller or larger division ring.
 | 
						|
##  <Example><![CDATA[
 | 
						|
##  gap> V:= FullRowSpace( GF( 27 ), 3 );
 | 
						|
##  ( GF(3^3)^3 )
 | 
						|
##  gap> Dimension( V );  LeftActingDomain( V );
 | 
						|
##  3
 | 
						|
##  GF(3^3)
 | 
						|
##  gap> W:= AsVectorSpace( GF( 3 ), V );
 | 
						|
##  <vector space over GF(3), with 9 generators>
 | 
						|
##  gap> Dimension( W );  LeftActingDomain( W );
 | 
						|
##  9
 | 
						|
##  GF(3)
 | 
						|
##  gap> AsVectorSpace( GF( 9 ), V );
 | 
						|
##  fail
 | 
						|
##  ]]></Example>
 | 
						|
##  </Description>
 | 
						|
##  </ManSection>
 | 
						|
##  <#/GAPDoc>
 | 
						|
##
 | 
						|
DeclareSynonym( "AsVectorSpace", AsLeftModule );
 | 
						|
 | 
						|
 | 
						|
#############################################################################
 | 
						|
##
 | 
						|
#O  AsSubspace( <V>, <U> )  . . . . . . . . . . . view <U> as subspace of <V>
 | 
						|
##
 | 
						|
##  <#GAPDoc Label="AsSubspace">
 | 
						|
##  <ManSection>
 | 
						|
##  <Oper Name="AsSubspace" Arg='V, U'/>
 | 
						|
##
 | 
						|
##  <Description>
 | 
						|
##  Let <A>V</A> be an <M>F</M>-vector space, and <A>U</A> a collection.
 | 
						|
##  If <A>U</A> is a subset of <A>V</A> such that the elements of <A>U</A>
 | 
						|
##  form an <M>F</M>-vector space then <Ref Oper="AsSubspace"/> returns this
 | 
						|
##  vector space, with parent set to <A>V</A>
 | 
						|
##  (see <Ref Func="AsVectorSpace"/>).
 | 
						|
##  Otherwise <K>fail</K> is returned.
 | 
						|
##  <Example><![CDATA[
 | 
						|
##  gap> V:= VectorSpace( Rationals, [ [ 1, 2, 3 ], [ 1, 1, 1 ] ] );;
 | 
						|
##  gap> W:= VectorSpace( Rationals, [ [ 1/2, 1/2, 1/2 ] ] );;
 | 
						|
##  gap> U:= AsSubspace( V, W );
 | 
						|
##  <vector space over Rationals, with 1 generators>
 | 
						|
##  gap> Parent( U ) = V;
 | 
						|
##  true
 | 
						|
##  gap> AsSubspace( V, [ [ 1, 1, 1 ] ] );
 | 
						|
##  fail
 | 
						|
##  ]]></Example>
 | 
						|
##  </Description>
 | 
						|
##  </ManSection>
 | 
						|
##  <#/GAPDoc>
 | 
						|
##
 | 
						|
DeclareOperation( "AsSubspace", [ IsVectorSpace, IsCollection ] );
 | 
						|
 | 
						|
 | 
						|
#############################################################################
 | 
						|
##
 | 
						|
#F  Intersection2Spaces( <AsStruct>, <Substruct>, <Struct> )
 | 
						|
##
 | 
						|
##  <ManSection>
 | 
						|
##  <Func Name="Intersection2Spaces" Arg='AsStruct, Substruct, Struct'/>
 | 
						|
##
 | 
						|
##  <Description>
 | 
						|
##  is a function that takes two arguments <A>V</A> and <A>W</A> which must
 | 
						|
##  be finite dimensional vector spaces,
 | 
						|
##  and returns the intersection of <A>V</A> and <A>W</A>.
 | 
						|
##  <P/>
 | 
						|
##  If the left acting domains are different then let <M>F</M> be their
 | 
						|
##  intersection.
 | 
						|
##  The intersection of <A>V</A> and <A>W</A> is computed as intersection of
 | 
						|
##  <C><A>AsStruct</A>( <A>F</A>, <A>V</A> )</C> and
 | 
						|
##  <C><A>AsStruct</A>( <A>F</A>, <A>V</A> )</C>.
 | 
						|
##  <P/>
 | 
						|
##  If the left acting domains are equal to <M>F</M> then the intersection of
 | 
						|
##  <A>V</A> and <A>W</A> is returned either as <M>F</M>-<A>Substruct</A>
 | 
						|
##  with the common parent of <A>V</A> and <A>W</A> or as
 | 
						|
##  <M>F</M>-<A>Struct</A>, in both cases with known basis.
 | 
						|
##  <P/>
 | 
						|
##  This function is used to handle the intersections of two vector spaces,
 | 
						|
##  two algebras, two algebras-with-one, two left ideals, two right ideals,
 | 
						|
##  two two-sided ideals.
 | 
						|
##  </Description>
 | 
						|
##  </ManSection>
 | 
						|
##
 | 
						|
DeclareGlobalFunction( "Intersection2Spaces" );
 | 
						|
 | 
						|
 | 
						|
#############################################################################
 | 
						|
##
 | 
						|
#F  FullRowSpace( <F>, <n> )
 | 
						|
##
 | 
						|
##  <#GAPDoc Label="FullRowSpace">
 | 
						|
##  <ManSection>
 | 
						|
##  <Func Name="FullRowSpace" Arg='F, n'/>
 | 
						|
##  <Meth Name="\^" Arg='F, n' Label="for a field and an integer"/>
 | 
						|
##
 | 
						|
##  <Description>
 | 
						|
##  For a field <A>F</A> and a nonnegative integer <A>n</A>,
 | 
						|
##  <Ref Func="FullRowSpace"/> returns the <A>F</A>-vector space that
 | 
						|
##  consists of all row vectors (see <Ref Func="IsRowVector"/>) of
 | 
						|
##  length <A>n</A> with entries in <A>F</A>.
 | 
						|
##  <P/>
 | 
						|
##  An alternative to construct this vector space is via
 | 
						|
##  <A>F</A><C>^</C><A>n</A>.
 | 
						|
##  <Example><![CDATA[
 | 
						|
##  gap> FullRowSpace( GF( 9 ), 3 );
 | 
						|
##  ( GF(3^2)^3 )
 | 
						|
##  gap> GF(9)^3;           # the same as above
 | 
						|
##  ( GF(3^2)^3 )
 | 
						|
##  ]]></Example>
 | 
						|
##  </Description>
 | 
						|
##  </ManSection>
 | 
						|
##  <#/GAPDoc>
 | 
						|
##
 | 
						|
DeclareSynonym( "FullRowSpace", FullRowModule );
 | 
						|
DeclareSynonym( "RowSpace", FullRowModule );
 | 
						|
 | 
						|
 | 
						|
#############################################################################
 | 
						|
##
 | 
						|
#F  FullMatrixSpace( <F>, <m>, <n> )
 | 
						|
##
 | 
						|
##  <#GAPDoc Label="FullMatrixSpace">
 | 
						|
##  <ManSection>
 | 
						|
##  <Func Name="FullMatrixSpace" Arg='F, m, n'/>
 | 
						|
##  <Meth Name="\^" Arg='F, dims'
 | 
						|
##   Label="for a field and a pair of integers"/>
 | 
						|
##
 | 
						|
##  <Description>
 | 
						|
##  For a field <A>F</A> and two positive integers <A>m</A> and <A>n</A>,
 | 
						|
##  <Ref Func="FullMatrixSpace"/> returns the <A>F</A>-vector space that
 | 
						|
##  consists of all <A>m</A> by <A>n</A> matrices
 | 
						|
##  (see <Ref Func="IsMatrix"/>) with entries in <A>F</A>.
 | 
						|
##  <P/>
 | 
						|
##  If <A>m</A><C> = </C><A>n</A> then the result is in fact an algebra
 | 
						|
##  (see <Ref Func="FullMatrixAlgebra"/>).
 | 
						|
##  <P/>
 | 
						|
##  An alternative to construct this vector space is via
 | 
						|
##  <A>F</A><C>^[</C><A>m</A>,<A>n</A><C>]</C>.
 | 
						|
##  <Example><![CDATA[
 | 
						|
##  gap> FullMatrixSpace( GF(2), 4, 5 );
 | 
						|
##  ( GF(2)^[ 4, 5 ] )
 | 
						|
##  gap> GF(2)^[ 4, 5 ];    # the same as above
 | 
						|
##  ( GF(2)^[ 4, 5 ] )
 | 
						|
##  ]]></Example>
 | 
						|
##  </Description>
 | 
						|
##  </ManSection>
 | 
						|
##  <#/GAPDoc>
 | 
						|
##
 | 
						|
DeclareSynonym( "FullMatrixSpace", FullMatrixModule );
 | 
						|
DeclareSynonym( "MatrixSpace", FullMatrixModule );
 | 
						|
DeclareSynonym( "MatSpace", FullMatrixModule );
 | 
						|
 | 
						|
 | 
						|
#############################################################################
 | 
						|
##
 | 
						|
#C  IsSubspacesVectorSpace( <D> )
 | 
						|
##
 | 
						|
##  <#GAPDoc Label="IsSubspacesVectorSpace">
 | 
						|
##  <ManSection>
 | 
						|
##  <Filt Name="IsSubspacesVectorSpace" Arg='D' Type='Category'/>
 | 
						|
##
 | 
						|
##  <Description>
 | 
						|
##  The domain of all subspaces of a (finite) vector space or of all
 | 
						|
##  subspaces of fixed dimension, as returned by <Ref Func="Subspaces"/>
 | 
						|
##  (see <Ref Func="Subspaces"/>) lies in the category
 | 
						|
##  <Ref Filt="IsSubspacesVectorSpace"/>.
 | 
						|
##  <Example><![CDATA[
 | 
						|
##  gap> D:= Subspaces( GF(3)^3 );
 | 
						|
##  Subspaces( ( GF(3)^3 ) )
 | 
						|
##  gap> Size( D );
 | 
						|
##  28
 | 
						|
##  gap> iter:= Iterator( D );;
 | 
						|
##  gap> NextIterator( iter );
 | 
						|
##  <vector space over GF(3), with 0 generators>
 | 
						|
##  gap> NextIterator( iter );
 | 
						|
##  <vector space of dimension 1 over GF(3)>
 | 
						|
##  gap> IsSubspacesVectorSpace( D );
 | 
						|
##  true
 | 
						|
##  ]]></Example>
 | 
						|
##  </Description>
 | 
						|
##  </ManSection>
 | 
						|
##  <#/GAPDoc>
 | 
						|
##
 | 
						|
DeclareCategory( "IsSubspacesVectorSpace", IsDomain );
 | 
						|
 | 
						|
 | 
						|
#############################################################################
 | 
						|
##
 | 
						|
#M  IsFinite( <D> ) . . . . . . . . . . . . . . . . .  for a subspaces domain
 | 
						|
##
 | 
						|
##  Returns `true' if <D> is finite.
 | 
						|
##  We allow subspaces domains in `IsSubspacesVectorSpace' only for finite
 | 
						|
##  vector spaces.
 | 
						|
##
 | 
						|
InstallTrueMethod( IsFinite, IsSubspacesVectorSpace );
 | 
						|
 | 
						|
 | 
						|
#############################################################################
 | 
						|
##
 | 
						|
#A  Subspaces( <V>[, <k>] )
 | 
						|
##
 | 
						|
##  <#GAPDoc Label="Subspaces">
 | 
						|
##  <ManSection>
 | 
						|
##  <Attr Name="Subspaces" Arg='V[, k]'/>
 | 
						|
##
 | 
						|
##  <Description>
 | 
						|
##  Called with a finite vector space <A>v</A>,
 | 
						|
##  <Ref Oper="Subspaces"/> returns the domain of all subspaces of <A>V</A>.
 | 
						|
##  <P/>
 | 
						|
##  Called with <A>V</A> and a nonnegative integer <A>k</A>,
 | 
						|
##  <Ref Oper="Subspaces"/> returns the domain of all <A>k</A>-dimensional
 | 
						|
##  subspaces of <A>V</A>.
 | 
						|
##  <P/>
 | 
						|
##  Special <Ref Attr="Size"/> and <Ref Oper="Iterator"/> methods are
 | 
						|
##  provided for these domains.
 | 
						|
##  <!-- <C>Enumerator</C> would also be good ...
 | 
						|
##       (special treatment for full row spaces,
 | 
						|
##       other spaces delegate to this)-->
 | 
						|
##  </Description>
 | 
						|
##  </ManSection>
 | 
						|
##  <#/GAPDoc>
 | 
						|
##
 | 
						|
DeclareAttribute( "Subspaces", IsLeftModule );
 | 
						|
DeclareOperation( "Subspaces", [ IsLeftModule, IsInt ] );
 | 
						|
 | 
						|
 | 
						|
#############################################################################
 | 
						|
##
 | 
						|
#F  IsSubspace( <V>, <U> )
 | 
						|
##
 | 
						|
##  <ManSection>
 | 
						|
##  <Func Name="IsSubspace" Arg='V, U'/>
 | 
						|
##
 | 
						|
##  <Description>
 | 
						|
##  check that <A>U</A> is a vector space that is contained in <A>V</A>
 | 
						|
##  <!-- Must also <A>V</A> be a vector space?
 | 
						|
##       If yes then must <A>V</A> and <A>U</A> have same left acting domain?
 | 
						|
##       (Is this function useful at all?) -->
 | 
						|
##  </Description>
 | 
						|
##  </ManSection>
 | 
						|
##
 | 
						|
DeclareGlobalFunction( "IsSubspace" );
 | 
						|
 | 
						|
 | 
						|
#############################################################################
 | 
						|
##
 | 
						|
#A  OrthogonalSpaceInFullRowSpace( <U> )
 | 
						|
##
 | 
						|
##  <ManSection>
 | 
						|
##  <Attr Name="OrthogonalSpaceInFullRowSpace" Arg='U'/>
 | 
						|
##
 | 
						|
##  <Description>
 | 
						|
##  For a Gaussian row space <A>U</A> over <M>F</M>,
 | 
						|
##  <Ref Attr="OrthogonalSpaceInFullRowSpace"/>
 | 
						|
##  returns a complement of <A>U</A> in the full row space of same vector
 | 
						|
##  dimension as <A>U</A> over <M>F</M>.
 | 
						|
##  </Description>
 | 
						|
##  </ManSection>
 | 
						|
##
 | 
						|
DeclareAttribute( "OrthogonalSpaceInFullRowSpace", IsGaussianSpace );
 | 
						|
 | 
						|
 | 
						|
#############################################################################
 | 
						|
##
 | 
						|
#P  IsVectorSpaceHomomorphism( <map> )
 | 
						|
##
 | 
						|
##  <ManSection>
 | 
						|
##  <Prop Name="IsVectorSpaceHomomorphism" Arg='map'/>
 | 
						|
##
 | 
						|
##  <Description>
 | 
						|
##  A mapping <M>f</M> is a vector space homomorphism (or linear mapping)
 | 
						|
##  if the source and range are vector spaces
 | 
						|
##  (see <Ref Func="IsVectorSpace"/>)
 | 
						|
##  over the same division ring <M>D</M>
 | 
						|
##  (see <Ref Func="LeftActingDomain"/>),
 | 
						|
##  and if <M>f( a + b ) = f(a) + f(b)</M> and <M>f( s * a ) = s * f(a)</M>
 | 
						|
##  hold for all elements <M>a</M>, <M>b</M> in the source of <M>f</M> and
 | 
						|
##  <M>s \in D</M>.
 | 
						|
##  </Description>
 | 
						|
##  </ManSection>
 | 
						|
##
 | 
						|
DeclareProperty( "IsVectorSpaceHomomorphism", IsGeneralMapping );
 | 
						|
 | 
						|
 | 
						|
#############################################################################
 | 
						|
##
 | 
						|
#E
 | 
						|
 |