Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 


Quelle  gp4obj.gi   Sprache: unbekannt

 
 #############################################################################
##
#W  gp4obj.gi                   GAP4 package `XMod'             Chris Wensley
##                                                               Alper Odabas
##  This file implements generic methods for (pre-)crossed cubes 
##  and (pre-)cat3-groups.
##
#Y  Copyright (C) 2001-2025, Chris Wensley et al, 
    
#############################################################################
##
#M  PreCat3GroupObj( [<front>,<left>,<up>,<right>,<down>,<back>] ) 
##
InstallMethod( PreCat3GroupObj, "for a list of pre-cat2-groups", true,
    [ IsList ], 0,
function( L )

    local PC, ok;

    if not ( Length( L ) = 6 ) then 
        Error( "there should be 6 pre-cat2-groups in the list L" ); 
    fi; 
    PC := rec();
    ObjectifyWithAttributes( PC, PreCat3GroupObjType, 
        Front3DimensionalGroup, L[1], 
        Left3DimensionalGroup, L[2], 
        Up3DimensionalGroup, L[3],
        Right3DimensionalGroup, L[4],
        Down3DimensionalGroup, L[5],
        Back3DimensionalGroup, L[6], 
        GeneratingCat1Groups, [ Up2DimensionalGroup( L[1] ),
                                Left2DimensionalGroup( L[1] ), 
                                Left2DimensionalGroup( L[2] ) ],
        HigherDimension, 4, 
        IsHigherDimensionalGroup, true, 
        IsPreCat3Group, true, 
        IsPreCatnGroup, true );
    ok := IsCat3Group( PC );
    return PC;
end );

#############################################################################
##
#M  IsPreCat3Group . . . . . . . . . . .  check that this is a pre-cat3-group
#M  IsCat3Group . . . . . . . . . . . . check that the object is a cat3-group
##
InstallMethod( IsCat3Group, "generic method for a cat3-group",
    true, [ IsHigherDimensionalGroup ], 0,
function( P )
    return ( HigherDimension( P ) = 4 ) 
        and IsCat2Group( Front3DimensionalGroup( P ) )  
        and IsCat2Group( Left3DimensionalGroup( P ) )  
        and IsCat2Group( Up3DimensionalGroup( P ) )  
        and IsCat2Group( Right3DimensionalGroup( P ) )  
        and IsCat2Group( Down3DimensionalGroup( P ) )  
        and IsCat2Group( Back3DimensionalGroup( P ) );  
end ); 

#############################################################################
##
#M  DetermineRemainingFaces . . . . . . . . . . . for list of pre-catn-groups
## 
InstallGlobalFunction( DetermineRemainingFaces, function( arg )

    local nargs, C1;

    nargs := Length( arg );
    if ( nargs = 2 ) then
        if IsPreCat1Group(arg[1]) and IsPreCat1Group(arg[2]) then
            return DetermineRemainingCat1Groups( arg[1], arg[2] );
        elif IsPreCat2Group(arg[1]) and IsPreCat2Group(arg[2]) then
            return DetermineRemainingCat2Groups( arg[1], arg[2] );
        else
            return fail;
        fi;
    else
        return fail;
    fi;
end );

#############################################################################
##
#M  DetermineRemainingCat2Groups . . . . . . . . . . for two pre-cat2-groups
## 
InstallMethod( DetermineRemainingCat2Groups, "for front,left pre-cat2-gps", 
    true, [ IsPreCat2Group, IsPreCat2Group ], 0,
function( front, left )

    local Cfl, Cfu, Cll, up, Cud, Cfr, right, Cfd, Clr, down, 
          Cld, Cur, back, Crd, G, R, Q, H, N, P, M, L; 

    Cfl := Left2DimensionalGroup( front ); 
    if not ( Cfl = Up2DimensionalGroup( left ) ) then 
        Error( "front-left mis-match" ); 
    fi; 
    Cfu := Up2DimensionalGroup( front ); 
    Cll := Left2DimensionalGroup( left ); 
    up := Cat2Group( Cll, Cfu ); 
    if ( up = fail ) then 
        Info( InfoXMod, 1, "up fails to be a cat2-group" ); 
        return fail; 
    fi; 
    Cud := Down2DimensionalGroup( up ); 
    Cfr := Right2DimensionalGroup( front ); 
    right := Cat2Group( Cud, Cfr ); 
    if ( right = fail ) then 
        Info( InfoXMod, 1, "right fails to be a cat2-group" ); 
        return fail; 
    fi; 
    Cfd := Down2DimensionalGroup( front ); 
    Clr := Right2DimensionalGroup( left ); 
    down := Cat2Group( Cfd, Clr ); 
    if ( down = fail ) then 
        Info( InfoXMod, 1, "down fails to be a cat2-group" ); 
        return fail; 
    fi; 
    Cld := Down2DimensionalGroup( left ); 
    Cur := Right2DimensionalGroup( up ); 
    back := Cat2Group( Cld, Cur ); 
    if ( back = fail ) then 
        Info( InfoXMod, 1, "back fails to be a cat2-group" ); 
        return fail; 
    fi; 
    return [ up, right, down, back ]; 
end ); 

