Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/GAP/lib/   (Algebra von RWTH Aachen Version 4.15.1©)  Datei vom 18.9.2025 mit Größe 3 kB image not shown  

Quelle  upolyirr.gi   Sprache: unbekannt

 
#############################################################################
##
##  This file is part of GAP, a system for computational discrete algebra.
##  This file's authors include Frank Lübeck.
##
##  Copyright of GAP belongs to its developers, whose names are too numerous
##  to list here. Please refer to the COPYRIGHT file for details.
##
##  SPDX-License-Identifier: GPL-2.0-or-later
##
##  This file  contains methods to compute irreducible univariate polynomials
##

#############################################################################
##
#F  AllMonicPolynomialCoeffsOfDegree( <n>, <q> )  . . . . . all coefficient
#F  lists of monic polynomials over GF(<q>) of degree <n>
##
BindGlobal("AllMonicPolynomialCoeffsOfDegree", function(n, q)
local   fq,  one,  res,  a;

  fq := AsSortedList(GF(q));
  one := One(GF(q));

  res := Tuples(fq, n);
  for a in res do
    Add(a, one);
  od;

  return res;
end );

#############################################################################
##
#F  AllIrreducibleMonicPolynomialCoeffsOfDegree( <n>, <q> )  . all coefficient
#F  lists of irreducible monic polynomials over GF(<q>) of degree <n>
##
#V  IRR_POLS_OVER_GF_CACHE:  a cache for the following function
##
BindGlobal( "IRR_POLS_OVER_GF_CACHE", NEW_SORTED_CACHE(false) );

DeclareGlobalName("AllIrreducibleMonicPolynomialCoeffsOfDegree");
BindGlobal("AllIrreducibleMonicPolynomialCoeffsOfDegree", function(n, q)
  return GET_FROM_SORTED_CACHE( IRR_POLS_OVER_GF_CACHE, [q,n], function( )
  local   l,  i,  r,  p, new, neverdiv;

  # this auxiliary function is for going around converting coefficients
  # to polynomials and using the \mod operator for divisibility tests
  # (I found a speedup factor of about 6 in the example n=9, q=3)
  neverdiv := function(r, p)
    local   lr,  lp,  rr,  pp;
    lr := Length(r[1]);
    lp := Length(p);
    for rr in r do
      pp := ShallowCopy(p);
      ReduceCoeffs(pp, lp, rr, lr);
      ShrinkRowVector(pp);
      if Length(pp)=0 then
        return false;
      fi;
    od;
    return true;
  end;

  l := AllMonicPolynomialCoeffsOfDegree(n, q);
  for i in [1..Int(n/2)] do
    r := AllIrreducibleMonicPolynomialCoeffsOfDegree(i, q);
    new:= [];
    for p in l do
      if neverdiv(r, p) then
        Add(new, p);
      fi;
    od;
    l := new;
  od;

  return Immutable(l);
  end );

end );

#############################################################################
##
#M  CompanionMatrix( <poly> )
#M  CompanionMatrix( <coeffs> )
##
InstallMethod( CompanionMatrix,
    [ IsObject ],
    function( obj )
    local c, l, res, i, F, c1;

    # for the moment allow coefficients as well
    if not IsList( obj ) then
        c := CoefficientsOfLaurentPolynomial( obj );
        if c[2] < 0 then
           Error( "This polynomial does not have a companion matrix" );
        fi;
        F:= DefaultField( c[1] );
        c1:= ListWithIdenticalEntries( c[2], Zero(F) );
        Append( c1, c[1] );
        c:= c1;
    else
        c := obj;
        F:= DefaultField( c );
    fi;

    l := Length( c ) - 1;
    if l = 0 then
       Error( "This polynomial does not have a companion matrix" );
    fi;
    res := NullMat( l, l, F );
    res[1][l] := -c[1];
    for i in [2..l] do
        res[i][i-1] := One( F );
        res[i][l] := -c[i];
    od;
    return res;
end );


#############################################################################
##
#F AllIrreducibleMonicPolynomials( <degree>, <field> )
##
InstallGlobalFunction( AllIrreducibleMonicPolynomials,
function( degree, field )
    local q, coeffs, fam, nr;
    if not IsFinite( field ) then
        Error("field must be finite");
    fi;
    q := Size(field);
    nr := IndeterminateNumberOfLaurentPolynomial(
          Indeterminate(field,"x"));
    coeffs := AllIrreducibleMonicPolynomialCoeffsOfDegree(degree,q);
    fam := FamilyObj( Zero(field) );
    return List( coeffs,
           x -> LaurentPolynomialByCoefficients( fam, x, 0, nr ) );
end );


[ Dauer der Verarbeitung: 0.36 Sekunden  (vorverarbeitet)  ]