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? 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 <al...@mcs.st-andrews.ac.uk> > To: buynnnm...@yahoo.co.jp > Cc: GAP Forum <fo...@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, buynnnm...@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 > _______________________________________________ Forum mailing list Forum@mail.gap-system.org http://mail.gap-system.org/mailman/listinfo/forum