On Tue, May 3, 2022 at 7:12 AM 'Martin R' via sage-devel
<sage-devel@googlegroups.com> wrote:
>
> I implemented (well, the implementation is trivial) the following, and I'd 
> like feedback.  I am not completely sure whether the interface for the second 
> variant, where the generators of the acting group are required, is ideal, but 
> I think it looks useable.
>
> A more serious problem is that orbits are currently computed twice: once when 
> creating the generators of the permutation group, and another time, when 
> asking for them.
>
> Martin
>

Hi Martin:

Thanks for programming this. I'd like to test it's functionality but
don't know your function's syntax. Something like

def PermutationGroup2(gens=None, gap_group=None, domain=None,
canonicalize=True, category=None, action=None):

maybe?

- David


>     """
>     ...
>     We can create a permutation group from a group action::
>
>         sage: A = lambda x: (2*x) % 6
>         sage: X = [0,1,2,3,4,5]
>         sage: G = PermutationGroup(action=A, domain=X)
>         sage: G.orbits()
>         [[0], [1, 2, 4], [3], [5]]
>
>         sage: A = lambda g, x: vector(g*x, immutable=True)
>         sage: X = [vector(x, immutable=True) for x in GF(3)^2]
>         sage: G = SL(2,3); G.gens()
>         (
>         [1 1]  [0 1]
>         [0 1], [2 0]
>         )
>         sage: H = PermutationGroup(G.gens(), action=A, domain=X)
>         sage: H.orbits()
>         [[(0, 0)], [(1, 0), (0, 2), (2, 2), (2, 0), (1, 2), (2, 1), (0, 1), 
> (1, 1)]]
>         sage: H.gens()
>         [((0,1),(1,1),(2,1))((0,2),(2,2),(1,2)),
>          ((1,0),(0,2),(2,0),(0,1))((1,1),(1,2),(2,2),(2,1))]
>     ...
>     """
>     if not is_ExpectElement(gens) and hasattr(gens, '_permgroup_'):
>         return gens._permgroup_()
>     if gens is not None and not isinstance(gens, (tuple, list, GapElement)):
>         raise TypeError("gens must be a tuple, list, or GapElement")
>     gap_group = kwds.get("gap_group", None)
>     domain = kwds.get("domain", None)
>     canonicalize = kwds.get("canonicalize", True)
>     category = kwds.get("category", None)
>     action = kwds.get("action", None)
>     if action is not None:
>         if domain is None:
>             raise ValueError("you must specify the domain for an action")
>         from sage.combinat.cyclic_sieving_phenomenon import 
> orbit_decomposition
>         if gap_group is not None:
>             raise ValueError("gap_group is not supported with action")
>         if gens is None and gap_group is None:
>             gens = [tuple(o) for o in orbit_decomposition(domain, action)]
>         else:
>             gens = [[tuple(o) for o in orbit_decomposition(domain, lambda x: 
> action(g, x))]
>                     for g in gens]
>     if args:
>         from sage.misc.superseded import deprecation
>         deprecation(31510, "gap_group, domain, canonicalize, category will 
> become keyword only")
>         if len(args) > 4:
>             raise ValueError("invalid input")
>         args = list(args)
>         gap_group = args.pop(0)
>         if args:
>             domain = args.pop(0)
>             if args:
>                 canonicalize = args.pop(0)
>                 if args:
>                     category = args.pop(0)
>     return PermutationGroup_generic(gens=gens, gap_group=gap_group, 
> domain=domain,
>                                     canonicalize=canonicalize, 
> category=category)
>
>
> On Monday, 2 May 2022 at 23:01:42 UTC+2 David Joyner wrote:
>>
>> On Mon, May 2, 2022 at 11:24 AM 'Martin R' via sage-devel
>> <sage-...@googlegroups.com> wrote:
>> >
>> > I am actually not sure anymore, which methods or functionality this class 
>> > should provide.
>> >
>> > Would it possibly be better to enhance PermutationGroup with an additional 
>> > optional "from_action" and "from_cyclic_action" argument? Eg.:
>> >
>> > PermutationGroup(domain = X, cyclic_action = lambda x: f(x))
>> >
>> > PermutationGroup(domain = X, group_action = (G, lambda g, x: f(g, x)))
>> >
>>
>> I like this idea!
>>
>> > Martin
>> > On Monday, 2 May 2022 at 14:20:57 UTC+2 kcrisman wrote:
>> >>
>> >> On Sunday, May 1, 2022 at 7:32:01 PM UTC-4 Travis Scrimshaw wrote:
>> >>>>>
>> >>>>> Sorry, I don't know an easy way. I've always just defined them by hand
>> >>>>> whenever needed.
>> >>>>> However, I agree with you that a better way is needed.
>> >>>>
>> >>>>
>> >>>> I would love for there to be some standard way to define a group action 
>> >>>> on a set - preferably maintaining other algebraic properties of the 
>> >>>> set, such as addition! But I don't know if there is even close to a 
>> >>>> standard way to do this either.
>> >>>
>> >>>
>> >>> - There is a standard way to do this, but not a generic method/class for 
>> >>> it IIRC. You can do this by implementing an _act_on_() method on a 
>> >>> wrapper class. Yet, this requires some manual input.
>> >>> - For cyclic actions, there is the DiscreteDynamicalSystem class 
>> >>> introduced in https://trac.sagemath.org/ticket/24128.
>> >>> - There is also the Representation class in 
>> >>> modules/with_basis/representation.py if you want to want to extend the 
>> >>> action on the set to the module with a basis given by that set.
>> >>>
>> >>> Likely we will want to implement a class SetWithAction that automates a 
>> >>> collects the orbit_decomposition functions and similar together as 
>> >>> methods as a single global entry point.
>> >>>
>> >>
>> >> Hmm, maybe a tutorial is needed for this. I would imagine that a lot of 
>> >> people who aren't familiar with how to create a new wrapper class would 
>> >> be the ones who need this. Of course, the FiniteGroupAction suggestion 
>> >> sounds quite welcome, too, though really having both options would be 
>> >> best.
>> >
>> > --
>> > You received this message because you are subscribed to the Google Groups 
>> > "sage-devel" group.
>> > To unsubscribe from this group and stop receiving emails from it, send an 
>> > email to sage-devel+...@googlegroups.com.
>> > To view this discussion on the web visit 
>> > https://groups.google.com/d/msgid/sage-devel/694a16d8-b59d-43bc-8b68-033c704284abn%40googlegroups.com.
>
> --
> You received this message because you are subscribed to the Google Groups 
> "sage-devel" group.
> To unsubscribe from this group and stop receiving emails from it, send an 
> email to sage-devel+unsubscr...@googlegroups.com.
> To view this discussion on the web visit 
> https://groups.google.com/d/msgid/sage-devel/641f204b-f89c-49f5-97d2-4ce8741ef04cn%40googlegroups.com.

-- 
You received this message because you are subscribed to the Google Groups 
"sage-devel" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to sage-devel+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/sage-devel/CAEQuuAX7XE3snH3jQuEmnUSZuqFOjmAq5B44aS%3DWfgc%2BBH%3DdfA%40mail.gmail.com.

Reply via email to