Some experimenting shows the following:

Applying W(-) to an element of the iterator is bad. In other words:

I.e. 

R = libgap.RightTransversal(W,G)

for w in R:
   v = W(w)

leads to some kind op corruption of R (which may manifest itself in 
different ways). It is hard to imagine how that is possible. Perhaps the 
element w keeps a reference to R which somehow gets corrupted when W(...) 
is applied? That seems far fetched but I can't think of anything else. I 
even tried to replace W by a copy (via WW=PermutationGroup(W.gens())) and 
then to use WW(w) but that made no difference.

Converting R to a list eliminates the corruption. Even if one does it 
manually. E.g. the following is fine.

L = []
for w in R:
    L.append(w)

for w in L:
    v = W(w)
 
Other variations of converting R to a list (e.g. using enumeration and 
R[i]) all work fine,

To me it really looks like a Sage/Cython bug.

Best,
Michel





On Saturday, February 7, 2026 at 7:20:47 AM UTC+1 [email protected] wrote:

> As I explained on the GitHub issue,
> it's more nuanced than that: RightTransversal is not a list, it's a 
> list-like object which need not behave as a real list.
>
> I don't know at the moment whether libgap (a library provided by the GAP 
> project) is capable of advertising to the user of their API 
> this fact, and how to find out what's safe to do with it, and what's not.
>
> I have asked for help here <https://github.com/gap-system/gap/issues/6223>
>
>
>
> On February 7, 2026 12:11:28 AM CST, 'Michel VAN DEN BERGH' via 
> sage-support <[email protected]> wrote:
>
>> IMHO it's not clear yet it's a GAP bug. If you use 
>> gap.RightTransversal(W,G) then there is no problem (but this is of course 
>> much slower).
>>
>> The fact that gap.RightTransversal(W,G) and 
>> list(libgap.RightTransversal(W,G)) both give the right thing suggest that 
>> GAP certainly knows the correct answer and that something goes wrong with 
>> forwarding it to Sage.
>>
>> So, unless further evidence to the contrary appears, my vote would be for 
>> a bug in the Sage-GAP interface.
>>
>> Best,
>> MIchel
>>
>>
>>
>>
>>
>>
>>
>>
>> On Friday, February 6, 2026 at 11:03:14 PM UTC+1 [email protected] wrote:
>>
>>> might it make sense to ask the gap people for help?
>>>
>>> Martin
>>>
>>> On Friday, 6 February 2026 at 22:57:54 UTC+1 Martin R wrote:
>>>
>>>> I think that this is a very serious bug, if you are unlucky, you might 
>>>> get wrong results without noticing.
>>>>
>>>> The failure in https://github.com/sagemath/sage/issues/33072 looks 
>>>> somewhat similar.
>>>>
>>>> Unfortunately, I have no idea how to debug it.
>>>> On Friday, 6 February 2026 at 16:20:28 UTC+1 [email protected] 
>>>> wrote:
>>>>
>>>>>
>>>>>
>>>>> On Thursday, February 5, 2026 at 6:39:18 PM UTC+1 dwrote:
>>>>>
>>>>> On Thu, Feb 5, 2026 at 9:59 AM 'Michel VAN DEN BERGH' via sage-support 
>>>>>
>>>>>  wrote: 
>>>>> > 
>>>>> > Ok here is the setting. It is rather specific. 
>>>>> > 
>>>>> > I have a group G (W(E8) in this example) and a left G equivariant 
>>>>> equivalence relation R on it. R is not known directly, but for any g in G 
>>>>> and any subset S of G I can efficiently check (complexity O(1)) if g is 
>>>>> equivalent to any element in S. I want to find representatives for G/R. 
>>>>> > 
>>>>> > Of course this is equivalent to determining the subgroup H={h in G | 
>>>>> h ~ 1} and a set of representatives for G/H. 
>>>>> > 
>>>>> > So what I do is I start with H={1}, S={1} and iterate over 
>>>>> representatives of g of G/H. If g is not equivalent to any element in S 
>>>>> then I add g to S. 
>>>>> > If g is equivalent to an element s in S then h=g^-1 s ~ 1 and I 
>>>>> replace H with the subgroup generated by H and h and repeat. 
>>>>> > 
>>>>> > The algorithm stops when |H| |S|=|G|. It works very efficiently, as 
>>>>> long as G/R is not too big (even if G itself is big). 
>>>>>
>>>>> Would it be more efficient to start from a subgroup G_1 of G and 
>>>>> compute the analog of R in G_1, and the corresponding H_1, first? 
>>>>> Then, for G and R, you can start with H=H_1, instead of H={1}, right? 
>>>>>
>>>>>
>>>>> Perhaps. But in the case I looked at then H becomes bigger quickly. So 
>>>>> starting with H={1} does not seem to be a problem. 
>>>>>
>>>>>
>>>>> Anyway, as FactorCosetAction is pretty fast, one can re-do it once a 
>>>>> new h to add to H is found. 
>>>>> The question is how to relate points of the domain O of the 
>>>>> permutation group f (where 
>>>>> f=libgap(W).FactorCosetAction(libgap(G)).Image(), 
>>>>> or, in the notation of this message, 
>>>>> f=libgap(G).FactorCosetAction(libgap(H)).Image()) 
>>>>>
>>>>> Each point of O is obtained by applying a sequence of generators of G 
>>>>> to 1 (i.e. to the coset {H}). 
>>>>> Classically, such a sequence can be obtained from the Schreier vector 
>>>>> (https://en.wikipedia.org/wiki/Schreier_vector). GAP itself does not 
>>>>> give you a ready access to a Schreier vector for an orbit, 
>>>>> but the GAP package orb has such a facility ( 
>>>>> libgap.LoadPackage("orb") will load it into the Sage session, 
>>>>> and you need gap_packages spkg installed, or, if your Sage install 
>>>>> uses system-wide GAP, you need it installed there). 
>>>>> So you'll need to call Orb() from orb package with option ": 
>>>>> schreier:=true" - this is something that has to be done via 
>>>>> libgap.function_factory(). And then use 
>>>>> TraceSchreierTreeForward (see 
>>>>> https://docs.gap-system.org/pkg/orb/doc/chap3_mj.html#X7F927E787BA898BF) 
>>>>>
>>>>> (or TraceSchreierTreeBack) to get the words. 
>>>>> Or you can roll your own orbit algorithm where you'd record Schreier 
>>>>> vector. 
>>>>>
>>>>> Does this make sense? 
>>>>>
>>>>>
>>>>> I think so. Thanks in any case for the very detailed explanation. I 
>>>>> need to study it more carefully though. In any case RightTransversal(W, 
>>>>> H) 
>>>>> works fine except for the bug. But I have a reasonable workaround.  I 
>>>>> remember the cosets where the bug is triggered and once H no longer 
>>>>> grows, 
>>>>> I convert  RightTransversal(W, H) to a list, to pick up the few cosets 
>>>>> that 
>>>>> were missed because of the bug.
>>>>>
>>>>> It is a mystery to me why list(RightTransversal(W, H)) does not suffer 
>>>>> from the bug, but it is what it is...
>>>>>
>>>>> Best,
>>>>> Michel
>>>>>
>>>>>
>>>>>
>>>>>  
>>>>>
>>>>>
>>>>> HTH 
>>>>> Dima 
>>>>>
>>>>>
>>>>>
>>>>> > 
>>>>> > Best, 
>>>>> > Michel 
>>>>> > 
>>>>> > 
>>>>> > 
>>>>> > 
>>>>> > 
>>>>> > On Thursday, February 5, 2026 at 4:33:15 PM UTC+1 wrote: 
>>>>> > 
>>>>> > In case you just want a permutation action of W on the cosets of G, 
>>>>> you can avoid dealing with cosets all together. 
>>>>> > sage: f=libgap(W).FactorCosetAction(libgap(G)).Image() 
>>>>> > sage: f.OrbitLength(1) 
>>>>> > 138240 
>>>>> > 
>>>>> > In fact, libgap(W).FactorCosetAction(libgap(G)) is a proper group 
>>>>> homomorphism, so you can go back and forth between W and f. 
>>>>> > If you explain what you wanted to do with your coset 
>>>>> representatives, I can say more... 
>>>>> > 
>>>>> > Dima 
>>>>> > 
>>>>> > On Thursday, February 5, 2026 at 6:15:17 AM UTC-6 wrote: 
>>>>> > 
>>>>> > Hmm I have to retract this last post.Using 
>>>>> > 
>>>>> > for i in range(0, len(R)): 
>>>>> > w = W(R[i]) 
>>>>> > 
>>>>> > still triggers the bug. 
>>>>> > 
>>>>> > Best, 
>>>>> > Michel 
>>>>> > 
>>>>> > 
>>>>> > 
>>>>> > 
>>>>> > 
>>>>> > 
>>>>> > 
>>>>> > 
>>>>> > 
>>>>> > On Thursday, February 5, 2026 at 12:57:16 PM UTC+1 Michel VAN DEN 
>>>>> BERGH wrote: 
>>>>> > 
>>>>> > On Thursday, February 5, 2026 at 12:15:21 PM UTC+1 wrote: 
>>>>> > 
>>>>> > As a workaround, I think that explicitly converting the gap list 
>>>>> returned by libgap.RightTransversal(W, G) into a python list helps. I.e., 
>>>>> > 
>>>>> > list(libgap.RightTransversal(W, G)) 
>>>>> > 
>>>>> > Martin 
>>>>> > 
>>>>> > 
>>>>> > I use this initially also for G=trivial (basically I am trying to 
>>>>> incrementally build the stabilizer of something by iterating over the 
>>>>> cosets of a stabilizing group already found) so constructing a list of 
>>>>> which only a small part will be consumed is a bit inconvenient. However 
>>>>> your issue suggests to use 
>>>>> > 
>>>>> > for i in range(0, len(R)): 
>>>>> > w = W(R[i]) 
>>>>> > 
>>>>> > This seems to work perfectly! 
>>>>> > 
>>>>> > I must say that I am mildly surprised that this works. I was 
>>>>> guessing that the coset representatives would be found on the fly in some 
>>>>> way. 
>>>>> > 
>>>>> > In any case: thanks for investigating and filing the issue! 
>>>>> > 
>>>>> > Best, 
>>>>> > Michel 
>>>>> > 
>>>>> > 
>>>>> > On Thursday, 5 February 2026 at 11:16:52 UTC+1 Martin R wrote: 
>>>>> > 
>>>>> > That's a huge example. 
>>>>> > 
>>>>> > sage: len(libgap.RightTransversal(W, G)) 
>>>>> > 138240 
>>>>> > 
>>>>> > I think it is a gap bug, I am checking right now. 
>>>>> > 
>>>>> > 
>>>>> > On Thursday, 5 February 2026 at 07:46:47 UTC+1 wrote: 
>>>>> > 
>>>>> > > This is very strange code - you are attempting to change the 
>>>>> variable of a loop inside a loop. 
>>>>> > > 
>>>>> > > What do you mean to do here? 
>>>>> > > 
>>>>> > > Dima 
>>>>> > 
>>>>> > Well that's not the point. Writing v=W(w) gives the same bug... 
>>>>> > 
>>>>> > Best, 
>>>>> > Michel 
>>>>> > 
>>>>> > PS. This was just some quick test code, but this being said, I think 
>>>>> assigning to a loop variable is fine. This does not influence the state 
>>>>> of 
>>>>> the iterator. A quick test confirms this. 
>>>>> > 
>>>>> > 
>>>>> > 
>>>>> > 
>>>>> > -- 
>>>>> > You received this message because you are subscribed to the Google 
>>>>> Groups "sage-support" group. 
>>>>>
>>>>> > To unsubscribe from this group and stop receiving emails from it, 
>>>>> send an email to. 
>>>>>
>>>>> > To view this discussion visit 
>>>>> https://groups.google.com/d/msgid/sage-support/2f5c40db-62ad-4e65-bfea-30f5e673ed39n%40googlegroups.com.
>>>>>  
>>>>>
>>>>>
>>>>>

-- 
You received this message because you are subscribed to the Google Groups 
"sage-support" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion visit 
https://groups.google.com/d/msgid/sage-support/7f8a6903-cfae-4b67-aec3-8e43c67c1343n%40googlegroups.com.

Reply via email to