#############################################################################
##
#M  PreCat3GroupByPreCat2Groups( <front>,<left>,<up>,<right>,<down>,<back> ) 
##
InstallMethod( PreCat3GroupByPreCat2Groups, "for a pair of pre-cat2-groups", 
    true, [ IsPreCat2Group, IsPreCat2Group, IsPreCat2Group, 
            IsPreCat2Group, IsPreCat2Group, IsPreCat2Group ], 0,
function( front, left, up, right, down, back )

    local Cfu, Cfl, Cul, Cur, Cfr, Cfd, Cld, Clb, Cub, Crd, 
          G, R, Q, H, N, P, M, L; 

    Cfu := Up2DimensionalGroup( front ); 
    Cfl := Left2DimensionalGroup( front ); 
    Cul := Up2DimensionalGroup( up ); 
    Cur := Down2DimensionalGroup( up ); 
    Cfr := Right2DimensionalGroup( front ); 
    Cfd := Down2DimensionalGroup( front ); 
    Cld := Down2DimensionalGroup( left ); 
    Clb := Down2DimensionalGroup( left ); 
    Cub := Right2DimensionalGroup( up ); 
    Crd := Down2DimensionalGroup( right ); 
    G := Source( Cfu ); 
    R := Range( Cfu ); 
    Q := Range( Cfl ); 
    H := Range( Cub ); 
    N := Range( Cur ); 
    P := Range( Cfd ); 
    M := Range( Cld ); 
    L := Range( Crd ); 
    return PreCat3GroupObj( [ front, left, up, right, down, back ] ); 
end ); 

#############################################################################
##
#F  (Pre)Cat3Group( front, left )    cat3-group from two (pre)cat2-groups
#F  (Pre)Cat3Group( front, uplt )    cat3-group from cat2 and cat1-groups
#F  (Pre)Cat3Group( fup, flt, llt )  cat3-group from 3 cat1-groups
#F  (Pre)Cat3Group( XS )             cat3-group from (pre)crossed cube
##
InstallGlobalFunction( PreCat3Group, function( arg )

    local nargs, front, left, Cfl, Clu, urdb, C3G, ok;

    nargs := Length( arg );
    if ( ( nargs < 1 ) or ( nargs > 3 ) ) then
        Print( "standard usage: (Pre)Cat3Group( front, left );\n" );
        Print( "            or: (Pre)Cat3Group( front, cat1 );\n" );
        Print( "            or: (Pre)Cat3Group( cat1, cat1, cat1 );\n" );
        Print( "            or: (Pre)Cat3Group( Xcube );\n" );
        return fail;
    fi; 
    if not ForAll( arg, HasHigherDimension ) then 
        Error( "each argument should have a higher dimension" ); 
    fi;
    if ( nargs = 1 ) then 
            Error( "PreCat3GroupOfPreCrossedcube not yet implemented" ); 
        ## C3G := PreCat3GroupOfPreCrossedcube( arg[1] );
    elif ( nargs = 3 ) then 
        front := PreCat2Group( arg[1], arg[2] ); 
        left := PreCat2Group( arg[2], arg[3] ); 
    elif ( nargs = 2 ) and ( HigherDimension( arg[2] ) = 2 ) then 
        front := arg[1]; 
        Cfl := Left2DimensionalGroup( arg[1] ); 
        left := PreCat2Group( Cfl, arg[2] ); 
    else 
        front := arg[1]; 
        left := arg[2]; 
    fi; 
    if ( ( front = fail ) or (left = fail ) ) then 
        return fail; 
    fi;
    if not IsPreCat2Group( front ) and IsPreCat2Group( left ) then 
        Error( "front and left are not both pre-cat2-groups" ); 
    fi; 
    Cfl := Left2DimensionalGroup( front ); 
    Clu := Up2DimensionalGroup( left ); 
    if not ( Cfl = Clu ) then 
        Info( InfoXMod, 1, "front-left <> left-up" ); 
        return fail; 
    fi; 
    urdb := DetermineRemainingCat2Groups( front, left ); 
    if ( urdb = fail ) then 
        Info( InfoXMod, 2, "failure with RemainingCat2Groups" ); 
        return fail; 
    fi;
    C3G := PreCat3GroupByPreCat2Groups( 
               front, left, urdb[1], urdb[2], urdb[3], urdb[4] ); 
    if ( C3G = fail ) then 
        return fail; 
    fi;
    ok := IsPreCat3Group( C3G );
    if ok then 
        ok := IsCat3Group( C3G ); 
        return C3G;
    else
        return fail;
    fi;
end );

