Skip to content

Instantly share code, notes, and snippets.

@dharmatech
Last active July 23, 2017 23:43
Show Gist options
  • Save dharmatech/ba0bbfde102e064763d1ef5fba4107e1 to your computer and use it in GitHub Desktop.
Save dharmatech/ba0bbfde102e064763d1ef5fba4107e1 to your computer and use it in GitHub Desktop.

8.A.1 - A Book of Abstract Algebra by Charles C. Pinter

using System;
using System.Collections.Generic;
using System.Linq;

using static System.Console;

namespace pinter_8.A._1_multiplying_permutations
{
    class Program
    {
        static List<List<int>> parse(string s)
        {
            var result = new List<List<int>>();

            foreach (var elt in s)
            {
                if (elt == '(') result.Add(new List<int>());

                if (Char.IsDigit(elt)) result.Last().Add(elt - '0');
            }

            return result;
        }
        
        static void display(Dictionary<int, int> f)
        {
            foreach (var key in f.Keys.OrderBy(elt => elt)) Write($"{key} "); WriteLine();
            foreach (var key in f.Keys.OrderBy(elt => elt)) Write($"{f[key]} "); WriteLine();
        }

        static void display(List<List<int>> cycles)
        {
            foreach (var cycle in cycles)
            {
                Write("(");
                foreach (var i in cycle) Write(i);
                Write(")");
            }

            WriteLine();
        }

        // ----------------------------------------------------------------------

        static int apply(List<int> cycle, int a) => 
            cycle.Contains(a) ? cycle[(cycle.IndexOf(a) + 1) % cycle.Count] : a;
        
        static int apply_multiple(List<List<int>> cycles, int a) => 
            cycles.Reverse<List<int>>().Aggregate(a, (elt, cycle) => apply(cycle, elt));

        static Dictionary<int, int> cycles_to_permutation(List<List<int>> cycles, int n) => 
            Enumerable.Range(1, n).ToDictionary(i => i, i => apply_multiple(cycles, i));
        
        static List<T> LS<T>(params T[] items) => new List<T>(items);

        static void display_cycles_as_permutation(List<List<int>> cycles, int n)
        {
            display(cycles);

            display(cycles_to_permutation(cycles, n));
        }

        static void display_cycles_as_permutation(string s, int n) => 
            display_cycles_as_permutation(parse(s), n);

        static void Main(string[] args)
        {
            display_cycles_as_permutation("(145)(37)(682)",      9); WriteLine();
            display_cycles_as_permutation("(17)(628)(9354)",     9); WriteLine();
            display_cycles_as_permutation("(71825)(36)(49)",     9); WriteLine();
            display_cycles_as_permutation("(12)(347)",           9); WriteLine();
            display_cycles_as_permutation("(147)(1678)(74132)",  9); WriteLine();
            display_cycles_as_permutation("(6148)(2345)(12493)", 9); WriteLine();
        }
    }
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment