I'm sure that changing the convention would be greatly frowned upon. The SymPy documentation clearly states
``` Caution: when the cycles have common elements between them then the order in which the permutations are applied matters. The convention is that the permutations are applied from *right to left*. In the following, the transposition of elements 2 and 3 is followed by the transposition of elements 1 and 2: >>> Permutation(1, 2)(2, 3) == Permutation([(1, 2), (2, 3)]) True >>> Permutation(1, 2)(2, 3).list() [0, 3, 1, 2] If the first and second elements had been swapped first, followed by the swapping of the second and third, the result would have been [0, 2, 3, 1]. If, for some reason, you want to apply the cycles in the order they are entered, you can simply reverse the order of cycles: >>> Permutation([(1, 2), (2, 3)][::-1]).list() [0, 2, 3, 1] ``` But the matter of fixing the docs to reflect that `p*q` means `q` is applied first and then `p` still remains to be fixed. This should be opened as an issue. /c On Friday, March 12, 2021 at 4:21:47 PM UTC-6 [email protected] wrote: > Hi again, > > Note also that GAP handles permutations identically to SymPy, and the > manual states unambiguously that "GAP multiplies permutations from left to > right!": > > > https://college.cengage.com/mathematics/gallian/abstract_algebra/5e/shared/gap/gap_manual.pdf?URL=www.kau.edu.sa > > (p. 25). > > Again, this follows the conventional element interpretation, rather than > the position interpretation. I understand the arguments in favor of the > position interpretation, but I would encourage you to adopt the convention > that, as far as I can tell, is in wider use. > > Thanks, > Alex > > On Fri, Mar 12, 2021 at 1:34 PM Chris Smith <[email protected]> wrote: > >> ...but then I see in the notes "decomposing a cycle" where the author is >> definitely referring to elements being switched. But it makes sense to me >> to make the references refer to position so they can be applied regardless >> of the identity of the elements (as in Aaron's example using a string). >> This might be something to make clear at the outset of the Permutation >> documentation. >> >> If you are more comfortable working with swaps in the order given you can >> write a utility function something like this: >> >> ``` >> def eswap(*p): >> assert len(p)%2==0 >> big = max(p) >> rv = list(range(big+1)) >> for i,j in zip(p[::2],p[1::2]): >> k,l = [rv.index(w) for w in (i,j)] >> rv[k], rv[l] = rv[l],rv[k] >> return Permutation(rv) >> >> >>> eswap(1,3,1,2) >> (132) >> >>> eswap(1,2,1,3) >> (123) >> ``` >> /c >> >> On Friday, March 12, 2021 at 3:17:34 PM UTC-6 Chris Smith wrote: >> >>> From page two of the notes I reconstruct the same output >>> >>> ` >>> >>> (Permutation(1,5)(2,6,4)).list() >>> [0, 5, 6, 3, 2, 1, 4] >>> ` >>> Could it be that the semantics (which are the same when you start with >>> an ordered list and do only one cycle) are the confusing issue in that you >>> thought it meant elements but it really refers to position? >>> >>> /c >>> >>> On Friday, March 12, 2021 at 12:15:35 PM UTC-6 [email protected] wrote: >>> >>>> Hi Chris, >>>> >>>> The convention that I'm familiar with is that the notation (both cycle >>>> notation and the two-line notation) represents the exchange of >>>> *elements*, not positions. See for example >>>> >>>> >>>> http://www.math.caltech.edu/~2015-16/1term/ma006a/17.%20More%20permutations.pdf >>>> >>>> pp. 4--5. >>>> >>>> So my interpretation of t*s where t=(1,2) and s=(2,3) (multiplying from >>>> R to L) would be: >>>> >>>> 1 -s-> 1 -t-> 2 >>>> 2 -s-> 3 -t-> 3 >>>> 3 -s-> 2 -t-> 1, >>>> >>>> hence (1,2,3) ("1 goes to 2, 2 goes to 3, 3 goes to 1"), or (in list >>>> form) [0, 2, 3, 1]. >>>> >>>> Is transposition of elements from right to left (my interpretation) >>>> equivalent to transposition of positions from left to right (your >>>> interpretation)? I can't think of any counterexamples, but I'll chew on >>>> it. >>>> >>>> At the very least, I think that just specifying a multiplication >>>> direction without specifying what's being permuted (elements or positions) >>>> is ambiguous. >>>> >>>> Thanks again, >>>> Alex >>>> >>>> On Fri, Mar 12, 2021 at 8:29 AM Chris Smith <[email protected]> wrote: >>>> >>>>> My thinking is expression in the transformations of the original list >>>>> of items, [0,1,2,3]. If you first transpose the 2nd and third position >>>>> you >>>>> get [0,1,3,2] and then if you transpose 1st and 2nd position you get >>>>> [0,3,1,2]. You'll see my name all over the docs for that module so if you >>>>> can find the error in my thinking here, you are close to the source ;-) >>>>> >>>>> /c >>>>> >>>>> On Thursday, March 11, 2021 at 9:47:05 PM UTC-6 [email protected] >>>>> wrote: >>>>> >>>>>> Hi Chris, >>>>>> >>>>>> Thanks for your response. When you write, >>>>>> >>>>>> > If you let `p = Permutation(1,2)(2,3)` then `p.list()` gives `[0, >>>>>> 3, 1, 2]` which is consistent with R to L interpretation >>>>>> >>>>>> I think this is incorrect (and I contend that the docs are incorrect >>>>>> on this point as well). >>>>>> Multiplying the transpositions (1,2)(2,3) from R to L, we end up with >>>>>> the cycle (1,2,3), >>>>>> which in list form is [0, 2, 3, 1] (if `p.list()` is the second line >>>>>> of 2-line permutation notation). >>>>>> >>>>>> What do you think? >>>>>> >>>>>> On Thu, Mar 11, 2021 at 7:33 PM Chris Smith <[email protected]> wrote: >>>>>> >>>>>>> So documentation here, "The composite of two permutations p*q means >>>>>>> first apply p, then q" should read "...apply q, then p", right? This >>>>>>> would >>>>>>> be an easy issue to open and fix if there is consensus that it is wrong >>>>>>> as >>>>>>> written. But note that using the composition of function syntax >>>>>>> reverses >>>>>>> the order, "One can use also the notation p(i) = i^p, but then the >>>>>>> composition rule is (p*q)(i) = q(p(i)), not p(q(i)):" >>>>>>> >>>>>>> /c >>>>>>> >>>>>>> On Thursday, March 11, 2021 at 8:37:25 PM UTC-6 Chris Smith wrote: >>>>>>> >>>>>>>> Given elements `0,1,2,3`, `Permutation(1,2)(2,3)` interpreting R to >>>>>>>> L gives `0123->0132->0312`; interpreting L to R gives >>>>>>>> `0123->0213->0231` >>>>>>>> >>>>>>>> If you let `p = Permutation(1,2)(2,3)` then `p.list()` gives `[0, >>>>>>>> 3, 1, 2]` which is consistent with R to L interpretation. So the >>>>>>>> assumption >>>>>>>> that spelling it `Permutation(1,2)*Permutation(2,3)` means left to >>>>>>>> right >>>>>>>> must be wrong? >>>>>>>> >>>>>>>> /c >>>>>>>> >>>>>>>> On Monday, February 22, 2021 at 3:51:02 PM UTC-6 [email protected] >>>>>>>> wrote: >>>>>>>> >>>>>>>>> Hi everyone, >>>>>>>>> >>>>>>>>> I've been experimenting with the "Permutations" module, trying to >>>>>>>>> follow the examples in the documentation here: >>>>>>>>> >>>>>>>>> >>>>>>>>> https://docs.sympy.org/latest/modules/combinatorics/permutations.html >>>>>>>>> >>>>>>>>> As expected, >>>>>>>>> >>>>>>>>> Permutation(1, 2)(2, 3) == Permutation(1, 2) * Permutation(2, 3) >>>>>>>>> >>>>>>>>> But doesn't this mean that the permutations are applied from left >>>>>>>>> to right, since (as described in the docs) left-to-right permutation >>>>>>>>> multiplication p*q is equivalent to composition q o p? >>>>>>>>> >>>>>>>>> If so, this contradicts the documentation's claim that "The >>>>>>>>> convention is that the permutations are applied from *right to >>>>>>>>> left*". >>>>>>>>> >>>>>>>>> If not, I must be confused about something, and would appreciate >>>>>>>>> any corrections. >>>>>>>>> >>>>>>>>> Thanks for your help, >>>>>>>>> Alex >>>>>>>>> >>>>>>>>> -- >>>>>>> You received this message because you are subscribed to a topic in >>>>>>> the Google Groups "sympy" group. >>>>>>> To unsubscribe from this topic, visit >>>>>>> https://groups.google.com/d/topic/sympy/5MTQFwB7xIo/unsubscribe. >>>>>>> To unsubscribe from this group and all its topics, send an email to >>>>>>> [email protected]. >>>>>>> To view this discussion on the web visit >>>>>>> https://groups.google.com/d/msgid/sympy/7556df78-eb14-408c-bf38-326dafaa1318n%40googlegroups.com >>>>>>> >>>>>>> <https://groups.google.com/d/msgid/sympy/7556df78-eb14-408c-bf38-326dafaa1318n%40googlegroups.com?utm_medium=email&utm_source=footer> >>>>>>> . >>>>>>> >>>>>> -- >>>>> You received this message because you are subscribed to a topic in the >>>>> Google Groups "sympy" group. >>>>> To unsubscribe from this topic, visit >>>>> https://groups.google.com/d/topic/sympy/5MTQFwB7xIo/unsubscribe. >>>>> To unsubscribe from this group and all its topics, send an email to >>>>> [email protected]. >>>>> >>>> To view this discussion on the web visit >>>>> https://groups.google.com/d/msgid/sympy/b0302a20-7afa-48e7-ac63-2f467c0b164cn%40googlegroups.com >>>>> >>>>> <https://groups.google.com/d/msgid/sympy/b0302a20-7afa-48e7-ac63-2f467c0b164cn%40googlegroups.com?utm_medium=email&utm_source=footer> >>>>> . >>>>> >>>> -- >> You received this message because you are subscribed to a topic in the >> Google Groups "sympy" group. >> To unsubscribe from this topic, visit >> https://groups.google.com/d/topic/sympy/5MTQFwB7xIo/unsubscribe. >> To unsubscribe from this group and all its topics, send an email to >> [email protected]. >> > To view this discussion on the web visit >> https://groups.google.com/d/msgid/sympy/05b31174-bc37-45ed-8a34-bc69b636cc10n%40googlegroups.com >> >> <https://groups.google.com/d/msgid/sympy/05b31174-bc37-45ed-8a34-bc69b636cc10n%40googlegroups.com?utm_medium=email&utm_source=footer> >> . >> > -- You received this message because you are subscribed to the Google Groups "sympy" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/sympy/f0a0deb0-920f-4d42-abe8-9430f9dcf77fn%40googlegroups.com.
