[GAP Forum] Is it possible to step through the program, like GNU GDB debugger, against built-in functions(ex. DerivedSubgroup, ClosureSubgroupNC )?

buynnnmmm1 at yahoo.co.jp buynnnmmm1 at yahoo.co.jp
Wed Sep 17 14:51:29 BST 2014


Dear Alexander Konovalov,

Thank you very much for your help.

> Not really - the method for IsSolvable did not evolve from the code similar to 
> myIsSolvable at all.
> 
> Perhaps the key is to read about GAP method selection and learn the concept of 
> methods as bundles of functions:
> 
> http://www.gap-system.org/Manuals/doc/tut/chap8.html#X7AEED9AB824CD4DA
> 
> - that is, IsSolvable(G) will select the best available method to apply to G, 
> taking into account what's known about G at the moment. With myIsSolvable, 
> you enforce the calculation of DerivedSeries, while some of the methods may need 
> not to know the derived series at all to give an answer. The profile below just 
> illustrates this, since the number of methods involved in the calls to GAP's 
> IsSolvable is much smaller.

IsSolvable in lib/grp.gi is the same as the method for determining whether or not solvable group I have learned .
I'll try to understand that the method for determining whether or not solvable group I have learned is the same the built-in IsSolvable function.
I think it will be the good study of group theory .
I'll try to be able to understand "Operations and Methods of GAP" with the document, too.
Thank you very much for your help.

With best regards
buynnnmmm1

----- Original Message -----

