I would like to use libgap in PermutationGroup_generic.random_element, because of the following:
sage: G = PermutationGroup([[(1,2,3),(4,5)], [(1,2)]])
sage: %timeit G(G._libgap_().Random(), check=False)
9.83 µs ± 24.8 ns per loop (mean ± std. dev. of 7 runs, 100,000 loops each)
sage: %timeit G(G._gap_().Random(), check=False)
6.73 ms ± 97 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
I think that's a factor of about 700.
However, I am running into a problem with randstate.pyx.
The code for random_element is:
```
def random_element(self):
...
current_randstate().set_seed_gap()
return self(self._gap_().Random(), check=False)
```
If I change the last line to use libgap, `set_seed_gap` does not achieve its goal anymore, because it uses the gap interface:
```
global _gap_seed_randstate
if _gap_seed_randstate is not self:
from sage.interfaces.gap import gap
if self._gap_saved_seed is not None:
mersenne_seed, classic_seed = self._gap_saved_seed
else:
from sage.rings.integer_ring import ZZ
seed = ZZ.random_element(1<<128)
classic_seed = seed
mersenne_seed = seed
prev_mersenne_seed = gap.Reset(gap.GlobalMersenneTwister, mersenne_seed)
prev_classic_seed = gap.Reset(gap.GlobalRandomSource, classic_seed)
if _gap_seed_randstate is not None:
_gap_seed_randstate._gap_saved_seed = \
prev_mersenne_seed, prev_classic_seed
_gap_seed_randstate = self
```
I'm currently trying to simply duplicate that function, replacing gap with libgap , but I would rather have only one that synchronizes the two.