gap-packages / io

GAP package IO to do input and output
https://gap-packages.github.io/io/
Other
14 stars 14 forks source link

Pickle FpGroups #87

Open kiryph opened 3 years ago

kiryph commented 3 years ago

I miss the possibility to store a larger list of FpGroups to a file. As far as I know, only permutation and matrix groups are implemented:

https://github.com/gap-packages/io/blob/a911c8866781aaac2948e19252266fddd529fe78/gap/pickle.gi#L1155-L1209

For example:

gap> L24fp;
[ Group([ g1, g2, g3, g4 ]), Group([ g1, g2, g3, g5*g4^-1 ]), Group([ g1, g2, g3, g4^-2 ]), Group([ g1, g2, g3, g4^3 ]), Group([ g1, g2, g3, g4^-1*g5^2*g4^-1 ]), 
  Group([ g1, g2, g3, g4^-4 ]), Group([ g1, g2, g4 ]), Group([ g1, g2, g4^-2, g5*g4^-1 ]), Group([ g1, g2, g5*g4^-1, g3*g5*g4^-1*g3^-1 ]), 
  Group([ g1, g2, g5*g4^-1, g3*g4^-2*g3^-1 ]), Group([ g1, g2, g5*g4^-1, g3*g4^2*g5^-1*g3^-1 ]), Group([ g1, g2, g5*g4^-1, g3*g4^3*g3^-1 ]), 
  Group([ g1, g2, g5*g4^-1, g3*g4^-2*g5*g4^-1*g3^-1 ]), Group([ g1, g2, g5*g4^-1, g3*g4^-4*g3^-1 ]), Group([ g1, g2, g5*g4, g4^3 ]), Group([ g1, g2, g5*g4, g4^-4 ]), 
  Group([ g1, g2, g5*g4, g4^5 ]), Group([ g1, g2, g5*g4, g4^-6 ]), Group([ g1, g2, g5*g4, g4^7 ]), Group([ g1, g2, g5*g4, g4^-8 ]), Group([ g1, g2, g4^-2 ]), 
  Group([ g1, g2, g3*g4^-2*g3^-1, g4^-4 ]), Group([ g1, g2, g4^-2*g5^-1*g4^-1 ]), Group([ g1, g2, g3*g4^-2*g3^-1, g4^-2*g5*g4^-1 ]), Group([ g1, g3, g4 ]), 
  Group([ g1, g3, g5*g4^-1 ]), Group([ g1, g3, g4^-2 ]), Group([ g1, g3, g4^-1*g5^2*g4^-1 ]), Group([ g1, g3, g4^3 ]), Group([ g1, g4 ]), 
  Group([ g1, g4*g2^-1, g4^-1*g2^-1 ]), Group([ g1, g4*g2^-1, g3*g4^-2*g3^-1 ]), Group([ g1, g4*g2^-1, g3*g4^3*g3^-1 ]), Group([ g1, g4*g2^-1, g3*g4^-4*g3^-1 ]), 
  Group([ g1, g4^-2, g5*g4^-1 ]), Group([ g1, g5*g4^-1, g3*g5*g4^-1*g3^-1 ]), Group([ g1, g5*g4^-1, g3*g4^-2*g3^-1 ]), Group([ g1, g5*g4, g2*g4^2 ]), 
  Group([ g1, g4^-2, g5^-2, g2*g4*g5^-1 ]), Group([ g1, g2*g4*g5^-1, g3*g4^-2*g3^-1 ]), Group([ g1, g5*g4, g4^3 ]), Group([ g1, g5*g4, g4^3*g2^-1 ]), 
  Group([ g1, g5*g4, g4^-4 ]), Group([ g1, g5*g4, g2*g4^4 ]), Group([ g1, g2*g4*g5, g2*g4^-2 ]), Group([ g1, g2*g4*g5, g2*g4^-1*g5^-1, g4^-4 ]), 
  Group([ g1, g2*g4*g5, g2*g4^-1*g5^-1, g4^-2*g5*g4^-1 ]), Group([ g1, g2*g4^2, g2*g4^-2 ]), Group([ g1, g4^-2 ]), Group([ g2, g3, g4 ]), Group([ g2, g3, g5*g4^-1 ]), 
  Group([ g2, g3, g4^-2 ]), Group([ g2, g3, g4^2*g5^-1 ]), Group([ g2, g3, g4^3 ]), Group([ g2, g3, g4^-1*g5^2*g4^-1 ]), Group([ g2, g4, g5 ]), 
  Group([ g2, g4, g5^-2, g1*g3^-1*g5^-1 ]), Group([ g2, g4, g5^-2 ]), Group([ g2, g4, g5^3 ]), Group([ g2, g4, g1*g3^-1*g5^3 ]), Group([ g2, g4, g5^-4 ]), 
  Group([ g2, g5*g4^-1, g1*g4^2 ]), Group([ g2, g5*g4^-1, g3*g5*g4^-1*g3^-1 ]), Group([ g2, g5*g4^-1, g4*g3^-1*g4^-1*g3, g4^3*g1^-1 ]), 
  Group([ g2, g5*g4^-1, g3*g4^-2*g3^-1 ]), Group([ g2, g5*g4^-1, g1*g3*g4^2*g3^-1 ]), Group([ g2, g5^-2, g1*g3*g5^-1, g4^-4 ]), Group([ g2, g4^-2, g5^-2 ]), 
  Group([ g2, g4^-2, g3*g4^2*g1^-1 ]), Group([ g2*g1^-1, g3, g4 ]), Group([ g2*g1^-1, g3, g5*g4^-1 ]), Group([ g2*g1^-1, g3, g4^-2 ]), 
  Group([ g2*g1^-1, g3, g4^-1*g5^2*g4^-1 ]), Group([ g2*g1^-1, g3, g4^3 ]), Group([ g2*g1^-1, g4 ]), Group([ g2*g1^-1, g4*g1^-1, g4^-1*g1^-1 ]), 
  Group([ g2*g1^-1, g4*g1^-1, g4^-3*g1^-1 ]), Group([ g2*g1^-1, g4*g1^-1, g4^-5*g1^-1 ]), Group([ g2*g1^-1, g4*g1^-1, g4^-7*g1^-1 ]), 
  Group([ g2*g1^-1, g4*g3^-1, g4^-1*g3 ]), Group([ g2*g1^-1, g4^-1*g3, g3*g5^2 ]), Group([ g2*g1^-1, g4^-1*g3, g4^2*g5^-1*g3^-1 ]), Group([ g2*g1^-1, g4^-2, g5*g4^-1 ]), 
  Group([ g2*g1^-1, g5*g4^-1, g3*g5*g4^-1*g3^-1 ]), Group([ g2*g1^-1, g5*g4^-1, g4*g3^-1*g4^-1*g3, g4^3*g1^-1 ]), Group([ g2*g1^-1, g5*g4^-1, g3*g4^-2*g3^-1 ]), 
  Group([ g2*g1^-1, g5*g4, g4^3 ]), Group([ g2*g1^-1, g5*g4, g4^-4 ]), Group([ g2*g1^-1, g1*g4*g5, g4^-4 ]), Group([ g2*g1^-1, g4^-2 ]), Group([ g3, g4 ]), 
  Group([ g3, g5*g4^-1 ]), Group([ g3, g4^-2 ]), Group([ g4, g5 ]), Group([ g4, g5*g2^-1, g5^-1*g2^-1 ]), Group([ g4, g5*g2^-1, g1*g3^-1*g5 ]), 
  Group([ g4, g5*g2^-1, g5^-3*g2^-1 ]), Group([ g4, g5*g2^-1, g1*g3^-1*g5^3 ]), Group([ g4, g5^-2, g1*g3^-1*g5^-1 ]), Group([ g4, g1*g3^-1*g5^-1, g5^-4 ]), 
  Group([ g4, g5^-2, g2*g3*g4^-1*g1^-1 ]), Group([ g4, g5^-2 ]), Group([ g4, g5^-4, g1*g2*g3^-1*g5^-2 ]), Group([ g4*g2^-1, g5*g2^-1, g1*g2*g4 ]), 
  Group([ g4*g2^-1, g5*g2^-1, g3*g4^-2*g3^-1 ]), Group([ g4*g2^-1, g5*g2^-1, g1*g2*g4^3 ]), Group([ g4*g2^-1, g4^-1*g2^-1, g5^-2 ]), 
  Group([ g4*g2^-1, g4^-1*g2^-1, g3*g4^2*g1^-1 ]), Group([ g4*g3^-1, g4^-1*g3, g5*g3^-1 ]), Group([ g5*g4^-1, g1*g2*g4^-1, g3*g4^-2*g3^-1 ]), 
  Group([ g5*g4^-1, g1*g4^2 ]) ]

Documentation on Extending the pickling framework can be found here: https://gap-packages.github.io/io/doc/chap5_mj.html#X7B1C9A9C7D3C0312

fingolfin commented 3 years ago

Sure, something like this would be nice, also for pc groups. If anybody is interested in working on this, patches are welcome.

Note that pickling fp groups is a bit tricky, as each fp group has its own family, and one has to be very careful to handle this correctly when e.g. also pickling list of elements of fp groups.