> From: Alexander Konovalov <alexk at mcs.st-andrews.ac.uk>
> To: buynnnmmm1 at yahoo.co.jp
> Cc: GAP Forum <forum at gap-system.org>
> Date: 2014/9/17, Wed 22:07
> Subject: Re: [GAP Forum] Is it possible to step through the program, like GNU GDB debugger, against built-in functions(ex. DerivedSubgroup, ClosureSubgroupNC )?
> 
> 
> On 17 Sep 2014, at 13:57, buynnnmmm1 at yahoo.co.jp wrote:
> 
>>  Dear Alexander Konovalov,
>> 
>>  Thank you very much for your help.
>>  I will be able to do what I would like to do with the way you taught me, 
> embeded Err("Message")s in codes.
>> 
>>>  What is does is that it calls TryPcgsPermGroup and then checks if it 
> returns the 
>>>  object which is IsPcgs (polycyclic generating system, see 
>>>  http://www.gap-system.org/Manuals/doc/ref/chap45.html). If that 
> calculation is 
>>>  not successful, the group is not solvable, otherwise it is. Now you may 
> be 
>>>  interested to find the (undocumented!) function TryPcgsPermGroup which 
> does the 
>>>  actual job, see for any comments in the code, etc. 
>> 
>> 
>>  I have not try to read the source TryPcgsPermGroup and IsPcgs yet.
>> 
>>  Source code of IsSolvable was also included in the lib / grp.gi and lib / 
> grp.gd. 
>>  It is very easy to understand for me.
>> 
>>  myIsSolvable:=function ( x )
>>     local  d;
>>     d := DerivedSeries( x );
>>     return IsTrivial( d[Size( d )] );
>>  end
>> 
>> 
>>  gap> List([1..30], x -> myIsSolvable(SymmetricGroup(x))) = 
> List([1..30], x -> IsSolvable(SymmetricGroup(x)));
>>  true
>> 
>>  For Symmetric Group, the same results have been obtained. 
>>  So I'm going to try to do withmyIsSolvable function that uses the 
> DerivedSeries function.
>> 
>>  There was a difference of more than twice the run time to IsSolvable of 
> built-in and myIsSolvable Taking the profile.
>> 
>>  Built-in IsSolved Would has become the source code I hard to understand in 
> order to increase the execution speed?
>> 
>> 
> 
> Not really - the method for IsSolvable did not evolve from the code similar to 
> myIsSolvable at all.
> 
> Perhaps the key is to read about GAP method selection and learn the concept of 
> methods as bundles of functions:
> 
> http://www.gap-system.org/Manuals/doc/tut/chap8.html#X7AEED9AB824CD4DA
> 
> - that is, IsSolvable(G) will select the best available method to apply to G, 
> taking into account what's known about G at the moment. With myIsSolvable, 
> you enforce the calculation of DerivedSeries, while some of the methods may need 
> not to know the derived series at all to give an answer. The profile below just 
> illustrates this, since the number of methods involved in the calls to GAP's 
> IsSolvable is much smaller.
> 
> Best wishes
> Alexander
> 
> 
> 
> 
> 
>>  gap> ProfileGlobalFunctions( true );
>>  gap> ProfileOperationsAndMethods( true );
>>  gap> List( [1..30], x -> IsSolvable(SymmetricGroup(x))) ;
>>  [ true, true, true, true, false, false, false, false, false, false, false, 
> false, false, false, false, false, false, false, false, 
>>    false, false, false, false, false, false, false, false, false, false, 
> false ]
>>  gap> ProfileGlobalFunctions( false );
>>  gap> ProfileOperationsAndMethods( false );
>>  gap> DisplayProfile();
>>    count  self/ms  chld/ms  stor/kb  chld/kb  package  function              
>                                                       
>>       56        0       32        6      786  GAP      TryPcgsPermGroup      
>                                                       
>>       56        0       32        9      794  (oprt.)  IsSolvableGroup      
>                                                         
>>       30        0       32        0      804  (oprt.)  IsSolvable            
>                                                       
>>       28        0       32        0      794  GAP      IsSolvableGroup: for 
> permgrp                                                
>>   156491       40        0      741       15  (oprt.)  Add                  
>                                                         
>>        3       52        0       70        0           SortParallel: for two 
> dense and mutable lists                                
>>      574       16       40     2043      988  GAP      List                  
>                                                       
>>        4        4       80       96      213  (oprt.)  Sortex                
>                                                       
>>        4       60       52       72       70  (oprt.)  SortParallel          
>                                                       
>>     2028      272        0        0        0  (oprt.)  Position              
>                                                       
>>                72              2324                    OTHER                
>                                                         
>>               516              5365                    TOTAL                
>                                                         
>>  gap> ProfileGlobalFunctions( true );
>>  gap> ProfileOperationsAndMethods( true );
>>  gap> List( [1..30], x -> myIsSolvable(SymmetricGroup(x))) ;
>>  [ true, true, true, true, false, false, false, false, false, false, false, 
> false, false, false, false, false, false, false, false, 
>>    false, false, false, false, false, false, false, false, false, false, 
> false ]
>>  gap> ProfileGlobalFunctions( false );
>>  gap> ProfileOperationsAndMethods( false );
>>  gap> DisplayProfile();
>>    count  self/ms  chld/ms  stor/kb  chld/kb  package  function              
>                                                       
>>    11686        0        0        0        0           CanComputeIsSubset: 
> default: no, unless identical                            
>>    12708        4        4      198        0  GAP      IsOne: for a 
> multiplicative-element-with-one                                
>>    18151        8        4        0        0  (oprt.)  
> Tester(IsAssociative)                                                        
>>    12708       20        0        0      198  (oprt.)  IsOne                
>                                                         
>>    15776       12        4        0        0           OneImmutable: system 
> getter                                                  
>>    21144       16        4       29        0          
> GeneratorsOfMagmaWithInverses: system getter                                
>>    17646       12       12       18      173  (oprt.)  Representative: for 
> magma-with-one with known one                            
>>      382        0       32        5      269  (oprt.)  Setter(ParentAttr)    
>                                                       
>>    21144       16       16       18       29  (oprt.)  
> FreeGeneratorsOfFpGroup: for a free group                                    
>>        1        0       32       70       70  GAP      Sortex: for a mutable 
> list                                                  
>>     3391        8       24       92      191  GAP      SmallestMovedPoint: 
> for a collection of permutations                        
>>      382        0       32        7       12  GAP      Setter(ParentAttr): 
> method that calls 'UseSubsetRelation'                    
>>     8681        4       40        0      337  (oprt.)  SmallestMovedPoint    
>                                                       
>>    43634       16       36     1985      382  GAP      ForAll                
>                                                       
>>   185602       52        0      863        2  (oprt.)  Add                  
>                                                         
>>      757       44       16       17        0  GAP      UseSubsetRelation: 
> default method that checks maintenances and then returns *
>>      757        0       60        7       17  (oprt.)  UseSubsetRelation    
>                                                         
>>    53823       68        4    11517        0  GAP      
> InverseRepresentative                                                        
>>        3       76        0       70        0           SortParallel: for two 
> dense and mutable lists                                
>>     9945       20       72      194    12950  GAP      in: for a 
> permutation, and a permutation group                              
>>     5564       44       60     3915     2410  GAP      ChooseNextBasePoint  
>                                                         
>>        4        0      108      113      254  (oprt.)  Sortex                
>                                                       
>>   224034      116        0        0        0  (oprt.)  NumberOp: for a dense 
> list                                                  
>>     5564       84       60      498      168  GAP      
> AddGeneratorsExtendSchreierTree                                              
>>        5       76       76      113       70  (oprt.)  SortParallel          
>                                                       
>>    12526      280        4        0        0  (oprt.)  Position              
>                                                       
>>    94315      472        8    89804        0  GAP      SiftedPermutation    
>                                                         
>>    5564      184      804     8789    94952  GAP      StabChainStrong        
>                                                       
>>      265        8     1104       77   107182  GAP      ClosureGroup: 
> permgroup, elements, options                                  
>>      265        4     1112        0   107259  (oprt.)  ClosureGroup          
>                                                       
>>       62        0     1296        0   122301  (oprt.)  DerivedSubgroup      
>                                                         
>>       56       12     1284      162   122086  GAP      DerivedSubgroup: 
> permgrps                                                    
>>       30        0     1316        5   122489  GAP      DerivedSeriesOfGroup: 
> generic method for groups                              
>>       30        0     1316        0   122505  (oprt.)  DerivedSeries        
>                                                         
>>       30        0     1316        0   122505  (oprt.)  DerivedSeriesOfGroup  
>                                                       
>>       26       36     1324     2853   122729  GAP      List                  
>                                                       
>>               160              6531                    OTHER                
>                                                         
>>              1852            127963                    TOTAL                
>                                                         
>> 
>> 
>>  With best regards
>>  buynnnmmm1
>> 
>> 
>> 
>>  ----- Original Message -----
>>>  From: Alexander Konovalov <alexk at mcs.st-andrews.ac.uk>
>>>  To: buynnnmmm1 at yahoo.co.jp
>>>  Cc: GAP Forum <forum at gap-system.org>
>>>  Date: 2014/9/17, Wed 20:19
>>>  Subject: Re: [GAP Forum] Is it possible to step through the program, 
> like GNU GDB debugger, against built-in functions(ex. DerivedSubgroup, 
> ClosureSubgroupNC )?
>>> 
>>>  On 16 Sep 2014, at 22:52, buynnnmmm1 at yahoo.co.jp wrote:
>>> 
>>>>  Dear GAP forum,
>>>> 
>>>>  Is it possible to set break points against built-in functions (ex. 
>>>  DerivedSubgroup)?  
>>>> 
>>>>  Is it possible to step through the program, like GNU GDB debugger, 
> against 
>>>  built-in functions(ex. DerivedSubgroup, ClosureSubgroupNC )?
>>>> 
>>>>  Because I am a beginner the group theory , I would to examine in 
> detail 
>>>  what functions are doing in what procedure .
>>>> 
>>>>  I check http://www.gap-system.org/Manuals/doc/ref/chap7.html, but I 
> cannot 
>>>  find the function that set break points or step through the function.
>>> 
>>>  No, there is no such functionality, but there are workarounds and 
> alternatives.
>>> 
>>>  First, you can add the line like
>>> 
>>>  Error("Break point some text which you want to display...");
>>> 
>>>  in the code, and then you will be able to investigate local variables 
> from the 
>>>  break loop - see http://www.gap-system.org/Manuals/doc/ref/chap6.html
>>> 
>>>  Second, you already know from your previous post how to find the code 
> of the 
>>>  function. Since GAP is an interpreted language, you may try to paste 
> the code of 
>>>  the function into your session line by line and see what happens. 
>>> 
>>>  Finally, YMMV (your mileage may vary): looking at the method below for 
>>>  IsSolvableGroup itself will likely not give an insight into the 
> solvability of 
>>>  groups, it will just point to some other procedure: 
>>> 
>>>>  gap> g := SymmetricGroup(5);
>>>>  Sym( [ 1 .. 5 ] )
>>>>  gap> ApplicableMethod(IsSolvableGroup,[g]);
>>>>  function( G ) ... end
>>>>  gap> f := last;
>>>>  function( G ) ... end
>>>>  gap> Print(f);
>>>>  function ( G )
>>>>       local  pcgs;
>>>>       pcgs := TryPcgsPermGroup( G, false, false, true );
>>>>       if IsPcgs( pcgs )  then
>>>>           SetIndicesEANormalSteps( pcgs, pcgs!.permpcgsNormalSteps 
> );
>>>>           SetIsPcgsElementaryAbelianSeries( pcgs, true );
>>>>           if not HasPcgs( G )  then
>>>>               SetPcgs( G, pcgs );
>>>>           fi;
>>>>           if not HasPcgsElementaryAbelianSeries( G )  then
>>>>               SetPcgsElementaryAbelianSeries( G, pcgs );
>>>>           fi;
>>>>           return true;
>>>>       else
>>>>           return false;
>>>>       fi;
>>>>       return;
>>>>  end
>>> 
>>> 
>>>  What is does is that it calls TryPcgsPermGroup and then checks if it 
> returns the 
>>>  object which is IsPcgs (polycyclic generating system, see 
>>>  http://www.gap-system.org/Manuals/doc/ref/chap45.html). If that 
> calculation is 
>>>  not successful, the group is not solvable, otherwise it is. Now you may 
> be 
>>>  interested to find the (undocumented!) function TryPcgsPermGroup which 
> does the 
>>>  actual job, see for any comments in the code, etc. 
>>> 
>>>  Best wishes
>>>  Alexander
>>> 
> 



More information about the Forum mailing list