InstallGlobalFunction( Cat3Group, function( arg )

    local nargs, C3G, ok; 

    nargs := Length( arg );
    if ( nargs = 3 ) then 
        C3G := PreCat3Group( arg[1], arg[2], arg[3] ); 
    elif ( nargs = 2 ) then 
        C3G := PreCat3Group( arg[1], arg[2] ); 
    elif ( nargs = 1 ) then 
        C3G := PreCat3Group( arg[1] ); 
    else 
        Print( "standard usage: (Pre)Cat3Group( cat2, cat2 );\n" );
        Print( "            or: (Pre)Cat3Group( cat2, cat1 );\n" );
        Print( "            or: (Pre)Cat3Group( cat1, cat1, cat1 );\n" );
        Print( "            or: (Pre)Cat3Group( XCube );\n" );
        return fail; 
    fi;
    ok := not ( C3G = fail ) and IsCat3Group( C3G ); 
    if ok then 
        return C3G; 
    else 
        return fail; 
    fi; 
end ); 

InstallMethod( AllCat3GroupTriples, "for a group", [ IsGroup ], 0,
function( G )

    local all1, all2, pairs, T, t, n, i, j, k, front, left, up, a, b, c, pos; 

    InitCatnGroupRecords( G ); 
    if IsBound( CatnGroupLists( G ).cat3triples ) then 
        return CatnGroupLists( G ).cat3triples; 
    fi; 
    all1 := AllCat1Groups( G ); 
    all2 := AllCat2Groups( G ); 
    pairs := CatnGroupLists( G ).cat2pairs; 
    T := [ ];
    t := 0; 
    n := Length( pairs ); 
    for i in [1..n] do 
        front := pairs[i]; 
        a := front[1]; 
        b := front[2]; 
        for j in [i..n] do 
            left := pairs[j]; 
            if ( left[1] = b ) then 
                c := left[2]; 
                up := [ c, a ]; 
                pos := Position( pairs, up ); 
                if ( pos = fail ) then 
                    pos := Position( pairs, [ a, c ] ); 
                fi; 
                if ( pos <> fail ) then 
                    Add( T, [ a, b, c ] ); 
                    t := t+1; 
                fi; 
            fi; 
        od; 
    od; 
    CatnGroupNumbers( G ).cat3 := Length( T ); 
    CatnGroupLists( G ).cat3triples := T; 
    return T; 
end ); 

InstallMethod( AllCat3GroupsNumber, "for a group", [ IsGroup ], 0, 
function( G ) 

    local n, C, triples; 

    InitCatnGroupRecords( G ); 
    if IsBound( CatnGroupNumbers( G ).cat3 ) then 
        return CatnGroupNumbers( G ).cat3; 
    fi; 
    ## not already known, so perform the calculation 
    triples := AllCat3GroupTriples( G ); 
    return Length( triples ); 
end ); 

InstallMethod( AllCat3Groups, "for a group", [ IsGroup ], 0, 
function( G ) 

    local all1, triples, n, L, i, t, C; 

    InitCatnGroupRecords( G ); 
    all1 := AllCat1Groups( G ); 
    triples := AllCat3GroupTriples( G ); 
    n := Length( triples ); 
    L := [ ]; 
    for i in [1..n] do
        t := triples[i]; 
        C := Cat3Group( all1[t[1]], all1[t[2]], all1[t[3]] );
        Add( L, C ); 
    od;
    return L; 
end ); 

[ Dauer der Verarbeitung: 0.23 Sekunden  (vorverarbeitet)  ]

                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Software

     Produkte
     Quellcodebibliothek

Aktivitäten

     Artikel über Sicherheit
     Anleitung zur Aktivierung von SSL

Muße

     Gedichte
     Musik
     Bilder

Jenseits des Üblichen ....

Besucherstatistik

Besucherstatistik

Monitoring

Montastic status badge