<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://drorbn.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Tholden</id>
	<title>Drorbn - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://drorbn.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Tholden"/>
	<link rel="alternate" type="text/html" href="https://drorbn.net/index.php?title=Special:Contributions/Tholden"/>
	<updated>2026-04-23T09:20:19Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.39.6</generator>
	<entry>
		<id>https://drorbn.net/index.php?title=11-1100/Homework_Assignment_5&amp;diff=11103</id>
		<title>11-1100/Homework Assignment 5</title>
		<link rel="alternate" type="text/html" href="https://drorbn.net/index.php?title=11-1100/Homework_Assignment_5&amp;diff=11103"/>
		<updated>2011-12-02T22:41:46Z</updated>

		<summary type="html">&lt;p&gt;Tholden: /* Solve the following questions */  Spelling Mistake&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{11-1100/Navigation}}&lt;br /&gt;
===The Final Exam===&lt;br /&gt;
The Final Exam will take place on Friday December 9, 10-1 at Bahen 6183. You may expect very approximately one third of the exam to be about class-proven theorems, one third to be repeats of HW problems and/or exam problems from this year or last, and one third to be fresh exercises. You will have to solve about 5 out of about 6 problems. It is likely that the overall shape of the exam will be similar to last year&#039;s final exam, which can be found at [[10-1100/Final Exam]].&lt;br /&gt;
&lt;br /&gt;
When I was a student, before exams I usually made sure that I &#039;&#039;&#039;absolutely&#039;&#039;&#039; understand all class material and I worried less about the exercises, on the assumption that class was about the most important knowledge and that if I really understood all that was done in class, the exercises would follow relatively easily. That was my strategy; it worked well for me, but what works for you is not for me to tell.&lt;br /&gt;
&lt;br /&gt;
===Last Week&#039;s Schedule===&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red; margin:0; padding:0&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Warning.&#039;&#039;&#039; This schedule is subject to changes. Recheck this web site the day before any activity.&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{|border=1 cellspacing=0&lt;br /&gt;
|-&lt;br /&gt;
|Tuesday December 6&lt;br /&gt;
|10-12&lt;br /&gt;
|Last Class&lt;br /&gt;
|-&lt;br /&gt;
|Wednesday December 7&lt;br /&gt;
|12-2&lt;br /&gt;
|{{Dror}}&#039;s office hours, Bahen 6178.&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2PM&lt;br /&gt;
|HW5 &amp;quot;early bird&amp;quot; due date. If you submit HW5 by this time, it will be marked by noon of the following day.&lt;br /&gt;
|-&lt;br /&gt;
|Thursday December 8&lt;br /&gt;
|10:30-12:30&lt;br /&gt;
|{{Dror}}&#039;s office hours, Bahen 6178.&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|Noon&lt;br /&gt;
|HW5 is due in {{Dror}}&#039;s office, to be graded after the final. Also, at this time &amp;quot;early bird&amp;quot; marked HW5 can be collected at {{Dror}}&#039;s office.&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3-5&lt;br /&gt;
|Stephen Morgan&#039;s office hours, at Huron 1028.&lt;br /&gt;
|-&lt;br /&gt;
|Friday December 9&lt;br /&gt;
|10-1&lt;br /&gt;
|The Final Exam.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Solve the following questions===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Problem 1.&#039;&#039;&#039; Let &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; be a module over a PID &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt;. Assume that &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; is isomorphic to &amp;lt;math&amp;gt;R^k\oplus R/\langle a_1\rangle\oplus R/\langle a_2\rangle\oplus\cdots\oplus R/\langle a_l\rangle&amp;lt;/math&amp;gt;, with &amp;lt;math&amp;gt;a_i&amp;lt;/math&amp;gt; non-zero non-units and with &amp;lt;math&amp;gt;a_1\mid a_2\mid\cdots\mid a_l&amp;lt;/math&amp;gt;. Assume also that &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; is isomorphic to &amp;lt;math&amp;gt;R^m\oplus R/\langle b_1\rangle\oplus R/\langle b_2\rangle\oplus\cdots\oplus R/\langle b_n\rangle&amp;lt;/math&amp;gt;, with &amp;lt;math&amp;gt;b_i&amp;lt;/math&amp;gt; non-zero non-units and with &amp;lt;math&amp;gt;b_1\mid b_2\mid\cdots\mid b_l&amp;lt;/math&amp;gt;. Prove that &amp;lt;math&amp;gt;k=m&amp;lt;/math&amp;gt;, that &amp;lt;math&amp;gt;l=n&amp;lt;/math&amp;gt;, and that &amp;lt;math&amp;gt;a_i\sim b_i&amp;lt;/math&amp;gt; for each &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Problem 2.&#039;&#039;&#039; Let &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; be primes in a PID &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; such that &amp;lt;math&amp;gt;p\not\sim q&amp;lt;/math&amp;gt;, let &amp;lt;math&amp;gt;\hat{p}&amp;lt;/math&amp;gt; denote the operation of &amp;quot;multiplication by &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;&amp;quot;, acting on any &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt;-module &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;, and let &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; be positive integers.&lt;br /&gt;
# For each of the &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt;-modules &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;R/\langle q^t\rangle&amp;lt;/math&amp;gt;, and &amp;lt;math&amp;gt;R/\langle p^t\rangle&amp;lt;/math&amp;gt;, determine &amp;lt;math&amp;gt;\ker\hat{p}^s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;(R/\langle p\rangle)\otimes\ker\hat{p}^s&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Explain why this approach for proving the uniqueness in the structure theorem for finitely generated modules fails.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Problem 3.&#039;&#039;&#039; (comprehensive exam, 2009) Find the tensor product of the &amp;lt;math&amp;gt;{\mathbb C}[t]&amp;lt;/math&amp;gt; modules &amp;lt;math&amp;gt;{\mathbb C}[t,t^{-1}]&amp;lt;/math&amp;gt; (&amp;quot;Laurent polynomials in &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;&amp;quot;) and &amp;lt;math&amp;gt;{\mathbb C}&amp;lt;/math&amp;gt; (here &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; acts on &amp;lt;math&amp;gt;{\mathbb C}&amp;lt;/math&amp;gt; as &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Problem 4.&#039;&#039;&#039; (from Selick) Show that if &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; is a PID and &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; is a multiplicative subset of &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; then &amp;lt;math&amp;gt;S^{-1}R&amp;lt;/math&amp;gt; is also a PID.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Definition.&#039;&#039;&#039; The &amp;quot;rank&amp;quot; of a module &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; over a (commutative) domain &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; is the maximal number of &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt;-linearly-independent elements of &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;. (Linear dependence and independence is defined as in vector spaces).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Definition.&#039;&#039;&#039; An element &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; of a module &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; over a commutative domain &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; is called a &amp;quot;torsion element&amp;quot; if there is a non-zero &amp;lt;math&amp;gt;r\in R&amp;lt;/math&amp;gt; such that &amp;lt;math&amp;gt;rm=0&amp;lt;/math&amp;gt;. Let &amp;lt;math&amp;gt;\mbox{Tor }M&amp;lt;/math&amp;gt; denote the set of all torsion elements of &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;. (Check that &amp;lt;math&amp;gt;\mbox{Tor }M&amp;lt;/math&amp;gt; is always a submodule of &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;, but don&#039;t bother writing this up). A module &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; is called a &amp;quot;torsion module&amp;quot; if &amp;lt;math&amp;gt;M=\mbox{Tor }M&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Problem 5.&#039;&#039;&#039; (Dummit and Foote, page 468) Let &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; be a module over a commutative domain &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Suppose that &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; has rank &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; and that &amp;lt;math&amp;gt;x_1,\ldots x_n&amp;lt;/math&amp;gt; is a maximal set of linearly independent elements of &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;. Show that &amp;lt;math&amp;gt;\langle x_1,\ldots x_n\rangle&amp;lt;/math&amp;gt; is isomorphic to &amp;lt;math&amp;gt;R^n&amp;lt;/math&amp;gt; and that &amp;lt;math&amp;gt;M/\langle x_1,\ldots x_n\rangle&amp;lt;/math&amp;gt; is a torsion module.&lt;br /&gt;
# Conversely show that if &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; contains a submodule &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; which is isomorphic to &amp;lt;math&amp;gt;R^n&amp;lt;/math&amp;gt; for some &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, and so that &amp;lt;math&amp;gt;M/N&amp;lt;/math&amp;gt; is torsion, then the rank of &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; is &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Problem 6.&#039;&#039;&#039; (see also Dummit and Foote, page 469) Show that the ideal &amp;lt;math&amp;gt;\langle 2,x\rangle&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;R={\mathbb Z}[x]&amp;lt;/math&amp;gt;, regarded as a module over &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt;, is finitely generated but cannot be written in the form &amp;lt;math&amp;gt;R^k\oplus\bigoplus R/\langle p_i^{s_i}\rangle&amp;lt;/math&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Tholden</name></author>
	</entry>
	<entry>
		<id>https://drorbn.net/index.php?title=11-1100/Navigation&amp;diff=11096</id>
		<title>11-1100/Navigation</title>
		<link rel="alternate" type="text/html" href="https://drorbn.net/index.php?title=11-1100/Navigation&amp;diff=11096"/>
		<updated>2011-11-29T16:19:40Z</updated>

		<summary type="html">&lt;p&gt;Tholden: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;Back to [[11-1100]].&amp;lt;br/&amp;gt;&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
{| border=&amp;quot;1px&amp;quot; cellpadding=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; width=&amp;quot;100%&amp;quot; style=&amp;quot;font-size: small; align: left&amp;quot;&lt;br /&gt;
|- align=left&lt;br /&gt;
!#&lt;br /&gt;
!Week of...&lt;br /&gt;
!Notes and Links&lt;br /&gt;
|- align=left&lt;br /&gt;
|align=center|1&lt;br /&gt;
|Sep 12&lt;br /&gt;
|[[11-1100/About This Class|About This Class]], [[11-1100/Classnotes for Tuesday September 13|Tuesday]] - Non Commutative Gaussian Elimination, [[11-1100/Classnotes for Thursday September 15|Thursday]] - NCGE completed, the category of groups, images and kernels.&lt;br /&gt;
|- align=left&lt;br /&gt;
|align=center|2&lt;br /&gt;
|Sep 19&lt;br /&gt;
|I&#039;ll be in {{Home link|Talks/Strasbourg-1109/|Strasbourg}}, class was be taught by [http://www.math.toronto.edu/selick/ Paul Selick]. See my {{Home link|classes/1112/1100-AlgebraI/The_Selick_Week.html|summary}}.&lt;br /&gt;
|- align=left&lt;br /&gt;
|align=center|3&lt;br /&gt;
|Sep 26&lt;br /&gt;
|[[11-1100/Class Photo|Class Photo]], [[11-1100/Homework Assignment 1| HW1]], [[11-1100/Homework Assignment 1 Submissions| HW1 Submissions]], [[11-1100/Homework Solutions#Sample solutions to Homework Assignment 1| HW 1 Solutions]]&lt;br /&gt;
|- align=left&lt;br /&gt;
|align=center|4&lt;br /&gt;
|Oct 3&lt;br /&gt;
|[[11-1100/The Simplicity of the Alternating Groups| The Simplicity of the Alternating Groups]]&lt;br /&gt;
|- align=left&lt;br /&gt;
|align=center|5&lt;br /&gt;
|Oct 10&lt;br /&gt;
|[[11-1100/Homework Assignment 2|HW2]], [[11-1100/Homework Solutions#Sample solutions to Homework Assignment 2| HW 2 Solutions]]&lt;br /&gt;
|- align=left&lt;br /&gt;
|align=center|6&lt;br /&gt;
|Oct 18&lt;br /&gt;
|[[11-1100/Groups of Order 60 and 84|Groups of Order 60 and 84]]&lt;br /&gt;
|- align=left&lt;br /&gt;
|align=center|7&lt;br /&gt;
|Oct 24&lt;br /&gt;
|Extra office hours: Monday 10:30-12:30 (Dror), 5PM-7PM @ Huron 1028 (Stephen). [[11-1100/Term Test|Term Test]] on Tuesday. [[11-1100/Summary for the midterm| Summary for the midterm exam]]. [[11-1100/Term Test Solutions|Term Test - Sample Solutions ]]&lt;br /&gt;
|- align=left&lt;br /&gt;
|align=center|8&lt;br /&gt;
|Oct 31&lt;br /&gt;
|[[11-1100/Homework Assignment 3|HW3]], [[11-1100/Homework Solutions#Sample solutions to Homework Assignment 3| HW 3 Solutions]]&lt;br /&gt;
|- align=left&lt;br /&gt;
|align=center|9&lt;br /&gt;
|Nov 7&lt;br /&gt;
|Monday-Tuesday is November Break, {{Pensieve Link|Classes/11-1100/1t2c4w.pdf|One Theorem, Two Corollaries, Four Weeks}}&lt;br /&gt;
|- align=left&lt;br /&gt;
|align=center|10&lt;br /&gt;
|Nov 14&lt;br /&gt;
|[[11-1100/Homework Assignment 4|HW4]], [[11-1100/Homework Solutions#Sample solutions to Homework Assignment 4| HW 4 Solutions]]&lt;br /&gt;
|- align=left&lt;br /&gt;
|align=center|11&lt;br /&gt;
|Nov 21&lt;br /&gt;
|&lt;br /&gt;
|- align=left&lt;br /&gt;
|align=center|12&lt;br /&gt;
|Nov 28&lt;br /&gt;
|[[11-1100/Homework Assignment 5|HW5 and last week&#039;s schedule]]&lt;br /&gt;
|- align=left&lt;br /&gt;
|align=center|13&lt;br /&gt;
|Dec 5&lt;br /&gt;
|UofT Fall Semester ends Wednesday; our [[10-1100/Final Exam|Final Exam]] will be on Friday&lt;br /&gt;
|- align=left&lt;br /&gt;
|colspan=3 align=center|[[11-1100/Register of Good Deeds|Register of Good Deeds]]&lt;br /&gt;
|- align=left&lt;br /&gt;
|colspan=3 align=center|[[Image:11-1100-ClassPhoto.jpg|310px]]&amp;lt;br/&amp;gt;[[11-1100/Class Photo|Add your name / see who&#039;s in!]]&lt;br /&gt;
|- align=left&lt;br /&gt;
|colspan=3 align=center|[[Image:10-1100-Splash.png|310px]]&amp;lt;br/&amp;gt;See {{Home Link|classes/1112/1100-AlgebraI/NCGE.html|Non Commutative Gaussian Elimination}}&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Tholden</name></author>
	</entry>
	<entry>
		<id>https://drorbn.net/index.php?title=11-1100/Homework_Solutions&amp;diff=11095</id>
		<title>11-1100/Homework Solutions</title>
		<link rel="alternate" type="text/html" href="https://drorbn.net/index.php?title=11-1100/Homework_Solutions&amp;diff=11095"/>
		<updated>2011-11-29T16:07:28Z</updated>

		<summary type="html">&lt;p&gt;Tholden: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{11-1100/Navigation}}&lt;br /&gt;
&lt;br /&gt;
==Sample solutions to Homework Assignment 1==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; align = &amp;quot;center&amp;quot;&lt;br /&gt;
|+ Please Input Your Information Here&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Last Name&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | First Name&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | User ID&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Link to Submission&lt;br /&gt;
|-&lt;br /&gt;
| Smith || Jerrod || [[User:Smith36j|Smith36j]] || [[Media:Smith-HW1Soln.pdf | Solutions]]&lt;br /&gt;
|-&lt;br /&gt;
| Holden || Tyler || [[User:Tholden|tholden]] || [[Media:HoldenAlgHW1.pdf | Solutions]]&lt;br /&gt;
|-&lt;br /&gt;
| Mracek || James || [[User:jmracek|jmracek]] || [[Media:jmracekHW1.pdf | Solutions]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Sample solutions to Homework Assignment 2==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; align = &amp;quot;center&amp;quot;&lt;br /&gt;
|+ Please Input Your Information Here&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Last Name&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | First Name&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | User ID&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Link to Submission&lt;br /&gt;
|-&lt;br /&gt;
| Holden || Tyler || [[User:tholden|tholden]] || [[Media:HoldenHW2.pdf|Solutions]]&lt;br /&gt;
|-&lt;br /&gt;
| Mracek || James || [[User:jmracek|jmracek]] || [[Media:jmracekHW2.pdf | Solutions]] &lt;br /&gt;
|-&lt;br /&gt;
| Smith || Jerrod || [[User:Smith36j|Smith36j]] || [[Media:JMS_MAT1100_HW2.pdf | Solutions]] &lt;br /&gt;
|-&lt;br /&gt;
| Grigorios || Fournodavlos || [[User:Gregdavlos|Gregdavlos]] || [[Media:GD_MAT1100_HW2.pdf | Solutions]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Sample solutions to Homework Assignment 3==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; align = &amp;quot;center&amp;quot;&lt;br /&gt;
|+ Please Input Your Information Here&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Last Name&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | First Name&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | User ID&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Link to Submission&lt;br /&gt;
|-&lt;br /&gt;
| Holden || Tyler || [[User:tholden|tholden]] || [[Media:HoldenHW3.pdf|Solutions]]&lt;br /&gt;
|-&lt;br /&gt;
| Thibault || Louis-Philippe || [[User:Lp.thibault|Lp.thibault]] || [[Media:11-1100HW3.pdf|Solutions]]&lt;br /&gt;
|-&lt;br /&gt;
| Smith|| Jerrod || [[User:Smith36j|Smith36j]] ||[[Media:11-1100_JMS_HW3.pdf |Solutions]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Sample solutions to Homework Assignment 4==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; align = &amp;quot;center&amp;quot;&lt;br /&gt;
|+ Please Input Your Information Here&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Last Name&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | First Name&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | User ID&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Link to Submission&lt;br /&gt;
|-&lt;br /&gt;
| Holden || Tyler || [[User:tholden|tholden]] || [[Media:HoldenHW4.pdf|Solutions]]&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Tholden</name></author>
	</entry>
	<entry>
		<id>https://drorbn.net/index.php?title=User:Tholden&amp;diff=11094</id>
		<title>User:Tholden</title>
		<link rel="alternate" type="text/html" href="https://drorbn.net/index.php?title=User:Tholden&amp;diff=11094"/>
		<updated>2011-11-29T15:25:24Z</updated>

		<summary type="html">&lt;p&gt;Tholden: /* Assignments */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hello and welcome to my user page.&lt;br /&gt;
&lt;br /&gt;
I will be using this page to publish my course notes, as well as a hyperlink to pages made before going live.&lt;br /&gt;
&lt;br /&gt;
==Course Notes ==&lt;br /&gt;
&lt;br /&gt;
[http://individual.utoronto.ca/tholden/CourseNotes/Algebra.pdf Tyler&#039;s Course Notes]&lt;br /&gt;
&lt;br /&gt;
==Assignments==&lt;br /&gt;
&lt;br /&gt;
[[Media:HoldenAlgHW1.pdf|First Homework Assignment]]&lt;br /&gt;
&lt;br /&gt;
[[Media:HoldenHW2.pdf|Second Homework Assignment]]&lt;br /&gt;
&lt;br /&gt;
[[Media:HoldenHW4.pdf|Fourth Homework Assignment]]&lt;br /&gt;
&lt;br /&gt;
==User Sub-Pages == &lt;br /&gt;
&lt;br /&gt;
[[User:Tholden/11-1100 Simplicity of the Alternating Group  ]]&lt;br /&gt;
&lt;br /&gt;
[[User:Tholden/Simplicity Redirect]]&lt;br /&gt;
&lt;br /&gt;
[[User:Tholden/11-1100/Homework Part 1]]&lt;br /&gt;
&lt;br /&gt;
[[User:Tholden/11-1100/File Repository]]&lt;br /&gt;
&lt;br /&gt;
==Source Code ==&lt;br /&gt;
&lt;br /&gt;
[[User:Tholden/11-1100/HW2 SourceCode|HW2 Source Code]]&lt;br /&gt;
&lt;br /&gt;
==Messages ==&lt;br /&gt;
&lt;br /&gt;
Please leave messages for me here.&lt;/div&gt;</summary>
		<author><name>Tholden</name></author>
	</entry>
	<entry>
		<id>https://drorbn.net/index.php?title=File:HoldenHW4.pdf&amp;diff=11093</id>
		<title>File:HoldenHW4.pdf</title>
		<link rel="alternate" type="text/html" href="https://drorbn.net/index.php?title=File:HoldenHW4.pdf&amp;diff=11093"/>
		<updated>2011-11-29T15:24:31Z</updated>

		<summary type="html">&lt;p&gt;Tholden: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Tholden</name></author>
	</entry>
	<entry>
		<id>https://drorbn.net/index.php?title=11-1100/Homework_Solutions&amp;diff=11055</id>
		<title>11-1100/Homework Solutions</title>
		<link rel="alternate" type="text/html" href="https://drorbn.net/index.php?title=11-1100/Homework_Solutions&amp;diff=11055"/>
		<updated>2011-11-15T15:20:11Z</updated>

		<summary type="html">&lt;p&gt;Tholden: Fix formatting&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{11-1100/Navigation}}&lt;br /&gt;
&lt;br /&gt;
==Sample solutions to Homework Assignment 1==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; align = &amp;quot;center&amp;quot;&lt;br /&gt;
|+ Please Input Your Information Here&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Last Name&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | First Name&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | User ID&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Link to Submission&lt;br /&gt;
|-&lt;br /&gt;
| Smith || Jerrod || [[User:Smith36j|Smith36j]] || [[Media:Smith-HW1Soln.pdf | Solutions]]&lt;br /&gt;
|-&lt;br /&gt;
| Holden || Tyler || [[User:Tholden|tholden]] || [[Media:HoldenAlgHW1.pdf | Solutions]]&lt;br /&gt;
|-&lt;br /&gt;
| Mracek || James || [[User:jmracek|jmracek]] || [[Media:jmracekHW1.pdf | Solutions]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Sample solutions to Homework Assignment 2==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; align = &amp;quot;center&amp;quot;&lt;br /&gt;
|+ Please Input Your Information Here&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Last Name&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | First Name&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | User ID&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Link to Submission&lt;br /&gt;
|-&lt;br /&gt;
| Holden || Tyler || [[User:tholden|tholden]] || [[Media:HoldenHW2.pdf|Solutions]]&lt;br /&gt;
|-&lt;br /&gt;
| Mracek || James || [[User:jmracek|jmracek]] || [[Media:jmracekHW2.pdf | Solutions]] &lt;br /&gt;
|-&lt;br /&gt;
| Smith || Jerrod || [[User:Smith36j|Smith36j]] || [[Media:JMS_MAT1100_HW2.pdf | Solutions]] &lt;br /&gt;
|-&lt;br /&gt;
| Grigorios || Fournodavlos || [[User:Gregdavlos|Gregdavlos]] || [[Media:GD_MAT1100_HW2.pdf | Solutions]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Sample solutions to Homework Assignment 3==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; align = &amp;quot;center&amp;quot;&lt;br /&gt;
|+ Please Input Your Information Here&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Last Name&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | First Name&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | User ID&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Link to Submission&lt;br /&gt;
|-&lt;br /&gt;
| Holden || Tyler || [[User:tholden|tholden]] || [[Media:HoldenHW3.pdf|Solutions]]&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Tholden</name></author>
	</entry>
	<entry>
		<id>https://drorbn.net/index.php?title=11-1100/Navigation&amp;diff=11054</id>
		<title>11-1100/Navigation</title>
		<link rel="alternate" type="text/html" href="https://drorbn.net/index.php?title=11-1100/Navigation&amp;diff=11054"/>
		<updated>2011-11-15T15:19:15Z</updated>

		<summary type="html">&lt;p&gt;Tholden: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;Back to [[11-1100]].&amp;lt;br/&amp;gt;&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
{| border=&amp;quot;1px&amp;quot; cellpadding=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; width=&amp;quot;100%&amp;quot; style=&amp;quot;font-size: small; align: left&amp;quot;&lt;br /&gt;
|- align=left&lt;br /&gt;
!#&lt;br /&gt;
!Week of...&lt;br /&gt;
!Notes and Links&lt;br /&gt;
|- align=left&lt;br /&gt;
|align=center|1&lt;br /&gt;
|Sep 12&lt;br /&gt;
|[[11-1100/About This Class|About This Class]], [[11-1100/Classnotes for Tuesday September 13|Tuesday]] - Non Commutative Gaussian Elimination, [[11-1100/Classnotes for Thursday September 15|Thursday]] - NCGE completed, the category of groups, images and kernels.&lt;br /&gt;
|- align=left&lt;br /&gt;
|align=center|2&lt;br /&gt;
|Sep 19&lt;br /&gt;
|I&#039;ll be in {{Home link|Talks/Strasbourg-1109/|Strasbourg}}, class was be taught by [http://www.math.toronto.edu/selick/ Paul Selick]. See my {{Home link|classes/1112/1100-AlgebraI/The_Selick_Week.html|summary}}.&lt;br /&gt;
|- align=left&lt;br /&gt;
|align=center|3&lt;br /&gt;
|Sep 26&lt;br /&gt;
|[[11-1100/Class Photo|Class Photo]], [[11-1100/Homework Assignment 1| HW1]], [[11-1100/Homework Assignment 1 Submissions| HW1 Submissions]], [[11-1100/Homework Solutions#Sample solutions to Homework Assignment 1| HW 1 Solutions]]&lt;br /&gt;
|- align=left&lt;br /&gt;
|align=center|4&lt;br /&gt;
|Oct 3&lt;br /&gt;
|[[11-1100/The Simplicity of the Alternating Groups| The Simplicity of the Alternating Groups]]&lt;br /&gt;
|- align=left&lt;br /&gt;
|align=center|5&lt;br /&gt;
|Oct 10&lt;br /&gt;
|[[11-1100/Homework Assignment 2|HW2]], [[11-1100/Homework Solutions#Sample solutions to Homework Assignment 2| HW 2 Solutions]]&lt;br /&gt;
|- align=left&lt;br /&gt;
|align=center|6&lt;br /&gt;
|Oct 18&lt;br /&gt;
|[[11-1100/Groups of Order 60 and 84|Groups of Order 60 and 84]]&lt;br /&gt;
|- align=left&lt;br /&gt;
|align=center|7&lt;br /&gt;
|Oct 24&lt;br /&gt;
|Extra office hours: Monday 10:30-12:30 (Dror), 5PM-7PM @ Huron 1028 (Stephen). [[11-1100/Term Test|Term Test]] on Tuesday. [[11-1100/Summary for the midterm| Summary for the midterm exam]]. [[11-1100/Term Test Solutions|Term Test - Sample Solutions ]]&lt;br /&gt;
|- align=left&lt;br /&gt;
|align=center|8&lt;br /&gt;
|Oct 31&lt;br /&gt;
|[[11-1100/Homework Assignment 3|HW3]], [[11-1100/Homework Solutions#Sample solutions to Homework Assignment 3| HW 3 Solutions]]&lt;br /&gt;
|- align=left&lt;br /&gt;
|align=center|9&lt;br /&gt;
|Nov 7&lt;br /&gt;
|Monday-Tuesday is November Break, {{Pensieve Link|Classes/11-1100/1t2c4w.pdf|One Theorem, Two Corollaries, Four Weeks}}&lt;br /&gt;
|- align=left&lt;br /&gt;
|align=center|10&lt;br /&gt;
|Nov 14&lt;br /&gt;
|[[11-1100/Homework Assignment 4|HW4]]&lt;br /&gt;
|- align=left&lt;br /&gt;
|align=center|11&lt;br /&gt;
|Nov 21&lt;br /&gt;
|&lt;br /&gt;
|- align=left&lt;br /&gt;
|align=center|12&lt;br /&gt;
|Nov 28&lt;br /&gt;
|[[11-1100/Homework Assignment 5|HW5]]&lt;br /&gt;
|- align=left&lt;br /&gt;
|align=center|13&lt;br /&gt;
|Dec 5&lt;br /&gt;
|UofT Fall Semester ends Wednesday; our [[10-1100/Final Exam|Final Exam]] will be on Friday&lt;br /&gt;
|- align=left&lt;br /&gt;
|colspan=3 align=center|[[11-1100/Register of Good Deeds|Register of Good Deeds]]&lt;br /&gt;
|- align=left&lt;br /&gt;
|colspan=3 align=center|[[Image:11-1100-ClassPhoto.jpg|310px]]&amp;lt;br/&amp;gt;[[11-1100/Class Photo|Add your name / see who&#039;s in!]]&lt;br /&gt;
|- align=left&lt;br /&gt;
|colspan=3 align=center|[[Image:10-1100-Splash.png|310px]]&amp;lt;br/&amp;gt;See {{Home Link|classes/1112/1100-AlgebraI/NCGE.html|Non Commutative Gaussian Elimination}}&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Tholden</name></author>
	</entry>
	<entry>
		<id>https://drorbn.net/index.php?title=11-1100/Homework_Solutions&amp;diff=11053</id>
		<title>11-1100/Homework Solutions</title>
		<link rel="alternate" type="text/html" href="https://drorbn.net/index.php?title=11-1100/Homework_Solutions&amp;diff=11053"/>
		<updated>2011-11-15T15:15:53Z</updated>

		<summary type="html">&lt;p&gt;Tholden: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{11-1100/Navigation}}&lt;br /&gt;
&lt;br /&gt;
==Sample solutions to Homework Assignment 1==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; align = &amp;quot;center&amp;quot;&lt;br /&gt;
|+ Please Input Your Information Here&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Last Name&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | First Name&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | User ID&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Link to Submission&lt;br /&gt;
|-&lt;br /&gt;
| Smith || Jerrod || [[User:Smith36j|Smith36j]] || [[Media:Smith-HW1Soln.pdf | Solutions]]&lt;br /&gt;
|-&lt;br /&gt;
| Holden || Tyler || [[User:Tholden|tholden]] || [[Media:HoldenAlgHW1.pdf | Solutions]]&lt;br /&gt;
|-&lt;br /&gt;
| Mracek || James || [[User:jmracek|jmracek]] || [[Media:jmracekHW1.pdf | Solutions]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Sample solutions to Homework Assignment 2==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; align = &amp;quot;center&amp;quot;&lt;br /&gt;
|+ Please Input Your Information Here&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Last Name&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | First Name&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | User ID&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Link to Submission&lt;br /&gt;
|-&lt;br /&gt;
| Holden || Tyler || [[User:tholden|tholden]] || [[Media:HoldenHW2.pdf|Solutions]]&lt;br /&gt;
|-&lt;br /&gt;
| Mracek || James || [[User:jmracek|jmracek]] || [[Media:jmracekHW2.pdf | Solutions]] &lt;br /&gt;
|-&lt;br /&gt;
| Smith || Jerrod || [[User:Smith36j|Smith36j]] || [[Media:JMS_MAT1100_HW2.pdf | Solutions]] &lt;br /&gt;
|-&lt;br /&gt;
| Grigorios || Fournodavlos || [[User:Gregdavlos|Gregdavlos]] || [[Media:GD_MAT1100_HW2.pdf | Solutions]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Sample solutions to Homework Assignment 3==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; align = &amp;quot;center&amp;quot;&lt;br /&gt;
|+ Please Input Your Information Here&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Last Name&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | First Name&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | User ID&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Link to Submission&lt;br /&gt;
|-&lt;br /&gt;
| Holden || Tyler || [[User:tholden|tholden]] || [[Image:HoldenHW3.pdf|Solutions]]&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Tholden</name></author>
	</entry>
	<entry>
		<id>https://drorbn.net/index.php?title=File:HoldenHW3.pdf&amp;diff=11052</id>
		<title>File:HoldenHW3.pdf</title>
		<link rel="alternate" type="text/html" href="https://drorbn.net/index.php?title=File:HoldenHW3.pdf&amp;diff=11052"/>
		<updated>2011-11-15T15:15:35Z</updated>

		<summary type="html">&lt;p&gt;Tholden: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Tholden</name></author>
	</entry>
	<entry>
		<id>https://drorbn.net/index.php?title=11-1100/Notes&amp;diff=11037</id>
		<title>11-1100/Notes</title>
		<link rel="alternate" type="text/html" href="https://drorbn.net/index.php?title=11-1100/Notes&amp;diff=11037"/>
		<updated>2011-11-06T03:07:50Z</updated>

		<summary type="html">&lt;p&gt;Tholden: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{11-1100/Navigation}}&lt;br /&gt;
&lt;br /&gt;
==Notes from Lectures==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; align = &amp;quot;center&amp;quot;&lt;br /&gt;
|+ Please Input Your Information Here&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Last Name&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | First Name&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | User ID&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Link to Submission&lt;br /&gt;
|-&lt;br /&gt;
| Da Silva || Sergio || [[User:Sdasilva|Sdasilva]] || [[Media:October27.pdf | October 27]]&lt;br /&gt;
|-&lt;br /&gt;
| Holden || Tyler || [[User:tholden|tholden]] || [http://individual.utoronto.ca/tholden/CourseNotes/Algebra.pdf Course Notes]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Tholden</name></author>
	</entry>
	<entry>
		<id>https://drorbn.net/index.php?title=User:Tholden/11-1100/HW2_SourceCode&amp;diff=10930</id>
		<title>User:Tholden/11-1100/HW2 SourceCode</title>
		<link rel="alternate" type="text/html" href="https://drorbn.net/index.php?title=User:Tholden/11-1100/HW2_SourceCode&amp;diff=10930"/>
		<updated>2011-10-20T15:27:04Z</updated>

		<summary type="html">&lt;p&gt;Tholden: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The following is a collection of Matlab m-files used for computing quantities of the symmetric group. I apologize as these are not properly commented at this time, though this will hopefully change in the near future. However, all code that is not commented is small and easily parsed.&lt;br /&gt;
&lt;br /&gt;
==Generalized Least Common Multiple==&lt;br /&gt;
&lt;br /&gt;
Matlab has a built in least common multiple command; however, it can only take two inputs at a time. Consequently the following is a recursive algorithm for calculating the least common multiple of a several integers&lt;br /&gt;
&lt;br /&gt;
 function mylcm = genLCM(array)&lt;br /&gt;
 &lt;br /&gt;
 if length(array)&amp;lt;2&lt;br /&gt;
     mylcm = array;&lt;br /&gt;
     return;&lt;br /&gt;
 elseif length(array)==2&lt;br /&gt;
     mylcm = lcm(array(1),array(2));&lt;br /&gt;
     return;&lt;br /&gt;
 else&lt;br /&gt;
     mylcm = lcm(array(1),genLCM(array(2:end)));&lt;br /&gt;
     return;&lt;br /&gt;
 end&lt;br /&gt;
&lt;br /&gt;
==Computing the Orders of Elements in the Symmetric Group==&lt;br /&gt;
&lt;br /&gt;
 function orders = compSymOrders(grpSize)&lt;br /&gt;
 &lt;br /&gt;
 myParts = partitions(grpSize);&lt;br /&gt;
 orders = zeros(size(myParts,1),1);&lt;br /&gt;
 &lt;br /&gt;
 for itrow = 1:size(myParts,1)&lt;br /&gt;
     cycle=[];&lt;br /&gt;
     for itcol = 1:size(myParts,2)&lt;br /&gt;
         cycle = [cycle itcol*ones(1,myParts(itrow,itcol))];&lt;br /&gt;
     end&lt;br /&gt;
     orders(itrow) = genLCM(cycle);&lt;br /&gt;
 end&lt;br /&gt;
&lt;br /&gt;
==Smallest Subgroup with Element of Given Order==&lt;br /&gt;
&lt;br /&gt;
 function grpSize = smallestSymGrp(order)&lt;br /&gt;
 &lt;br /&gt;
 answerFound=false;&lt;br /&gt;
 grpSize = 2;&lt;br /&gt;
 while ~answerFound &amp;amp;&amp;amp; grpSize &amp;lt; 100&lt;br /&gt;
     orders = compSymOrders(grpSize);&lt;br /&gt;
     if ~isempty(find(orders==order, 1))&lt;br /&gt;
         return;&lt;br /&gt;
     else&lt;br /&gt;
         grpSize = grpSize + 1;&lt;br /&gt;
     end&lt;br /&gt;
 end %end while&lt;br /&gt;
&lt;br /&gt;
==Partitions of an Integer==&lt;br /&gt;
&lt;br /&gt;
The following is a canned algorithm, available from the [http://www.mathworks.com/matlabcentral/fileexchange/12009 Mathworks website], and is not my own work:&lt;br /&gt;
&lt;br /&gt;
 function plist = partitions(total_sum,candidate_set,max_count,fixed_count)&lt;br /&gt;
 % extracts the list of all partitions of a number as integer sums of a list of candidates&lt;br /&gt;
 % usage: plist = partitions(total_sum,candidate_set)&lt;br /&gt;
 % usage: plist = partitions(total_sum,candidate_set,max_count,fixed_count)&lt;br /&gt;
 %&lt;br /&gt;
 % PARTITIONS solves the money changing problem. E.g.,&lt;br /&gt;
 % how can you make change for one dollar given coins&lt;br /&gt;
 % of a given set of denominations. A good reference on&lt;br /&gt;
 % the general problem is found here:&lt;br /&gt;
 %&lt;br /&gt;
 % http://en.wikipedia.org/wiki/Integer_partition&lt;br /&gt;
 %&lt;br /&gt;
 % PARTITIONS uses a recursive strategy to enumerate all&lt;br /&gt;
 % possible partitions of the total_sum. This may be&lt;br /&gt;
 % highly intensive for large sums or large sets of&lt;br /&gt;
 % candidates.&lt;br /&gt;
 % &lt;br /&gt;
 % arguments: (input)&lt;br /&gt;
 %  total_sum - scalar positive integer (to be partitioned)&lt;br /&gt;
 %&lt;br /&gt;
 %              BEWARE! a large total_sum can easily cause&lt;br /&gt;
 %              stack problems. For example, the number of&lt;br /&gt;
 %              partitions of 40 is 37338, a set that took 24&lt;br /&gt;
 %              seconds to completely enumerate on my cpu.&lt;br /&gt;
 %&lt;br /&gt;
 %  candidate_set - (OPTIONAL) vector of (distinct) candidate&lt;br /&gt;
 %              positive integers for the partitions.&lt;br /&gt;
 %&lt;br /&gt;
 %              Efficiency considerations force me to require&lt;br /&gt;
 %              that the candidates be sorted in non-decreasing&lt;br /&gt;
 %              order. An error is produced otherwise.&lt;br /&gt;
 %&lt;br /&gt;
 %              DEFAULT: candidate_set = 1:total_sum&lt;br /&gt;
 %&lt;br /&gt;
 %              BEWARE! large candidate sets can easily cause&lt;br /&gt;
 %              stack problems&lt;br /&gt;
 %&lt;br /&gt;
 %  max_count - (OPTIONAL) the maximum quantity of any&lt;br /&gt;
 %              candidate in the final sum.&lt;br /&gt;
 %&lt;br /&gt;
 %              max_count must be either a vector of the&lt;br /&gt;
 %              same length as candidate_set, or a scalar&lt;br /&gt;
 %              that applies to all elements in that set.&lt;br /&gt;
 %&lt;br /&gt;
 %              DEFAULT = floor(total_sum./candidate_set)&lt;br /&gt;
 %&lt;br /&gt;
 %  fixed_count - (OPTIONAL) Allows you to specify a fixed&lt;br /&gt;
 %              number of terms in the partitioned sum.&lt;br /&gt;
 %&lt;br /&gt;
 %              fixed_count must be a positive integer if&lt;br /&gt;
 %              supplied.&lt;br /&gt;
 %&lt;br /&gt;
 %              DEFAULT = []&lt;br /&gt;
 %&lt;br /&gt;
 % arguments: (output)&lt;br /&gt;
 %  plist - array of partitions of total_sum. This is a list&lt;br /&gt;
 %              of the quantity of each element such that&lt;br /&gt;
 %              plist*candidate_set(:) yields total_sum&lt;br /&gt;
 %&lt;br /&gt;
 %&lt;br /&gt;
 % example: Write 9 as an integer combination of the set [1 2 4 7]&lt;br /&gt;
 %&lt;br /&gt;
 %  partitions(9,[1 2 4 7])&lt;br /&gt;
 %&lt;br /&gt;
 %  ans =&lt;br /&gt;
 %    9     0     0     0&lt;br /&gt;
 %   7     1     0     0&lt;br /&gt;
 %    5     2     0     0&lt;br /&gt;
 %    3     3     0     0&lt;br /&gt;
 %    1     4     0     0&lt;br /&gt;
 %    5     0     1     0&lt;br /&gt;
 %    3     1     1     0&lt;br /&gt;
 %    1     2     1     0&lt;br /&gt;
 %    1     0     2     0&lt;br /&gt;
 %    2     0     0     1&lt;br /&gt;
 %    0     1     0     1&lt;br /&gt;
 %&lt;br /&gt;
 % Thus, we can write 9 = 9*1&lt;br /&gt;
 % or 9 = 1*1 + 4*2&lt;br /&gt;
 % or 9 = 1*2 + 1*7&lt;br /&gt;
 % or any of 8 distinct other ways.&lt;br /&gt;
 %&lt;br /&gt;
 % There are 11 such ways to write 9 in terms of these&lt;br /&gt;
 % candidates.&lt;br /&gt;
 %&lt;br /&gt;
 %&lt;br /&gt;
 % example: Change a 1 dollar bill (100 cents) as an integer&lt;br /&gt;
 %  combination of the set [1 5 10 25 50], using no more than&lt;br /&gt;
 %  4 of any one coin denomination. Note that no pennies will&lt;br /&gt;
 %  be allowed by the maximum constraint.&lt;br /&gt;
 %&lt;br /&gt;
 %  partitions(100,[1 5 10 25 50],4)&lt;br /&gt;
 %&lt;br /&gt;
 % ans =&lt;br /&gt;
 %    0     4     3     2     0&lt;br /&gt;
 %    0     2     4     2     0&lt;br /&gt;
 %    0     3     1     3     0&lt;br /&gt;
 %    0     1     2     3     0&lt;br /&gt;
 %    0     0     0     4     0&lt;br /&gt;
 %    0     4     3     0     1&lt;br /&gt;
 %    0     2     4     0     1&lt;br /&gt;
 %    0     3     1     1     1&lt;br /&gt;
 %    0     1     2     1     1&lt;br /&gt;
 %    0     0     0     2     1&lt;br /&gt;
 %    0     0     0     0     2&lt;br /&gt;
 %&lt;br /&gt;
 % example: Write 13 as an integer combination of the set [2 4 6 8 10 12]&lt;br /&gt;
 %  (Note that no such combination exists.)&lt;br /&gt;
 %&lt;br /&gt;
 %  partitions(13,[2 4 6 8 10 12])&lt;br /&gt;
 %&lt;br /&gt;
 % ans =&lt;br /&gt;
 %   Empty matrix: 0-by-6&lt;br /&gt;
 %&lt;br /&gt;
 %&lt;br /&gt;
 % example: find all possible ways to write 100 as a sum of EXACTLY 4&lt;br /&gt;
 %  squares of the integers 1:9.&lt;br /&gt;
 %&lt;br /&gt;
 %  partitions(100,(1:9).^2,[],4)&lt;br /&gt;
 % ans =&lt;br /&gt;
 %   0    0    0    0    4    0    0    0    0&lt;br /&gt;
 %   1    0    0    0    2    0    1    0    0&lt;br /&gt;
 %   2    0    0    0    0    0    2    0    0&lt;br /&gt;
 %   0    1    0    2    0    0    0    1    0&lt;br /&gt;
 %   1    0    2    0    0    0    0    0    1&lt;br /&gt;
 %&lt;br /&gt;
 %&lt;br /&gt;
 % Author: John D&#039;Errico&lt;br /&gt;
 % e-mail: woodchips@rochester.rr.com&lt;br /&gt;
 % Release: 2&lt;br /&gt;
 % Release date: 7/15/08 &lt;br /&gt;
 &lt;br /&gt;
 % default for candidate_set&lt;br /&gt;
 if (nargin&amp;lt;2) || isempty(candidate_set)&lt;br /&gt;
   candidate_set = 1:total_sum;&lt;br /&gt;
 end&lt;br /&gt;
 &lt;br /&gt;
 % how many candidates are there&lt;br /&gt;
 n = length(candidate_set);&lt;br /&gt;
 &lt;br /&gt;
 % error checks&lt;br /&gt;
 if any(candidate_set&amp;lt;=0)&lt;br /&gt;
   error(&#039;All members of candidate_set must be &amp;gt; 0&#039;)&lt;br /&gt;
 end&lt;br /&gt;
 % candidates must be sorted in increasng order&lt;br /&gt;
 if any(diff(candidate_set)&amp;lt;0)&lt;br /&gt;
   error(&#039;Efficiency requires that candidate_set be sorted&#039;)&lt;br /&gt;
 end&lt;br /&gt;
 &lt;br /&gt;
 % check for a max_count. do we supply a default?&lt;br /&gt;
 if (nargin&amp;lt;3) || isempty(max_count)&lt;br /&gt;
   % how high do we need look?&lt;br /&gt;
   max_count = floor(total_sum./candidate_set);&lt;br /&gt;
 elseif length(max_count)==1&lt;br /&gt;
   % if a scalar was provided, then turn it into a vector&lt;br /&gt;
   max_count = repmat(max_count,1,n);&lt;br /&gt;
 end&lt;br /&gt;
 &lt;br /&gt;
 % check for a fixed_count&lt;br /&gt;
 if (nargin&amp;lt;4) || isempty(fixed_count)&lt;br /&gt;
   fixed_count = [];&lt;br /&gt;
 elseif (fixed_count&amp;lt;0) || (fixed_count~=round(fixed_count))&lt;br /&gt;
   error(&#039;fixed_count must be a positive integer if supplied&#039;)&lt;br /&gt;
 end&lt;br /&gt;
 &lt;br /&gt;
 % check for degenerate cases&lt;br /&gt;
 if isempty(fixed_count)&lt;br /&gt;
   if total_sum == 0&lt;br /&gt;
     plist = zeros(1,n);&lt;br /&gt;
     return&lt;br /&gt;
   elseif (n == 0)&lt;br /&gt;
     plist = [];&lt;br /&gt;
     return&lt;br /&gt;
   elseif (n == 1)&lt;br /&gt;
     % only one element in the set. can we form&lt;br /&gt;
     % total_sum from it as an integer multiple?&lt;br /&gt;
     p = total_sum/candidate_set;&lt;br /&gt;
     if (p==fix(p)) &amp;amp;&amp;amp; (p&amp;lt;=max_count)&lt;br /&gt;
       plist = p;&lt;br /&gt;
     else&lt;br /&gt;
       plist = [];&lt;br /&gt;
     end&lt;br /&gt;
     return&lt;br /&gt;
  end&lt;br /&gt;
 else&lt;br /&gt;
   % there was a fixed_count supplied&lt;br /&gt;
   if (total_sum == 0) &amp;amp;&amp;amp; (fixed_count == 0)&lt;br /&gt;
     plist = zeros(1,n);&lt;br /&gt;
     return&lt;br /&gt;
   elseif (n == 0) || (fixed_count &amp;lt;= 0)&lt;br /&gt;
     plist = [];&lt;br /&gt;
     return&lt;br /&gt;
   elseif (n==1)&lt;br /&gt;
     % there must be a non-zero fixed_count, since&lt;br /&gt;
     % we did not trip the last test. since there&lt;br /&gt;
     % is only one candidate in the set, will it work?&lt;br /&gt;
     if (fixed_count*candidate_set) == total_sum&lt;br /&gt;
       plist = fixed_count;&lt;br /&gt;
     else&lt;br /&gt;
       plist = [];&lt;br /&gt;
     end&lt;br /&gt;
     return&lt;br /&gt;
   end&lt;br /&gt;
 end&lt;br /&gt;
 &lt;br /&gt;
 % finally, we can do some work. start with the&lt;br /&gt;
 % largest element and work backwards&lt;br /&gt;
 m = max_count(end);&lt;br /&gt;
 % do we need to back off on m?&lt;br /&gt;
 c = candidate_set(end);&lt;br /&gt;
 m = min([m,floor(total_sum/c),fixed_count]); &lt;br /&gt;
 &lt;br /&gt;
 plist = zeros(0,n);&lt;br /&gt;
 for i = 0:m&lt;br /&gt;
   temp = partitions(total_sum - i*c, ...&lt;br /&gt;
       candidate_set(1:(end-1)), ...&lt;br /&gt;
       max_count(1:(end-1)),fixed_count-i);&lt;br /&gt;
   plist = [plist;[temp,repmat(i,size(temp,1),1)]];  %#ok&lt;br /&gt;
 end&lt;/div&gt;</summary>
		<author><name>Tholden</name></author>
	</entry>
	<entry>
		<id>https://drorbn.net/index.php?title=User:Tholden/11-1100/HW2_SourceCode&amp;diff=10929</id>
		<title>User:Tholden/11-1100/HW2 SourceCode</title>
		<link rel="alternate" type="text/html" href="https://drorbn.net/index.php?title=User:Tholden/11-1100/HW2_SourceCode&amp;diff=10929"/>
		<updated>2011-10-20T15:25:43Z</updated>

		<summary type="html">&lt;p&gt;Tholden: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The following is a collection of Matlab m-files used for computing quantities of the symmetric group. I apologize as these are not properly commented at this time, though this will hopefully change in the near future. However, all code that is not commented is small and easily parsed.&lt;br /&gt;
&lt;br /&gt;
==Partitions of an Integer==&lt;br /&gt;
&lt;br /&gt;
The following is a canned algorithm, available from the [http://www.mathworks.com/matlabcentral/fileexchange/12009 Mathworks website], and is not my own work:&lt;br /&gt;
&lt;br /&gt;
==Generalized Least Common Multiple==&lt;br /&gt;
&lt;br /&gt;
Matlab has a built in least common multiple command; however, it can only take two inputs at a time. Consequently the following is a recursive algorithm for calculating the least common multiple of a several integers&lt;br /&gt;
&lt;br /&gt;
 function mylcm = genLCM(array)&lt;br /&gt;
 &lt;br /&gt;
 if length(array)&amp;lt;2&lt;br /&gt;
     mylcm = array;&lt;br /&gt;
     return;&lt;br /&gt;
 elseif length(array)==2&lt;br /&gt;
     mylcm = lcm(array(1),array(2));&lt;br /&gt;
     return;&lt;br /&gt;
 else&lt;br /&gt;
     mylcm = lcm(array(1),genLCM(array(2:end)));&lt;br /&gt;
     return;&lt;br /&gt;
 end&lt;br /&gt;
&lt;br /&gt;
==Computing the Orders of Elements in the Symmetric Group==&lt;br /&gt;
&lt;br /&gt;
 function orders = compSymOrders(grpSize)&lt;br /&gt;
 &lt;br /&gt;
 myParts = partitions(grpSize);&lt;br /&gt;
 orders = zeros(size(myParts,1),1);&lt;br /&gt;
 &lt;br /&gt;
 for itrow = 1:size(myParts,1)&lt;br /&gt;
     cycle=[];&lt;br /&gt;
     for itcol = 1:size(myParts,2)&lt;br /&gt;
         cycle = [cycle itcol*ones(1,myParts(itrow,itcol))];&lt;br /&gt;
     end&lt;br /&gt;
     orders(itrow) = genLCM(cycle);&lt;br /&gt;
 end&lt;br /&gt;
&lt;br /&gt;
==Smallest Subgroup with Element of Given Order==&lt;br /&gt;
&lt;br /&gt;
 function grpSize = smallestSymGrp(order)&lt;br /&gt;
 &lt;br /&gt;
 answerFound=false;&lt;br /&gt;
 grpSize = 2;&lt;br /&gt;
 while ~answerFound &amp;amp;&amp;amp; grpSize &amp;lt; 100&lt;br /&gt;
     orders = compSymOrders(grpSize);&lt;br /&gt;
     if ~isempty(find(orders==order, 1))&lt;br /&gt;
         return;&lt;br /&gt;
     else&lt;br /&gt;
         grpSize = grpSize + 1;&lt;br /&gt;
     end&lt;br /&gt;
 end %end while&lt;br /&gt;
&lt;br /&gt;
 function plist = partitions(total_sum,candidate_set,max_count,fixed_count)&lt;br /&gt;
 % extracts the list of all partitions of a number as integer sums of a list of candidates&lt;br /&gt;
 % usage: plist = partitions(total_sum,candidate_set)&lt;br /&gt;
 % usage: plist = partitions(total_sum,candidate_set,max_count,fixed_count)&lt;br /&gt;
 %&lt;br /&gt;
 % PARTITIONS solves the money changing problem. E.g.,&lt;br /&gt;
 % how can you make change for one dollar given coins&lt;br /&gt;
 % of a given set of denominations. A good reference on&lt;br /&gt;
 % the general problem is found here:&lt;br /&gt;
 %&lt;br /&gt;
 % http://en.wikipedia.org/wiki/Integer_partition&lt;br /&gt;
 %&lt;br /&gt;
 % PARTITIONS uses a recursive strategy to enumerate all&lt;br /&gt;
 % possible partitions of the total_sum. This may be&lt;br /&gt;
 % highly intensive for large sums or large sets of&lt;br /&gt;
 % candidates.&lt;br /&gt;
 % &lt;br /&gt;
 % arguments: (input)&lt;br /&gt;
 %  total_sum - scalar positive integer (to be partitioned)&lt;br /&gt;
 %&lt;br /&gt;
 %              BEWARE! a large total_sum can easily cause&lt;br /&gt;
 %              stack problems. For example, the number of&lt;br /&gt;
 %              partitions of 40 is 37338, a set that took 24&lt;br /&gt;
 %              seconds to completely enumerate on my cpu.&lt;br /&gt;
 %&lt;br /&gt;
 %  candidate_set - (OPTIONAL) vector of (distinct) candidate&lt;br /&gt;
 %              positive integers for the partitions.&lt;br /&gt;
 %&lt;br /&gt;
 %              Efficiency considerations force me to require&lt;br /&gt;
 %              that the candidates be sorted in non-decreasing&lt;br /&gt;
 %              order. An error is produced otherwise.&lt;br /&gt;
 %&lt;br /&gt;
 %              DEFAULT: candidate_set = 1:total_sum&lt;br /&gt;
 %&lt;br /&gt;
 %              BEWARE! large candidate sets can easily cause&lt;br /&gt;
 %              stack problems&lt;br /&gt;
 %&lt;br /&gt;
 %  max_count - (OPTIONAL) the maximum quantity of any&lt;br /&gt;
 %              candidate in the final sum.&lt;br /&gt;
 %&lt;br /&gt;
 %              max_count must be either a vector of the&lt;br /&gt;
 %              same length as candidate_set, or a scalar&lt;br /&gt;
 %              that applies to all elements in that set.&lt;br /&gt;
 %&lt;br /&gt;
 %              DEFAULT = floor(total_sum./candidate_set)&lt;br /&gt;
 %&lt;br /&gt;
 %  fixed_count - (OPTIONAL) Allows you to specify a fixed&lt;br /&gt;
 %              number of terms in the partitioned sum.&lt;br /&gt;
 %&lt;br /&gt;
 %              fixed_count must be a positive integer if&lt;br /&gt;
 %              supplied.&lt;br /&gt;
 %&lt;br /&gt;
 %              DEFAULT = []&lt;br /&gt;
 %&lt;br /&gt;
 % arguments: (output)&lt;br /&gt;
 %  plist - array of partitions of total_sum. This is a list&lt;br /&gt;
 %              of the quantity of each element such that&lt;br /&gt;
 %              plist*candidate_set(:) yields total_sum&lt;br /&gt;
 %&lt;br /&gt;
 %&lt;br /&gt;
 % example: Write 9 as an integer combination of the set [1 2 4 7]&lt;br /&gt;
 %&lt;br /&gt;
 %  partitions(9,[1 2 4 7])&lt;br /&gt;
 %&lt;br /&gt;
 %  ans =&lt;br /&gt;
 %    9     0     0     0&lt;br /&gt;
 %   7     1     0     0&lt;br /&gt;
 %    5     2     0     0&lt;br /&gt;
 %    3     3     0     0&lt;br /&gt;
 %    1     4     0     0&lt;br /&gt;
 %    5     0     1     0&lt;br /&gt;
 %    3     1     1     0&lt;br /&gt;
 %    1     2     1     0&lt;br /&gt;
 %    1     0     2     0&lt;br /&gt;
 %    2     0     0     1&lt;br /&gt;
 %    0     1     0     1&lt;br /&gt;
 %&lt;br /&gt;
 % Thus, we can write 9 = 9*1&lt;br /&gt;
 % or 9 = 1*1 + 4*2&lt;br /&gt;
 % or 9 = 1*2 + 1*7&lt;br /&gt;
 % or any of 8 distinct other ways.&lt;br /&gt;
 %&lt;br /&gt;
 % There are 11 such ways to write 9 in terms of these&lt;br /&gt;
 % candidates.&lt;br /&gt;
 %&lt;br /&gt;
 %&lt;br /&gt;
 % example: Change a 1 dollar bill (100 cents) as an integer&lt;br /&gt;
 %  combination of the set [1 5 10 25 50], using no more than&lt;br /&gt;
 %  4 of any one coin denomination. Note that no pennies will&lt;br /&gt;
 %  be allowed by the maximum constraint.&lt;br /&gt;
 %&lt;br /&gt;
 %  partitions(100,[1 5 10 25 50],4)&lt;br /&gt;
 %&lt;br /&gt;
 % ans =&lt;br /&gt;
 %    0     4     3     2     0&lt;br /&gt;
 %    0     2     4     2     0&lt;br /&gt;
 %    0     3     1     3     0&lt;br /&gt;
 %    0     1     2     3     0&lt;br /&gt;
 %    0     0     0     4     0&lt;br /&gt;
 %    0     4     3     0     1&lt;br /&gt;
 %    0     2     4     0     1&lt;br /&gt;
 %    0     3     1     1     1&lt;br /&gt;
 %    0     1     2     1     1&lt;br /&gt;
 %    0     0     0     2     1&lt;br /&gt;
 %    0     0     0     0     2&lt;br /&gt;
 %&lt;br /&gt;
 % example: Write 13 as an integer combination of the set [2 4 6 8 10 12]&lt;br /&gt;
 %  (Note that no such combination exists.)&lt;br /&gt;
 %&lt;br /&gt;
 %  partitions(13,[2 4 6 8 10 12])&lt;br /&gt;
 %&lt;br /&gt;
 % ans =&lt;br /&gt;
 %   Empty matrix: 0-by-6&lt;br /&gt;
 %&lt;br /&gt;
 %&lt;br /&gt;
 % example: find all possible ways to write 100 as a sum of EXACTLY 4&lt;br /&gt;
 %  squares of the integers 1:9.&lt;br /&gt;
 %&lt;br /&gt;
 %  partitions(100,(1:9).^2,[],4)&lt;br /&gt;
 % ans =&lt;br /&gt;
 %   0    0    0    0    4    0    0    0    0&lt;br /&gt;
 %   1    0    0    0    2    0    1    0    0&lt;br /&gt;
 %   2    0    0    0    0    0    2    0    0&lt;br /&gt;
 %   0    1    0    2    0    0    0    1    0&lt;br /&gt;
 %   1    0    2    0    0    0    0    0    1&lt;br /&gt;
 %&lt;br /&gt;
 %&lt;br /&gt;
 % Author: John D&#039;Errico&lt;br /&gt;
 % e-mail: woodchips@rochester.rr.com&lt;br /&gt;
 % Release: 2&lt;br /&gt;
 % Release date: 7/15/08 &lt;br /&gt;
 &lt;br /&gt;
 % default for candidate_set&lt;br /&gt;
 if (nargin&amp;lt;2) || isempty(candidate_set)&lt;br /&gt;
   candidate_set = 1:total_sum;&lt;br /&gt;
 end&lt;br /&gt;
 &lt;br /&gt;
 % how many candidates are there&lt;br /&gt;
 n = length(candidate_set);&lt;br /&gt;
 &lt;br /&gt;
 % error checks&lt;br /&gt;
 if any(candidate_set&amp;lt;=0)&lt;br /&gt;
   error(&#039;All members of candidate_set must be &amp;gt; 0&#039;)&lt;br /&gt;
 end&lt;br /&gt;
 % candidates must be sorted in increasng order&lt;br /&gt;
 if any(diff(candidate_set)&amp;lt;0)&lt;br /&gt;
   error(&#039;Efficiency requires that candidate_set be sorted&#039;)&lt;br /&gt;
 end&lt;br /&gt;
 &lt;br /&gt;
 % check for a max_count. do we supply a default?&lt;br /&gt;
 if (nargin&amp;lt;3) || isempty(max_count)&lt;br /&gt;
   % how high do we need look?&lt;br /&gt;
   max_count = floor(total_sum./candidate_set);&lt;br /&gt;
 elseif length(max_count)==1&lt;br /&gt;
   % if a scalar was provided, then turn it into a vector&lt;br /&gt;
   max_count = repmat(max_count,1,n);&lt;br /&gt;
 end&lt;br /&gt;
 &lt;br /&gt;
 % check for a fixed_count&lt;br /&gt;
 if (nargin&amp;lt;4) || isempty(fixed_count)&lt;br /&gt;
   fixed_count = [];&lt;br /&gt;
 elseif (fixed_count&amp;lt;0) || (fixed_count~=round(fixed_count))&lt;br /&gt;
   error(&#039;fixed_count must be a positive integer if supplied&#039;)&lt;br /&gt;
 end&lt;br /&gt;
 &lt;br /&gt;
 % check for degenerate cases&lt;br /&gt;
 if isempty(fixed_count)&lt;br /&gt;
   if total_sum == 0&lt;br /&gt;
     plist = zeros(1,n);&lt;br /&gt;
     return&lt;br /&gt;
   elseif (n == 0)&lt;br /&gt;
     plist = [];&lt;br /&gt;
     return&lt;br /&gt;
   elseif (n == 1)&lt;br /&gt;
     % only one element in the set. can we form&lt;br /&gt;
     % total_sum from it as an integer multiple?&lt;br /&gt;
     p = total_sum/candidate_set;&lt;br /&gt;
     if (p==fix(p)) &amp;amp;&amp;amp; (p&amp;lt;=max_count)&lt;br /&gt;
       plist = p;&lt;br /&gt;
     else&lt;br /&gt;
       plist = [];&lt;br /&gt;
     end&lt;br /&gt;
     return&lt;br /&gt;
  end&lt;br /&gt;
 else&lt;br /&gt;
   % there was a fixed_count supplied&lt;br /&gt;
   if (total_sum == 0) &amp;amp;&amp;amp; (fixed_count == 0)&lt;br /&gt;
     plist = zeros(1,n);&lt;br /&gt;
     return&lt;br /&gt;
   elseif (n == 0) || (fixed_count &amp;lt;= 0)&lt;br /&gt;
     plist = [];&lt;br /&gt;
     return&lt;br /&gt;
   elseif (n==1)&lt;br /&gt;
     % there must be a non-zero fixed_count, since&lt;br /&gt;
     % we did not trip the last test. since there&lt;br /&gt;
     % is only one candidate in the set, will it work?&lt;br /&gt;
     if (fixed_count*candidate_set) == total_sum&lt;br /&gt;
       plist = fixed_count;&lt;br /&gt;
     else&lt;br /&gt;
       plist = [];&lt;br /&gt;
     end&lt;br /&gt;
     return&lt;br /&gt;
   end&lt;br /&gt;
 end&lt;br /&gt;
 &lt;br /&gt;
 % finally, we can do some work. start with the&lt;br /&gt;
 % largest element and work backwards&lt;br /&gt;
 m = max_count(end);&lt;br /&gt;
 % do we need to back off on m?&lt;br /&gt;
 c = candidate_set(end);&lt;br /&gt;
 m = min([m,floor(total_sum/c),fixed_count]); &lt;br /&gt;
 &lt;br /&gt;
 plist = zeros(0,n);&lt;br /&gt;
 for i = 0:m&lt;br /&gt;
   temp = partitions(total_sum - i*c, ...&lt;br /&gt;
       candidate_set(1:(end-1)), ...&lt;br /&gt;
       max_count(1:(end-1)),fixed_count-i);&lt;br /&gt;
   plist = [plist;[temp,repmat(i,size(temp,1),1)]];  %#ok&lt;br /&gt;
 end&lt;/div&gt;</summary>
		<author><name>Tholden</name></author>
	</entry>
	<entry>
		<id>https://drorbn.net/index.php?title=User:Tholden&amp;diff=10928</id>
		<title>User:Tholden</title>
		<link rel="alternate" type="text/html" href="https://drorbn.net/index.php?title=User:Tholden&amp;diff=10928"/>
		<updated>2011-10-20T14:58:58Z</updated>

		<summary type="html">&lt;p&gt;Tholden: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hello and welcome to my user page.&lt;br /&gt;
&lt;br /&gt;
I will be using this page to publish my course notes, as well as a hyperlink to pages made before going live.&lt;br /&gt;
&lt;br /&gt;
==Course Notes ==&lt;br /&gt;
&lt;br /&gt;
[http://individual.utoronto.ca/tholden/CourseNotes/Algebra.pdf Tyler&#039;s Course Notes]&lt;br /&gt;
&lt;br /&gt;
==Assignments==&lt;br /&gt;
&lt;br /&gt;
[[Media:HoldenAlgHW1.pdf|First Homework Assignment]]&lt;br /&gt;
&lt;br /&gt;
[[Media:HoldenHW2.pdf|Second Homework Assignment]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==User Sub-Pages == &lt;br /&gt;
&lt;br /&gt;
[[User:Tholden/11-1100 Simplicity of the Alternating Group  ]]&lt;br /&gt;
&lt;br /&gt;
[[User:Tholden/Simplicity Redirect]]&lt;br /&gt;
&lt;br /&gt;
[[User:Tholden/11-1100/Homework Part 1]]&lt;br /&gt;
&lt;br /&gt;
[[User:Tholden/11-1100/File Repository]]&lt;br /&gt;
&lt;br /&gt;
==Source Code ==&lt;br /&gt;
&lt;br /&gt;
[[User:Tholden/11-1100/HW2 SourceCode|HW2 Source Code]]&lt;br /&gt;
&lt;br /&gt;
==Messages ==&lt;br /&gt;
&lt;br /&gt;
Please leave messages for me here.&lt;/div&gt;</summary>
		<author><name>Tholden</name></author>
	</entry>
	<entry>
		<id>https://drorbn.net/index.php?title=11-1100/Navigation&amp;diff=10927</id>
		<title>11-1100/Navigation</title>
		<link rel="alternate" type="text/html" href="https://drorbn.net/index.php?title=11-1100/Navigation&amp;diff=10927"/>
		<updated>2011-10-20T14:36:50Z</updated>

		<summary type="html">&lt;p&gt;Tholden: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;Back to [[11-1100]].&amp;lt;br/&amp;gt;&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
{| border=&amp;quot;1px&amp;quot; cellpadding=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; width=&amp;quot;100%&amp;quot; style=&amp;quot;font-size: small; align: left&amp;quot;&lt;br /&gt;
|- align=left&lt;br /&gt;
!#&lt;br /&gt;
!Week of...&lt;br /&gt;
!Notes and Links&lt;br /&gt;
|- align=left&lt;br /&gt;
|align=center|1&lt;br /&gt;
|Sep 12&lt;br /&gt;
|[[11-1100/About This Class|About This Class]], [[11-1100/Classnotes for Tuesday September 13|Tuesday]] - Non Commutative Gaussian Elimination, [[11-1100/Classnotes for Thursday September 15|Thursday]] - NCGE completed, the category of groups, images and kernels.&lt;br /&gt;
|- align=left&lt;br /&gt;
|align=center|2&lt;br /&gt;
|Sep 19&lt;br /&gt;
|I&#039;ll be in {{Home link|Talks/Strasbourg-1109/|Strasbourg}}, class was be taught by [http://www.math.toronto.edu/selick/ Paul Selick]. See my {{Home link|classes/1112/1100-AlgebraI/The_Selick_Week.html|summary}}.&lt;br /&gt;
|- align=left&lt;br /&gt;
|align=center|3&lt;br /&gt;
|Sep 26&lt;br /&gt;
|[[11-1100/Class Photo|Class Photo]], [[11-1100/Homework Assignment 1| HW1]], [[11-1100/Homework Assignment 1 Submissions| HW1 Submissions]], [[11-1100/Homework Solutions#Sample solutions to Homework Assignment 1| HW 1 Solutions]]&lt;br /&gt;
|- align=left&lt;br /&gt;
|align=center|4&lt;br /&gt;
|Oct 3&lt;br /&gt;
|[[11-1100/The Simplicity of the Alternating Groups| The Simplicity of the Alternating Groups]]&lt;br /&gt;
|- align=left&lt;br /&gt;
|align=center|5&lt;br /&gt;
|Oct 10&lt;br /&gt;
|[[11-1100/Homework Assignment 2|HW2]], [[11-1100/Homework Solutions#Sample solutions to Homework Assignment 2| HW 2 Solutions]]&lt;br /&gt;
|- align=left&lt;br /&gt;
|align=center|6&lt;br /&gt;
|Oct 18&lt;br /&gt;
|&lt;br /&gt;
|- align=left&lt;br /&gt;
|align=center|7&lt;br /&gt;
|Oct 24&lt;br /&gt;
|Extra office hours: Monday 10:30-12:30 (Dror), 5PM-7PM @ Huron 1028 (Stephen). [[11-1100/Term Test|Term Test]] on Tuesday&lt;br /&gt;
|- align=left&lt;br /&gt;
|align=center|8&lt;br /&gt;
|Oct 31&lt;br /&gt;
|[[11-1100/Homework Assignment 3|HW3]]&lt;br /&gt;
|- align=left&lt;br /&gt;
|align=center|9&lt;br /&gt;
|Nov 7&lt;br /&gt;
|Monday-Tuesday is November Break&lt;br /&gt;
|- align=left&lt;br /&gt;
|align=center|10&lt;br /&gt;
|Nov 14&lt;br /&gt;
|[[11-1100/Homework Assignment 4|HW4]]&lt;br /&gt;
|- align=left&lt;br /&gt;
|align=center|11&lt;br /&gt;
|Nov 21&lt;br /&gt;
|&lt;br /&gt;
|- align=left&lt;br /&gt;
|align=center|12&lt;br /&gt;
|Nov 28&lt;br /&gt;
|[[11-1100/Homework Assignment 5|HW5]]&lt;br /&gt;
|- align=left&lt;br /&gt;
|align=center|13&lt;br /&gt;
|Dec 5&lt;br /&gt;
|UofT Fall Semester ends Wednesday; our [[10-1100/Final Exam|Final Exam]] will be on Friday&lt;br /&gt;
|- align=left&lt;br /&gt;
|colspan=3 align=center|[[11-1100/Register of Good Deeds|Register of Good Deeds]]&lt;br /&gt;
|- align=left&lt;br /&gt;
|colspan=3 align=center|[[Image:11-1100-ClassPhoto.jpg|310px]]&amp;lt;br/&amp;gt;[[11-1100/Class Photo|Add your name / see who&#039;s in!]]&lt;br /&gt;
|- align=left&lt;br /&gt;
|colspan=3 align=center|[[Image:10-1100-Splash.png|310px]]&amp;lt;br/&amp;gt;See {{Home Link|classes/1112/1100-AlgebraI/NCGE.html|Non Commutative Gaussian Elimination}}&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Tholden</name></author>
	</entry>
	<entry>
		<id>https://drorbn.net/index.php?title=11-1100/Homework_Solutions&amp;diff=10926</id>
		<title>11-1100/Homework Solutions</title>
		<link rel="alternate" type="text/html" href="https://drorbn.net/index.php?title=11-1100/Homework_Solutions&amp;diff=10926"/>
		<updated>2011-10-20T14:31:15Z</updated>

		<summary type="html">&lt;p&gt;Tholden: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{11-1100/Navigation}}&lt;br /&gt;
&lt;br /&gt;
==Sample solutions to Homework Assignment 1==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; align = &amp;quot;center&amp;quot;&lt;br /&gt;
|+ Please Input Your Information Here&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Last Name&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | First Name&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | User ID&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Link to Submission&lt;br /&gt;
|-&lt;br /&gt;
| Smith || Jerrod || [[User:Smith36j|Smith36j]] || [[Media:Smith-HW1Soln.pdf | Solutions]]&lt;br /&gt;
|-&lt;br /&gt;
| Holden || Tyler || [[User:Tholden|tholden]] || [[Media:HoldenAlgHW1.pdf | Solutions]]&lt;br /&gt;
|-&lt;br /&gt;
| Mracek || James || [[User:jmracek|jmracek]] || [[Media:jmracekHW1.pdf | Solutions]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Sample solutions to Homework Assignment 2==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; align = &amp;quot;center&amp;quot;&lt;br /&gt;
|+ Please Input Your Information Here&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Last Name&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | First Name&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | User ID&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Link to Submission&lt;br /&gt;
|-&lt;br /&gt;
| Holden || Tyler || [[User:tholden|tholden]] || [[Media:HoldenHW2.pdf|Solutions]]&lt;br /&gt;
|-&lt;br /&gt;
| Mracek || James || [[User:jmracek|jmracek]] || [[Media:jmracekHW2.pdf | Solutions]] &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Tholden</name></author>
	</entry>
	<entry>
		<id>https://drorbn.net/index.php?title=User:Tholden&amp;diff=10925</id>
		<title>User:Tholden</title>
		<link rel="alternate" type="text/html" href="https://drorbn.net/index.php?title=User:Tholden&amp;diff=10925"/>
		<updated>2011-10-20T14:26:49Z</updated>

		<summary type="html">&lt;p&gt;Tholden: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hello and welcome to my user page.&lt;br /&gt;
&lt;br /&gt;
I will be using this page to publish my course notes, as well as a hyperlink to pages made before going live.&lt;br /&gt;
&lt;br /&gt;
==Course Notes ==&lt;br /&gt;
&lt;br /&gt;
[http://individual.utoronto.ca/tholden/CourseNotes/Algebra.pdf Tyler&#039;s Course Notes]&lt;br /&gt;
&lt;br /&gt;
==Assignments==&lt;br /&gt;
&lt;br /&gt;
[[Media:HoldenAlgHW1.pdf|First Homework Assignment]]&lt;br /&gt;
&lt;br /&gt;
[[Media:HoldenHW2.pdf|Second Homework Assignment]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==User Sub-Pages == &lt;br /&gt;
&lt;br /&gt;
[[User:Tholden/11-1100 Simplicity of the Alternating Group  ]]&lt;br /&gt;
&lt;br /&gt;
[[User:Tholden/Simplicity Redirect]]&lt;br /&gt;
&lt;br /&gt;
[[User:Tholden/11-1100/Homework Part 1]]&lt;br /&gt;
&lt;br /&gt;
[[User:Tholden/11-1100/File Repository]]&lt;br /&gt;
&lt;br /&gt;
==Messages ==&lt;br /&gt;
&lt;br /&gt;
Please leave messages for me here.&lt;/div&gt;</summary>
		<author><name>Tholden</name></author>
	</entry>
	<entry>
		<id>https://drorbn.net/index.php?title=File:HoldenHW2.pdf&amp;diff=10924</id>
		<title>File:HoldenHW2.pdf</title>
		<link rel="alternate" type="text/html" href="https://drorbn.net/index.php?title=File:HoldenHW2.pdf&amp;diff=10924"/>
		<updated>2011-10-20T14:25:23Z</updated>

		<summary type="html">&lt;p&gt;Tholden: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Tholden</name></author>
	</entry>
	<entry>
		<id>https://drorbn.net/index.php?title=11-1100/Navigation&amp;diff=10902</id>
		<title>11-1100/Navigation</title>
		<link rel="alternate" type="text/html" href="https://drorbn.net/index.php?title=11-1100/Navigation&amp;diff=10902"/>
		<updated>2011-10-13T15:56:04Z</updated>

		<summary type="html">&lt;p&gt;Tholden: Added anchor to sample solution subpage&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;Back to [[11-1100]].&amp;lt;br/&amp;gt;&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
{| border=&amp;quot;1px&amp;quot; cellpadding=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; width=&amp;quot;100%&amp;quot; style=&amp;quot;font-size: small; align: left&amp;quot;&lt;br /&gt;
|- align=left&lt;br /&gt;
!#&lt;br /&gt;
!Week of...&lt;br /&gt;
!Notes and Links&lt;br /&gt;
|- align=left&lt;br /&gt;
|align=center|1&lt;br /&gt;
|Sep 12&lt;br /&gt;
|[[11-1100/About This Class|About This Class]], [[11-1100/Classnotes for Tuesday September 13|Tuesday]] - Non Commutative Gaussian Elimination, [[11-1100/Classnotes for Thursday September 15|Thursday]] - NCGE completed, the category of groups, images and kernels.&lt;br /&gt;
|- align=left&lt;br /&gt;
|align=center|2&lt;br /&gt;
|Sep 19&lt;br /&gt;
|I&#039;ll be in {{Home link|Talks/Strasbourg-1109/|Strasbourg}}, class was be taught by [http://www.math.toronto.edu/selick/ Paul Selick]. See my {{Home link|classes/1112/1100-AlgebraI/The_Selick_Week.html|summary}}.&lt;br /&gt;
|- align=left&lt;br /&gt;
|align=center|3&lt;br /&gt;
|Sep 26&lt;br /&gt;
|[[11-1100/Class Photo|Class Photo]], [[11-1100/Homework Assignment 1| HW1]], [[11-1100/Homework Assignment 1 Submissions| HW1 Submissions]], [[11-1100/Homework Solutions#Sample solutions to Homework Assignment 1| HW 1 Solutions]]&lt;br /&gt;
|- align=left&lt;br /&gt;
|align=center|4&lt;br /&gt;
|Oct 3&lt;br /&gt;
|[[11-1100/The Simplicity of the Alternating Groups| The Simplicity of the Alternating Groups]]&lt;br /&gt;
|- align=left&lt;br /&gt;
|align=center|5&lt;br /&gt;
|Oct 10&lt;br /&gt;
|[[11-1100/Homework Assignment 2|HW2]]&lt;br /&gt;
|- align=left&lt;br /&gt;
|align=center|6&lt;br /&gt;
|Oct 18&lt;br /&gt;
|&lt;br /&gt;
|- align=left&lt;br /&gt;
|align=center|7&lt;br /&gt;
|Oct 24&lt;br /&gt;
|[[11-1100/Term Test|Term Test]]&lt;br /&gt;
|- align=left&lt;br /&gt;
|align=center|8&lt;br /&gt;
|Oct 31&lt;br /&gt;
|[[11-1100/Homework Assignment 3|HW3]]&lt;br /&gt;
|- align=left&lt;br /&gt;
|align=center|9&lt;br /&gt;
|Nov 7&lt;br /&gt;
|Monday-Tuesday is November Break&lt;br /&gt;
|- align=left&lt;br /&gt;
|align=center|10&lt;br /&gt;
|Nov 14&lt;br /&gt;
|[[11-1100/Homework Assignment 4|HW4]]&lt;br /&gt;
|- align=left&lt;br /&gt;
|align=center|11&lt;br /&gt;
|Nov 21&lt;br /&gt;
|&lt;br /&gt;
|- align=left&lt;br /&gt;
|align=center|12&lt;br /&gt;
|Nov 28&lt;br /&gt;
|[[11-1100/Homework Assignment 5|HW5]]&lt;br /&gt;
|- align=left&lt;br /&gt;
|align=center|13&lt;br /&gt;
|Dec 5&lt;br /&gt;
|UofT Fall Semester ends Wednesday; our [[10-1100/Final Exam|Final Exam]] will be on Friday&lt;br /&gt;
|- align=left&lt;br /&gt;
|colspan=3 align=center|[[11-1100/Register of Good Deeds|Register of Good Deeds]]&lt;br /&gt;
|- align=left&lt;br /&gt;
|colspan=3 align=center|[[Image:11-1100-ClassPhoto.jpg|310px]]&amp;lt;br/&amp;gt;[[11-1100/Class Photo|Add your name / see who&#039;s in!]]&lt;br /&gt;
|- align=left&lt;br /&gt;
|colspan=3 align=center|[[Image:10-1100-Splash.png|310px]]&amp;lt;br/&amp;gt;See {{Home Link|classes/1112/1100-AlgebraI/NCGE.html|Non Commutative Gaussian Elimination}}&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Tholden</name></author>
	</entry>
	<entry>
		<id>https://drorbn.net/index.php?title=11-1100/Homework_Solutions&amp;diff=10899</id>
		<title>11-1100/Homework Solutions</title>
		<link rel="alternate" type="text/html" href="https://drorbn.net/index.php?title=11-1100/Homework_Solutions&amp;diff=10899"/>
		<updated>2011-10-13T15:54:09Z</updated>

		<summary type="html">&lt;p&gt;Tholden: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{11-1100/Navigation}}&lt;br /&gt;
&lt;br /&gt;
==Sample solutions to Homework Assignment 1==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; align = &amp;quot;center&amp;quot;&lt;br /&gt;
|+ Please Input Your Information Here&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Last Name&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | First Name&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | User ID&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Link to Submission&lt;br /&gt;
|-&lt;br /&gt;
| Smith || Jerrod || [[User:Smith36j|Smith36j]] || [[Media:Smith-HW1Soln.pdf | here]]&lt;br /&gt;
|-&lt;br /&gt;
| Holden || Tyler || [[User:Tholden|tholden]] || [[Media:HoldenAlgHW1.pdf | Solutions]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Sample solutions to Homework Assignment 2==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; align = &amp;quot;center&amp;quot;&lt;br /&gt;
|+ Please Input Your Information Here&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Last Name&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | First Name&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | User ID&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Link to Submission&lt;br /&gt;
|-&lt;br /&gt;
| Last ||First|| User || Link&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Tholden</name></author>
	</entry>
	<entry>
		<id>https://drorbn.net/index.php?title=11-1100/Homework_Solutions&amp;diff=10898</id>
		<title>11-1100/Homework Solutions</title>
		<link rel="alternate" type="text/html" href="https://drorbn.net/index.php?title=11-1100/Homework_Solutions&amp;diff=10898"/>
		<updated>2011-10-13T15:53:04Z</updated>

		<summary type="html">&lt;p&gt;Tholden: Made section headers linkable&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Sample solutions to Homework Assignment 1==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; align = &amp;quot;center&amp;quot;&lt;br /&gt;
|+ Please Input Your Information Here&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Last Name&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | First Name&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | User ID&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Link to Submission&lt;br /&gt;
|-&lt;br /&gt;
| Smith || Jerrod || [[User:Smith36j|Smith36j]] || [[Media:Smith-HW1Soln.pdf | here]]&lt;br /&gt;
|-&lt;br /&gt;
| Holden || Tyler || [[User:Tholden|tholden]] || [[Media:HoldenAlgHW1.pdf | Solutions]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Sample solutions to Homework Assignment 2==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; align = &amp;quot;center&amp;quot;&lt;br /&gt;
|+ Please Input Your Information Here&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Last Name&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | First Name&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | User ID&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Link to Submission&lt;br /&gt;
|-&lt;br /&gt;
| Last ||First|| User || Link&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Tholden</name></author>
	</entry>
	<entry>
		<id>https://drorbn.net/index.php?title=Talk:11-1100/Homework_Solutions&amp;diff=10897</id>
		<title>Talk:11-1100/Homework Solutions</title>
		<link rel="alternate" type="text/html" href="https://drorbn.net/index.php?title=Talk:11-1100/Homework_Solutions&amp;diff=10897"/>
		<updated>2011-10-13T15:52:07Z</updated>

		<summary type="html">&lt;p&gt;Tholden: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Changing Format==&lt;br /&gt;
&lt;br /&gt;
I like the idea of this page, though I think I may change its format a little bit. In particular, if we add hyperlinks from the navigation bar, it would be useful if they went directly to the pertinent assignment. To do this, it will be necessary to change the section headers to be linkable. [[User:Tholden|Tholden]] 11:52, 13 October 2011 (EDT)&lt;/div&gt;</summary>
		<author><name>Tholden</name></author>
	</entry>
	<entry>
		<id>https://drorbn.net/index.php?title=User:Josh.seaton&amp;diff=10896</id>
		<title>User:Josh.seaton</title>
		<link rel="alternate" type="text/html" href="https://drorbn.net/index.php?title=User:Josh.seaton&amp;diff=10896"/>
		<updated>2011-10-13T15:42:09Z</updated>

		<summary type="html">&lt;p&gt;Tholden: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Assignment I - Permutation Counting]]&lt;br /&gt;
&lt;br /&gt;
==Messages==&lt;br /&gt;
&lt;br /&gt;
Hey. Not sure if you were in lecture today, but Dror warned that pages without the 11-1100 tag would be removed. Consequently, I have moved your HW1 Submission page so that it will not be deleted.[[User:Tholden|Tholden]] 11:42, 13 October 2011 (EDT)&lt;/div&gt;</summary>
		<author><name>Tholden</name></author>
	</entry>
	<entry>
		<id>https://drorbn.net/index.php?title=Assignment_I_-_Permutation_Counting&amp;diff=10895</id>
		<title>Assignment I - Permutation Counting</title>
		<link rel="alternate" type="text/html" href="https://drorbn.net/index.php?title=Assignment_I_-_Permutation_Counting&amp;diff=10895"/>
		<updated>2011-10-13T15:39:56Z</updated>

		<summary type="html">&lt;p&gt;Tholden: Assignment I - Permutation Counting moved to 11-1100/Assignment I - Permutation Counting: Adding class tag so page will not be deleted.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#redirect [[11-1100/Assignment I - Permutation Counting]]&lt;/div&gt;</summary>
		<author><name>Tholden</name></author>
	</entry>
	<entry>
		<id>https://drorbn.net/index.php?title=11-1100/Assignment_I_-_Permutation_Counting&amp;diff=10894</id>
		<title>11-1100/Assignment I - Permutation Counting</title>
		<link rel="alternate" type="text/html" href="https://drorbn.net/index.php?title=11-1100/Assignment_I_-_Permutation_Counting&amp;diff=10894"/>
		<updated>2011-10-13T15:39:56Z</updated>

		<summary type="html">&lt;p&gt;Tholden: Assignment I - Permutation Counting moved to 11-1100/Assignment I - Permutation Counting&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The puzzle that I have chosen is a 2x2x3 variant of the Rubik&#039;s cube. Below is a sketch of how I have labelled it.&lt;br /&gt;
&lt;br /&gt;
[[2x2x3 Permutation Puzzle]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Here are the generators:&lt;br /&gt;
&lt;br /&gt;
g1 = [1,2,3,4,12,22,7,8,6,11,21,28,13,14,15,16,17,18,5,10,20,27,23,24,25,26,9,19,29,30,31,32] &amp;lt;math&amp;gt; \equiv &amp;lt;/math&amp;gt; (28,19,5,12)(9,6,22,27)(10,11,21,20)&lt;br /&gt;
&lt;br /&gt;
g2 = [1,2,13,23,5,6,7,4,9,10,11,12,30,14,15,16,17,3,19,20,21,22,29,24,25,26,27,28,8,18,31,32] &amp;lt;math&amp;gt; \equiv &amp;lt;/math&amp;gt; (18,3,13,30)(8,4,23,29)&lt;br /&gt;
&lt;br /&gt;
g3 = [14,24,3,4,5,6,2,8,9,10,11,12,13,32,16,26,1,18,19,20,21,22,23,31,15,25,27,28,29,30,7,17] &amp;lt;math&amp;gt; \equiv &amp;lt;/math&amp;gt; (32,17,1,14)(24,31,7,2)(16,26,25,15)&lt;br /&gt;
&lt;br /&gt;
g4 = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,22,23,24,25,26,17,18,19,20,21,32,31,30,29,28,27] &amp;lt;math&amp;gt; \equiv &amp;lt;/math&amp;gt; (17,22)(18,23)(24,19)(25,20)(26,21)(32,27)(28,31)(29,30)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This is the Python code used to implement the NCGE algorithm for the 2x2x3 puzzle.&lt;br /&gt;
&lt;br /&gt;
[[NCGE Python Code]]&lt;br /&gt;
&lt;br /&gt;
First, the class of permutations is defined, along with how to multiply them and take their inverses. Then, algorithm is spelled out.&lt;br /&gt;
&lt;br /&gt;
The algorithm yields that their are &#039;&#039;&#039;39016857600&#039;&#039;&#039; different configurations of the 2x2x3 puzzle. The implementation was subsequently checked with the Rubik&#039;s cube generators given on [http://www.math.toronto.edu/~drorbn/Talks/Mathcamp-0907/NCGE.pdf the handout] and the correct numbers were outputted.&lt;/div&gt;</summary>
		<author><name>Tholden</name></author>
	</entry>
	<entry>
		<id>https://drorbn.net/index.php?title=11-1100/Homework_Solutions&amp;diff=10893</id>
		<title>11-1100/Homework Solutions</title>
		<link rel="alternate" type="text/html" href="https://drorbn.net/index.php?title=11-1100/Homework_Solutions&amp;diff=10893"/>
		<updated>2011-10-13T14:31:57Z</updated>

		<summary type="html">&lt;p&gt;Tholden: Added my solution set.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sample solutions to Homework Assignment 1&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; align = &amp;quot;center&amp;quot;&lt;br /&gt;
|+ Please Input Your Information Here&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Last Name&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | First Name&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | User ID&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Link to Submission&lt;br /&gt;
|-&lt;br /&gt;
| Smith || Jerrod || [[User:Smith36j|Smith36j]] || [[Media:Smith-HW1Soln.pdf | here]]&lt;br /&gt;
|-&lt;br /&gt;
| Holden || Tyler || [[User:Tholden|tholden]] || [[Media:HoldenAlgHW1.pdf | Solutions]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Sample solutions to Homework Assignment 2&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; align = &amp;quot;center&amp;quot;&lt;br /&gt;
|+ Please Input Your Information Here&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Last Name&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | First Name&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | User ID&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Link to Submission&lt;br /&gt;
|-&lt;br /&gt;
| Last ||First|| User || Link&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Tholden</name></author>
	</entry>
	<entry>
		<id>https://drorbn.net/index.php?title=User:Tholden&amp;diff=10882</id>
		<title>User:Tholden</title>
		<link rel="alternate" type="text/html" href="https://drorbn.net/index.php?title=User:Tholden&amp;diff=10882"/>
		<updated>2011-10-11T14:16:12Z</updated>

		<summary type="html">&lt;p&gt;Tholden: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hello and welcome to my user page.&lt;br /&gt;
&lt;br /&gt;
I will be using this page to publish my course notes, as well as a hyperlink to pages made before going live.&lt;br /&gt;
&lt;br /&gt;
==Course Notes ==&lt;br /&gt;
&lt;br /&gt;
[http://individual.utoronto.ca/tholden/CourseNotes/Algebra.pdf Tyler&#039;s Course Notes]&lt;br /&gt;
&lt;br /&gt;
==Assignments==&lt;br /&gt;
&lt;br /&gt;
[[Media:HoldenAlgHW1.pdf|First Homework Assignment]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==User Sub-Pages == &lt;br /&gt;
&lt;br /&gt;
[[User:Tholden/11-1100 Simplicity of the Alternating Group  ]]&lt;br /&gt;
&lt;br /&gt;
[[User:Tholden/Simplicity Redirect]]&lt;br /&gt;
&lt;br /&gt;
[[User:Tholden/11-1100/Homework Part 1]]&lt;br /&gt;
&lt;br /&gt;
[[User:Tholden/11-1100/File Repository]]&lt;br /&gt;
&lt;br /&gt;
==Messages ==&lt;br /&gt;
&lt;br /&gt;
Please leave messages for me here.&lt;/div&gt;</summary>
		<author><name>Tholden</name></author>
	</entry>
	<entry>
		<id>https://drorbn.net/index.php?title=File:HoldenAlgHW1.pdf&amp;diff=10881</id>
		<title>File:HoldenAlgHW1.pdf</title>
		<link rel="alternate" type="text/html" href="https://drorbn.net/index.php?title=File:HoldenAlgHW1.pdf&amp;diff=10881"/>
		<updated>2011-10-11T14:15:10Z</updated>

		<summary type="html">&lt;p&gt;Tholden: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Tholden</name></author>
	</entry>
	<entry>
		<id>https://drorbn.net/index.php?title=MATLAB_Code_for_Non-Commutative_Gaussian_Elimination&amp;diff=10853</id>
		<title>MATLAB Code for Non-Commutative Gaussian Elimination</title>
		<link rel="alternate" type="text/html" href="https://drorbn.net/index.php?title=MATLAB_Code_for_Non-Commutative_Gaussian_Elimination&amp;diff=10853"/>
		<updated>2011-10-10T22:36:05Z</updated>

		<summary type="html">&lt;p&gt;Tholden: MATLAB Code for Non-Commutative Gaussian Elimination moved to 11-1100/MATLAB Code for Non-Commutative Gaussian Elimination: Adding class tag&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#redirect [[11-1100/MATLAB Code for Non-Commutative Gaussian Elimination]]&lt;/div&gt;</summary>
		<author><name>Tholden</name></author>
	</entry>
	<entry>
		<id>https://drorbn.net/index.php?title=11-1100/MATLAB_Code_for_Non-Commutative_Gaussian_Elimination&amp;diff=10852</id>
		<title>11-1100/MATLAB Code for Non-Commutative Gaussian Elimination</title>
		<link rel="alternate" type="text/html" href="https://drorbn.net/index.php?title=11-1100/MATLAB_Code_for_Non-Commutative_Gaussian_Elimination&amp;diff=10852"/>
		<updated>2011-10-10T22:36:05Z</updated>

		<summary type="html">&lt;p&gt;Tholden: MATLAB Code for Non-Commutative Gaussian Elimination moved to 11-1100/MATLAB Code for Non-Commutative Gaussian Elimination&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I wrote a MATLAB script to carry out the non-commutative Gaussian elimination algorithm.  Specifically, I have chosen to use the problem of the 2x2x2 pocket cube; however, this algorithm may be easily adapted for finding the solution to other combinatorial puzzles.  The structure of the script is very similar to Dror&#039;s code.  I call the &amp;quot;Feed&amp;quot; script for each generator of the puzzle, but the built in recursion takes care of finding an empty spot in the table, as well as all the messiness of feeding all products of everything in the table.  &lt;br /&gt;
&lt;br /&gt;
My solution is slightly different, however, in that I carry out group operations using matrix representations of the generators.  I picked a representation of the group in which every matrix was comprised of only 1&#039;s and 0&#039;s.  This is useful, because it easily allows me to compute products, inverses, and find pivot points.  The representation of which I write can be constructed by considering the action of &amp;lt;math&amp;gt;S_{n}&amp;lt;/math&amp;gt; on an n-dimensional vector space.  As an example, consider the permutation &amp;lt;math&amp;gt;g = (1 2 3) \in S_{3}&amp;lt;/math&amp;gt;.  This permutation takes 1 -&amp;gt; 2, 2 -&amp;gt; 3, and 3 -&amp;gt; 1; thus, the matrix representation of this operation is:&lt;br /&gt;
&lt;br /&gt;
[[Image:Matrix.jpg]]&lt;br /&gt;
&lt;br /&gt;
From a computational standpoint this is kind of a bad idea, but I figured it was something different and no one else was likely to try this solution.&lt;br /&gt;
&lt;br /&gt;
First, I needed to define the problem for the computer.  I picked an enumeration of the faces of the 2x2x2 cube, and wrote out the generators of the group based on this enumeration.  The rotations of the faces are the generators for the group operations.  Since the cube has six faces which can be rotated, there are six generators.  The group I am dealing with is a subgroup of the permutations on 24 elements because a 2x2x2 cube has 6*4 = 24 faces.  The following figure shows how I chose my enumeration of the cube faces:&lt;br /&gt;
&lt;br /&gt;
[[Image:cubelayout.jpg]]&lt;br /&gt;
(A) This sub-figure demonstrates the enumeration of the faces that I adopted. (B)  An image of the Pocket Cube. (C) A list of the group generators (face rotations).&lt;br /&gt;
&lt;br /&gt;
Note that since the pocket cube has no faces which would fix its overall orientation, there are actually 24 equivalent cube configurations per permutation; thus, whatever answer is obtained at the end needs to be divided by 24 to give the actual group order.&lt;br /&gt;
&lt;br /&gt;
I split the program into 3 parts. BG2.m is a short script which builds the matrix representations of the generators.  Feed.m is a script which carries out the non-commutative Gaussian elimination algorithm.  Finally, PocketCube.m is a parent script in which the generators of the pocket cube problem are defined, the Feed algorithm is called for each generator, and once the lookup table is finally constructed, the order of the group is output.&lt;br /&gt;
&lt;br /&gt;
[[Image:BG2.jpg]]&lt;br /&gt;
[[Image:Feed.jpg]]&lt;br /&gt;
[[Image:PocketCube.jpg]]&lt;br /&gt;
&lt;br /&gt;
At the MATLAB prompt, the following set of commands were used to run my program:&lt;br /&gt;
&lt;br /&gt;
[[Image:output.jpg]]&lt;br /&gt;
[[Image:pivot.jpg]]&lt;br /&gt;
&lt;br /&gt;
The above plot is displaying the non-zero entries in the NCGE table.  I calculate the order of the Pocket Cube group to be 3,674,160.  I also ran the program using a restricted subset of the generators.  Interestingly, the entire pocket cube group can be generated using only 3 of the face rotations!&lt;/div&gt;</summary>
		<author><name>Tholden</name></author>
	</entry>
	<entry>
		<id>https://drorbn.net/index.php?title=User:Dsoukup&amp;diff=10849</id>
		<title>User:Dsoukup</title>
		<link rel="alternate" type="text/html" href="https://drorbn.net/index.php?title=User:Dsoukup&amp;diff=10849"/>
		<updated>2011-10-10T22:31:55Z</updated>

		<summary type="html">&lt;p&gt;Tholden: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Message==&lt;br /&gt;
&lt;br /&gt;
Hey Dan. Hope you don&#039;t mind, but I jacked your [[11-1100/Homework Assignment 1 Submissions|solution&#039;s page]] and reformatted it so that everybody could use it. [[User:Tholden|Tholden]] 18:31, 10 October 2011 (EDT)&lt;/div&gt;</summary>
		<author><name>Tholden</name></author>
	</entry>
	<entry>
		<id>https://drorbn.net/index.php?title=11-1100/Navigation&amp;diff=10846</id>
		<title>11-1100/Navigation</title>
		<link rel="alternate" type="text/html" href="https://drorbn.net/index.php?title=11-1100/Navigation&amp;diff=10846"/>
		<updated>2011-10-10T22:22:35Z</updated>

		<summary type="html">&lt;p&gt;Tholden: Changed Solutions -&amp;gt; Submissions&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;Back to [[11-1100]].&amp;lt;br/&amp;gt;&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
{| border=&amp;quot;1px&amp;quot; cellpadding=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; width=&amp;quot;100%&amp;quot; style=&amp;quot;font-size: small; align: left&amp;quot;&lt;br /&gt;
|- align=left&lt;br /&gt;
!#&lt;br /&gt;
!Week of...&lt;br /&gt;
!Notes and Links&lt;br /&gt;
|- align=left&lt;br /&gt;
|align=center|1&lt;br /&gt;
|Sep 12&lt;br /&gt;
|[[11-1100/About This Class|About This Class]], [[11-1100/Classnotes for Tuesday September 13|Tuesday]] - Non Commutative Gaussian Elimination, [[11-1100/Classnotes for Thursday September 15|Thursday]] - NCGE completed, the category of groups, images and kernels.&lt;br /&gt;
|- align=left&lt;br /&gt;
|align=center|2&lt;br /&gt;
|Sep 19&lt;br /&gt;
|I&#039;ll be in {{Home link|Talks/Strasbourg-1109/|Strasbourg}}, class was be taught by [http://www.math.toronto.edu/selick/ Paul Selick]. See my {{Home link|classes/1112/1100-AlgebraI/The_Selick_Week.html|summary}}.&lt;br /&gt;
|- align=left&lt;br /&gt;
|align=center|3&lt;br /&gt;
|Sep 26&lt;br /&gt;
|[[11-1100/Class Photo|Class Photo]], [[11-1100/Homework Assignment 1| HW1]], [[11-1100/Homework Assignment 1 Submissions| HW1 Submissions]]&lt;br /&gt;
|- align=left&lt;br /&gt;
|align=center|4&lt;br /&gt;
|Oct 3&lt;br /&gt;
|[[11-1100/The Simplicity of the Alternating Groups| The Simplicity of the Alternating Groups]]&lt;br /&gt;
|- align=left&lt;br /&gt;
|align=center|5&lt;br /&gt;
|Oct 10&lt;br /&gt;
|[[11-1100/Homework Assignment 2|HW2]]&lt;br /&gt;
|- align=left&lt;br /&gt;
|align=center|6&lt;br /&gt;
|Oct 18&lt;br /&gt;
|&lt;br /&gt;
|- align=left&lt;br /&gt;
|align=center|7&lt;br /&gt;
|Oct 24&lt;br /&gt;
|[[11-1100/Term Test|Term Test]]&lt;br /&gt;
|- align=left&lt;br /&gt;
|align=center|8&lt;br /&gt;
|Oct 31&lt;br /&gt;
|[[11-1100/Homework Assignment 3|HW3]]&lt;br /&gt;
|- align=left&lt;br /&gt;
|align=center|9&lt;br /&gt;
|Nov 7&lt;br /&gt;
|Monday-Tuesday is November Break&lt;br /&gt;
|- align=left&lt;br /&gt;
|align=center|10&lt;br /&gt;
|Nov 14&lt;br /&gt;
|[[11-1100/Homework Assignment 4|HW4]]&lt;br /&gt;
|- align=left&lt;br /&gt;
|align=center|11&lt;br /&gt;
|Nov 21&lt;br /&gt;
|&lt;br /&gt;
|- align=left&lt;br /&gt;
|align=center|12&lt;br /&gt;
|Nov 28&lt;br /&gt;
|[[11-1100/Homework Assignment 5|HW5]]&lt;br /&gt;
|- align=left&lt;br /&gt;
|align=center|13&lt;br /&gt;
|Dec 5&lt;br /&gt;
|UofT Fall Semester ends Wednesday; our [[10-1100/Final Exam|Final Exam]] will be on Friday&lt;br /&gt;
|- align=left&lt;br /&gt;
|colspan=3 align=center|[[11-1100/Register of Good Deeds|Register of Good Deeds]]&lt;br /&gt;
|- align=left&lt;br /&gt;
|colspan=3 align=center|[[Image:11-1100-ClassPhoto.jpg|310px]]&amp;lt;br/&amp;gt;[[11-1100/Class Photo|Add your name / see who&#039;s in!]]&lt;br /&gt;
|- align=left&lt;br /&gt;
|colspan=3 align=center|[[Image:10-1100-Splash.png|310px]]&amp;lt;br/&amp;gt;See {{Home Link|classes/1112/1100-AlgebraI/NCGE.html|Non Commutative Gaussian Elimination}}&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Tholden</name></author>
	</entry>
	<entry>
		<id>https://drorbn.net/index.php?title=11-1100/Homework_Assignment_1_Solutions&amp;diff=10845</id>
		<title>11-1100/Homework Assignment 1 Solutions</title>
		<link rel="alternate" type="text/html" href="https://drorbn.net/index.php?title=11-1100/Homework_Assignment_1_Solutions&amp;diff=10845"/>
		<updated>2011-10-10T22:21:41Z</updated>

		<summary type="html">&lt;p&gt;Tholden: 11-1100/Homework Assignment 1 Solutions moved to 11-1100/Homework Assignment 1 Submissions: Possible naming conflict if official solutions are posted.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#redirect [[11-1100/Homework Assignment 1 Submissions]]&lt;/div&gt;</summary>
		<author><name>Tholden</name></author>
	</entry>
	<entry>
		<id>https://drorbn.net/index.php?title=Talk:11-1100/Homework_Assignment_1_Solutions&amp;diff=10843</id>
		<title>Talk:11-1100/Homework Assignment 1 Solutions</title>
		<link rel="alternate" type="text/html" href="https://drorbn.net/index.php?title=Talk:11-1100/Homework_Assignment_1_Solutions&amp;diff=10843"/>
		<updated>2011-10-10T22:20:42Z</updated>

		<summary type="html">&lt;p&gt;Tholden: Talk:11-1100/Homework Assignment 1 Solutions moved to Talk:11-1100/Homework Assignment 1 Submissions: Possible name conflict in the event official solutions to the problem sets are posted.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#redirect [[Talk:11-1100/Homework Assignment 1 Submissions]]&lt;/div&gt;</summary>
		<author><name>Tholden</name></author>
	</entry>
	<entry>
		<id>https://drorbn.net/index.php?title=Talk:11-1100/Homework_Assignment_1_Submissions&amp;diff=10842</id>
		<title>Talk:11-1100/Homework Assignment 1 Submissions</title>
		<link rel="alternate" type="text/html" href="https://drorbn.net/index.php?title=Talk:11-1100/Homework_Assignment_1_Submissions&amp;diff=10842"/>
		<updated>2011-10-10T22:20:42Z</updated>

		<summary type="html">&lt;p&gt;Tholden: Talk:11-1100/Homework Assignment 1 Solutions moved to Talk:11-1100/Homework Assignment 1 Submissions&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Moving Page==&lt;br /&gt;
&lt;br /&gt;
I don&#039;t think this is appropriately named. If Dror wants to post actual solutions, then we&#039;ll have a naming conflict. I&#039;m going to change this page to submissions instead. [[User:Tholden|Tholden]] 18:20, 10 October 2011 (EDT)&lt;/div&gt;</summary>
		<author><name>Tholden</name></author>
	</entry>
	<entry>
		<id>https://drorbn.net/index.php?title=Talk:11-1100/Homework_Assignment_1_Submissions&amp;diff=10841</id>
		<title>Talk:11-1100/Homework Assignment 1 Submissions</title>
		<link rel="alternate" type="text/html" href="https://drorbn.net/index.php?title=Talk:11-1100/Homework_Assignment_1_Submissions&amp;diff=10841"/>
		<updated>2011-10-10T22:20:10Z</updated>

		<summary type="html">&lt;p&gt;Tholden: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Moving Page==&lt;br /&gt;
&lt;br /&gt;
I don&#039;t think this is appropriately named. If Dror wants to post actual solutions, then we&#039;ll have a naming conflict. I&#039;m going to change this page to submissions instead. [[User:Tholden|Tholden]] 18:20, 10 October 2011 (EDT)&lt;/div&gt;</summary>
		<author><name>Tholden</name></author>
	</entry>
	<entry>
		<id>https://drorbn.net/index.php?title=User:Tholden/11-1100/Homework_Part_1&amp;diff=10834</id>
		<title>User:Tholden/11-1100/Homework Part 1</title>
		<link rel="alternate" type="text/html" href="https://drorbn.net/index.php?title=User:Tholden/11-1100/Homework_Part_1&amp;diff=10834"/>
		<updated>2011-10-10T18:43:31Z</updated>

		<summary type="html">&lt;p&gt;Tholden: /* 2x2x2 Rubik&amp;#039;s cube */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page showcases my work done in implementing the Non-Commutative Gaussian Elimination algorithm with direct application to solving a permutation puzzle. I would like it to be known that I had originally chosen the Megaminx puzzle and am still in the process of solving it. The algorithm is currently running on a Sun x4600 computational server using Matlab 2010b including eight Opteron 8212 processors with 32 GB of memory. However, the algorithm is not conducive to parallelization and so has yet to converge. As a test-case, I have solved the &amp;lt;math&amp;gt; 2 \times 2 \times 2 &amp;lt;/math&amp;gt; Rubik&#039;s cube, which I will also present here. In the event that the algorithm has not converged, I will submit the &amp;lt;math&amp;gt; 2 \times 2 \times 2 &amp;lt;/math&amp;gt; Rubik&#039;s cube for marking.&lt;br /&gt;
&lt;br /&gt;
==Theoretical Review of the Algorithm==&lt;br /&gt;
&lt;br /&gt;
The purpose of Non-Commutative Gaussian Elimination (NCGE) is to find the elements and order of a subgroup generated by a finite set of generators. The algorithm proceeds as follows:&lt;br /&gt;
&lt;br /&gt;
Let &amp;lt;math&amp;gt;G = \langle g_1,\ldots, g_\alpha \rangle&amp;lt;/math&amp;gt;. Define the pivot of &amp;lt;math&amp;gt;\sigma \in S_n&amp;lt;/math&amp;gt; to be the minimal &amp;lt;math&amp;gt;k \in \mathbb N&amp;lt;/math&amp;gt; such that &amp;lt;math&amp;gt;\sigma(k) \neq k&amp;lt;/math&amp;gt;. We prepare a table which is mostly empty&lt;br /&gt;
&lt;br /&gt;
[[Image:NCGETable1.jpg|thumb|right|alt=The table initialization for Non-Commutative Gaussian Elimination.|A mostly empty table for Gaussian Elimination]]&lt;br /&gt;
&lt;br /&gt;
Feed &amp;lt;math&amp;gt;g_1, \ldots, g_n&amp;lt;/math&amp;gt; in order. To feed a non-identity &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;, find its pivotal position &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; and let &amp;lt;math&amp;gt;j = \sigma(i)&amp;lt;/math&amp;gt;. &lt;br /&gt;
#If box &amp;lt;math&amp;gt;(i,j)&amp;lt;/math&amp;gt; is empty, put &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; in this box.&lt;br /&gt;
#If box &amp;lt;math&amp;gt;(i,j)&amp;lt;/math&amp;gt; is not-empty, feed &amp;lt;math&amp;gt;\sigma&#039; = \sigma_{i,j}^{-1} \sigma&amp;lt;/math&amp;gt; into the table.&lt;br /&gt;
&lt;br /&gt;
After this procedure is completed, for each occupied box &amp;lt;math&amp;gt;(i,j)&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;(k,\ell)&amp;lt;/math&amp;gt; feed the product &amp;lt;math&amp;gt;\sigma_{i,j}\sigma_{k,\ell}&amp;lt;/math&amp;gt; into the table. Repeat this until the table stops changing.&lt;br /&gt;
&lt;br /&gt;
==Matlab Implementation ==&lt;br /&gt;
&lt;br /&gt;
Individual and additional files can be downloaded from [[User:Tholden/11-1100/File Repository|this page]]. However, for completeness the primary algorithm has been included below. Its documentation is fairly comprehensive, and so all explanation of the code will be deferred to the code itself.&lt;br /&gt;
&lt;br /&gt;
   function [table, tabLogic] = NonComGaussElim(myperms, table, tabLogic)&lt;br /&gt;
   %&lt;br /&gt;
   % NONCOMGAUSSELIM: A function used for computing the non-commutive gaussian&lt;br /&gt;
   % elimination algorithm on a finitely generated subset of the symmetric&lt;br /&gt;
   % group.&lt;br /&gt;
   %&lt;br /&gt;
   % [table,tabLogic] = NonComGaussElim(myperms,table,tabLogic)&lt;br /&gt;
   %&lt;br /&gt;
   %  INPUT:  myperms - [cell] A cell whose entries consist of the generators&lt;br /&gt;
   %                    of the group. The format of these entries should be&lt;br /&gt;
   %                    given via the &amp;quot;image&amp;quot; notation. Namely, if sigma is&lt;br /&gt;
   %                    a generator in Sn, then express sigma as&lt;br /&gt;
   %                    [sigma(1), sigma(2), ..., sigma(n)]&lt;br /&gt;
   %            table - [3d array, non-user input] The result of the&lt;br /&gt;
   %                    calculations. Necessary for recursion and needn&#039;t be&lt;br /&gt;
   %                    supplied by the end-user.&lt;br /&gt;
   %         tabLogic - [2d array, non-user input] The logical array&lt;br /&gt;
   %                    consisting of the non-identity indices for which&lt;br /&gt;
   %                    elements have been inserted into the table. Need not&lt;br /&gt;
   %                    be supplied by the end-user.&lt;br /&gt;
   % OUTPUT:    table - [3d array] The final result of the calculations.&lt;br /&gt;
   %                    table(i,j,:) consists of the permutation element&lt;br /&gt;
   %                    corresponding to pivot i with image j. &lt;br /&gt;
   %         tabLogic - [2d array] The logical array&lt;br /&gt;
   %                    consisting of the non-identity indices for which&lt;br /&gt;
   %                    elements have been inserted into the table.&lt;br /&gt;
   %&lt;br /&gt;
   % Example: Consider the symmetric group S4 and the generators&lt;br /&gt;
   %          g1 = [2 3 1 4] and g2 = [2 1 4 3]. The code is executed as&lt;br /&gt;
   %          &amp;gt;&amp;gt;myperms = {[2 3 1 4], [2 1 4 3]};&lt;br /&gt;
   %          &amp;gt;&amp;gt;[table, tabLogical] = NonComGaussElim(myperms);&lt;br /&gt;
   &lt;br /&gt;
   % Version : 1.2&lt;br /&gt;
   % Author  : Tyler Holden&lt;br /&gt;
   % Date    : September 29, 2011&lt;br /&gt;
   &lt;br /&gt;
   %    To Do: &lt;br /&gt;
   % 1) Add step to pre-process the input permutations. In particular, if&lt;br /&gt;
   %    the identity element is given as one of the generators, this algorithm&lt;br /&gt;
   %    will terminate prematurely. This is because the recursive halting&lt;br /&gt;
   %    criterion is the identity permutation&lt;br /&gt;
   % 2) Optimize for parallel computing. There are not many places wherein&lt;br /&gt;
   %    such improvements could be made, since the algorithm is recursive and&lt;br /&gt;
   %    heavily dependent on neighbouring iterations. However, some&lt;br /&gt;
   %    improvements may be made to computing products and inverses of&lt;br /&gt;
   %    elements.&lt;br /&gt;
   &lt;br /&gt;
   try&lt;br /&gt;
       &lt;br /&gt;
       % Return condition for recursion.&lt;br /&gt;
       if isempty(myperms)&lt;br /&gt;
           return&lt;br /&gt;
       end %End if&lt;br /&gt;
   &lt;br /&gt;
       sizeGrp = length(cell2mat(myperms(1)));&lt;br /&gt;
   &lt;br /&gt;
       % Since the user is not expected to input the table, the following&lt;br /&gt;
       % condition checks that we are at the top level of the recursion and&lt;br /&gt;
       % creates the table as necessary.&lt;br /&gt;
       if nargin &amp;lt; 2&lt;br /&gt;
           table = zeros(sizeGrp,sizeGrp,sizeGrp);&lt;br /&gt;
           tabLogic = zeros(sizeGrp);&lt;br /&gt;
           %     for i=1:sizeGrp&lt;br /&gt;
           %         table(i,i,:) = 1:sizeGrp;&lt;br /&gt;
           %     end %End for(i)&lt;br /&gt;
       end %End if&lt;br /&gt;
   &lt;br /&gt;
       % Here we pull out the first generator and calculate its pivot point.&lt;br /&gt;
       curGen = cell2mat(myperms(1));&lt;br /&gt;
       [piv,img] = findPivot(curGen);&lt;br /&gt;
   &lt;br /&gt;
       % If curGen is the identity, piv will be empty. In this case, we simply&lt;br /&gt;
       % return to the call function. This is used in sublevels of the recursion.&lt;br /&gt;
       % However, this will result in improper calculations if the identity is&lt;br /&gt;
       % included in the original set of permutations. In a future version of this&lt;br /&gt;
       % code, one could &amp;quot;pre-process&amp;quot; the input permutations to remove the&lt;br /&gt;
       % identity elements. This would remove the erroneous calculations and the&lt;br /&gt;
       % recursion check would stay consistent.&lt;br /&gt;
       if isempty(piv)&lt;br /&gt;
           return;&lt;br /&gt;
       end %End if&lt;br /&gt;
   &lt;br /&gt;
       % Pull the permutation from the table. Afterwards, check if it is empty. If&lt;br /&gt;
       % so, input curGen into the table. Otherwise, pre-multiply and apply&lt;br /&gt;
       % recursively to the singleton permutation.&lt;br /&gt;
       sigij(1:sizeGrp) = table(piv,img,1:sizeGrp);&lt;br /&gt;
   &lt;br /&gt;
       if isempty(find(sigij))&lt;br /&gt;
           table(piv,img,:) = curGen;&lt;br /&gt;
           tabLogic(piv,img) = 1;&lt;br /&gt;
           % Only when something new has been added to the table do we do the&lt;br /&gt;
           % multiplication step. Note that it is important to do multiplication&lt;br /&gt;
           % on both sides, otherwise this will not work.&lt;br /&gt;
           for it1=sizeGrp:-1:1;&lt;br /&gt;
               for it2=sizeGrp:-1:it1&lt;br /&gt;
                   if tabLogic(it1,it2)&lt;br /&gt;
                       sigij(1:sizeGrp) = table(it1,it2,1:sizeGrp);&lt;br /&gt;
                       %First multiplication.&lt;br /&gt;
                       newPerm = permMult(sigij, curGen);&lt;br /&gt;
                       [table,tabLogic] = NonComGaussElim({newPerm}, table, tabLogic);&lt;br /&gt;
                       %Second multiplication.&lt;br /&gt;
                        newPerm = permMult(curGen, sigij);&lt;br /&gt;
                        [table,tabLogic] = NonComGaussElim({newPerm}, table, tabLogic);&lt;br /&gt;
                    end %End if&lt;br /&gt;
                end %End for(it2)&lt;br /&gt;
            end %End for (it1)&lt;br /&gt;
        else&lt;br /&gt;
            newPerm = permMult(permInv(sigij),curGen);&lt;br /&gt;
            [table, tabLogic] = NonComGaussElim({newPerm}, table, tabLogic);&lt;br /&gt;
        end %end if &lt;br /&gt;
 &lt;br /&gt;
     %Once the generator and its multiples have been added, we remove it from&lt;br /&gt;
     %the list of permutations and apply the algorithm recursively.&lt;br /&gt;
     [table, tabLogic] = NonComGaussElim(myperms(2:end), table, tabLogic);&lt;br /&gt;
   catch ME&lt;br /&gt;
       disp(&#039;Error&#039;);&lt;br /&gt;
   end &lt;br /&gt;
   &lt;br /&gt;
   %-------------------------------Subroutines-------------------------------%&lt;br /&gt;
 &lt;br /&gt;
   function [pivot, image] = findPivot(permut)&lt;br /&gt;
   %&lt;br /&gt;
   % Calculates the pivot of the permutation. If the permutation is identity,&lt;br /&gt;
   % pivot and image return empty.&lt;br /&gt;
   pivot = find(permut ~= 1:length(permut),1);&lt;br /&gt;
   image = permut(pivot);&lt;br /&gt;
   &lt;br /&gt;
   function prod = permMult(perm1, perm2)&lt;br /&gt;
   %&lt;br /&gt;
   % Multiplies two permutations. This is simply the composition of the&lt;br /&gt;
   % permtuations acting on the set {1,...,n}. That is, if sigma and tau are&lt;br /&gt;
   % permutations, then sigma*tau acting on the set {1,...,n} is given in&lt;br /&gt;
   % &amp;quot;image notation&amp;quot; as&lt;br /&gt;
   % sigma*tau = [sigma(tau(1)), sigma(tau(2)), ... , sigma(tau(n)) ]&lt;br /&gt;
   prod = perm1(perm2);&lt;br /&gt;
   &lt;br /&gt;
   function inverse = permInv(perm)&lt;br /&gt;
   %&lt;br /&gt;
   % Calculates the inverse element. If sigma is the permutation to be&lt;br /&gt;
   % inverted, it is written as [sigma(1), sigma(2), ... , sigma(n)]. The&lt;br /&gt;
   % inverse of this function is just done by placing j in the sigma(j)&lt;br /&gt;
   % position. &lt;br /&gt;
   inverse(perm) = 1:length(perm);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 2x2x2 Rubik&#039;s cube==&lt;br /&gt;
&lt;br /&gt;
[[Image:2x2x2CubeSmall.jpg|thumb|right|alt=A picture of the 2x2x2 Rubik&#039;s cube.|The 2x2x2 Rubik&#039;s cube.]]&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;math&amp;gt; 2 \times 2 \times 2 &amp;lt;/math&amp;gt; Rubik&#039;s cube is a simplified version of the classical Rubik&#039;s cube. Indeed, while this simplified Rubik&#039;s cube still has six faces, each face only has four stickers. This greatly simplifies the process of analyzing the subgroup generated by this problem. We note that there are a total of &amp;lt;math&amp;gt; 24 &amp;lt;/math&amp;gt; stickers on this cube, so that the generators a subgroup of &amp;lt;math&amp;gt; S_{24} &amp;lt;/math&amp;gt; which has order &amp;lt;math&amp;gt; 24! &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
To determine our sticker numbering, we have rendered a [http://individual.utoronto.ca/tholden/CourseNotes/AlgebraWikiCode/RotatingCube.gif three-dimensional image of the cube], the source code for which can be found on my [[User:Tholden/11-1100/File Repository|file repository]].&lt;br /&gt;
&lt;br /&gt;
Using the numbering scheme given in the rendered image of the cube, our generators can be given in cycle notation as&lt;br /&gt;
* &amp;lt;math&amp;gt; g_1 = (1\ 3\ 4\ 2) (22\ 6\ 9\ 17) (21\ 5\ 10\ 18) &amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt; g_2 = (5\ 6\ 8\ 7) (21\ 14\ 11\ 1) (23\ 13\ 9\ 2) &amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt; g_3 = (9\ 11\ 12\ 10) (3\ 5\ 13\ 19) ( 1\ 7\ 15\ 17) &amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt; g_4 = (13\ 15\ 16\ 14) (24\ 8\ 11\ 19) (23\ 7\ 12\ 20) &amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt; g_5 = (17\ 18\ 20\ 19) (22\ 16\ 12\ 3)(24\ 15\ 10\ 4) &amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt; g_6 = (21\ 23\ 24\ 22)(14\ 20\ 4\ 6)(16\ 18\ 2\ 8) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Using the supplied files, the code can be executed as follows:&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt; SimpleCube2&lt;br /&gt;
 &amp;gt;&amp;gt; tic; [table,tabLogic] = NonComGaussElim(myPerms); toc&lt;br /&gt;
 Elapsed time is 4.016460 seconds.&lt;br /&gt;
 &amp;gt;&amp;gt; prod(sum(tabLogic&#039;)+1)&lt;br /&gt;
 ans =&lt;br /&gt;
    88179840&lt;br /&gt;
&lt;br /&gt;
However, we note that unlike the classical Rubik&#039;s cube, there are no center pieces whose position fixes an orientation of our configuration. Consequently, there are 24 additional symmetries. We conclude the actual size of the &amp;lt;math&amp;gt; 2\times 2 \times 2 &amp;lt;/math&amp;gt; Rubik&#039;s cube group is &amp;lt;math&amp;gt; 3674160 = \frac{88179840}{24} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Megaminx==&lt;br /&gt;
&lt;br /&gt;
[[Image:Megaminx.jpg|thumb|right|alt=The Megaminx permutation puzzle in a solved state. |The Megaminx Permutation Puzzle.]]&lt;br /&gt;
&lt;br /&gt;
The Megaminx is an advanced but conceptually related cousin of the Rubik&#039;s cube. However, the polyhedron on which this puzzle is situated is not a cube, but is instead a dodecahedron. Consequently, this puzzle has twelve (12) faces and each face has a star configuration. The star configuration imparts eleven (11) stickers per face, meaning that this puzzle forms a subgroup of &amp;lt;math&amp;gt; S_{132} &amp;lt;/math&amp;gt; which has order &amp;lt;math&amp;gt; 132! &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
The sticker numbering for the Dodecahedron has been done by rendering a [http://individual.utoronto.ca/tholden/CourseNotes/AlgebraWikiCode/MegaminxNumbering.gif three-dimensional image of the dodecahedron.] With this numbering convention, the generators of the Megaminx group are given by&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt; g_1 =(1\ 5\ 11\ 9\ 2)(4\ 8\ 10\ 6\ 3)(20\ 64\ 53\ 42\ 31)(21\ 65\ 54\ 43\ 32)(22\ 66\ 55\ 44\ 35)&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt; g_2 =(12\ 16\ 22\ 20\ 13)(15\ 19\ 21\ 17\ 14)(\ 1\ 33\ 86\ 68\ 57)(3\ 30\ 87\ 72\ 61)(2\ 27\ 88\ 75\ 64)&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt; g_3 =(23\ 27\ 33\ 31\ 24)(26\ 30\ 32\ 28\ 25)(2\ 44\ 97\ 79\ 13)(6\ 41\ 98\ 83\ 17)(9\ 38\ 99\ 86\ 20)&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt; g_4 =(34\ 38\ 44\ 42\ 35)(37\ 41\ 43\ 39\ 36)(9\ 55\ 108\ 90\ 24 )(10\ 52\ 109\ 94\ 28)(11\ 49\ 110\ 97\ 31)&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt; g_5 =(45\ 49\ 55\ 53\ 46)(48\ 52\ 54\ 50\ 47)(5\ 60\ 121\ 108\ 42)(8\ 63\ 120\ 105\ 39)(11\ 66\ 119\ 101\ 35)&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt; g_6 =(56\ 60\ 66\ 64\ 57)(59\ 63\ 65\ 61\ 58)(1\ 16\ 77\ 119\ 53)(4\ 19\ 76\ 116\ 50)(5\ 22\ 75\ 112\ 46)&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt; g_7 =(67\ 71\ 77\ 75\ 68)(70\ 74\ 76\ 72\ 69)(12\ 82\ 130\ 112\ 57)(15\ 85\ 127\ 113\ 58)(16\ 88\ 123\ 111\ 56)&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt; g_8 =(78\ 82\ 88\ 86\ 79)(81\ 85\ 87\ 83\ 80)(13\ 23\ 93\ 123\ 68)(14\ 26\ 96\ 124\ 69)(12\ 27\ 99\ 122\ 67)&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt; g_9 =(89\ 93\ 99\ 97\ 90)(92\ 96\ 98\ 94\ 91)(24\ 34\ 104\ 122\ 79)(25\ 37\ 107\ 125\ 80)(23\ 38\ 110\ 126\ 78)&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt; g_{10} =(100\ 104\ 110\ 108\ 101)(103\ 107\ 109\ 105\ 102)(35\ 45\ 115\ 126\ 90)(36\ 48\ 118\ 129\ 91)(34\ 49\ 121\ 132\ 89)&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt; g_{11} =(111\ 115\ 121\ 119\ 112)(114\ 118\ 120\ 116\ 113)(46\ 56\ 71\ 132\ 101)(47\ 59\ 74\ 131\ 102)(45\ 60\ 77\ 130\ 100)&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt; g_{12} =(122\ 126\ 132\ 130\ 123)(125\ 129\ 131\ 127\ 124)(67\ 78\ 89\ 100\ 111)(70\ 81\ 92\ 103\ 114)(71\ 82\ 93\ 104\ 115)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As of writing this article, the algorithm has yet to converge. However, there are partial results that we can state. In particular, on four generators, the size of the group is the order of &amp;lt;math&amp;gt; 1.9 \times 10^{57} &amp;lt;/math&amp;gt;. This was done using the code&lt;br /&gt;
 &amp;gt;&amp;gt;Dodecahedron2&lt;br /&gt;
 &amp;gt;&amp;gt;subPerms = myPerms(1:4);&lt;br /&gt;
 &amp;gt;&amp;gt; tic; [table,tabLogic] = NonComGaussElim(subPerms); toc&lt;br /&gt;
 Elapsed time is 1153.4619 seconds&lt;/div&gt;</summary>
		<author><name>Tholden</name></author>
	</entry>
	<entry>
		<id>https://drorbn.net/index.php?title=User:Tholden/11-1100/File_Repository&amp;diff=10833</id>
		<title>User:Tholden/11-1100/File Repository</title>
		<link rel="alternate" type="text/html" href="https://drorbn.net/index.php?title=User:Tholden/11-1100/File_Repository&amp;diff=10833"/>
		<updated>2011-10-10T18:37:58Z</updated>

		<summary type="html">&lt;p&gt;Tholden: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Any files located on any of my pages can be found below. In particular, since the wiki server does not like adding .m files, these are hyperlinked to my ftp page.&lt;br /&gt;
&lt;br /&gt;
[http://individual.utoronto.ca/tholden/CourseNotes/AlgebraWikiCode/addCycle2Img.m addCycle2Img.m] - A Matlab M-file that converts from cycle notation to &amp;quot;image&amp;quot; notation.&lt;br /&gt;
&lt;br /&gt;
[http://individual.utoronto.ca/tholden/CourseNotes/AlgebraWikiCode/Dodecahedron2.m Dodecahedron.m] - A Matlab M-file that generates the renders a three-dimensional image of the dodecahedron along with a star pattern on each face and a numbering scheme.&lt;br /&gt;
&lt;br /&gt;
[http://individual.utoronto.ca/tholden/CourseNotes/AlgebraWikiCode/Dodecahedron2.m Dodecahedron2.m] - A Matlab M-file that generates the input parameters for use in solving the Megaminx problem in conjunction with NonCommGaussElim.m.&lt;br /&gt;
&lt;br /&gt;
[http://individual.utoronto.ca/tholden/CourseNotes/AlgebraWikiCode/SimpleCube.m SimpleCube.m] - A Matlab M-file that generates the renders a three-dimensional image of the pocket cube along with a numbering scheme.&lt;br /&gt;
&lt;br /&gt;
[http://individual.utoronto.ca/tholden/CourseNotes/AlgebraWikiCode/SimpleCube2.m SimpleCube2.m] - A Matlab M-file that generates the input parameters for use in solving the &amp;lt;math&amp;gt; 2 \times 2 \times 2 &amp;lt;/math&amp;gt; Rubik&#039;s cube problem in conjunction with NonCommGaussElim.m.&lt;br /&gt;
&lt;br /&gt;
[http://individual.utoronto.ca/tholden/CourseNotes/AlgebraWikiCode/RotatingCube.gif RotatingCube Animation] - A GIF file that animates the sticker choice for the pocket cube. &lt;br /&gt;
&lt;br /&gt;
[http://individual.utoronto.ca/tholden/CourseNotes/AlgebraWikiCode/MegaminxNumbering.gif RotatingCube Animation] - A GIF file that animates the sticker choice for the Megaminx permutation problem.&lt;/div&gt;</summary>
		<author><name>Tholden</name></author>
	</entry>
	<entry>
		<id>https://drorbn.net/index.php?title=User:Jmracek&amp;diff=10832</id>
		<title>User:Jmracek</title>
		<link rel="alternate" type="text/html" href="https://drorbn.net/index.php?title=User:Jmracek&amp;diff=10832"/>
		<updated>2011-10-10T18:32:00Z</updated>

		<summary type="html">&lt;p&gt;Tholden: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hello all, and welcome to my user page.  Here you will find notes, my assignment solutions, and assorted other bits that I find interesting.&lt;br /&gt;
&lt;br /&gt;
[[MATLAB Code for Non-Commutative Gaussian Elimination]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Messages ==&lt;br /&gt;
&lt;br /&gt;
Hey buddy. You might want to move your page so that that it has 11-1100 as the prefix. [[User:Tholden|Tholden]] 14:32, 10 October 2011 (EDT)&lt;/div&gt;</summary>
		<author><name>Tholden</name></author>
	</entry>
	<entry>
		<id>https://drorbn.net/index.php?title=User:Tholden/11-1100/Homework_Part_1&amp;diff=10831</id>
		<title>User:Tholden/11-1100/Homework Part 1</title>
		<link rel="alternate" type="text/html" href="https://drorbn.net/index.php?title=User:Tholden/11-1100/Homework_Part_1&amp;diff=10831"/>
		<updated>2011-10-10T18:30:41Z</updated>

		<summary type="html">&lt;p&gt;Tholden: /* Megaminx */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page showcases my work done in implementing the Non-Commutative Gaussian Elimination algorithm with direct application to solving a permutation puzzle. I would like it to be known that I had originally chosen the Megaminx puzzle and am still in the process of solving it. The algorithm is currently running on a Sun x4600 computational server using Matlab 2010b including eight Opteron 8212 processors with 32 GB of memory. However, the algorithm is not conducive to parallelization and so has yet to converge. As a test-case, I have solved the &amp;lt;math&amp;gt; 2 \times 2 \times 2 &amp;lt;/math&amp;gt; Rubik&#039;s cube, which I will also present here. In the event that the algorithm has not converged, I will submit the &amp;lt;math&amp;gt; 2 \times 2 \times 2 &amp;lt;/math&amp;gt; Rubik&#039;s cube for marking.&lt;br /&gt;
&lt;br /&gt;
==Theoretical Review of the Algorithm==&lt;br /&gt;
&lt;br /&gt;
The purpose of Non-Commutative Gaussian Elimination (NCGE) is to find the elements and order of a subgroup generated by a finite set of generators. The algorithm proceeds as follows:&lt;br /&gt;
&lt;br /&gt;
Let &amp;lt;math&amp;gt;G = \langle g_1,\ldots, g_\alpha \rangle&amp;lt;/math&amp;gt;. Define the pivot of &amp;lt;math&amp;gt;\sigma \in S_n&amp;lt;/math&amp;gt; to be the minimal &amp;lt;math&amp;gt;k \in \mathbb N&amp;lt;/math&amp;gt; such that &amp;lt;math&amp;gt;\sigma(k) \neq k&amp;lt;/math&amp;gt;. We prepare a table which is mostly empty&lt;br /&gt;
&lt;br /&gt;
[[Image:NCGETable1.jpg|thumb|right|alt=The table initialization for Non-Commutative Gaussian Elimination.|A mostly empty table for Gaussian Elimination]]&lt;br /&gt;
&lt;br /&gt;
Feed &amp;lt;math&amp;gt;g_1, \ldots, g_n&amp;lt;/math&amp;gt; in order. To feed a non-identity &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;, find its pivotal position &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; and let &amp;lt;math&amp;gt;j = \sigma(i)&amp;lt;/math&amp;gt;. &lt;br /&gt;
#If box &amp;lt;math&amp;gt;(i,j)&amp;lt;/math&amp;gt; is empty, put &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; in this box.&lt;br /&gt;
#If box &amp;lt;math&amp;gt;(i,j)&amp;lt;/math&amp;gt; is not-empty, feed &amp;lt;math&amp;gt;\sigma&#039; = \sigma_{i,j}^{-1} \sigma&amp;lt;/math&amp;gt; into the table.&lt;br /&gt;
&lt;br /&gt;
After this procedure is completed, for each occupied box &amp;lt;math&amp;gt;(i,j)&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;(k,\ell)&amp;lt;/math&amp;gt; feed the product &amp;lt;math&amp;gt;\sigma_{i,j}\sigma_{k,\ell}&amp;lt;/math&amp;gt; into the table. Repeat this until the table stops changing.&lt;br /&gt;
&lt;br /&gt;
==Matlab Implementation ==&lt;br /&gt;
&lt;br /&gt;
Individual and additional files can be downloaded from [[User:Tholden/11-1100/File Repository|this page]]. However, for completeness the primary algorithm has been included below. Its documentation is fairly comprehensive, and so all explanation of the code will be deferred to the code itself.&lt;br /&gt;
&lt;br /&gt;
   function [table, tabLogic] = NonComGaussElim(myperms, table, tabLogic)&lt;br /&gt;
   %&lt;br /&gt;
   % NONCOMGAUSSELIM: A function used for computing the non-commutive gaussian&lt;br /&gt;
   % elimination algorithm on a finitely generated subset of the symmetric&lt;br /&gt;
   % group.&lt;br /&gt;
   %&lt;br /&gt;
   % [table,tabLogic] = NonComGaussElim(myperms,table,tabLogic)&lt;br /&gt;
   %&lt;br /&gt;
   %  INPUT:  myperms - [cell] A cell whose entries consist of the generators&lt;br /&gt;
   %                    of the group. The format of these entries should be&lt;br /&gt;
   %                    given via the &amp;quot;image&amp;quot; notation. Namely, if sigma is&lt;br /&gt;
   %                    a generator in Sn, then express sigma as&lt;br /&gt;
   %                    [sigma(1), sigma(2), ..., sigma(n)]&lt;br /&gt;
   %            table - [3d array, non-user input] The result of the&lt;br /&gt;
   %                    calculations. Necessary for recursion and needn&#039;t be&lt;br /&gt;
   %                    supplied by the end-user.&lt;br /&gt;
   %         tabLogic - [2d array, non-user input] The logical array&lt;br /&gt;
   %                    consisting of the non-identity indices for which&lt;br /&gt;
   %                    elements have been inserted into the table. Need not&lt;br /&gt;
   %                    be supplied by the end-user.&lt;br /&gt;
   % OUTPUT:    table - [3d array] The final result of the calculations.&lt;br /&gt;
   %                    table(i,j,:) consists of the permutation element&lt;br /&gt;
   %                    corresponding to pivot i with image j. &lt;br /&gt;
   %         tabLogic - [2d array] The logical array&lt;br /&gt;
   %                    consisting of the non-identity indices for which&lt;br /&gt;
   %                    elements have been inserted into the table.&lt;br /&gt;
   %&lt;br /&gt;
   % Example: Consider the symmetric group S4 and the generators&lt;br /&gt;
   %          g1 = [2 3 1 4] and g2 = [2 1 4 3]. The code is executed as&lt;br /&gt;
   %          &amp;gt;&amp;gt;myperms = {[2 3 1 4], [2 1 4 3]};&lt;br /&gt;
   %          &amp;gt;&amp;gt;[table, tabLogical] = NonComGaussElim(myperms);&lt;br /&gt;
   &lt;br /&gt;
   % Version : 1.2&lt;br /&gt;
   % Author  : Tyler Holden&lt;br /&gt;
   % Date    : September 29, 2011&lt;br /&gt;
   &lt;br /&gt;
   %    To Do: &lt;br /&gt;
   % 1) Add step to pre-process the input permutations. In particular, if&lt;br /&gt;
   %    the identity element is given as one of the generators, this algorithm&lt;br /&gt;
   %    will terminate prematurely. This is because the recursive halting&lt;br /&gt;
   %    criterion is the identity permutation&lt;br /&gt;
   % 2) Optimize for parallel computing. There are not many places wherein&lt;br /&gt;
   %    such improvements could be made, since the algorithm is recursive and&lt;br /&gt;
   %    heavily dependent on neighbouring iterations. However, some&lt;br /&gt;
   %    improvements may be made to computing products and inverses of&lt;br /&gt;
   %    elements.&lt;br /&gt;
   &lt;br /&gt;
   try&lt;br /&gt;
       &lt;br /&gt;
       % Return condition for recursion.&lt;br /&gt;
       if isempty(myperms)&lt;br /&gt;
           return&lt;br /&gt;
       end %End if&lt;br /&gt;
   &lt;br /&gt;
       sizeGrp = length(cell2mat(myperms(1)));&lt;br /&gt;
   &lt;br /&gt;
       % Since the user is not expected to input the table, the following&lt;br /&gt;
       % condition checks that we are at the top level of the recursion and&lt;br /&gt;
       % creates the table as necessary.&lt;br /&gt;
       if nargin &amp;lt; 2&lt;br /&gt;
           table = zeros(sizeGrp,sizeGrp,sizeGrp);&lt;br /&gt;
           tabLogic = zeros(sizeGrp);&lt;br /&gt;
           %     for i=1:sizeGrp&lt;br /&gt;
           %         table(i,i,:) = 1:sizeGrp;&lt;br /&gt;
           %     end %End for(i)&lt;br /&gt;
       end %End if&lt;br /&gt;
   &lt;br /&gt;
       % Here we pull out the first generator and calculate its pivot point.&lt;br /&gt;
       curGen = cell2mat(myperms(1));&lt;br /&gt;
       [piv,img] = findPivot(curGen);&lt;br /&gt;
   &lt;br /&gt;
       % If curGen is the identity, piv will be empty. In this case, we simply&lt;br /&gt;
       % return to the call function. This is used in sublevels of the recursion.&lt;br /&gt;
       % However, this will result in improper calculations if the identity is&lt;br /&gt;
       % included in the original set of permutations. In a future version of this&lt;br /&gt;
       % code, one could &amp;quot;pre-process&amp;quot; the input permutations to remove the&lt;br /&gt;
       % identity elements. This would remove the erroneous calculations and the&lt;br /&gt;
       % recursion check would stay consistent.&lt;br /&gt;
       if isempty(piv)&lt;br /&gt;
           return;&lt;br /&gt;
       end %End if&lt;br /&gt;
   &lt;br /&gt;
       % Pull the permutation from the table. Afterwards, check if it is empty. If&lt;br /&gt;
       % so, input curGen into the table. Otherwise, pre-multiply and apply&lt;br /&gt;
       % recursively to the singleton permutation.&lt;br /&gt;
       sigij(1:sizeGrp) = table(piv,img,1:sizeGrp);&lt;br /&gt;
   &lt;br /&gt;
       if isempty(find(sigij))&lt;br /&gt;
           table(piv,img,:) = curGen;&lt;br /&gt;
           tabLogic(piv,img) = 1;&lt;br /&gt;
           % Only when something new has been added to the table do we do the&lt;br /&gt;
           % multiplication step. Note that it is important to do multiplication&lt;br /&gt;
           % on both sides, otherwise this will not work.&lt;br /&gt;
           for it1=sizeGrp:-1:1;&lt;br /&gt;
               for it2=sizeGrp:-1:it1&lt;br /&gt;
                   if tabLogic(it1,it2)&lt;br /&gt;
                       sigij(1:sizeGrp) = table(it1,it2,1:sizeGrp);&lt;br /&gt;
                       %First multiplication.&lt;br /&gt;
                       newPerm = permMult(sigij, curGen);&lt;br /&gt;
                       [table,tabLogic] = NonComGaussElim({newPerm}, table, tabLogic);&lt;br /&gt;
                       %Second multiplication.&lt;br /&gt;
                        newPerm = permMult(curGen, sigij);&lt;br /&gt;
                        [table,tabLogic] = NonComGaussElim({newPerm}, table, tabLogic);&lt;br /&gt;
                    end %End if&lt;br /&gt;
                end %End for(it2)&lt;br /&gt;
            end %End for (it1)&lt;br /&gt;
        else&lt;br /&gt;
            newPerm = permMult(permInv(sigij),curGen);&lt;br /&gt;
            [table, tabLogic] = NonComGaussElim({newPerm}, table, tabLogic);&lt;br /&gt;
        end %end if &lt;br /&gt;
 &lt;br /&gt;
     %Once the generator and its multiples have been added, we remove it from&lt;br /&gt;
     %the list of permutations and apply the algorithm recursively.&lt;br /&gt;
     [table, tabLogic] = NonComGaussElim(myperms(2:end), table, tabLogic);&lt;br /&gt;
   catch ME&lt;br /&gt;
       disp(&#039;Error&#039;);&lt;br /&gt;
   end &lt;br /&gt;
   &lt;br /&gt;
   %-------------------------------Subroutines-------------------------------%&lt;br /&gt;
 &lt;br /&gt;
   function [pivot, image] = findPivot(permut)&lt;br /&gt;
   %&lt;br /&gt;
   % Calculates the pivot of the permutation. If the permutation is identity,&lt;br /&gt;
   % pivot and image return empty.&lt;br /&gt;
   pivot = find(permut ~= 1:length(permut),1);&lt;br /&gt;
   image = permut(pivot);&lt;br /&gt;
   &lt;br /&gt;
   function prod = permMult(perm1, perm2)&lt;br /&gt;
   %&lt;br /&gt;
   % Multiplies two permutations. This is simply the composition of the&lt;br /&gt;
   % permtuations acting on the set {1,...,n}. That is, if sigma and tau are&lt;br /&gt;
   % permutations, then sigma*tau acting on the set {1,...,n} is given in&lt;br /&gt;
   % &amp;quot;image notation&amp;quot; as&lt;br /&gt;
   % sigma*tau = [sigma(tau(1)), sigma(tau(2)), ... , sigma(tau(n)) ]&lt;br /&gt;
   prod = perm1(perm2);&lt;br /&gt;
   &lt;br /&gt;
   function inverse = permInv(perm)&lt;br /&gt;
   %&lt;br /&gt;
   % Calculates the inverse element. If sigma is the permutation to be&lt;br /&gt;
   % inverted, it is written as [sigma(1), sigma(2), ... , sigma(n)]. The&lt;br /&gt;
   % inverse of this function is just done by placing j in the sigma(j)&lt;br /&gt;
   % position. &lt;br /&gt;
   inverse(perm) = 1:length(perm);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 2x2x2 Rubik&#039;s cube==&lt;br /&gt;
&lt;br /&gt;
[[Image:2x2x2CubeSmall.jpg|thumb|right|alt=A picture of the 2x2x2 Rubik&#039;s cube.|The 2x2x2 Rubik&#039;s cube.]]&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;math&amp;gt; 2 \times 2 \times 2 &amp;lt;/math&amp;gt; Rubik&#039;s cube is a simplified version of the classical Rubik&#039;s cube. Indeed, while this simplified Rubik&#039;s cube still has six faces, each face only has four stickers. This greatly simplifies the process of analyzing the subgroup generated by this problem. We note that there are a total of &amp;lt;math&amp;gt; 24 &amp;lt;/math&amp;gt; stickers on this cube, so that the generators a subgroup of &amp;lt;math&amp;gt; S_{24} &amp;lt;/math&amp;gt; which has order &amp;lt;math&amp;gt; 24! &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
To determine our sticker numbering, we have rendered a [http://individual.utoronto.ca/tholden/CourseNotes/AlgebraWikiCode/RotatingCube.gif three-dimensional image of the cube], the source code for which can be found on my [[User:Tholden/11-1100/File Repository|file repository]].&lt;br /&gt;
&lt;br /&gt;
Using the numbering scheme given in the rendered image of the cube, our generators can be given in cycle notation as&lt;br /&gt;
* &amp;lt;math&amp;gt; g_1 = (1\ 3\ 4\ 2) (22\ 6\ 9\ 17) (21\ 5\ 10\ 18) &amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt; g_2 = (5\ 6\ 8\ 7) (21\ 14\ 11\ 1) (23\ 13\ 9\ 2) &amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt; g_3 = (9\ 11\ 12\ 10) (3\ 5\ 13\ 19) ( 1\ 7\ 15\ 17) &amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt; g_4 = (13\ 15\ 16\ 14) (24\ 8\ 11\ 19) (23\ 7\ 12\ 20) &amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt; g_5 = (17\ 18\ 20\ 19) (22\ 16\ 12\ 3)(24\ 15\ 10\ 4) &amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt; g_6 = (21\ 23\ 24\ 22)(14\ 20\ 4\ 6)(16\ 18\ 2\ 8) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Using the supplied files, the code can be executed as follows:&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt; tic; [table,tabLogic] = NonComGaussElim(myPerms); toc&lt;br /&gt;
 Elapsed time is 4.016460 seconds.&lt;br /&gt;
 &amp;gt;&amp;gt; prod(sum(tabLogic&#039;)+1)&lt;br /&gt;
 ans =&lt;br /&gt;
    88179840&lt;br /&gt;
&lt;br /&gt;
However, we note that unlike the classical Rubik&#039;s cube, there are no center pieces whose position fixes an orientation of our configuration. Consequently, there are 24 additional symmetries. We conclude the actual size of the &amp;lt;math&amp;gt; 2\times 2 \times 2 &amp;lt;/math&amp;gt; Rubik&#039;s cube group is &amp;lt;math&amp;gt; 3674160 = \frac{88179840}{24} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Megaminx==&lt;br /&gt;
&lt;br /&gt;
[[Image:Megaminx.jpg|thumb|right|alt=The Megaminx permutation puzzle in a solved state. |The Megaminx Permutation Puzzle.]]&lt;br /&gt;
&lt;br /&gt;
The Megaminx is an advanced but conceptually related cousin of the Rubik&#039;s cube. However, the polyhedron on which this puzzle is situated is not a cube, but is instead a dodecahedron. Consequently, this puzzle has twelve (12) faces and each face has a star configuration. The star configuration imparts eleven (11) stickers per face, meaning that this puzzle forms a subgroup of &amp;lt;math&amp;gt; S_{132} &amp;lt;/math&amp;gt; which has order &amp;lt;math&amp;gt; 132! &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
The sticker numbering for the Dodecahedron has been done by rendering a [http://individual.utoronto.ca/tholden/CourseNotes/AlgebraWikiCode/MegaminxNumbering.gif three-dimensional image of the dodecahedron.] With this numbering convention, the generators of the Megaminx group are given by&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt; g_1 =(1\ 5\ 11\ 9\ 2)(4\ 8\ 10\ 6\ 3)(20\ 64\ 53\ 42\ 31)(21\ 65\ 54\ 43\ 32)(22\ 66\ 55\ 44\ 35)&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt; g_2 =(12\ 16\ 22\ 20\ 13)(15\ 19\ 21\ 17\ 14)(\ 1\ 33\ 86\ 68\ 57)(3\ 30\ 87\ 72\ 61)(2\ 27\ 88\ 75\ 64)&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt; g_3 =(23\ 27\ 33\ 31\ 24)(26\ 30\ 32\ 28\ 25)(2\ 44\ 97\ 79\ 13)(6\ 41\ 98\ 83\ 17)(9\ 38\ 99\ 86\ 20)&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt; g_4 =(34\ 38\ 44\ 42\ 35)(37\ 41\ 43\ 39\ 36)(9\ 55\ 108\ 90\ 24 )(10\ 52\ 109\ 94\ 28)(11\ 49\ 110\ 97\ 31)&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt; g_5 =(45\ 49\ 55\ 53\ 46)(48\ 52\ 54\ 50\ 47)(5\ 60\ 121\ 108\ 42)(8\ 63\ 120\ 105\ 39)(11\ 66\ 119\ 101\ 35)&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt; g_6 =(56\ 60\ 66\ 64\ 57)(59\ 63\ 65\ 61\ 58)(1\ 16\ 77\ 119\ 53)(4\ 19\ 76\ 116\ 50)(5\ 22\ 75\ 112\ 46)&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt; g_7 =(67\ 71\ 77\ 75\ 68)(70\ 74\ 76\ 72\ 69)(12\ 82\ 130\ 112\ 57)(15\ 85\ 127\ 113\ 58)(16\ 88\ 123\ 111\ 56)&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt; g_8 =(78\ 82\ 88\ 86\ 79)(81\ 85\ 87\ 83\ 80)(13\ 23\ 93\ 123\ 68)(14\ 26\ 96\ 124\ 69)(12\ 27\ 99\ 122\ 67)&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt; g_9 =(89\ 93\ 99\ 97\ 90)(92\ 96\ 98\ 94\ 91)(24\ 34\ 104\ 122\ 79)(25\ 37\ 107\ 125\ 80)(23\ 38\ 110\ 126\ 78)&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt; g_{10} =(100\ 104\ 110\ 108\ 101)(103\ 107\ 109\ 105\ 102)(35\ 45\ 115\ 126\ 90)(36\ 48\ 118\ 129\ 91)(34\ 49\ 121\ 132\ 89)&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt; g_{11} =(111\ 115\ 121\ 119\ 112)(114\ 118\ 120\ 116\ 113)(46\ 56\ 71\ 132\ 101)(47\ 59\ 74\ 131\ 102)(45\ 60\ 77\ 130\ 100)&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt; g_{12} =(122\ 126\ 132\ 130\ 123)(125\ 129\ 131\ 127\ 124)(67\ 78\ 89\ 100\ 111)(70\ 81\ 92\ 103\ 114)(71\ 82\ 93\ 104\ 115)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As of writing this article, the algorithm has yet to converge. However, there are partial results that we can state. In particular, on four generators, the size of the group is the order of &amp;lt;math&amp;gt; 1.9 \times 10^{57} &amp;lt;/math&amp;gt;. This was done using the code&lt;br /&gt;
 &amp;gt;&amp;gt;Dodecahedron2&lt;br /&gt;
 &amp;gt;&amp;gt;subPerms = myPerms(1:4);&lt;br /&gt;
 &amp;gt;&amp;gt; tic; [table,tabLogic] = NonComGaussElim(subPerms); toc&lt;br /&gt;
 Elapsed time is 1153.4619 seconds&lt;/div&gt;</summary>
		<author><name>Tholden</name></author>
	</entry>
	<entry>
		<id>https://drorbn.net/index.php?title=User:Tholden/11-1100/Homework_Part_1&amp;diff=10830</id>
		<title>User:Tholden/11-1100/Homework Part 1</title>
		<link rel="alternate" type="text/html" href="https://drorbn.net/index.php?title=User:Tholden/11-1100/Homework_Part_1&amp;diff=10830"/>
		<updated>2011-10-10T18:28:52Z</updated>

		<summary type="html">&lt;p&gt;Tholden: /* Megaminx */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page showcases my work done in implementing the Non-Commutative Gaussian Elimination algorithm with direct application to solving a permutation puzzle. I would like it to be known that I had originally chosen the Megaminx puzzle and am still in the process of solving it. The algorithm is currently running on a Sun x4600 computational server using Matlab 2010b including eight Opteron 8212 processors with 32 GB of memory. However, the algorithm is not conducive to parallelization and so has yet to converge. As a test-case, I have solved the &amp;lt;math&amp;gt; 2 \times 2 \times 2 &amp;lt;/math&amp;gt; Rubik&#039;s cube, which I will also present here. In the event that the algorithm has not converged, I will submit the &amp;lt;math&amp;gt; 2 \times 2 \times 2 &amp;lt;/math&amp;gt; Rubik&#039;s cube for marking.&lt;br /&gt;
&lt;br /&gt;
==Theoretical Review of the Algorithm==&lt;br /&gt;
&lt;br /&gt;
The purpose of Non-Commutative Gaussian Elimination (NCGE) is to find the elements and order of a subgroup generated by a finite set of generators. The algorithm proceeds as follows:&lt;br /&gt;
&lt;br /&gt;
Let &amp;lt;math&amp;gt;G = \langle g_1,\ldots, g_\alpha \rangle&amp;lt;/math&amp;gt;. Define the pivot of &amp;lt;math&amp;gt;\sigma \in S_n&amp;lt;/math&amp;gt; to be the minimal &amp;lt;math&amp;gt;k \in \mathbb N&amp;lt;/math&amp;gt; such that &amp;lt;math&amp;gt;\sigma(k) \neq k&amp;lt;/math&amp;gt;. We prepare a table which is mostly empty&lt;br /&gt;
&lt;br /&gt;
[[Image:NCGETable1.jpg|thumb|right|alt=The table initialization for Non-Commutative Gaussian Elimination.|A mostly empty table for Gaussian Elimination]]&lt;br /&gt;
&lt;br /&gt;
Feed &amp;lt;math&amp;gt;g_1, \ldots, g_n&amp;lt;/math&amp;gt; in order. To feed a non-identity &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;, find its pivotal position &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; and let &amp;lt;math&amp;gt;j = \sigma(i)&amp;lt;/math&amp;gt;. &lt;br /&gt;
#If box &amp;lt;math&amp;gt;(i,j)&amp;lt;/math&amp;gt; is empty, put &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; in this box.&lt;br /&gt;
#If box &amp;lt;math&amp;gt;(i,j)&amp;lt;/math&amp;gt; is not-empty, feed &amp;lt;math&amp;gt;\sigma&#039; = \sigma_{i,j}^{-1} \sigma&amp;lt;/math&amp;gt; into the table.&lt;br /&gt;
&lt;br /&gt;
After this procedure is completed, for each occupied box &amp;lt;math&amp;gt;(i,j)&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;(k,\ell)&amp;lt;/math&amp;gt; feed the product &amp;lt;math&amp;gt;\sigma_{i,j}\sigma_{k,\ell}&amp;lt;/math&amp;gt; into the table. Repeat this until the table stops changing.&lt;br /&gt;
&lt;br /&gt;
==Matlab Implementation ==&lt;br /&gt;
&lt;br /&gt;
Individual and additional files can be downloaded from [[User:Tholden/11-1100/File Repository|this page]]. However, for completeness the primary algorithm has been included below. Its documentation is fairly comprehensive, and so all explanation of the code will be deferred to the code itself.&lt;br /&gt;
&lt;br /&gt;
   function [table, tabLogic] = NonComGaussElim(myperms, table, tabLogic)&lt;br /&gt;
   %&lt;br /&gt;
   % NONCOMGAUSSELIM: A function used for computing the non-commutive gaussian&lt;br /&gt;
   % elimination algorithm on a finitely generated subset of the symmetric&lt;br /&gt;
   % group.&lt;br /&gt;
   %&lt;br /&gt;
   % [table,tabLogic] = NonComGaussElim(myperms,table,tabLogic)&lt;br /&gt;
   %&lt;br /&gt;
   %  INPUT:  myperms - [cell] A cell whose entries consist of the generators&lt;br /&gt;
   %                    of the group. The format of these entries should be&lt;br /&gt;
   %                    given via the &amp;quot;image&amp;quot; notation. Namely, if sigma is&lt;br /&gt;
   %                    a generator in Sn, then express sigma as&lt;br /&gt;
   %                    [sigma(1), sigma(2), ..., sigma(n)]&lt;br /&gt;
   %            table - [3d array, non-user input] The result of the&lt;br /&gt;
   %                    calculations. Necessary for recursion and needn&#039;t be&lt;br /&gt;
   %                    supplied by the end-user.&lt;br /&gt;
   %         tabLogic - [2d array, non-user input] The logical array&lt;br /&gt;
   %                    consisting of the non-identity indices for which&lt;br /&gt;
   %                    elements have been inserted into the table. Need not&lt;br /&gt;
   %                    be supplied by the end-user.&lt;br /&gt;
   % OUTPUT:    table - [3d array] The final result of the calculations.&lt;br /&gt;
   %                    table(i,j,:) consists of the permutation element&lt;br /&gt;
   %                    corresponding to pivot i with image j. &lt;br /&gt;
   %         tabLogic - [2d array] The logical array&lt;br /&gt;
   %                    consisting of the non-identity indices for which&lt;br /&gt;
   %                    elements have been inserted into the table.&lt;br /&gt;
   %&lt;br /&gt;
   % Example: Consider the symmetric group S4 and the generators&lt;br /&gt;
   %          g1 = [2 3 1 4] and g2 = [2 1 4 3]. The code is executed as&lt;br /&gt;
   %          &amp;gt;&amp;gt;myperms = {[2 3 1 4], [2 1 4 3]};&lt;br /&gt;
   %          &amp;gt;&amp;gt;[table, tabLogical] = NonComGaussElim(myperms);&lt;br /&gt;
   &lt;br /&gt;
   % Version : 1.2&lt;br /&gt;
   % Author  : Tyler Holden&lt;br /&gt;
   % Date    : September 29, 2011&lt;br /&gt;
   &lt;br /&gt;
   %    To Do: &lt;br /&gt;
   % 1) Add step to pre-process the input permutations. In particular, if&lt;br /&gt;
   %    the identity element is given as one of the generators, this algorithm&lt;br /&gt;
   %    will terminate prematurely. This is because the recursive halting&lt;br /&gt;
   %    criterion is the identity permutation&lt;br /&gt;
   % 2) Optimize for parallel computing. There are not many places wherein&lt;br /&gt;
   %    such improvements could be made, since the algorithm is recursive and&lt;br /&gt;
   %    heavily dependent on neighbouring iterations. However, some&lt;br /&gt;
   %    improvements may be made to computing products and inverses of&lt;br /&gt;
   %    elements.&lt;br /&gt;
   &lt;br /&gt;
   try&lt;br /&gt;
       &lt;br /&gt;
       % Return condition for recursion.&lt;br /&gt;
       if isempty(myperms)&lt;br /&gt;
           return&lt;br /&gt;
       end %End if&lt;br /&gt;
   &lt;br /&gt;
       sizeGrp = length(cell2mat(myperms(1)));&lt;br /&gt;
   &lt;br /&gt;
       % Since the user is not expected to input the table, the following&lt;br /&gt;
       % condition checks that we are at the top level of the recursion and&lt;br /&gt;
       % creates the table as necessary.&lt;br /&gt;
       if nargin &amp;lt; 2&lt;br /&gt;
           table = zeros(sizeGrp,sizeGrp,sizeGrp);&lt;br /&gt;
           tabLogic = zeros(sizeGrp);&lt;br /&gt;
           %     for i=1:sizeGrp&lt;br /&gt;
           %         table(i,i,:) = 1:sizeGrp;&lt;br /&gt;
           %     end %End for(i)&lt;br /&gt;
       end %End if&lt;br /&gt;
   &lt;br /&gt;
       % Here we pull out the first generator and calculate its pivot point.&lt;br /&gt;
       curGen = cell2mat(myperms(1));&lt;br /&gt;
       [piv,img] = findPivot(curGen);&lt;br /&gt;
   &lt;br /&gt;
       % If curGen is the identity, piv will be empty. In this case, we simply&lt;br /&gt;
       % return to the call function. This is used in sublevels of the recursion.&lt;br /&gt;
       % However, this will result in improper calculations if the identity is&lt;br /&gt;
       % included in the original set of permutations. In a future version of this&lt;br /&gt;
       % code, one could &amp;quot;pre-process&amp;quot; the input permutations to remove the&lt;br /&gt;
       % identity elements. This would remove the erroneous calculations and the&lt;br /&gt;
       % recursion check would stay consistent.&lt;br /&gt;
       if isempty(piv)&lt;br /&gt;
           return;&lt;br /&gt;
       end %End if&lt;br /&gt;
   &lt;br /&gt;
       % Pull the permutation from the table. Afterwards, check if it is empty. If&lt;br /&gt;
       % so, input curGen into the table. Otherwise, pre-multiply and apply&lt;br /&gt;
       % recursively to the singleton permutation.&lt;br /&gt;
       sigij(1:sizeGrp) = table(piv,img,1:sizeGrp);&lt;br /&gt;
   &lt;br /&gt;
       if isempty(find(sigij))&lt;br /&gt;
           table(piv,img,:) = curGen;&lt;br /&gt;
           tabLogic(piv,img) = 1;&lt;br /&gt;
           % Only when something new has been added to the table do we do the&lt;br /&gt;
           % multiplication step. Note that it is important to do multiplication&lt;br /&gt;
           % on both sides, otherwise this will not work.&lt;br /&gt;
           for it1=sizeGrp:-1:1;&lt;br /&gt;
               for it2=sizeGrp:-1:it1&lt;br /&gt;
                   if tabLogic(it1,it2)&lt;br /&gt;
                       sigij(1:sizeGrp) = table(it1,it2,1:sizeGrp);&lt;br /&gt;
                       %First multiplication.&lt;br /&gt;
                       newPerm = permMult(sigij, curGen);&lt;br /&gt;
                       [table,tabLogic] = NonComGaussElim({newPerm}, table, tabLogic);&lt;br /&gt;
                       %Second multiplication.&lt;br /&gt;
                        newPerm = permMult(curGen, sigij);&lt;br /&gt;
                        [table,tabLogic] = NonComGaussElim({newPerm}, table, tabLogic);&lt;br /&gt;
                    end %End if&lt;br /&gt;
                end %End for(it2)&lt;br /&gt;
            end %End for (it1)&lt;br /&gt;
        else&lt;br /&gt;
            newPerm = permMult(permInv(sigij),curGen);&lt;br /&gt;
            [table, tabLogic] = NonComGaussElim({newPerm}, table, tabLogic);&lt;br /&gt;
        end %end if &lt;br /&gt;
 &lt;br /&gt;
     %Once the generator and its multiples have been added, we remove it from&lt;br /&gt;
     %the list of permutations and apply the algorithm recursively.&lt;br /&gt;
     [table, tabLogic] = NonComGaussElim(myperms(2:end), table, tabLogic);&lt;br /&gt;
   catch ME&lt;br /&gt;
       disp(&#039;Error&#039;);&lt;br /&gt;
   end &lt;br /&gt;
   &lt;br /&gt;
   %-------------------------------Subroutines-------------------------------%&lt;br /&gt;
 &lt;br /&gt;
   function [pivot, image] = findPivot(permut)&lt;br /&gt;
   %&lt;br /&gt;
   % Calculates the pivot of the permutation. If the permutation is identity,&lt;br /&gt;
   % pivot and image return empty.&lt;br /&gt;
   pivot = find(permut ~= 1:length(permut),1);&lt;br /&gt;
   image = permut(pivot);&lt;br /&gt;
   &lt;br /&gt;
   function prod = permMult(perm1, perm2)&lt;br /&gt;
   %&lt;br /&gt;
   % Multiplies two permutations. This is simply the composition of the&lt;br /&gt;
   % permtuations acting on the set {1,...,n}. That is, if sigma and tau are&lt;br /&gt;
   % permutations, then sigma*tau acting on the set {1,...,n} is given in&lt;br /&gt;
   % &amp;quot;image notation&amp;quot; as&lt;br /&gt;
   % sigma*tau = [sigma(tau(1)), sigma(tau(2)), ... , sigma(tau(n)) ]&lt;br /&gt;
   prod = perm1(perm2);&lt;br /&gt;
   &lt;br /&gt;
   function inverse = permInv(perm)&lt;br /&gt;
   %&lt;br /&gt;
   % Calculates the inverse element. If sigma is the permutation to be&lt;br /&gt;
   % inverted, it is written as [sigma(1), sigma(2), ... , sigma(n)]. The&lt;br /&gt;
   % inverse of this function is just done by placing j in the sigma(j)&lt;br /&gt;
   % position. &lt;br /&gt;
   inverse(perm) = 1:length(perm);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 2x2x2 Rubik&#039;s cube==&lt;br /&gt;
&lt;br /&gt;
[[Image:2x2x2CubeSmall.jpg|thumb|right|alt=A picture of the 2x2x2 Rubik&#039;s cube.|The 2x2x2 Rubik&#039;s cube.]]&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;math&amp;gt; 2 \times 2 \times 2 &amp;lt;/math&amp;gt; Rubik&#039;s cube is a simplified version of the classical Rubik&#039;s cube. Indeed, while this simplified Rubik&#039;s cube still has six faces, each face only has four stickers. This greatly simplifies the process of analyzing the subgroup generated by this problem. We note that there are a total of &amp;lt;math&amp;gt; 24 &amp;lt;/math&amp;gt; stickers on this cube, so that the generators a subgroup of &amp;lt;math&amp;gt; S_{24} &amp;lt;/math&amp;gt; which has order &amp;lt;math&amp;gt; 24! &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
To determine our sticker numbering, we have rendered a [http://individual.utoronto.ca/tholden/CourseNotes/AlgebraWikiCode/RotatingCube.gif three-dimensional image of the cube], the source code for which can be found on my [[User:Tholden/11-1100/File Repository|file repository]].&lt;br /&gt;
&lt;br /&gt;
Using the numbering scheme given in the rendered image of the cube, our generators can be given in cycle notation as&lt;br /&gt;
* &amp;lt;math&amp;gt; g_1 = (1\ 3\ 4\ 2) (22\ 6\ 9\ 17) (21\ 5\ 10\ 18) &amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt; g_2 = (5\ 6\ 8\ 7) (21\ 14\ 11\ 1) (23\ 13\ 9\ 2) &amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt; g_3 = (9\ 11\ 12\ 10) (3\ 5\ 13\ 19) ( 1\ 7\ 15\ 17) &amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt; g_4 = (13\ 15\ 16\ 14) (24\ 8\ 11\ 19) (23\ 7\ 12\ 20) &amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt; g_5 = (17\ 18\ 20\ 19) (22\ 16\ 12\ 3)(24\ 15\ 10\ 4) &amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt; g_6 = (21\ 23\ 24\ 22)(14\ 20\ 4\ 6)(16\ 18\ 2\ 8) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Using the supplied files, the code can be executed as follows:&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt; tic; [table,tabLogic] = NonComGaussElim(myPerms); toc&lt;br /&gt;
 Elapsed time is 4.016460 seconds.&lt;br /&gt;
 &amp;gt;&amp;gt; prod(sum(tabLogic&#039;)+1)&lt;br /&gt;
 ans =&lt;br /&gt;
    88179840&lt;br /&gt;
&lt;br /&gt;
However, we note that unlike the classical Rubik&#039;s cube, there are no center pieces whose position fixes an orientation of our configuration. Consequently, there are 24 additional symmetries. We conclude the actual size of the &amp;lt;math&amp;gt; 2\times 2 \times 2 &amp;lt;/math&amp;gt; Rubik&#039;s cube group is &amp;lt;math&amp;gt; 3674160 = \frac{88179840}{24} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Megaminx==&lt;br /&gt;
&lt;br /&gt;
[[Image:Megaminx.jpg|thumb|right|alt=The Megaminx permutation puzzle in a solved state. |The Megaminx Permutation Puzzle.]]&lt;br /&gt;
&lt;br /&gt;
The Megaminx is an advanced but conceptually related cousin of the Rubik&#039;s cube. However, the polyhedron on which this puzzle is situated is not a cube, but is instead a dodecahedron. Consequently, this puzzle has twelve (12) faces and each face has a star configuration. The star configuration imparts eleven (11) stickers per face, meaning that this puzzle forms a subgroup of &amp;lt;math&amp;gt; S_{132} &amp;lt;/math&amp;gt; which has order &amp;lt;math&amp;gt; 132! &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
The sticker numbering for the Dodecahedron has been done by rendering a [http://individual.utoronto.ca/tholden/CourseNotes/AlgebraWikiCode/MegaminxNumbering.gif three-dimensional image of the dodecahedron.] With this numbering convention, the generators of the Megaminx group are given by&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt; g_1 =(1\ 5\ 11\ 9\ 2)(4\ 8\ 10\ 6\ 3)(20\ 64\ 53\ 42\ 31)(21\ 65\ 54\ 43\ 32)(22\ 66\ 55\ 44\ 35)&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt; g_2 =(12\ 16\ 22\ 20\ 13)(15\ 19\ 21\ 17\ 14)(\ 1\ 33\ 86\ 68\ 57)(3\ 30\ 87\ 72\ 61)(2\ 27\ 88\ 75\ 64)&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt; g_3 =(23\ 27\ 33\ 31\ 24)(26\ 30\ 32\ 28\ 25)(2\ 44\ 97\ 79\ 13)(6\ 41\ 98\ 83\ 17)(9\ 38\ 99\ 86\ 20)&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt; g_4 =(34\ 38\ 44\ 42\ 35)(37\ 41\ 43\ 39\ 36)(9\ 55\ 108\ 90\ 24 )(10\ 52\ 109\ 94\ 28)(11\ 49\ 110\ 97\ 31)&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt; g_5 =(45\ 49\ 55\ 53\ 46)(48\ 52\ 54\ 50\ 47)(5\ 60\ 121\ 108\ 42)(8\ 63\ 120\ 105\ 39)(11\ 66\ 119\ 101\ 35)&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt; g_6 =(56\ 60\ 66\ 64\ 57)(59\ 63\ 65\ 61\ 58)(1\ 16\ 77\ 119\ 53)(4\ 19\ 76\ 116\ 50)(5\ 22\ 75\ 112\ 46)&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt; g_7 =(67\ 71\ 77\ 75\ 68)(70\ 74\ 76\ 72\ 69)(12\ 82\ 130\ 112\ 57)(15\ 85\ 127\ 113\ 58)(16\ 88\ 123\ 111\ 56)&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt; g_8 =(78\ 82\ 88\ 86\ 79)(81\ 85\ 87\ 83\ 80)(13\ 23\ 93\ 123\ 68)(14\ 26\ 96\ 124\ 69)(12\ 27\ 99\ 122\ 67)&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt; g_9 =(89\ 93\ 99\ 97\ 90)(92\ 96\ 98\ 94\ 91)(24\ 34\ 104\ 122\ 79)(25\ 37\ 107\ 125\ 80)(23\ 38\ 110\ 126\ 78)&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt; g_{10} =(100\ 104\ 110\ 108\ 101)(103\ 107\ 109\ 105\ 102)(35\ 45\ 115\ 126\ 90)(36\ 48\ 118\ 129\ 91)(34\ 49\ 121\ 132\ 89)&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt; g_{11} =(111\ 115\ 121\ 119\ 112)(114\ 118\ 120\ 116\ 113)(46\ 56\ 71\ 132\ 101)(47\ 59\ 74\ 131\ 102)(45\ 60\ 77\ 130\ 100)&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt; g_{12} =(122\ 126\ 132\ 130\ 123)(125\ 129\ 131\ 127\ 124)(67\ 78\ 89\ 100\ 111)(70\ 81\ 92\ 103\ 114)(71\ 82\ 93\ 104\ 115)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As of writing this article, the algorithm has yet to converge. However, there are partial results that we can state. In particular, on four generators, the size of the group is the order of &amp;lt;math&amp;gt; 1.9 \times 10^{57} &amp;lt;/math&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Tholden</name></author>
	</entry>
	<entry>
		<id>https://drorbn.net/index.php?title=File:Megaminx.jpg&amp;diff=10829</id>
		<title>File:Megaminx.jpg</title>
		<link rel="alternate" type="text/html" href="https://drorbn.net/index.php?title=File:Megaminx.jpg&amp;diff=10829"/>
		<updated>2011-10-10T17:52:41Z</updated>

		<summary type="html">&lt;p&gt;Tholden: Picture of Megaminx Permutation Puzzle&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Picture of Megaminx Permutation Puzzle&lt;/div&gt;</summary>
		<author><name>Tholden</name></author>
	</entry>
	<entry>
		<id>https://drorbn.net/index.php?title=User:Tholden/11-1100/Homework_Part_1&amp;diff=10828</id>
		<title>User:Tholden/11-1100/Homework Part 1</title>
		<link rel="alternate" type="text/html" href="https://drorbn.net/index.php?title=User:Tholden/11-1100/Homework_Part_1&amp;diff=10828"/>
		<updated>2011-10-10T17:47:41Z</updated>

		<summary type="html">&lt;p&gt;Tholden: /* 2x2x2 Rubik&amp;#039;s cube */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page showcases my work done in implementing the Non-Commutative Gaussian Elimination algorithm with direct application to solving a permutation puzzle. I would like it to be known that I had originally chosen the Megaminx puzzle and am still in the process of solving it. The algorithm is currently running on a Sun x4600 computational server using Matlab 2010b including eight Opteron 8212 processors with 32 GB of memory. However, the algorithm is not conducive to parallelization and so has yet to converge. As a test-case, I have solved the &amp;lt;math&amp;gt; 2 \times 2 \times 2 &amp;lt;/math&amp;gt; Rubik&#039;s cube, which I will also present here. In the event that the algorithm has not converged, I will submit the &amp;lt;math&amp;gt; 2 \times 2 \times 2 &amp;lt;/math&amp;gt; Rubik&#039;s cube for marking.&lt;br /&gt;
&lt;br /&gt;
==Theoretical Review of the Algorithm==&lt;br /&gt;
&lt;br /&gt;
The purpose of Non-Commutative Gaussian Elimination (NCGE) is to find the elements and order of a subgroup generated by a finite set of generators. The algorithm proceeds as follows:&lt;br /&gt;
&lt;br /&gt;
Let &amp;lt;math&amp;gt;G = \langle g_1,\ldots, g_\alpha \rangle&amp;lt;/math&amp;gt;. Define the pivot of &amp;lt;math&amp;gt;\sigma \in S_n&amp;lt;/math&amp;gt; to be the minimal &amp;lt;math&amp;gt;k \in \mathbb N&amp;lt;/math&amp;gt; such that &amp;lt;math&amp;gt;\sigma(k) \neq k&amp;lt;/math&amp;gt;. We prepare a table which is mostly empty&lt;br /&gt;
&lt;br /&gt;
[[Image:NCGETable1.jpg|thumb|right|alt=The table initialization for Non-Commutative Gaussian Elimination.|A mostly empty table for Gaussian Elimination]]&lt;br /&gt;
&lt;br /&gt;
Feed &amp;lt;math&amp;gt;g_1, \ldots, g_n&amp;lt;/math&amp;gt; in order. To feed a non-identity &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;, find its pivotal position &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; and let &amp;lt;math&amp;gt;j = \sigma(i)&amp;lt;/math&amp;gt;. &lt;br /&gt;
#If box &amp;lt;math&amp;gt;(i,j)&amp;lt;/math&amp;gt; is empty, put &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; in this box.&lt;br /&gt;
#If box &amp;lt;math&amp;gt;(i,j)&amp;lt;/math&amp;gt; is not-empty, feed &amp;lt;math&amp;gt;\sigma&#039; = \sigma_{i,j}^{-1} \sigma&amp;lt;/math&amp;gt; into the table.&lt;br /&gt;
&lt;br /&gt;
After this procedure is completed, for each occupied box &amp;lt;math&amp;gt;(i,j)&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;(k,\ell)&amp;lt;/math&amp;gt; feed the product &amp;lt;math&amp;gt;\sigma_{i,j}\sigma_{k,\ell}&amp;lt;/math&amp;gt; into the table. Repeat this until the table stops changing.&lt;br /&gt;
&lt;br /&gt;
==Matlab Implementation ==&lt;br /&gt;
&lt;br /&gt;
Individual and additional files can be downloaded from [[User:Tholden/11-1100/File Repository|this page]]. However, for completeness the primary algorithm has been included below. Its documentation is fairly comprehensive, and so all explanation of the code will be deferred to the code itself.&lt;br /&gt;
&lt;br /&gt;
   function [table, tabLogic] = NonComGaussElim(myperms, table, tabLogic)&lt;br /&gt;
   %&lt;br /&gt;
   % NONCOMGAUSSELIM: A function used for computing the non-commutive gaussian&lt;br /&gt;
   % elimination algorithm on a finitely generated subset of the symmetric&lt;br /&gt;
   % group.&lt;br /&gt;
   %&lt;br /&gt;
   % [table,tabLogic] = NonComGaussElim(myperms,table,tabLogic)&lt;br /&gt;
   %&lt;br /&gt;
   %  INPUT:  myperms - [cell] A cell whose entries consist of the generators&lt;br /&gt;
   %                    of the group. The format of these entries should be&lt;br /&gt;
   %                    given via the &amp;quot;image&amp;quot; notation. Namely, if sigma is&lt;br /&gt;
   %                    a generator in Sn, then express sigma as&lt;br /&gt;
   %                    [sigma(1), sigma(2), ..., sigma(n)]&lt;br /&gt;
   %            table - [3d array, non-user input] The result of the&lt;br /&gt;
   %                    calculations. Necessary for recursion and needn&#039;t be&lt;br /&gt;
   %                    supplied by the end-user.&lt;br /&gt;
   %         tabLogic - [2d array, non-user input] The logical array&lt;br /&gt;
   %                    consisting of the non-identity indices for which&lt;br /&gt;
   %                    elements have been inserted into the table. Need not&lt;br /&gt;
   %                    be supplied by the end-user.&lt;br /&gt;
   % OUTPUT:    table - [3d array] The final result of the calculations.&lt;br /&gt;
   %                    table(i,j,:) consists of the permutation element&lt;br /&gt;
   %                    corresponding to pivot i with image j. &lt;br /&gt;
   %         tabLogic - [2d array] The logical array&lt;br /&gt;
   %                    consisting of the non-identity indices for which&lt;br /&gt;
   %                    elements have been inserted into the table.&lt;br /&gt;
   %&lt;br /&gt;
   % Example: Consider the symmetric group S4 and the generators&lt;br /&gt;
   %          g1 = [2 3 1 4] and g2 = [2 1 4 3]. The code is executed as&lt;br /&gt;
   %          &amp;gt;&amp;gt;myperms = {[2 3 1 4], [2 1 4 3]};&lt;br /&gt;
   %          &amp;gt;&amp;gt;[table, tabLogical] = NonComGaussElim(myperms);&lt;br /&gt;
   &lt;br /&gt;
   % Version : 1.2&lt;br /&gt;
   % Author  : Tyler Holden&lt;br /&gt;
   % Date    : September 29, 2011&lt;br /&gt;
   &lt;br /&gt;
   %    To Do: &lt;br /&gt;
   % 1) Add step to pre-process the input permutations. In particular, if&lt;br /&gt;
   %    the identity element is given as one of the generators, this algorithm&lt;br /&gt;
   %    will terminate prematurely. This is because the recursive halting&lt;br /&gt;
   %    criterion is the identity permutation&lt;br /&gt;
   % 2) Optimize for parallel computing. There are not many places wherein&lt;br /&gt;
   %    such improvements could be made, since the algorithm is recursive and&lt;br /&gt;
   %    heavily dependent on neighbouring iterations. However, some&lt;br /&gt;
   %    improvements may be made to computing products and inverses of&lt;br /&gt;
   %    elements.&lt;br /&gt;
   &lt;br /&gt;
   try&lt;br /&gt;
       &lt;br /&gt;
       % Return condition for recursion.&lt;br /&gt;
       if isempty(myperms)&lt;br /&gt;
           return&lt;br /&gt;
       end %End if&lt;br /&gt;
   &lt;br /&gt;
       sizeGrp = length(cell2mat(myperms(1)));&lt;br /&gt;
   &lt;br /&gt;
       % Since the user is not expected to input the table, the following&lt;br /&gt;
       % condition checks that we are at the top level of the recursion and&lt;br /&gt;
       % creates the table as necessary.&lt;br /&gt;
       if nargin &amp;lt; 2&lt;br /&gt;
           table = zeros(sizeGrp,sizeGrp,sizeGrp);&lt;br /&gt;
           tabLogic = zeros(sizeGrp);&lt;br /&gt;
           %     for i=1:sizeGrp&lt;br /&gt;
           %         table(i,i,:) = 1:sizeGrp;&lt;br /&gt;
           %     end %End for(i)&lt;br /&gt;
       end %End if&lt;br /&gt;
   &lt;br /&gt;
       % Here we pull out the first generator and calculate its pivot point.&lt;br /&gt;
       curGen = cell2mat(myperms(1));&lt;br /&gt;
       [piv,img] = findPivot(curGen);&lt;br /&gt;
   &lt;br /&gt;
       % If curGen is the identity, piv will be empty. In this case, we simply&lt;br /&gt;
       % return to the call function. This is used in sublevels of the recursion.&lt;br /&gt;
       % However, this will result in improper calculations if the identity is&lt;br /&gt;
       % included in the original set of permutations. In a future version of this&lt;br /&gt;
       % code, one could &amp;quot;pre-process&amp;quot; the input permutations to remove the&lt;br /&gt;
       % identity elements. This would remove the erroneous calculations and the&lt;br /&gt;
       % recursion check would stay consistent.&lt;br /&gt;
       if isempty(piv)&lt;br /&gt;
           return;&lt;br /&gt;
       end %End if&lt;br /&gt;
   &lt;br /&gt;
       % Pull the permutation from the table. Afterwards, check if it is empty. If&lt;br /&gt;
       % so, input curGen into the table. Otherwise, pre-multiply and apply&lt;br /&gt;
       % recursively to the singleton permutation.&lt;br /&gt;
       sigij(1:sizeGrp) = table(piv,img,1:sizeGrp);&lt;br /&gt;
   &lt;br /&gt;
       if isempty(find(sigij))&lt;br /&gt;
           table(piv,img,:) = curGen;&lt;br /&gt;
           tabLogic(piv,img) = 1;&lt;br /&gt;
           % Only when something new has been added to the table do we do the&lt;br /&gt;
           % multiplication step. Note that it is important to do multiplication&lt;br /&gt;
           % on both sides, otherwise this will not work.&lt;br /&gt;
           for it1=sizeGrp:-1:1;&lt;br /&gt;
               for it2=sizeGrp:-1:it1&lt;br /&gt;
                   if tabLogic(it1,it2)&lt;br /&gt;
                       sigij(1:sizeGrp) = table(it1,it2,1:sizeGrp);&lt;br /&gt;
                       %First multiplication.&lt;br /&gt;
                       newPerm = permMult(sigij, curGen);&lt;br /&gt;
                       [table,tabLogic] = NonComGaussElim({newPerm}, table, tabLogic);&lt;br /&gt;
                       %Second multiplication.&lt;br /&gt;
                        newPerm = permMult(curGen, sigij);&lt;br /&gt;
                        [table,tabLogic] = NonComGaussElim({newPerm}, table, tabLogic);&lt;br /&gt;
                    end %End if&lt;br /&gt;
                end %End for(it2)&lt;br /&gt;
            end %End for (it1)&lt;br /&gt;
        else&lt;br /&gt;
            newPerm = permMult(permInv(sigij),curGen);&lt;br /&gt;
            [table, tabLogic] = NonComGaussElim({newPerm}, table, tabLogic);&lt;br /&gt;
        end %end if &lt;br /&gt;
 &lt;br /&gt;
     %Once the generator and its multiples have been added, we remove it from&lt;br /&gt;
     %the list of permutations and apply the algorithm recursively.&lt;br /&gt;
     [table, tabLogic] = NonComGaussElim(myperms(2:end), table, tabLogic);&lt;br /&gt;
   catch ME&lt;br /&gt;
       disp(&#039;Error&#039;);&lt;br /&gt;
   end &lt;br /&gt;
   &lt;br /&gt;
   %-------------------------------Subroutines-------------------------------%&lt;br /&gt;
 &lt;br /&gt;
   function [pivot, image] = findPivot(permut)&lt;br /&gt;
   %&lt;br /&gt;
   % Calculates the pivot of the permutation. If the permutation is identity,&lt;br /&gt;
   % pivot and image return empty.&lt;br /&gt;
   pivot = find(permut ~= 1:length(permut),1);&lt;br /&gt;
   image = permut(pivot);&lt;br /&gt;
   &lt;br /&gt;
   function prod = permMult(perm1, perm2)&lt;br /&gt;
   %&lt;br /&gt;
   % Multiplies two permutations. This is simply the composition of the&lt;br /&gt;
   % permtuations acting on the set {1,...,n}. That is, if sigma and tau are&lt;br /&gt;
   % permutations, then sigma*tau acting on the set {1,...,n} is given in&lt;br /&gt;
   % &amp;quot;image notation&amp;quot; as&lt;br /&gt;
   % sigma*tau = [sigma(tau(1)), sigma(tau(2)), ... , sigma(tau(n)) ]&lt;br /&gt;
   prod = perm1(perm2);&lt;br /&gt;
   &lt;br /&gt;
   function inverse = permInv(perm)&lt;br /&gt;
   %&lt;br /&gt;
   % Calculates the inverse element. If sigma is the permutation to be&lt;br /&gt;
   % inverted, it is written as [sigma(1), sigma(2), ... , sigma(n)]. The&lt;br /&gt;
   % inverse of this function is just done by placing j in the sigma(j)&lt;br /&gt;
   % position. &lt;br /&gt;
   inverse(perm) = 1:length(perm);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 2x2x2 Rubik&#039;s cube==&lt;br /&gt;
&lt;br /&gt;
[[Image:2x2x2CubeSmall.jpg|thumb|right|alt=A picture of the 2x2x2 Rubik&#039;s cube.|The 2x2x2 Rubik&#039;s cube.]]&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;math&amp;gt; 2 \times 2 \times 2 &amp;lt;/math&amp;gt; Rubik&#039;s cube is a simplified version of the classical Rubik&#039;s cube. Indeed, while this simplified Rubik&#039;s cube still has six faces, each face only has four stickers. This greatly simplifies the process of analyzing the subgroup generated by this problem. We note that there are a total of &amp;lt;math&amp;gt; 24 &amp;lt;/math&amp;gt; stickers on this cube, so that the generators a subgroup of &amp;lt;math&amp;gt; S_{24} &amp;lt;/math&amp;gt; which has order &amp;lt;math&amp;gt; 24! &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
To determine our sticker numbering, we have rendered a [http://individual.utoronto.ca/tholden/CourseNotes/AlgebraWikiCode/RotatingCube.gif three-dimensional image of the cube], the source code for which can be found on my [[User:Tholden/11-1100/File Repository|file repository]].&lt;br /&gt;
&lt;br /&gt;
Using the numbering scheme given in the rendered image of the cube, our generators can be given in cycle notation as&lt;br /&gt;
* &amp;lt;math&amp;gt; g_1 = (1\ 3\ 4\ 2) (22\ 6\ 9\ 17) (21\ 5\ 10\ 18) &amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt; g_2 = (5\ 6\ 8\ 7) (21\ 14\ 11\ 1) (23\ 13\ 9\ 2) &amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt; g_3 = (9\ 11\ 12\ 10) (3\ 5\ 13\ 19) ( 1\ 7\ 15\ 17) &amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt; g_4 = (13\ 15\ 16\ 14) (24\ 8\ 11\ 19) (23\ 7\ 12\ 20) &amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt; g_5 = (17\ 18\ 20\ 19) (22\ 16\ 12\ 3)(24\ 15\ 10\ 4) &amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt; g_6 = (21\ 23\ 24\ 22)(14\ 20\ 4\ 6)(16\ 18\ 2\ 8) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Using the supplied files, the code can be executed as follows:&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt; tic; [table,tabLogic] = NonComGaussElim(myPerms); toc&lt;br /&gt;
 Elapsed time is 4.016460 seconds.&lt;br /&gt;
 &amp;gt;&amp;gt; prod(sum(tabLogic&#039;)+1)&lt;br /&gt;
 ans =&lt;br /&gt;
    88179840&lt;br /&gt;
&lt;br /&gt;
However, we note that unlike the classical Rubik&#039;s cube, there are no center pieces whose position fixes an orientation of our configuration. Consequently, there are 24 additional symmetries. We conclude the actual size of the &amp;lt;math&amp;gt; 2\times 2 \times 2 &amp;lt;/math&amp;gt; Rubik&#039;s cube group is &amp;lt;math&amp;gt; 3674160 = \frac{88179840}{24} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Megaminx==&lt;/div&gt;</summary>
		<author><name>Tholden</name></author>
	</entry>
	<entry>
		<id>https://drorbn.net/index.php?title=User:Tholden/11-1100/Homework_Part_1&amp;diff=10827</id>
		<title>User:Tholden/11-1100/Homework Part 1</title>
		<link rel="alternate" type="text/html" href="https://drorbn.net/index.php?title=User:Tholden/11-1100/Homework_Part_1&amp;diff=10827"/>
		<updated>2011-10-10T17:42:48Z</updated>

		<summary type="html">&lt;p&gt;Tholden: /* &amp;lt;math&amp;gt; 2 \times 2 \times 2 &amp;lt;/math&amp;gt; Rubik&amp;#039;s cube */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page showcases my work done in implementing the Non-Commutative Gaussian Elimination algorithm with direct application to solving a permutation puzzle. I would like it to be known that I had originally chosen the Megaminx puzzle and am still in the process of solving it. The algorithm is currently running on a Sun x4600 computational server using Matlab 2010b including eight Opteron 8212 processors with 32 GB of memory. However, the algorithm is not conducive to parallelization and so has yet to converge. As a test-case, I have solved the &amp;lt;math&amp;gt; 2 \times 2 \times 2 &amp;lt;/math&amp;gt; Rubik&#039;s cube, which I will also present here. In the event that the algorithm has not converged, I will submit the &amp;lt;math&amp;gt; 2 \times 2 \times 2 &amp;lt;/math&amp;gt; Rubik&#039;s cube for marking.&lt;br /&gt;
&lt;br /&gt;
==Theoretical Review of the Algorithm==&lt;br /&gt;
&lt;br /&gt;
The purpose of Non-Commutative Gaussian Elimination (NCGE) is to find the elements and order of a subgroup generated by a finite set of generators. The algorithm proceeds as follows:&lt;br /&gt;
&lt;br /&gt;
Let &amp;lt;math&amp;gt;G = \langle g_1,\ldots, g_\alpha \rangle&amp;lt;/math&amp;gt;. Define the pivot of &amp;lt;math&amp;gt;\sigma \in S_n&amp;lt;/math&amp;gt; to be the minimal &amp;lt;math&amp;gt;k \in \mathbb N&amp;lt;/math&amp;gt; such that &amp;lt;math&amp;gt;\sigma(k) \neq k&amp;lt;/math&amp;gt;. We prepare a table which is mostly empty&lt;br /&gt;
&lt;br /&gt;
[[Image:NCGETable1.jpg|thumb|right|alt=The table initialization for Non-Commutative Gaussian Elimination.|A mostly empty table for Gaussian Elimination]]&lt;br /&gt;
&lt;br /&gt;
Feed &amp;lt;math&amp;gt;g_1, \ldots, g_n&amp;lt;/math&amp;gt; in order. To feed a non-identity &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;, find its pivotal position &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; and let &amp;lt;math&amp;gt;j = \sigma(i)&amp;lt;/math&amp;gt;. &lt;br /&gt;
#If box &amp;lt;math&amp;gt;(i,j)&amp;lt;/math&amp;gt; is empty, put &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; in this box.&lt;br /&gt;
#If box &amp;lt;math&amp;gt;(i,j)&amp;lt;/math&amp;gt; is not-empty, feed &amp;lt;math&amp;gt;\sigma&#039; = \sigma_{i,j}^{-1} \sigma&amp;lt;/math&amp;gt; into the table.&lt;br /&gt;
&lt;br /&gt;
After this procedure is completed, for each occupied box &amp;lt;math&amp;gt;(i,j)&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;(k,\ell)&amp;lt;/math&amp;gt; feed the product &amp;lt;math&amp;gt;\sigma_{i,j}\sigma_{k,\ell}&amp;lt;/math&amp;gt; into the table. Repeat this until the table stops changing.&lt;br /&gt;
&lt;br /&gt;
==Matlab Implementation ==&lt;br /&gt;
&lt;br /&gt;
Individual and additional files can be downloaded from [[User:Tholden/11-1100/File Repository|this page]]. However, for completeness the primary algorithm has been included below. Its documentation is fairly comprehensive, and so all explanation of the code will be deferred to the code itself.&lt;br /&gt;
&lt;br /&gt;
   function [table, tabLogic] = NonComGaussElim(myperms, table, tabLogic)&lt;br /&gt;
   %&lt;br /&gt;
   % NONCOMGAUSSELIM: A function used for computing the non-commutive gaussian&lt;br /&gt;
   % elimination algorithm on a finitely generated subset of the symmetric&lt;br /&gt;
   % group.&lt;br /&gt;
   %&lt;br /&gt;
   % [table,tabLogic] = NonComGaussElim(myperms,table,tabLogic)&lt;br /&gt;
   %&lt;br /&gt;
   %  INPUT:  myperms - [cell] A cell whose entries consist of the generators&lt;br /&gt;
   %                    of the group. The format of these entries should be&lt;br /&gt;
   %                    given via the &amp;quot;image&amp;quot; notation. Namely, if sigma is&lt;br /&gt;
   %                    a generator in Sn, then express sigma as&lt;br /&gt;
   %                    [sigma(1), sigma(2), ..., sigma(n)]&lt;br /&gt;
   %            table - [3d array, non-user input] The result of the&lt;br /&gt;
   %                    calculations. Necessary for recursion and needn&#039;t be&lt;br /&gt;
   %                    supplied by the end-user.&lt;br /&gt;
   %         tabLogic - [2d array, non-user input] The logical array&lt;br /&gt;
   %                    consisting of the non-identity indices for which&lt;br /&gt;
   %                    elements have been inserted into the table. Need not&lt;br /&gt;
   %                    be supplied by the end-user.&lt;br /&gt;
   % OUTPUT:    table - [3d array] The final result of the calculations.&lt;br /&gt;
   %                    table(i,j,:) consists of the permutation element&lt;br /&gt;
   %                    corresponding to pivot i with image j. &lt;br /&gt;
   %         tabLogic - [2d array] The logical array&lt;br /&gt;
   %                    consisting of the non-identity indices for which&lt;br /&gt;
   %                    elements have been inserted into the table.&lt;br /&gt;
   %&lt;br /&gt;
   % Example: Consider the symmetric group S4 and the generators&lt;br /&gt;
   %          g1 = [2 3 1 4] and g2 = [2 1 4 3]. The code is executed as&lt;br /&gt;
   %          &amp;gt;&amp;gt;myperms = {[2 3 1 4], [2 1 4 3]};&lt;br /&gt;
   %          &amp;gt;&amp;gt;[table, tabLogical] = NonComGaussElim(myperms);&lt;br /&gt;
   &lt;br /&gt;
   % Version : 1.2&lt;br /&gt;
   % Author  : Tyler Holden&lt;br /&gt;
   % Date    : September 29, 2011&lt;br /&gt;
   &lt;br /&gt;
   %    To Do: &lt;br /&gt;
   % 1) Add step to pre-process the input permutations. In particular, if&lt;br /&gt;
   %    the identity element is given as one of the generators, this algorithm&lt;br /&gt;
   %    will terminate prematurely. This is because the recursive halting&lt;br /&gt;
   %    criterion is the identity permutation&lt;br /&gt;
   % 2) Optimize for parallel computing. There are not many places wherein&lt;br /&gt;
   %    such improvements could be made, since the algorithm is recursive and&lt;br /&gt;
   %    heavily dependent on neighbouring iterations. However, some&lt;br /&gt;
   %    improvements may be made to computing products and inverses of&lt;br /&gt;
   %    elements.&lt;br /&gt;
   &lt;br /&gt;
   try&lt;br /&gt;
       &lt;br /&gt;
       % Return condition for recursion.&lt;br /&gt;
       if isempty(myperms)&lt;br /&gt;
           return&lt;br /&gt;
       end %End if&lt;br /&gt;
   &lt;br /&gt;
       sizeGrp = length(cell2mat(myperms(1)));&lt;br /&gt;
   &lt;br /&gt;
       % Since the user is not expected to input the table, the following&lt;br /&gt;
       % condition checks that we are at the top level of the recursion and&lt;br /&gt;
       % creates the table as necessary.&lt;br /&gt;
       if nargin &amp;lt; 2&lt;br /&gt;
           table = zeros(sizeGrp,sizeGrp,sizeGrp);&lt;br /&gt;
           tabLogic = zeros(sizeGrp);&lt;br /&gt;
           %     for i=1:sizeGrp&lt;br /&gt;
           %         table(i,i,:) = 1:sizeGrp;&lt;br /&gt;
           %     end %End for(i)&lt;br /&gt;
       end %End if&lt;br /&gt;
   &lt;br /&gt;
       % Here we pull out the first generator and calculate its pivot point.&lt;br /&gt;
       curGen = cell2mat(myperms(1));&lt;br /&gt;
       [piv,img] = findPivot(curGen);&lt;br /&gt;
   &lt;br /&gt;
       % If curGen is the identity, piv will be empty. In this case, we simply&lt;br /&gt;
       % return to the call function. This is used in sublevels of the recursion.&lt;br /&gt;
       % However, this will result in improper calculations if the identity is&lt;br /&gt;
       % included in the original set of permutations. In a future version of this&lt;br /&gt;
       % code, one could &amp;quot;pre-process&amp;quot; the input permutations to remove the&lt;br /&gt;
       % identity elements. This would remove the erroneous calculations and the&lt;br /&gt;
       % recursion check would stay consistent.&lt;br /&gt;
       if isempty(piv)&lt;br /&gt;
           return;&lt;br /&gt;
       end %End if&lt;br /&gt;
   &lt;br /&gt;
       % Pull the permutation from the table. Afterwards, check if it is empty. If&lt;br /&gt;
       % so, input curGen into the table. Otherwise, pre-multiply and apply&lt;br /&gt;
       % recursively to the singleton permutation.&lt;br /&gt;
       sigij(1:sizeGrp) = table(piv,img,1:sizeGrp);&lt;br /&gt;
   &lt;br /&gt;
       if isempty(find(sigij))&lt;br /&gt;
           table(piv,img,:) = curGen;&lt;br /&gt;
           tabLogic(piv,img) = 1;&lt;br /&gt;
           % Only when something new has been added to the table do we do the&lt;br /&gt;
           % multiplication step. Note that it is important to do multiplication&lt;br /&gt;
           % on both sides, otherwise this will not work.&lt;br /&gt;
           for it1=sizeGrp:-1:1;&lt;br /&gt;
               for it2=sizeGrp:-1:it1&lt;br /&gt;
                   if tabLogic(it1,it2)&lt;br /&gt;
                       sigij(1:sizeGrp) = table(it1,it2,1:sizeGrp);&lt;br /&gt;
                       %First multiplication.&lt;br /&gt;
                       newPerm = permMult(sigij, curGen);&lt;br /&gt;
                       [table,tabLogic] = NonComGaussElim({newPerm}, table, tabLogic);&lt;br /&gt;
                       %Second multiplication.&lt;br /&gt;
                        newPerm = permMult(curGen, sigij);&lt;br /&gt;
                        [table,tabLogic] = NonComGaussElim({newPerm}, table, tabLogic);&lt;br /&gt;
                    end %End if&lt;br /&gt;
                end %End for(it2)&lt;br /&gt;
            end %End for (it1)&lt;br /&gt;
        else&lt;br /&gt;
            newPerm = permMult(permInv(sigij),curGen);&lt;br /&gt;
            [table, tabLogic] = NonComGaussElim({newPerm}, table, tabLogic);&lt;br /&gt;
        end %end if &lt;br /&gt;
 &lt;br /&gt;
     %Once the generator and its multiples have been added, we remove it from&lt;br /&gt;
     %the list of permutations and apply the algorithm recursively.&lt;br /&gt;
     [table, tabLogic] = NonComGaussElim(myperms(2:end), table, tabLogic);&lt;br /&gt;
   catch ME&lt;br /&gt;
       disp(&#039;Error&#039;);&lt;br /&gt;
   end &lt;br /&gt;
   &lt;br /&gt;
   %-------------------------------Subroutines-------------------------------%&lt;br /&gt;
 &lt;br /&gt;
   function [pivot, image] = findPivot(permut)&lt;br /&gt;
   %&lt;br /&gt;
   % Calculates the pivot of the permutation. If the permutation is identity,&lt;br /&gt;
   % pivot and image return empty.&lt;br /&gt;
   pivot = find(permut ~= 1:length(permut),1);&lt;br /&gt;
   image = permut(pivot);&lt;br /&gt;
   &lt;br /&gt;
   function prod = permMult(perm1, perm2)&lt;br /&gt;
   %&lt;br /&gt;
   % Multiplies two permutations. This is simply the composition of the&lt;br /&gt;
   % permtuations acting on the set {1,...,n}. That is, if sigma and tau are&lt;br /&gt;
   % permutations, then sigma*tau acting on the set {1,...,n} is given in&lt;br /&gt;
   % &amp;quot;image notation&amp;quot; as&lt;br /&gt;
   % sigma*tau = [sigma(tau(1)), sigma(tau(2)), ... , sigma(tau(n)) ]&lt;br /&gt;
   prod = perm1(perm2);&lt;br /&gt;
   &lt;br /&gt;
   function inverse = permInv(perm)&lt;br /&gt;
   %&lt;br /&gt;
   % Calculates the inverse element. If sigma is the permutation to be&lt;br /&gt;
   % inverted, it is written as [sigma(1), sigma(2), ... , sigma(n)]. The&lt;br /&gt;
   % inverse of this function is just done by placing j in the sigma(j)&lt;br /&gt;
   % position. &lt;br /&gt;
   inverse(perm) = 1:length(perm);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 2x2x2 Rubik&#039;s cube==&lt;br /&gt;
&lt;br /&gt;
[[Image:2x2x2CubeSmall.jpg|thumb|right|alt=A picture of the 2x2x2 Rubik&#039;s cube.|The 2x2x2 Rubik&#039;s cube.]]&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;math&amp;gt; 2 \times 2 \times 2 &amp;lt;/math&amp;gt; Rubik&#039;s cube is a simplified version of the classical Rubik&#039;s cube. Indeed, while this simplified Rubik&#039;s cube still has six faces, each face only has four stickers. This greatly simplifies the process of analyzing the subgroup generated by this problem. We note that there are a total of &amp;lt;math&amp;gt; 24 &amp;lt;/math&amp;gt; stickers on this cube, so that the generators a subgroup of &amp;lt;math&amp;gt; S_{24} &amp;lt;/math&amp;gt; which has order &amp;lt;math&amp;gt; 24! &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
To determine our sticker numbering, we have rendered a [http://individual.utoronto.ca/tholden/CourseNotes/AlgebraWikiCode/RotatingCube.gif three-dimensional image of the cube], the source code for which can be found on my [[User:Tholden/11-1100/File Repository|file repository]].&lt;br /&gt;
&lt;br /&gt;
Using the numbering scheme given in the rendered image of the cube, our generators can be given in cycle notation as&lt;br /&gt;
* &amp;lt;math&amp;gt; g_1 = (1\ 3\ 4\ 2) (22\ 6\ 9\ 17) (21\ 5\ 10\ 18) &amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt; g_2 = (5\ 6\ 8\ 7) (21\ 14\ 11\ 1) (23\ 13\ 9\ 2) &amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt; g_3 = (9\ 11\ 12\ 10) (3\ 5\ 13\ 19) ( 1\ 7\ 15\ 17) &amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt; g_4 = (13\ 15\ 16\ 14) (24\ 8\ 11\ 19) (23\ 7\ 12\ 20) &amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt; g_5 = (17\ 18\ 20\ 19) (22\ 16\ 12\ 3)(24\ 15\ 10\ 4) &amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt; g_6 = (21\ 23\ 24\ 22)(14\ 20\ 4\ 6)(16\ 18\ 2\ 8) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Megaminx==&lt;/div&gt;</summary>
		<author><name>Tholden</name></author>
	</entry>
	<entry>
		<id>https://drorbn.net/index.php?title=User:Tholden/11-1100/Homework_Part_1&amp;diff=10826</id>
		<title>User:Tholden/11-1100/Homework Part 1</title>
		<link rel="alternate" type="text/html" href="https://drorbn.net/index.php?title=User:Tholden/11-1100/Homework_Part_1&amp;diff=10826"/>
		<updated>2011-10-10T17:42:23Z</updated>

		<summary type="html">&lt;p&gt;Tholden: /* &amp;lt;math&amp;gt; 2 \times 2 \times 2 &amp;lt;/math&amp;gt; Rubik&amp;#039;s cube */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page showcases my work done in implementing the Non-Commutative Gaussian Elimination algorithm with direct application to solving a permutation puzzle. I would like it to be known that I had originally chosen the Megaminx puzzle and am still in the process of solving it. The algorithm is currently running on a Sun x4600 computational server using Matlab 2010b including eight Opteron 8212 processors with 32 GB of memory. However, the algorithm is not conducive to parallelization and so has yet to converge. As a test-case, I have solved the &amp;lt;math&amp;gt; 2 \times 2 \times 2 &amp;lt;/math&amp;gt; Rubik&#039;s cube, which I will also present here. In the event that the algorithm has not converged, I will submit the &amp;lt;math&amp;gt; 2 \times 2 \times 2 &amp;lt;/math&amp;gt; Rubik&#039;s cube for marking.&lt;br /&gt;
&lt;br /&gt;
==Theoretical Review of the Algorithm==&lt;br /&gt;
&lt;br /&gt;
The purpose of Non-Commutative Gaussian Elimination (NCGE) is to find the elements and order of a subgroup generated by a finite set of generators. The algorithm proceeds as follows:&lt;br /&gt;
&lt;br /&gt;
Let &amp;lt;math&amp;gt;G = \langle g_1,\ldots, g_\alpha \rangle&amp;lt;/math&amp;gt;. Define the pivot of &amp;lt;math&amp;gt;\sigma \in S_n&amp;lt;/math&amp;gt; to be the minimal &amp;lt;math&amp;gt;k \in \mathbb N&amp;lt;/math&amp;gt; such that &amp;lt;math&amp;gt;\sigma(k) \neq k&amp;lt;/math&amp;gt;. We prepare a table which is mostly empty&lt;br /&gt;
&lt;br /&gt;
[[Image:NCGETable1.jpg|thumb|right|alt=The table initialization for Non-Commutative Gaussian Elimination.|A mostly empty table for Gaussian Elimination]]&lt;br /&gt;
&lt;br /&gt;
Feed &amp;lt;math&amp;gt;g_1, \ldots, g_n&amp;lt;/math&amp;gt; in order. To feed a non-identity &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;, find its pivotal position &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; and let &amp;lt;math&amp;gt;j = \sigma(i)&amp;lt;/math&amp;gt;. &lt;br /&gt;
#If box &amp;lt;math&amp;gt;(i,j)&amp;lt;/math&amp;gt; is empty, put &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; in this box.&lt;br /&gt;
#If box &amp;lt;math&amp;gt;(i,j)&amp;lt;/math&amp;gt; is not-empty, feed &amp;lt;math&amp;gt;\sigma&#039; = \sigma_{i,j}^{-1} \sigma&amp;lt;/math&amp;gt; into the table.&lt;br /&gt;
&lt;br /&gt;
After this procedure is completed, for each occupied box &amp;lt;math&amp;gt;(i,j)&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;(k,\ell)&amp;lt;/math&amp;gt; feed the product &amp;lt;math&amp;gt;\sigma_{i,j}\sigma_{k,\ell}&amp;lt;/math&amp;gt; into the table. Repeat this until the table stops changing.&lt;br /&gt;
&lt;br /&gt;
==Matlab Implementation ==&lt;br /&gt;
&lt;br /&gt;
Individual and additional files can be downloaded from [[User:Tholden/11-1100/File Repository|this page]]. However, for completeness the primary algorithm has been included below. Its documentation is fairly comprehensive, and so all explanation of the code will be deferred to the code itself.&lt;br /&gt;
&lt;br /&gt;
   function [table, tabLogic] = NonComGaussElim(myperms, table, tabLogic)&lt;br /&gt;
   %&lt;br /&gt;
   % NONCOMGAUSSELIM: A function used for computing the non-commutive gaussian&lt;br /&gt;
   % elimination algorithm on a finitely generated subset of the symmetric&lt;br /&gt;
   % group.&lt;br /&gt;
   %&lt;br /&gt;
   % [table,tabLogic] = NonComGaussElim(myperms,table,tabLogic)&lt;br /&gt;
   %&lt;br /&gt;
   %  INPUT:  myperms - [cell] A cell whose entries consist of the generators&lt;br /&gt;
   %                    of the group. The format of these entries should be&lt;br /&gt;
   %                    given via the &amp;quot;image&amp;quot; notation. Namely, if sigma is&lt;br /&gt;
   %                    a generator in Sn, then express sigma as&lt;br /&gt;
   %                    [sigma(1), sigma(2), ..., sigma(n)]&lt;br /&gt;
   %            table - [3d array, non-user input] The result of the&lt;br /&gt;
   %                    calculations. Necessary for recursion and needn&#039;t be&lt;br /&gt;
   %                    supplied by the end-user.&lt;br /&gt;
   %         tabLogic - [2d array, non-user input] The logical array&lt;br /&gt;
   %                    consisting of the non-identity indices for which&lt;br /&gt;
   %                    elements have been inserted into the table. Need not&lt;br /&gt;
   %                    be supplied by the end-user.&lt;br /&gt;
   % OUTPUT:    table - [3d array] The final result of the calculations.&lt;br /&gt;
   %                    table(i,j,:) consists of the permutation element&lt;br /&gt;
   %                    corresponding to pivot i with image j. &lt;br /&gt;
   %         tabLogic - [2d array] The logical array&lt;br /&gt;
   %                    consisting of the non-identity indices for which&lt;br /&gt;
   %                    elements have been inserted into the table.&lt;br /&gt;
   %&lt;br /&gt;
   % Example: Consider the symmetric group S4 and the generators&lt;br /&gt;
   %          g1 = [2 3 1 4] and g2 = [2 1 4 3]. The code is executed as&lt;br /&gt;
   %          &amp;gt;&amp;gt;myperms = {[2 3 1 4], [2 1 4 3]};&lt;br /&gt;
   %          &amp;gt;&amp;gt;[table, tabLogical] = NonComGaussElim(myperms);&lt;br /&gt;
   &lt;br /&gt;
   % Version : 1.2&lt;br /&gt;
   % Author  : Tyler Holden&lt;br /&gt;
   % Date    : September 29, 2011&lt;br /&gt;
   &lt;br /&gt;
   %    To Do: &lt;br /&gt;
   % 1) Add step to pre-process the input permutations. In particular, if&lt;br /&gt;
   %    the identity element is given as one of the generators, this algorithm&lt;br /&gt;
   %    will terminate prematurely. This is because the recursive halting&lt;br /&gt;
   %    criterion is the identity permutation&lt;br /&gt;
   % 2) Optimize for parallel computing. There are not many places wherein&lt;br /&gt;
   %    such improvements could be made, since the algorithm is recursive and&lt;br /&gt;
   %    heavily dependent on neighbouring iterations. However, some&lt;br /&gt;
   %    improvements may be made to computing products and inverses of&lt;br /&gt;
   %    elements.&lt;br /&gt;
   &lt;br /&gt;
   try&lt;br /&gt;
       &lt;br /&gt;
       % Return condition for recursion.&lt;br /&gt;
       if isempty(myperms)&lt;br /&gt;
           return&lt;br /&gt;
       end %End if&lt;br /&gt;
   &lt;br /&gt;
       sizeGrp = length(cell2mat(myperms(1)));&lt;br /&gt;
   &lt;br /&gt;
       % Since the user is not expected to input the table, the following&lt;br /&gt;
       % condition checks that we are at the top level of the recursion and&lt;br /&gt;
       % creates the table as necessary.&lt;br /&gt;
       if nargin &amp;lt; 2&lt;br /&gt;
           table = zeros(sizeGrp,sizeGrp,sizeGrp);&lt;br /&gt;
           tabLogic = zeros(sizeGrp);&lt;br /&gt;
           %     for i=1:sizeGrp&lt;br /&gt;
           %         table(i,i,:) = 1:sizeGrp;&lt;br /&gt;
           %     end %End for(i)&lt;br /&gt;
       end %End if&lt;br /&gt;
   &lt;br /&gt;
       % Here we pull out the first generator and calculate its pivot point.&lt;br /&gt;
       curGen = cell2mat(myperms(1));&lt;br /&gt;
       [piv,img] = findPivot(curGen);&lt;br /&gt;
   &lt;br /&gt;
       % If curGen is the identity, piv will be empty. In this case, we simply&lt;br /&gt;
       % return to the call function. This is used in sublevels of the recursion.&lt;br /&gt;
       % However, this will result in improper calculations if the identity is&lt;br /&gt;
       % included in the original set of permutations. In a future version of this&lt;br /&gt;
       % code, one could &amp;quot;pre-process&amp;quot; the input permutations to remove the&lt;br /&gt;
       % identity elements. This would remove the erroneous calculations and the&lt;br /&gt;
       % recursion check would stay consistent.&lt;br /&gt;
       if isempty(piv)&lt;br /&gt;
           return;&lt;br /&gt;
       end %End if&lt;br /&gt;
   &lt;br /&gt;
       % Pull the permutation from the table. Afterwards, check if it is empty. If&lt;br /&gt;
       % so, input curGen into the table. Otherwise, pre-multiply and apply&lt;br /&gt;
       % recursively to the singleton permutation.&lt;br /&gt;
       sigij(1:sizeGrp) = table(piv,img,1:sizeGrp);&lt;br /&gt;
   &lt;br /&gt;
       if isempty(find(sigij))&lt;br /&gt;
           table(piv,img,:) = curGen;&lt;br /&gt;
           tabLogic(piv,img) = 1;&lt;br /&gt;
           % Only when something new has been added to the table do we do the&lt;br /&gt;
           % multiplication step. Note that it is important to do multiplication&lt;br /&gt;
           % on both sides, otherwise this will not work.&lt;br /&gt;
           for it1=sizeGrp:-1:1;&lt;br /&gt;
               for it2=sizeGrp:-1:it1&lt;br /&gt;
                   if tabLogic(it1,it2)&lt;br /&gt;
                       sigij(1:sizeGrp) = table(it1,it2,1:sizeGrp);&lt;br /&gt;
                       %First multiplication.&lt;br /&gt;
                       newPerm = permMult(sigij, curGen);&lt;br /&gt;
                       [table,tabLogic] = NonComGaussElim({newPerm}, table, tabLogic);&lt;br /&gt;
                       %Second multiplication.&lt;br /&gt;
                        newPerm = permMult(curGen, sigij);&lt;br /&gt;
                        [table,tabLogic] = NonComGaussElim({newPerm}, table, tabLogic);&lt;br /&gt;
                    end %End if&lt;br /&gt;
                end %End for(it2)&lt;br /&gt;
            end %End for (it1)&lt;br /&gt;
        else&lt;br /&gt;
            newPerm = permMult(permInv(sigij),curGen);&lt;br /&gt;
            [table, tabLogic] = NonComGaussElim({newPerm}, table, tabLogic);&lt;br /&gt;
        end %end if &lt;br /&gt;
 &lt;br /&gt;
     %Once the generator and its multiples have been added, we remove it from&lt;br /&gt;
     %the list of permutations and apply the algorithm recursively.&lt;br /&gt;
     [table, tabLogic] = NonComGaussElim(myperms(2:end), table, tabLogic);&lt;br /&gt;
   catch ME&lt;br /&gt;
       disp(&#039;Error&#039;);&lt;br /&gt;
   end &lt;br /&gt;
   &lt;br /&gt;
   %-------------------------------Subroutines-------------------------------%&lt;br /&gt;
 &lt;br /&gt;
   function [pivot, image] = findPivot(permut)&lt;br /&gt;
   %&lt;br /&gt;
   % Calculates the pivot of the permutation. If the permutation is identity,&lt;br /&gt;
   % pivot and image return empty.&lt;br /&gt;
   pivot = find(permut ~= 1:length(permut),1);&lt;br /&gt;
   image = permut(pivot);&lt;br /&gt;
   &lt;br /&gt;
   function prod = permMult(perm1, perm2)&lt;br /&gt;
   %&lt;br /&gt;
   % Multiplies two permutations. This is simply the composition of the&lt;br /&gt;
   % permtuations acting on the set {1,...,n}. That is, if sigma and tau are&lt;br /&gt;
   % permutations, then sigma*tau acting on the set {1,...,n} is given in&lt;br /&gt;
   % &amp;quot;image notation&amp;quot; as&lt;br /&gt;
   % sigma*tau = [sigma(tau(1)), sigma(tau(2)), ... , sigma(tau(n)) ]&lt;br /&gt;
   prod = perm1(perm2);&lt;br /&gt;
   &lt;br /&gt;
   function inverse = permInv(perm)&lt;br /&gt;
   %&lt;br /&gt;
   % Calculates the inverse element. If sigma is the permutation to be&lt;br /&gt;
   % inverted, it is written as [sigma(1), sigma(2), ... , sigma(n)]. The&lt;br /&gt;
   % inverse of this function is just done by placing j in the sigma(j)&lt;br /&gt;
   % position. &lt;br /&gt;
   inverse(perm) = 1:length(perm);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;math&amp;gt; 2 \times 2 \times 2 &amp;lt;/math&amp;gt; Rubik&#039;s cube==&lt;br /&gt;
&lt;br /&gt;
[[Image:2x2x2CubeSmall.jpg|thumb|right|alt=A picture of the 2x2x2 Rubik&#039;s cube.|The 2x2x2 Rubik&#039;s cube.]]&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;math&amp;gt; 2 \times 2 \times 2 &amp;lt;/math&amp;gt; Rubik&#039;s cube is a simplified version of the classical Rubik&#039;s cube. Indeed, while this simplified Rubik&#039;s cube still has six faces, each face only has four stickers. This greatly simplifies the process of analyzing the subgroup generated by this problem. We note that there are a total of &amp;lt;math&amp;gt; 24 &amp;lt;/math&amp;gt; stickers on this cube, so that the generators a subgroup of &amp;lt;math&amp;gt; S_{24} &amp;lt;/math&amp;gt; which has order &amp;lt;math&amp;gt; 24! &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
To determine our sticker numbering, we have rendered a [http://individual.utoronto.ca/tholden/CourseNotes/AlgebraWikiCode/RotatingCube.gif three-dimensional image of the cube], the source code for which can be found on my [[User:Tholden/11-1100/File Repository|file repository]].&lt;br /&gt;
&lt;br /&gt;
Using the numbering scheme given in the rendered image of the cube, our generators can be given in cycle notation as&lt;br /&gt;
* &amp;lt;math&amp;gt; g_1 = (1\ 3\ 4\ 2) (22\ 6\ 9\ 17) (21\ 5\ 10\ 18) &amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt; g_2 = (5\ 6\ 8\ 7) (21\ 14\ 11\ 1) (23\ 13\ 9\ 2) &amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt; g_3 = (9\ 11\ 12\ 10) (3\ 5\ 13\ 19) ( 1\ 7\ 15\ 17) &amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt; g_4 = (13\ 15\ 16\ 14) (24\ 8\ 11\ 19) (23\ 7\ 12\ 20) &amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt; g_5 = (17\ 18\ 20\ 19) (22\ 16\ 12\ 3)(24\ 15\ 10\ 4) &amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt; g_6 = (21\ 23\ 24\ 22)(14\ 20\ 4\ 6)(16\ 18\ 2\ 8) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Megaminx==&lt;/div&gt;</summary>
		<author><name>Tholden</name></author>
	</entry>
	<entry>
		<id>https://drorbn.net/index.php?title=User:Tholden/11-1100/File_Repository&amp;diff=10825</id>
		<title>User:Tholden/11-1100/File Repository</title>
		<link rel="alternate" type="text/html" href="https://drorbn.net/index.php?title=User:Tholden/11-1100/File_Repository&amp;diff=10825"/>
		<updated>2011-10-10T17:33:58Z</updated>

		<summary type="html">&lt;p&gt;Tholden: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Any files located on any of my pages can be found below. In particular, since the wiki server does not like adding .m files, these are hyperlinked to my ftp page.&lt;br /&gt;
&lt;br /&gt;
[http://individual.utoronto.ca/tholden/CourseNotes/AlgebraWikiCode/addCycle2Img.m addCycle2Img.m]&lt;br /&gt;
&lt;br /&gt;
[http://individual.utoronto.ca/tholden/CourseNotes/AlgebraWikiCode/Dodecahedron2.m Dodecahedron2.m]&lt;br /&gt;
&lt;br /&gt;
[http://individual.utoronto.ca/tholden/CourseNotes/AlgebraWikiCode/SimpleCube.m SimpleCube.m]&lt;br /&gt;
&lt;br /&gt;
[http://individual.utoronto.ca/tholden/CourseNotes/AlgebraWikiCode/SimpleCube2.m SimpleCube2.m]&lt;br /&gt;
&lt;br /&gt;
[http://individual.utoronto.ca/tholden/CourseNotes/AlgebraWikiCode/RotatingCube.gif RotatingCube Animation]&lt;/div&gt;</summary>
		<author><name>Tholden</name></author>
	</entry>
	<entry>
		<id>https://drorbn.net/index.php?title=File:2x2x2CubeSmall.jpg&amp;diff=10824</id>
		<title>File:2x2x2CubeSmall.jpg</title>
		<link rel="alternate" type="text/html" href="https://drorbn.net/index.php?title=File:2x2x2CubeSmall.jpg&amp;diff=10824"/>
		<updated>2011-10-10T17:20:09Z</updated>

		<summary type="html">&lt;p&gt;Tholden: A high resolution picture of the 2x2x2 Rubik&amp;#039;s cube.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A high resolution picture of the 2x2x2 Rubik&#039;s cube.&lt;/div&gt;</summary>
		<author><name>Tholden</name></author>
	</entry>
	<entry>
		<id>https://drorbn.net/index.php?title=User:Tholden/11-1100/Homework_Part_1&amp;diff=10823</id>
		<title>User:Tholden/11-1100/Homework Part 1</title>
		<link rel="alternate" type="text/html" href="https://drorbn.net/index.php?title=User:Tholden/11-1100/Homework_Part_1&amp;diff=10823"/>
		<updated>2011-10-10T16:27:25Z</updated>

		<summary type="html">&lt;p&gt;Tholden: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page showcases my work done in implementing the Non-Commutative Gaussian Elimination algorithm with direct application to solving a permutation puzzle. I would like it to be known that I had originally chosen the Megaminx puzzle and am still in the process of solving it. The algorithm is currently running on a Sun x4600 computational server using Matlab 2010b including eight Opteron 8212 processors with 32 GB of memory. However, the algorithm is not conducive to parallelization and so has yet to converge. As a test-case, I have solved the &amp;lt;math&amp;gt; 2 \times 2 \times 2 &amp;lt;/math&amp;gt; Rubik&#039;s cube, which I will also present here. In the event that the algorithm has not converged, I will submit the &amp;lt;math&amp;gt; 2 \times 2 \times 2 &amp;lt;/math&amp;gt; Rubik&#039;s cube for marking.&lt;br /&gt;
&lt;br /&gt;
==Theoretical Review of the Algorithm==&lt;br /&gt;
&lt;br /&gt;
The purpose of Non-Commutative Gaussian Elimination (NCGE) is to find the elements and order of a subgroup generated by a finite set of generators. The algorithm proceeds as follows:&lt;br /&gt;
&lt;br /&gt;
Let &amp;lt;math&amp;gt;G = \langle g_1,\ldots, g_\alpha \rangle&amp;lt;/math&amp;gt;. Define the pivot of &amp;lt;math&amp;gt;\sigma \in S_n&amp;lt;/math&amp;gt; to be the minimal &amp;lt;math&amp;gt;k \in \mathbb N&amp;lt;/math&amp;gt; such that &amp;lt;math&amp;gt;\sigma(k) \neq k&amp;lt;/math&amp;gt;. We prepare a table which is mostly empty&lt;br /&gt;
&lt;br /&gt;
[[Image:NCGETable1.jpg|thumb|right|alt=The table initialization for Non-Commutative Gaussian Elimination.|A mostly empty table for Gaussian Elimination]]&lt;br /&gt;
&lt;br /&gt;
Feed &amp;lt;math&amp;gt;g_1, \ldots, g_n&amp;lt;/math&amp;gt; in order. To feed a non-identity &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;, find its pivotal position &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; and let &amp;lt;math&amp;gt;j = \sigma(i)&amp;lt;/math&amp;gt;. &lt;br /&gt;
#If box &amp;lt;math&amp;gt;(i,j)&amp;lt;/math&amp;gt; is empty, put &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; in this box.&lt;br /&gt;
#If box &amp;lt;math&amp;gt;(i,j)&amp;lt;/math&amp;gt; is not-empty, feed &amp;lt;math&amp;gt;\sigma&#039; = \sigma_{i,j}^{-1} \sigma&amp;lt;/math&amp;gt; into the table.&lt;br /&gt;
&lt;br /&gt;
After this procedure is completed, for each occupied box &amp;lt;math&amp;gt;(i,j)&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;(k,\ell)&amp;lt;/math&amp;gt; feed the product &amp;lt;math&amp;gt;\sigma_{i,j}\sigma_{k,\ell}&amp;lt;/math&amp;gt; into the table. Repeat this until the table stops changing.&lt;br /&gt;
&lt;br /&gt;
==Matlab Implementation ==&lt;br /&gt;
&lt;br /&gt;
Individual and additional files can be downloaded from [[User:Tholden/11-1100/File Repository|this page]]. However, for completeness the primary algorithm has been included below. Its documentation is fairly comprehensive, and so all explanation of the code will be deferred to the code itself.&lt;br /&gt;
&lt;br /&gt;
   function [table, tabLogic] = NonComGaussElim(myperms, table, tabLogic)&lt;br /&gt;
   %&lt;br /&gt;
   % NONCOMGAUSSELIM: A function used for computing the non-commutive gaussian&lt;br /&gt;
   % elimination algorithm on a finitely generated subset of the symmetric&lt;br /&gt;
   % group.&lt;br /&gt;
   %&lt;br /&gt;
   % [table,tabLogic] = NonComGaussElim(myperms,table,tabLogic)&lt;br /&gt;
   %&lt;br /&gt;
   %  INPUT:  myperms - [cell] A cell whose entries consist of the generators&lt;br /&gt;
   %                    of the group. The format of these entries should be&lt;br /&gt;
   %                    given via the &amp;quot;image&amp;quot; notation. Namely, if sigma is&lt;br /&gt;
   %                    a generator in Sn, then express sigma as&lt;br /&gt;
   %                    [sigma(1), sigma(2), ..., sigma(n)]&lt;br /&gt;
   %            table - [3d array, non-user input] The result of the&lt;br /&gt;
   %                    calculations. Necessary for recursion and needn&#039;t be&lt;br /&gt;
   %                    supplied by the end-user.&lt;br /&gt;
   %         tabLogic - [2d array, non-user input] The logical array&lt;br /&gt;
   %                    consisting of the non-identity indices for which&lt;br /&gt;
   %                    elements have been inserted into the table. Need not&lt;br /&gt;
   %                    be supplied by the end-user.&lt;br /&gt;
   % OUTPUT:    table - [3d array] The final result of the calculations.&lt;br /&gt;
   %                    table(i,j,:) consists of the permutation element&lt;br /&gt;
   %                    corresponding to pivot i with image j. &lt;br /&gt;
   %         tabLogic - [2d array] The logical array&lt;br /&gt;
   %                    consisting of the non-identity indices for which&lt;br /&gt;
   %                    elements have been inserted into the table.&lt;br /&gt;
   %&lt;br /&gt;
   % Example: Consider the symmetric group S4 and the generators&lt;br /&gt;
   %          g1 = [2 3 1 4] and g2 = [2 1 4 3]. The code is executed as&lt;br /&gt;
   %          &amp;gt;&amp;gt;myperms = {[2 3 1 4], [2 1 4 3]};&lt;br /&gt;
   %          &amp;gt;&amp;gt;[table, tabLogical] = NonComGaussElim(myperms);&lt;br /&gt;
   &lt;br /&gt;
   % Version : 1.2&lt;br /&gt;
   % Author  : Tyler Holden&lt;br /&gt;
   % Date    : September 29, 2011&lt;br /&gt;
   &lt;br /&gt;
   %    To Do: &lt;br /&gt;
   % 1) Add step to pre-process the input permutations. In particular, if&lt;br /&gt;
   %    the identity element is given as one of the generators, this algorithm&lt;br /&gt;
   %    will terminate prematurely. This is because the recursive halting&lt;br /&gt;
   %    criterion is the identity permutation&lt;br /&gt;
   % 2) Optimize for parallel computing. There are not many places wherein&lt;br /&gt;
   %    such improvements could be made, since the algorithm is recursive and&lt;br /&gt;
   %    heavily dependent on neighbouring iterations. However, some&lt;br /&gt;
   %    improvements may be made to computing products and inverses of&lt;br /&gt;
   %    elements.&lt;br /&gt;
   &lt;br /&gt;
   try&lt;br /&gt;
       &lt;br /&gt;
       % Return condition for recursion.&lt;br /&gt;
       if isempty(myperms)&lt;br /&gt;
           return&lt;br /&gt;
       end %End if&lt;br /&gt;
   &lt;br /&gt;
       sizeGrp = length(cell2mat(myperms(1)));&lt;br /&gt;
   &lt;br /&gt;
       % Since the user is not expected to input the table, the following&lt;br /&gt;
       % condition checks that we are at the top level of the recursion and&lt;br /&gt;
       % creates the table as necessary.&lt;br /&gt;
       if nargin &amp;lt; 2&lt;br /&gt;
           table = zeros(sizeGrp,sizeGrp,sizeGrp);&lt;br /&gt;
           tabLogic = zeros(sizeGrp);&lt;br /&gt;
           %     for i=1:sizeGrp&lt;br /&gt;
           %         table(i,i,:) = 1:sizeGrp;&lt;br /&gt;
           %     end %End for(i)&lt;br /&gt;
       end %End if&lt;br /&gt;
   &lt;br /&gt;
       % Here we pull out the first generator and calculate its pivot point.&lt;br /&gt;
       curGen = cell2mat(myperms(1));&lt;br /&gt;
       [piv,img] = findPivot(curGen);&lt;br /&gt;
   &lt;br /&gt;
       % If curGen is the identity, piv will be empty. In this case, we simply&lt;br /&gt;
       % return to the call function. This is used in sublevels of the recursion.&lt;br /&gt;
       % However, this will result in improper calculations if the identity is&lt;br /&gt;
       % included in the original set of permutations. In a future version of this&lt;br /&gt;
       % code, one could &amp;quot;pre-process&amp;quot; the input permutations to remove the&lt;br /&gt;
       % identity elements. This would remove the erroneous calculations and the&lt;br /&gt;
       % recursion check would stay consistent.&lt;br /&gt;
       if isempty(piv)&lt;br /&gt;
           return;&lt;br /&gt;
       end %End if&lt;br /&gt;
   &lt;br /&gt;
       % Pull the permutation from the table. Afterwards, check if it is empty. If&lt;br /&gt;
       % so, input curGen into the table. Otherwise, pre-multiply and apply&lt;br /&gt;
       % recursively to the singleton permutation.&lt;br /&gt;
       sigij(1:sizeGrp) = table(piv,img,1:sizeGrp);&lt;br /&gt;
   &lt;br /&gt;
       if isempty(find(sigij))&lt;br /&gt;
           table(piv,img,:) = curGen;&lt;br /&gt;
           tabLogic(piv,img) = 1;&lt;br /&gt;
           % Only when something new has been added to the table do we do the&lt;br /&gt;
           % multiplication step. Note that it is important to do multiplication&lt;br /&gt;
           % on both sides, otherwise this will not work.&lt;br /&gt;
           for it1=sizeGrp:-1:1;&lt;br /&gt;
               for it2=sizeGrp:-1:it1&lt;br /&gt;
                   if tabLogic(it1,it2)&lt;br /&gt;
                       sigij(1:sizeGrp) = table(it1,it2,1:sizeGrp);&lt;br /&gt;
                       %First multiplication.&lt;br /&gt;
                       newPerm = permMult(sigij, curGen);&lt;br /&gt;
                       [table,tabLogic] = NonComGaussElim({newPerm}, table, tabLogic);&lt;br /&gt;
                       %Second multiplication.&lt;br /&gt;
                        newPerm = permMult(curGen, sigij);&lt;br /&gt;
                        [table,tabLogic] = NonComGaussElim({newPerm}, table, tabLogic);&lt;br /&gt;
                    end %End if&lt;br /&gt;
                end %End for(it2)&lt;br /&gt;
            end %End for (it1)&lt;br /&gt;
        else&lt;br /&gt;
            newPerm = permMult(permInv(sigij),curGen);&lt;br /&gt;
            [table, tabLogic] = NonComGaussElim({newPerm}, table, tabLogic);&lt;br /&gt;
        end %end if &lt;br /&gt;
 &lt;br /&gt;
     %Once the generator and its multiples have been added, we remove it from&lt;br /&gt;
     %the list of permutations and apply the algorithm recursively.&lt;br /&gt;
     [table, tabLogic] = NonComGaussElim(myperms(2:end), table, tabLogic);&lt;br /&gt;
   catch ME&lt;br /&gt;
       disp(&#039;Error&#039;);&lt;br /&gt;
   end &lt;br /&gt;
   &lt;br /&gt;
   %-------------------------------Subroutines-------------------------------%&lt;br /&gt;
 &lt;br /&gt;
   function [pivot, image] = findPivot(permut)&lt;br /&gt;
   %&lt;br /&gt;
   % Calculates the pivot of the permutation. If the permutation is identity,&lt;br /&gt;
   % pivot and image return empty.&lt;br /&gt;
   pivot = find(permut ~= 1:length(permut),1);&lt;br /&gt;
   image = permut(pivot);&lt;br /&gt;
   &lt;br /&gt;
   function prod = permMult(perm1, perm2)&lt;br /&gt;
   %&lt;br /&gt;
   % Multiplies two permutations. This is simply the composition of the&lt;br /&gt;
   % permtuations acting on the set {1,...,n}. That is, if sigma and tau are&lt;br /&gt;
   % permutations, then sigma*tau acting on the set {1,...,n} is given in&lt;br /&gt;
   % &amp;quot;image notation&amp;quot; as&lt;br /&gt;
   % sigma*tau = [sigma(tau(1)), sigma(tau(2)), ... , sigma(tau(n)) ]&lt;br /&gt;
   prod = perm1(perm2);&lt;br /&gt;
   &lt;br /&gt;
   function inverse = permInv(perm)&lt;br /&gt;
   %&lt;br /&gt;
   % Calculates the inverse element. If sigma is the permutation to be&lt;br /&gt;
   % inverted, it is written as [sigma(1), sigma(2), ... , sigma(n)]. The&lt;br /&gt;
   % inverse of this function is just done by placing j in the sigma(j)&lt;br /&gt;
   % position. &lt;br /&gt;
   inverse(perm) = 1:length(perm);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;math&amp;gt; 2 \times 2 \times 2 &amp;lt;/math&amp;gt; Rubik&#039;s cube==&lt;br /&gt;
&lt;br /&gt;
==Megaminx==&lt;/div&gt;</summary>
		<author><name>Tholden</name></author>
	</entry>
	<entry>
		<id>https://drorbn.net/index.php?title=User:Tholden/11-1100/File_Repository&amp;diff=10822</id>
		<title>User:Tholden/11-1100/File Repository</title>
		<link rel="alternate" type="text/html" href="https://drorbn.net/index.php?title=User:Tholden/11-1100/File_Repository&amp;diff=10822"/>
		<updated>2011-10-10T16:19:19Z</updated>

		<summary type="html">&lt;p&gt;Tholden: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Any files located on any of my pages can be found below. In particular, since the wiki server does not like adding .m files, these are hyperlinked to my ftp page.&lt;br /&gt;
&lt;br /&gt;
[http://individual.utoronto.ca/tholden/CourseNotes/AlgebraWikiCode/addCycle2Img.m addCycle2Img.m]&lt;br /&gt;
&lt;br /&gt;
[http://individual.utoronto.ca/tholden/CourseNotes/AlgebraWikiCode/Dodecahedron2.m Dodecahedron2.m]&lt;br /&gt;
&lt;br /&gt;
[http://individual.utoronto.ca/tholden/CourseNotes/AlgebraWikiCode/NonComGaussElim.m NonComGaussElim.m]&lt;/div&gt;</summary>
		<author><name>Tholden</name></author>
	</entry>
	<entry>
		<id>https://drorbn.net/index.php?title=User:Tholden&amp;diff=10821</id>
		<title>User:Tholden</title>
		<link rel="alternate" type="text/html" href="https://drorbn.net/index.php?title=User:Tholden&amp;diff=10821"/>
		<updated>2011-10-10T16:15:58Z</updated>

		<summary type="html">&lt;p&gt;Tholden: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hello and welcome to my user page.&lt;br /&gt;
&lt;br /&gt;
I will be using this page to publish my course notes, as well as a hyperlink to pages made before going live.&lt;br /&gt;
&lt;br /&gt;
==Course Notes ==&lt;br /&gt;
&lt;br /&gt;
[http://individual.utoronto.ca/tholden/CourseNotes/Algebra.pdf Tyler&#039;s Course Notes]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==User Sub-Pages == &lt;br /&gt;
&lt;br /&gt;
[[User:Tholden/11-1100 Simplicity of the Alternating Group  ]]&lt;br /&gt;
&lt;br /&gt;
[[User:Tholden/Simplicity Redirect]]&lt;br /&gt;
&lt;br /&gt;
[[User:Tholden/11-1100/Homework Part 1]]&lt;br /&gt;
&lt;br /&gt;
[[User:Tholden/11-1100/File Repository]]&lt;br /&gt;
&lt;br /&gt;
==Messages ==&lt;br /&gt;
&lt;br /&gt;
Please leave messages for me here.&lt;/div&gt;</summary>
		<author><name>Tholden</name></author>
	</entry>
	<entry>
		<id>https://drorbn.net/index.php?title=User:Tholden/11-1100/Homework_Part_1&amp;diff=10820</id>
		<title>User:Tholden/11-1100/Homework Part 1</title>
		<link rel="alternate" type="text/html" href="https://drorbn.net/index.php?title=User:Tholden/11-1100/Homework_Part_1&amp;diff=10820"/>
		<updated>2011-10-10T15:56:00Z</updated>

		<summary type="html">&lt;p&gt;Tholden: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page showcases my work done in implementing the Non-Commutative Gaussian Elimination algorithm with direct application to solving a permutation puzzle. I would like it to be known that I had originally chosen the Megaminx puzzle and am still in the process of solving it. The algorithm is currently running on a Sun x4600 computational server using Matlab 2010b including eight Opteron 8212 processors with 32 GB of memory. However, the algorithm is not conducive to parallelization and so has yet to converge. As a test-case, I have solved the &amp;lt;math&amp;gt; 2 \times 2 \times 2 &amp;lt;/math&amp;gt; Rubik&#039;s cube, which I will also present here. In the event that the algorithm has not converged, I will submit the &amp;lt;math&amp;gt; 2 \times 2 \times 2 &amp;lt;/math&amp;gt; Rubik&#039;s cube for marking.&lt;br /&gt;
&lt;br /&gt;
==Theoretical Review of the Algorithm==&lt;br /&gt;
&lt;br /&gt;
The purpose of Non-Commutative Gaussian Elimination (NCGE) is to find the elements and order of a subgroup generated by a finite set of generators. The algorithm proceeds as follows:&lt;br /&gt;
&lt;br /&gt;
Let &amp;lt;math&amp;gt;G = \langle g_1,\ldots, g_\alpha \rangle&amp;lt;/math&amp;gt;. Define the pivot of &amp;lt;math&amp;gt;\sigma \in S_n&amp;lt;/math&amp;gt; to be the minimal &amp;lt;math&amp;gt;k \in \mathbb N&amp;lt;/math&amp;gt; such that &amp;lt;math&amp;gt;\sigma(k) \neq k&amp;lt;/math&amp;gt;. We prepare a table which is mostly empty&lt;br /&gt;
&lt;br /&gt;
[[Image:NCGETable1.jpg|thumb|right|alt=The table initialization for Non-Commutative Gaussian Elimination.|A mostly empty table for Gaussian Elimination]]&lt;br /&gt;
&lt;br /&gt;
Feed &amp;lt;math&amp;gt;g_1, \ldots, g_n&amp;lt;/math&amp;gt; in order. To feed a non-identity &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;, find its pivotal position &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; and let &amp;lt;math&amp;gt;j = \sigma(i)&amp;lt;/math&amp;gt;. &lt;br /&gt;
\begin{enumerate}&lt;br /&gt;
	\item&lt;br /&gt;
		If box &amp;lt;math&amp;gt;(i,j)&amp;lt;/math&amp;gt; is empty, put &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; in this box.&lt;br /&gt;
	\item&lt;br /&gt;
		If box &amp;lt;math&amp;gt;(i,j)&amp;lt;/math&amp;gt; is not-empty, feed &amp;lt;math&amp;gt;\sigma&#039; = \sigma_{i,j}^{-1} \sigma&amp;lt;/math&amp;gt; into the table.&lt;br /&gt;
\end{enumerate}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Matlab Implementation ==&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;math&amp;gt; 2 \times 2 \times 2 &amp;lt;/math&amp;gt; Rubik&#039;s cube==&lt;br /&gt;
&lt;br /&gt;
==Megaminx==&lt;/div&gt;</summary>
		<author><name>Tholden</name></author>
	</entry>
</feed>