Sage-Combinat demo
system:sage


<h2>Basic combinatorial objects</h2>

{{{id=5|
p = Partition([3,3,2,1])
p
///
[3, 3, 2, 1]
}}}

{{{id=65|
p.pp()
///
***
***
**
*
}}}

{{{id=9|
p.conjugate().pp()
///
****
***
**
}}}

{{{id=11|
p.conjugate?
///
<html><!--notruncate-->

<div class="docstring">
    
  <p><strong>File:</strong> /home/stumpc5/progs/sage-4.8/local/lib/python2.6/site-packages/sage/combinat/partition.py</p>
<p><strong>Type:</strong> &lt;type &#8216;instancemethod&#8217;&gt;</p>
<p><strong>Definition:</strong> p.conjugate()</p>
<p><strong>Docstring:</strong></p>
<blockquote>
<div><p>Returns the conjugate partition of the partition <tt class="docutils literal"><span class="pre">self</span></tt>. This
is also called the associated partition in the literature.</p>
<p>EXAMPLES:</p>
<div class="highlight-python"><div class="highlight"><pre class="literal-block"><span class="gp">sage: </span><span class="n">Partition</span><span class="p">([</span><span class="mi">2</span><span class="p">,</span><span class="mi">2</span><span class="p">])</span><span class="o">.</span><span class="n">conjugate</span><span class="p">()</span>
<span class="go">[2, 2]</span>
<span class="gp">sage: </span><span class="n">Partition</span><span class="p">([</span><span class="mi">6</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">1</span><span class="p">])</span><span class="o">.</span><span class="n">conjugate</span><span class="p">()</span>
<span class="go">[3, 2, 2, 1, 1, 1]</span>
</pre></div>
</div>
<p>The conjugate partition is obtained by transposing the Ferrers
diagram of the partition (see <tt class="xref py py-meth docutils literal"><span class="pre">ferrers_diagram()</span></tt>):</p>
<div class="highlight-python"><div class="highlight"><pre class="literal-block"><span class="gp">sage: </span><span class="k">print</span> <span class="n">Partition</span><span class="p">([</span><span class="mi">6</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">1</span><span class="p">])</span><span class="o">.</span><span class="n">ferrers_diagram</span><span class="p">()</span>
<span class="go">******</span>
<span class="go">***</span>
<span class="go">*</span>
<span class="gp">sage: </span><span class="k">print</span> <span class="n">Partition</span><span class="p">([</span><span class="mi">6</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">1</span><span class="p">])</span><span class="o">.</span><span class="n">conjugate</span><span class="p">()</span><span class="o">.</span><span class="n">ferrers_diagram</span><span class="p">()</span>
<span class="go">***</span>
<span class="go">**</span>
<span class="go">**</span>
<span class="go">*</span>
<span class="go">*</span>
<span class="go">*</span>
</pre></div>
</div>
</div></blockquote>


</div>
</html>
}}}

{{{id=12|
s = Permutation([5,3,2,6,4,8,9,7,1])
///
}}}

{{{id=62|
(p,q) = s.robinson_schensted()
///
}}}

{{{id=63|
p.pp()
///
  1  4  7  9
  2  6  8
  3
  5
}}}

{{{id=64|
q.pp()
///
  1  4  6  7
  2  5  8
  3
  9
}}}

{{{id=13|
p.row_stabilizer()
///
Permutation Group with generators [(), (7,9), (6,8), (4,7), (2,6), (1,4)]
}}}

<h2>Enumerated sets (combinatorial classes)</h2>

{{{id=66|
P5 = Partitions(5)
///
}}}

{{{id=14|
P5.list()
///
[[5], [4, 1], [3, 2], [3, 1, 1], [2, 2, 1], [2, 1, 1, 1], [1, 1, 1, 1, 1]]
}}}

{{{id=15|
P5.cardinality()
///
7
}}}

{{{id=16|
Partitions(100000).cardinality()
///
27493510569775696512677516320986352688173429315980054758203125984302147328114964173055050741660736621590157844774296248940493063070200461792764493033510116079342457190155718943509725312466108452006369558934464248716828789832182345009262853831404597021307130674510624419227311238999702284408609370935531629697851569569892196108480158600569421098519
}}}

{{{id=17|
Permutations(20).random_element()
///
[14, 15, 18, 10, 5, 11, 1, 9, 8, 4, 17, 19, 16, 20, 2, 7, 3, 13, 12, 6]
}}}

{{{id=18|
Compositions(10).unrank(100)      # TODO: non stupid algorithm
///
[1, 1, 3, 1, 2, 1, 1]
}}}

{{{id=53|
for p in StandardTableaux([3,2]):
    print "-----------------------------"
    p.pp()
///
-----------------------------
  1  3  5
  2  4
-----------------------------
  1  2  5
  3  4
-----------------------------
  1  3  4
  2  5
-----------------------------
  1  2  4
  3  5
-----------------------------
  1  2  3
  4  5
}}}

<p>Todo: trees</p>

<h3>Summary</h3>
<ul>
<li>Every mathematical object (element, set, category, ...) is modeled by a Python object</li>
<li>All combinatorial classes share a uniform interface</li>
</ul>

<h2>Constructions</h2>

{{{id=80|
C = DisjointUnionEnumeratedSets( [ Compositions(4), Permutations(3)] )
C
///
Disjoint union of Family (Compositions of 4, Standard permutations of 3)
}}}

{{{id=81|
C.cardinality()
///
14
}}}

{{{id=79|
C.list()
///
[[1, 1, 1, 1], [1, 1, 2], [1, 2, 1], [1, 3], [2, 1, 1], [2, 2], [3, 1], [4], [1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]]
}}}

{{{id=69|
C = CartesianProduct(Compositions(8), Permutations(20))
///
}}}

{{{id=74|
C.cardinality()
///
311411457046609920000
}}}

{{{id=122|
from sage.categories.examples.infinite_enumerated_sets import NonNegativeIntegers
F = Family(NonNegativeIntegers(), Permutations)
F
///
Lazy family (Permutations(i))_{i in An example of an infinite enumerated set: the non negative integers}
}}}

{{{id=78|
F[5]
///
Standard permutations of 5
}}}

{{{id=76|
U = DisjointUnionEnumeratedSets(F)
///
}}}

{{{id=67|
U.cardinality()
///
+Infinity
}}}

{{{id=77|
p = iter(U)
for i in range(12):
    print p.next()
///
[]
[1]
[1, 2]
[2, 1]
[1, 2, 3]
[1, 3, 2]
[2, 1, 3]
[2, 3, 1]
[3, 1, 2]
[3, 2, 1]
[1, 2, 3, 4]
[1, 2, 4, 3]
}}}

<h3>Summary:</h3>
<ul>
<li>Basic combinatorial classes + constructions give a flexible toolbox</li>
<li>This is made possible by uniform interfaces</li>
<li>Lazy algorithms and data structures for large / infinite sets (iterators, ...)</li>
</ul>
<h2>Enumeration kernels</h2>
<h3>Integer lists<br /></h3>

{{{id=86|
Compositions(5, max_part = 3, min_length = 2, max_length = 3).list()
///
[[3, 2], [3, 1, 1], [2, 3], [2, 2, 1], [2, 1, 2], [1, 3, 1], [1, 2, 2], [1, 1, 3]]
}}}

{{{id=87|
Partitions(5, max_slope = -1).list()
///
[[5], [4, 1], [3, 2]]
}}}

{{{id=88|
IntegerListsLex(10, length=3, min_part = 2, max_part = 5, floor = [2, 4, 2]).list()
///
[[4, 4, 2], [3, 5, 2], [3, 4, 3], [2, 5, 3], [2, 4, 4]]
}}}

{{{id=89|
IntegerListsLex(5, min_part = 1, max_part = 3, min_length = 2, max_length = 3).list()
///
[[3, 2], [3, 1, 1], [2, 3], [2, 2, 1], [2, 1, 2], [1, 3, 1], [1, 2, 2], [1, 1, 3]]
}}}

{{{id=90|
IntegerListsLex(5, min_part = 1, max_slope = -1).list()
///
[[5], [4, 1], [3, 2]]
}}}

{{{id=91|
type(Compositions(5)[1])
///
<class 'sage.combinat.composition.Composition_class'>
}}}

{{{id=123|
type(IntegerListsLex(5, min_part = 1)[1])
///
<type 'list'>
}}}

<h3>Species / decomposable classes</h3>

{{{id=129|
from sage.combinat.species.library import *
o   = var("o")
///
}}}

<p>Fibonacci words</p>

{{{id=131|
Eps =  EmptySetSpecies()
Z0  =  SingletonSpecies()
Z1  =  Eps*SingletonSpecies()

FW  = CombinatorialSpecies()
FW.define(Eps + Z0*FW  +  Z1*Eps + Z1*Z0*FW)
FW
///
Combinatorial species
}}}

{{{id=128|
FW.isotype_generating_series().coefficients(15)
///
[1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987]
}}}

{{{id=135|
FW3 = FW.isotypes([o]*4); FW3
///
Isomorphism types for Combinatorial species with labels [o, o, o, o]
}}}

{{{id=136|
FW3.list()
///
[o*(o*(o*(o*{}))), o*(o*(o*(({}*o)*{}))), o*(o*((({}*o)*o)*{})), o*((({}*o)*o)*(o*{})), o*((({}*o)*o)*(({}*o)*{})), (({}*o)*o)*(o*(o*{})), (({}*o)*o)*(o*(({}*o)*{})), (({}*o)*o)*((({}*o)*o)*{})]
}}}

<p>Binary trees</p>

{{{id=152|
BT = CombinatorialSpecies()
Leaf =  SingletonSpecies()
BT.define(Leaf+(BT*BT))
BT5 = BT.isotypes([o]*5)
BT5.list()
///
[o*(o*(o*(o*o))), o*(o*((o*o)*o)), o*((o*o)*(o*o)), o*((o*(o*o))*o), o*(((o*o)*o)*o), (o*o)*(o*(o*o)), (o*o)*((o*o)*o), (o*(o*o))*(o*o), ((o*o)*o)*(o*o), (o*(o*(o*o)))*o, (o*((o*o)*o))*o, ((o*o)*(o*o))*o, ((o*(o*o))*o)*o, (((o*o)*o)*o)*o]
}}}

<h3>Lattice points of polytopes</h3>

{{{id=93|
A=random_matrix(ZZ,3,6,x=7)
L=LatticePolytope(A)
L.plot3d()
///
}}}

{{{id=56|
L.npoints()  # should be cardinality!
///
21
}}}

<p>This example used PALP and J-mol.</p>

<h2>Graphs up to an isomorphism</h2>

{{{id=23|
show(graphs(5, lambda G: G.size() <= 4))
///
}}}

<h2>Predefined algebraic structures</h2>

{{{id=94|
L = RootSystem(['A',2,1]).weight_space()
L.plot(size=[[-1..1],[-1..1]],alcovewalks=[[0,2,0,1,2,1,2,0,2,1]])
///
<html><font color='black'><img src='cell://sage0.png'></font></html>
}}}

{{{id=107|
CartanType.samples()
///
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "_sage_input_52.py", line 10, in <module>
    exec compile(u'open("___code___.py","w").write("# -*- coding: utf-8 -*-\\n" + _support_.preparse_worksheet_cell(base64.b64decode("Q2FydGFuVHlwZS5zYW1wbGVzKCk="),globals())+"\\n"); execfile(os.path.abspath("___code___.py"))' + '\n', '', 'single')
  File "", line 1, in <module>
    
  File "/tmp/tmpZf4MTy/___code___.py", line 2, in <module>
    exec compile(u'CartanType.samples()' + '\n', '', 'single')
  File "", line 1, in <module>
    
  File "/home/stumpc5/progs/sage-4.8/local/lib/python2.6/site-packages/sage/combinat/root_system/cartan_type.py", line 544, in samples
    result = self._samples()
  File "/home/stumpc5/progs/sage-4.8/local/lib/python2.6/site-packages/sage/misc/cachefunc.py", line 555, in __call__
    w = self._cachedmethod._instance_call(self._instance, *args, **kwds)
  File "/home/stumpc5/progs/sage-4.8/local/lib/python2.6/site-packages/sage/misc/cachefunc.py", line 778, in _instance_call
    return self._cachedfunc.f(inst, *args, **kwds)
  File "/home/stumpc5/progs/sage-4.8/local/lib/python2.6/site-packages/sage/combinat/root_system/cartan_type.py", line 568, in _samples
    [CartanType(t).dual() for t in [["B", 5, 1], ["C", 4, 1], ["F", 4, 1], ["G", 2, 1]]] + \
  File "/home/stumpc5/progs/sage-4.8/local/lib/python2.6/site-packages/sage/combinat/root_system/cartan_type.py", line 689, in dual
    import type_dual
  File "/home/stumpc5/progs/sage-4.8/local/lib/python2.6/site-packages/sage/combinat/root_system/type_dual.py", line 214, in <module>
    class CartanType_affine(sage.combinat.root_system.cartan_type.CartanType_affine):
AttributeError: 'module' object has no attribute 'cartan_type'
}}}

{{{id=109|
T = CartanType(["E", 8, 1])
T.dynkin_diagram()
///
        O 2
        |
        |
O---O---O---O---O---O---O---O
1   3   4   5   6   7   8   0
E8~
}}}

{{{id=108|
T.is_simply_laced(), T.is_finite(), T.is_crystalographic()
///
(True, False, True)
}}}

{{{id=105|
W = WeylGroup(["B", 3])
W
///
Weyl Group of type ['B', 3] (as a matrix group acting on the ambient space)
}}}

{{{id=104|
W.cayley_graph(side = "left", simple = True).plot3d()
///
}}}

{{{id=126|
print W.character_table()  # Thanks GAP!
///
CT1

      2  4  4  3  3  4  3  1  1  3  4
      3  1  .  .  .  .  .  1  1  .  1

        1a 2a 2b 4a 2c 2d 6a 3a 4b 2e

X.1      1  1  1  1  1  1  1  1  1  1
X.2      1  1  1 -1 -1 -1 -1  1  1 -1
X.3      1  1 -1 -1  1 -1  1  1 -1  1
X.4      1  1 -1  1 -1  1 -1  1 -1 -1
X.5      2  2  .  . -2  .  1 -1  . -2
X.6      2  2  .  .  2  . -1 -1  .  2
X.7      3 -1 -1  1 -1 -1  .  .  1  3
X.8      3 -1  1  1  1 -1  .  . -1 -3
X.9      3 -1  1 -1 -1  1  .  . -1  3
X.10     3 -1 -1 -1  1  1  .  .  1 -3
}}}

{{{id=127|
rho = SymmetricGroupRepresentation([3, 2], "orthogonal"); rho
///
Orthogonal representation of the symmetric group corresponding to [3, 2]
}}}

{{{id=52|
view(rho([1, 3, 2, 4, 5]))
///
<html><span class="math">\newcommand{\Bold}[1]{\mathbf{#1}}\left(\begin{array}{rrrrr}
1 & 0 & 0 & 0 & 0 \\
0 & -\frac{1}{2} & \frac{1}{2} \, \sqrt{3} & 0 & 0 \\
0 & \frac{1}{2} \, \sqrt{3} & \frac{1}{2} & 0 & 0 \\
0 & 0 & 0 & -\frac{1}{2} & \frac{1}{2} \, \sqrt{3} \\
0 & 0 & 0 & \frac{1}{2} \, \sqrt{3} & \frac{1}{2}
\end{array}\right)</span></html>
}}}

{{{id=102|
W = WeylGroup(["C", 3, 1])
W
///
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "_sage_input_60.py", line 10, in <module>
    exec compile(u'open("___code___.py","w").write("# -*- coding: utf-8 -*-\\n" + _support_.preparse_worksheet_cell(base64.b64decode("VyA9IFdleWxHcm91cChbIkMiLCAzLCAxXSkKVw=="),globals())+"\\n"); execfile(os.path.abspath("___code___.py"))' + '\n', '', 'single')
  File "", line 1, in <module>
    
  File "/tmp/tmp8vsZoW/___code___.py", line 3, in <module>
    W = WeylGroup(["C", _sage_const_3 , _sage_const_1 ])
  File "/home/stumpc5/progs/sage-4.8/local/lib/python2.6/site-packages/sage/combinat/root_system/weyl_group.py", line 148, in WeylGroup
    return WeylGroup_gens(ct.root_system().root_space(), prefix=prefix)
  File "/home/stumpc5/progs/sage-4.8/local/lib/python2.6/site-packages/sage/combinat/root_system/cartan_type.py", line 888, in root_system
    return RootSystem(self)
  File "/home/stumpc5/progs/sage-4.8/local/lib/python2.6/site-packages/sage/misc/classcall_metaclass.py", line 276, in __call__
    return cls.__classcall__(cls, *args, **options)
  File "/home/stumpc5/progs/sage-4.8/local/lib/python2.6/site-packages/sage/combinat/root_system/root_system.py", line 226, in __classcall__
    return super(RootSystem, cls).__classcall__(cls, CartanType(cartan_type), as_dual_of)
  File "/home/stumpc5/progs/sage-4.8/local/lib/python2.6/site-packages/sage/misc/cachefunc.py", line 178, in __call__
    w = self.f(*args, **kwds)
  File "/home/stumpc5/progs/sage-4.8/local/lib/python2.6/site-packages/sage/structure/unique_representation.py", line 450, in __classcall__
    instance = type.__call__(cls, *args, **options)
  File "/home/stumpc5/progs/sage-4.8/local/lib/python2.6/site-packages/sage/combinat/root_system/root_system.py", line 243, in __init__
    self.dual = RootSystem(self._cartan_type.dual(), as_dual_of=self);
  File "/home/stumpc5/progs/sage-4.8/local/lib/python2.6/site-packages/sage/combinat/root_system/cartan_type.py", line 689, in dual
    import type_dual
  File "/home/stumpc5/progs/sage-4.8/local/lib/python2.6/site-packages/sage/combinat/root_system/type_dual.py", line 214, in <module>
    class CartanType_affine(sage.combinat.root_system.cartan_type.CartanType_affine):
AttributeError: 'module' object has no attribute 'cartan_type'
}}}

{{{id=124|
W.category()
///
Category of finite weyl groups
}}}

{{{id=106|
W.an_element()
///
[ 0  0 -1]
[ 1  0  0]
[ 0  1  0]
}}}

{{{id=101|
W.from_reduced_word([1,2,3,0,3,0,3,2,1,3,3,2]).stanley_symmetric_function()
///
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "_sage_input_63.py", line 10, in <module>
    exec compile(u'open("___code___.py","w").write("# -*- coding: utf-8 -*-\\n" + _support_.preparse_worksheet_cell(base64.b64decode("Vy5mcm9tX3JlZHVjZWRfd29yZChbMSwyLDMsMCwzLDAsMywyLDEsMywzLDJdKS5zdGFubGV5X3N5bW1ldHJpY19mdW5jdGlvbigp"),globals())+"\\n"); execfile(os.path.abspath("___code___.py"))' + '\n', '', 'single')
  File "", line 1, in <module>
    
  File "/tmp/tmpUjdzqR/___code___.py", line 3, in <module>
    exec compile(u'W.from_reduced_word([_sage_const_1 ,_sage_const_2 ,_sage_const_3 ,_sage_const_0 ,_sage_const_3 ,_sage_const_0 ,_sage_const_3 ,_sage_const_2 ,_sage_const_1 ,_sage_const_3 ,_sage_const_3 ,_sage_const_2 ]).stanley_symmetric_function()' + '\n', '', 'single')
  File "", line 1, in <module>
    
  File "/home/stumpc5/progs/sage-4.8/local/lib/python2.6/site-packages/sage/categories/weyl_groups.py", line 331, in stanley_symmetric_function
    return m.from_polynomial_exp(self.stanley_symmetric_function_as_polynomial())
  File "/home/stumpc5/progs/sage-4.8/local/lib/python2.6/site-packages/sage/misc/cachefunc.py", line 555, in __call__
    w = self._cachedmethod._instance_call(self._instance, *args, **kwds)
  File "/home/stumpc5/progs/sage-4.8/local/lib/python2.6/site-packages/sage/misc/cachefunc.py", line 778, in _instance_call
    return self._cachedfunc.f(inst, *args, **kwds)
  File "/home/stumpc5/progs/sage-4.8/local/lib/python2.6/site-packages/sage/categories/weyl_groups.py", line 278, in stanley_symmetric_function_as_polynomial
    pieri_factors = W.pieri_factors()
  File "/home/stumpc5/progs/sage-4.8/local/lib/python2.6/site-packages/sage/categories/weyl_groups.py", line 116, in pieri_factors
    raise NotImplementedError("Pieri factors for type %s"%ct)
NotImplementedError: Pieri factors for type ['B', 3]
}}}

{{{id=103|
Sym = SymmetricFunctions(QQ)
Sym
///
Symmetric Functions over Rational Field
}}}

{{{id=95|
s = Sym.schur()
h = Sym.complete()
e = Sym.elementary()
m = Sym.monomial()
p = Sym.powersum()
///
}}}

{{{id=110|
m(( ( h[2,1] * ( 1 + 3 * p[2,1]) ) + s[2](s[3])))
///
3*m[1, 1, 1] + 10*m[1, 1, 1, 1, 1, 1] + 2*m[2, 1] + 43*m[2, 1, 1, 1, 1] + 47*m[2, 2, 1, 1] + 40*m[2, 2, 2] + m[3] + 40*m[3, 1, 1, 1] + 33*m[3, 2, 1] + 20*m[3, 3] + 23*m[4, 1, 1] + 17*m[4, 2] + 10*m[5, 1] + 4*m[6]
}}}

{{{id=116|
Sym = SymmetricFunctions(QQ['t'])
Jack = Sym.jack_polynomials()		  # todo: not implemented
P = Jack.P(); J = Jack.J(); Q = Jack.Q()  # todo: not implemented
J(P[2,1])                                 # todo: not implemented
///
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "_sage_input_67.py", line 10, in <module>
    exec compile(u'open("___code___.py","w").write("# -*- coding: utf-8 -*-\\n" + _support_.preparse_worksheet_cell(base64.b64decode("U3ltID0gU3ltbWV0cmljRnVuY3Rpb25zKFFRWyd0J10pCkphY2sgPSBTeW0uamFja19wb2x5bm9taWFscygpCQkgICMgdG9kbzogbm90IGltcGxlbWVudGVkClAgPSBKYWNrLlAoKTsgSiA9IEphY2suSigpOyBRID0gSmFjay5RKCkgICMgdG9kbzogbm90IGltcGxlbWVudGVkCkooUFsyLDFdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgdG9kbzogbm90IGltcGxlbWVudGVk"),globals())+"\\n"); execfile(os.path.abspath("___code___.py"))' + '\n', '', 'single')
  File "", line 1, in <module>
    
  File "/tmp/tmpuirIS_/___code___.py", line 4, in <module>
    Jack = Sym.jack_polynomials()		  # todo: not implemented
  File "parent.pyx", line 823, in sage.structure.parent.Parent.__getattr__ (sage/structure/parent.c:6324)
  File "parent.pyx", line 323, in sage.structure.parent.getattr_from_other_class (sage/structure/parent.c:3162)
AttributeError: 'SymmetricFunctions_with_category' object has no attribute 'jack_polynomials'
}}}

{{{id=118|
J = MacdonaldPolynomialsJ(QQ)
P = MacdonaldPolynomialsP(QQ)
Q = MacdonaldPolynomialsQ(QQ)
J
///
Macdonald polynomials in the J basis over Fraction Field of Multivariate Polynomial Ring in q, t over Rational Field
}}}

{{{id=125|
f = P(J[2,2] + 3 * Q[3,1])
f
///
(q^2*t^6-q^2*t^5-q^2*t^4-q*t^5+q^2*t^3+2*q*t^3+t^3-q*t-t^2-t+1)*McdP[2, 2] + ((3*q^3*t^5-6*q^3*t^4+3*q^3*t^3-3*q^2*t^4+6*q^2*t^3-3*q^2*t^2-3*q*t^3+6*q*t^2-3*q*t+3*t^2-6*t+3)/(q^7*t-2*q^6*t+2*q^4*t-q^4-q^3*t+2*q^3-2*q+1))*McdP[3, 1]
}}}

{{{id=117|
view(f)
///
<html><span class="math">\newcommand{\Bold}[1]{\mathbf{#1}}\left(q^{2} t^{6} -  q^{2} t^{5} -  q^{2} t^{4} -  q t^{5} + q^{2} t^{3} + 2 q t^{3} + t^{3} -  q t -  t^{2} -  t + 1\right)McdP_{2,2} + \left(\frac{3 q^{3} t^{5} - 6 q^{3} t^{4} + 3 q^{3} t^{3} - 3 q^{2} t^{4} + 6 q^{2} t^{3} - 3 q^{2} t^{2} - 3 q t^{3} + 6 q t^{2} - 3 q t + 3 t^{2} - 6 t + 3}{q^{7} t - 2 q^{6} t + 2 q^{4} t -  q^{4} -  q^{3} t + 2 q^{3} - 2 q + 1}\right)McdP_{3,1}</span></html>
}}}

{{{id=112|
Sym = SymmetricFunctions(J.base_ring())
s = Sym.s()
view(s(f))
///
<html><span class="math">\newcommand{\Bold}[1]{\mathbf{#1}}\left(\frac{- q^{8} t^{6} + q^{7} t^{7} + q^{9} t^{4} + q^{7} t^{6} - 2 q^{6} t^{7} -  q^{9} t^{3} -  q^{7} t^{5} + 2 q^{6} t^{6} -  q^{9} t^{2} + 2 q^{8} t^{3} - 3 q^{7} t^{4} + 2 q^{6} t^{5} - 2 q^{5} t^{6} + 2 q^{4} t^{7} + q^{9} t + q^{8} t^{2} + q^{5} t^{5} - 2 q^{4} t^{6} -  q^{3} t^{7} - 2 q^{8} t + 2 q^{7} t^{2} - 3 q^{6} t^{3} + 3 q^{5} t^{4} - 3 q^{4} t^{5} + 3 q^{3} t^{6} -  q^{6} t^{2} + q^{5} t^{3} + q^{4} t^{4} -  q^{3} t^{5} + 3 q^{6} t - 3 q^{5} t^{2} + 3 q^{4} t^{3} - 3 q^{3} t^{4} + 2 q^{2} t^{5} - 2 q t^{6} -  q^{6} - 2 q^{5} t + q^{4} t^{2} + 3 q^{3} t^{3} - 3 q^{2} t^{4} + q t^{5} + t^{6} + 2 q^{5} - 2 q^{4} t -  q^{3} t^{2} -  q t^{4} + 2 t^{5} -  q^{3} t + 2 q^{2} t^{2} + 3 q t^{3} - 4 t^{4} + q^{3} - 2 q^{2} t + 3 q t^{2} - 2 t^{3} + q^{2} - 4 q t + 3 t^{2}}{q^{7} t - 2 q^{6} t + 2 q^{4} t -  q^{4} -  q^{3} t + 2 q^{3} - 2 q + 1}\right)s_{1,1,1,1} + \left(\frac{- q^{8} t^{6} + q^{7} t^{7} + q^{8} t^{5} + 2 q^{7} t^{6} - 3 q^{6} t^{7} + q^{8} t^{4} - 4 q^{7} t^{5} + 3 q^{5} t^{7} -  q^{8} t^{3} -  q^{7} t^{4} + 5 q^{6} t^{5} - 2 q^{5} t^{6} -  q^{4} t^{7} + 2 q^{7} t^{3} - 2 q^{6} t^{4} -  q^{7} t^{2} + q^{6} t^{3} + q^{5} t^{4} - 4 q^{4} t^{5} + 3 q^{3} t^{6} + q^{7} t + 2 q^{6} t^{2} - 6 q^{5} t^{3} + 5 q^{4} t^{4} + q^{3} t^{5} - 3 q^{2} t^{6} - 3 q^{6} t + q^{5} t^{2} + 5 q^{4} t^{3} - 6 q^{3} t^{4} + 2 q^{2} t^{5} + q t^{6} + 3 q^{5} t - 4 q^{4} t^{2} + q^{3} t^{3} - 2 q^{2} t^{4} + 2 q t^{5} + 4 q^{2} t^{3} - 4 q t^{4} -  q^{4} - 2 q^{3} t + 2 q^{2} t^{2} + 2 q t^{3} -  t^{4} + 3 q^{3} -  q t^{2} - 2 t^{3} - 3 q^{2} - 4 q t + 7 t^{2} + 4 q - 4 t}{q^{6} t - 3 q^{5} t + 3 q^{4} t -  q^{3} t -  q^{3} + 3 q^{2} - 3 q + 1}\right)s_{2,1,1} + \left(\frac{q^{9} t^{7} -  q^{9} t^{6} - 2 q^{8} t^{7} -  q^{9} t^{5} + q^{8} t^{6} + q^{9} t^{4} + 2 q^{8} t^{5} + 2 q^{7} t^{6} + 2 q^{6} t^{7} - 3 q^{6} t^{6} -  q^{5} t^{7} - 3 q^{7} t^{4} -  q^{6} t^{5} + q^{5} t^{6} -  q^{8} t^{2} -  q^{7} t^{3} + q^{6} t^{4} + q^{4} t^{6} + q^{7} t^{2} + q^{6} t^{3} + q^{5} t^{4} - 2 q^{4} t^{5} - 2 q^{3} t^{6} + q^{7} t + 2 q^{6} t^{2} + 2 q^{3} t^{5} + q^{2} t^{6} - 2 q^{6} t - 2 q^{5} t^{2} + q^{4} t^{3} - 2 q^{3} t^{4} + 4 q^{2} t^{5} + q^{5} t + 7 q^{3} t^{3} - 7 q^{2} t^{4} -  q t^{5} + q^{4} t - 4 q^{3} t^{2} -  q^{4} - 3 q^{3} t + 2 q^{3} + 2 q^{2} t + 5 q t^{2} - 2 t^{3} - 5 q t + 5 t^{2} + q - 4 t + 1}{q^{7} t - 2 q^{6} t + 2 q^{4} t -  q^{4} -  q^{3} t + 2 q^{3} - 2 q + 1}\right)s_{2,2} + \left(\frac{3 q^{3} t^{5} - 6 q^{3} t^{4} + 3 q^{3} t^{3} - 3 q^{2} t^{4} + 6 q^{2} t^{3} - 3 q^{2} t^{2} - 3 q t^{3} + 6 q t^{2} - 3 q t + 3 t^{2} - 6 t + 3}{q^{7} t - 2 q^{6} t + 2 q^{4} t -  q^{4} -  q^{3} t + 2 q^{3} - 2 q + 1}\right)s_{3,1}</span></html>
}}}

{{{id=119|
Cat = FiniteSemigroups(); Cat
///
Category of finite semigroups
}}}

{{{id=146|
Cat.category_graph().plot()
///
<html><font color='black'><img src='cell://sage0.png'></font></html>
}}}

{{{id=144|
S = Cat.example(alphabet = ('a','b','c'))
S
///
An example of a finite semigroup: the left regular band generated by ('a', 'b', 'c')
}}}

{{{id=149|
S.cayley_graph(side = "left", simple = True).plot()
///
<html><font color='black'><img src='cell://sage0.png'></font></html>
}}}

{{{id=24|
S.j_transversal_of_idempotents()
///
['a', 'acb', 'ac', 'ab', 'cb', 'c', 'b']
}}}

{{{id=145|
S??
///
<html><!--notruncate-->

<div class="docstring">
    
  <p><strong>File:</strong> /home/stumpc5/progs/sage-4.8/local/lib/python2.6/site-packages/sage/categories/examples/finite_semigroups.py</p>
<p><strong>Source Code</strong> (starting at line 19):</p>
<div class="highlight-python"><div class="highlight"><pre class="literal-block"><span class="k">class</span> <span class="nc">LeftRegularBand</span><span class="p">(</span><span class="n">UniqueRepresentation</span><span class="p">,</span> <span class="n">Parent</span><span class="p">):</span>
    <span class="s">r&quot;&quot;&quot;</span>
<span class="s">    An example of a finite semigroup</span>

<span class="s">    This class provides a minimal implementation of a finite semigroup.</span>

<span class="s">    EXAMPLES::</span>

<span class="s">        sage: S = FiniteSemigroups().example(); S</span>
<span class="s">        An example of a finite semigroup: the left regular band generated by (&#39;a&#39;, &#39;b&#39;, &#39;c&#39;, &#39;d&#39;)</span>

<span class="s">    This is the semigroup generated by::</span>

<span class="s">        sage: S.semigroup_generators()</span>
<span class="s">        Family (&#39;a&#39;, &#39;b&#39;, &#39;c&#39;, &#39;d&#39;)</span>

<span class="s">    such that `x^2 = x` and `x y x = xy` for any `x` and `y` in `S`::</span>

<span class="s">        sage: S(&#39;dab&#39;)</span>
<span class="s">        &#39;dab&#39;</span>
<span class="s">        sage: S(&#39;dab&#39;) * S(&#39;acb&#39;)</span>
<span class="s">        &#39;dabc&#39;</span>

<span class="s">    It follows that the elements of `S` are strings without</span>
<span class="s">    repetitions over the alphabet `a`, `b`, `c`, `d`::</span>

<span class="s">        sage: S.list()</span>
<span class="s">        [&#39;a&#39;, &#39;c&#39;, &#39;b&#39;, &#39;bd&#39;, &#39;bda&#39;, &#39;d&#39;, &#39;bdc&#39;, &#39;bc&#39;, &#39;bcd&#39;, &#39;cb&#39;,</span>
<span class="s">         &#39;ca&#39;, &#39;ac&#39;, &#39;cba&#39;, &#39;ba&#39;, &#39;cbd&#39;, &#39;bdca&#39;, &#39;db&#39;, &#39;dc&#39;, &#39;cd&#39;,</span>
<span class="s">         &#39;bdac&#39;, &#39;ab&#39;, &#39;abd&#39;, &#39;da&#39;, &#39;ad&#39;, &#39;cbad&#39;, &#39;acb&#39;, &#39;abc&#39;,</span>
<span class="s">         &#39;abcd&#39;, &#39;acbd&#39;, &#39;cda&#39;, &#39;cdb&#39;, &#39;dac&#39;, &#39;dba&#39;, &#39;dbc&#39;, &#39;dbca&#39;,</span>
<span class="s">         &#39;dcb&#39;, &#39;abdc&#39;, &#39;cdab&#39;, &#39;bcda&#39;, &#39;dab&#39;, &#39;acd&#39;, &#39;dabc&#39;, &#39;cbda&#39;,</span>
<span class="s">         &#39;bca&#39;, &#39;dacb&#39;, &#39;bad&#39;, &#39;adb&#39;, &#39;bac&#39;, &#39;cab&#39;, &#39;adc&#39;, &#39;cdba&#39;,</span>
<span class="s">         &#39;dca&#39;, &#39;cad&#39;, &#39;adbc&#39;, &#39;adcb&#39;, &#39;dbac&#39;, &#39;dcba&#39;, &#39;acdb&#39;, &#39;bacd&#39;,</span>
<span class="s">         &#39;cabd&#39;, &#39;cadb&#39;, &#39;badc&#39;, &#39;bcad&#39;, &#39;dcab&#39;]</span>

<span class="s">    It also follows that there are finitely many of them::</span>

<span class="s">        sage: S.cardinality()</span>
<span class="s">        64</span>

<span class="s">    Indeed::</span>

<span class="s">        sage: 4 * ( 1 + 3 * (1 + 2 * (1 + 1)))</span>
<span class="s">        64</span>

<span class="s">    As expected, all the elements of `S` are idempotents::</span>

<span class="s">        sage: all( x.is_idempotent() for x in S )</span>
<span class="s">        True</span>

<span class="s">    Now, let us look at the structure of the semigroup::</span>

<span class="s">        sage: S = FiniteSemigroups().example(alphabet = (&#39;a&#39;,&#39;b&#39;,&#39;c&#39;))</span>
<span class="s">        sage: S.cayley_graph(side=&quot;left&quot;, simple=True).plot()</span>
<span class="s">        sage: S.j_transversal_of_idempotents() # random (arbitrary choice)</span>
<span class="s">        [&#39;acb&#39;, &#39;ac&#39;, &#39;ab&#39;, &#39;bc&#39;, &#39;a&#39;, &#39;c&#39;, &#39;b&#39;]</span>

<span class="s">    We conclude by running systematic tests on this semigroup::</span>

<span class="s">        sage: TestSuite(S).run(verbose = True)</span>
<span class="s">        running ._test_an_element() . . . pass</span>
<span class="s">        running ._test_associativity() . . . pass</span>
<span class="s">        running ._test_category() . . . pass</span>
<span class="s">        running ._test_elements() . . .</span>
<span class="s">          Running the test suite of self.an_element()</span>
<span class="s">          running ._test_category() . . . pass</span>
<span class="s">          running ._test_eq() . . . pass</span>
<span class="s">          running ._test_not_implemented_methods() . . . pass</span>
<span class="s">          running ._test_pickling() . . . pass</span>
<span class="s">          pass</span>
<span class="s">        running ._test_elements_eq() . . . pass</span>
<span class="s">        running ._test_enumerated_set_contains() . . . pass</span>
<span class="s">        running ._test_enumerated_set_iter_cardinality() . . . pass</span>
<span class="s">        running ._test_enumerated_set_iter_list() . . . pass</span>
<span class="s">        running ._test_eq() . . . pass</span>
<span class="s">        running ._test_not_implemented_methods() . . . pass</span>
<span class="s">        running ._test_pickling() . . . pass</span>
<span class="s">        running ._test_some_elements() . . . pass</span>
<span class="s">    &quot;&quot;&quot;</span>

    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">alphabet</span><span class="o">=</span><span class="p">(</span><span class="s">&#39;a&#39;</span><span class="p">,</span><span class="s">&#39;b&#39;</span><span class="p">,</span><span class="s">&#39;c&#39;</span><span class="p">,</span><span class="s">&#39;d&#39;</span><span class="p">)):</span>
        <span class="s">r&quot;&quot;&quot;</span>
<span class="s">        A left regular band.</span>

<span class="s">        EXAMPLES::</span>

<span class="s">            sage: S = FiniteSemigroups().example(); S</span>
<span class="s">            An example of a finite semigroup: the left regular band generated by (&#39;a&#39;, &#39;b&#39;, &#39;c&#39;, &#39;d&#39;)</span>
<span class="s">            sage: S = FiniteSemigroups().example(alphabet=(&#39;x&#39;,&#39;y&#39;)); S</span>
<span class="s">            An example of a finite semigroup: the left regular band generated by (&#39;x&#39;, &#39;y&#39;)</span>
<span class="s">            sage: TestSuite(S).run()</span>
<span class="s">        &quot;&quot;&quot;</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">alphabet</span> <span class="o">=</span> <span class="n">alphabet</span>
        <span class="n">Parent</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">category</span> <span class="o">=</span> <span class="n">FiniteSemigroups</span><span class="p">())</span>

    <span class="k">def</span> <span class="nf">_repr_</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="s">r&quot;&quot;&quot;</span>
<span class="s">        TESTS::</span>

<span class="s">            sage: S = FiniteSemigroups().example()</span>
<span class="s">            sage: S._repr_()</span>
<span class="s">            &quot;An example of a finite semigroup: the left regular band generated by (&#39;a&#39;, &#39;b&#39;, &#39;c&#39;, &#39;d&#39;)&quot;</span>
<span class="s">        &quot;&quot;&quot;</span>
        <span class="k">return</span> <span class="s">&quot;An example of a finite semigroup: the left regular band generated by </span><span class="si">%s</span><span class="s">&quot;</span><span class="o">%</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">alphabet</span><span class="p">,)</span>

    <span class="k">def</span> <span class="nf">product</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">):</span>
        <span class="s">r&quot;&quot;&quot;</span>
<span class="s">        Returns the product of two elements of the semigroup.</span>

<span class="s">        EXAMPLES::</span>

<span class="s">            sage: S = FiniteSemigroups().example()</span>
<span class="s">            sage: S(&#39;a&#39;) * S(&#39;b&#39;)</span>
<span class="s">            &#39;ab&#39;</span>
<span class="s">            sage: S(&#39;a&#39;) * S(&#39;b&#39;) * S(&#39;a&#39;)</span>
<span class="s">            &#39;ab&#39;</span>
<span class="s">            sage: S(&#39;a&#39;) * S(&#39;a&#39;)</span>
<span class="s">            &#39;a&#39;</span>

<span class="s">        &quot;&quot;&quot;</span>
        <span class="k">assert</span> <span class="n">x</span> <span class="ow">in</span> <span class="bp">self</span>
        <span class="k">assert</span> <span class="n">y</span> <span class="ow">in</span> <span class="bp">self</span>
        <span class="n">x</span> <span class="o">=</span> <span class="n">x</span><span class="o">.</span><span class="n">value</span>
        <span class="n">y</span> <span class="o">=</span> <span class="n">y</span><span class="o">.</span><span class="n">value</span>
        <span class="k">return</span> <span class="bp">self</span><span class="p">(</span><span class="n">x</span> <span class="o">+</span> <span class="s">&#39;&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">c</span> <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="n">y</span> <span class="k">if</span> <span class="n">c</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">x</span><span class="p">))</span>

    <span class="nd">@cached_method</span>
    <span class="k">def</span> <span class="nf">semigroup_generators</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="s">r&quot;&quot;&quot;</span>
<span class="s">        Returns the generators of the semigroup.</span>

<span class="s">        EXAMPLES::</span>

<span class="s">            sage: S = FiniteSemigroups().example(alphabet=(&#39;x&#39;,&#39;y&#39;))</span>
<span class="s">            sage: S.semigroup_generators()</span>
<span class="s">            Family (&#39;x&#39;, &#39;y&#39;)</span>

<span class="s">        &quot;&quot;&quot;</span>
        <span class="k">return</span> <span class="n">Family</span><span class="p">([</span><span class="bp">self</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">alphabet</span><span class="p">])</span>

    <span class="k">def</span> <span class="nf">an_element</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="s">r&quot;&quot;&quot;</span>
<span class="s">        Returns an element of the semigroup.</span>

<span class="s">        EXAMPLES::</span>

<span class="s">            sage: S = FiniteSemigroups().example()</span>
<span class="s">            sage: S.an_element()</span>
<span class="s">            &#39;cdab&#39;</span>

<span class="s">            sage: S = FiniteSemigroups().example((&quot;b&quot;))</span>
<span class="s">            sage: S.an_element()</span>
<span class="s">            &#39;b&#39;</span>
<span class="s">        &quot;&quot;&quot;</span>

        <span class="k">return</span> <span class="bp">self</span><span class="p">(</span><span class="s">&#39;&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">alphabet</span><span class="p">[</span><span class="mi">2</span><span class="p">:]</span><span class="o">+</span><span class="bp">self</span><span class="o">.</span><span class="n">alphabet</span><span class="p">[</span><span class="mi">0</span><span class="p">:</span><span class="mi">2</span><span class="p">]))</span>

    <span class="k">class</span> <span class="nc">Element</span> <span class="p">(</span><span class="n">ElementWrapper</span><span class="p">):</span>
        <span class="n">wrapped_class</span> <span class="o">=</span> <span class="nb">str</span>
        <span class="n">__lt__</span> <span class="o">=</span> <span class="n">ElementWrapper</span><span class="o">.</span><span class="n">_lt_by_value</span>
</pre></div>
</div>


</div>
</html>
}}}

{{{id=147|
Cat = HopfAlgebrasWithBasis(QQ); Cat
///
Category of hopf algebras with basis over Rational Field
}}}

{{{id=113|
Cat.category_graph().plot()
///
<html><font color='black'><img src='cell://sage0.png'></font></html>
}}}

{{{id=143|
Cat?
///
<html><!--notruncate-->

<div class="docstring">
    
  <p><strong>File:</strong> /home/stumpc5/progs/sage-4.8/local/lib/python2.6/site-packages/sage/categories/hopf_algebras_with_basis.py</p>
<p><strong>Type:</strong> &lt;class &#8216;sage.categories.hopf_algebras_with_basis.HopfAlgebrasWithBasis&#8217;&gt;</p>
<p><strong>Definition:</strong> Cat(x, *args, **opts)</p>
<p><strong>Docstring:</strong></p>
<blockquote>
<div><p>The category of Hopf algebras with a distinguished basis</p>
<p>EXAMPLES:</p>
<div class="highlight-python"><div class="highlight"><pre class="literal-block"><span class="gp">sage: </span><span class="n">C</span> <span class="o">=</span> <span class="n">HopfAlgebrasWithBasis</span><span class="p">(</span><span class="n">QQ</span><span class="p">)</span>
<span class="gp">sage: </span><span class="n">C</span>
<span class="go">Category of hopf algebras with basis over Rational Field</span>
<span class="gp">sage: </span><span class="n">C</span><span class="o">.</span><span class="n">super_categories</span><span class="p">()</span>
<span class="go">[Category of hopf algebras over Rational Field,</span>
<span class="go"> Category of algebras with basis over Rational Field,</span>
<span class="go"> Category of coalgebras with basis over Rational Field]</span>
</pre></div>
</div>
<p>We now show how to use a simple hopf algebra, namely the group algebra of the dihedral group
(see also AlgebrasWithBasis):</p>
<div class="highlight-python"><div class="highlight"><pre class="literal-block"><span class="gp">sage: </span><span class="n">A</span> <span class="o">=</span> <span class="n">C</span><span class="o">.</span><span class="n">example</span><span class="p">();</span> <span class="n">A</span>
<span class="go">An example of Hopf algebra with basis: the group algebra of the Dihedral group of order 6 as a permutation group over Rational Field</span>
<span class="gp">sage: </span><span class="n">A</span><span class="o">.</span><span class="n">__custom_name</span> <span class="o">=</span> <span class="s">&quot;A&quot;</span>
<span class="gp">sage: </span><span class="n">A</span><span class="o">.</span><span class="n">category</span><span class="p">()</span>
<span class="go">Category of hopf algebras with basis over Rational Field</span>

<span class="gp">sage: </span><span class="n">A</span><span class="o">.</span><span class="n">one_basis</span><span class="p">()</span>
<span class="go">()</span>
<span class="gp">sage: </span><span class="n">A</span><span class="o">.</span><span class="n">one</span><span class="p">()</span>
<span class="go">B[()]</span>

<span class="gp">sage: </span><span class="n">A</span><span class="o">.</span><span class="n">base_ring</span><span class="p">()</span>
<span class="go">Rational Field</span>
<span class="gp">sage: </span><span class="n">A</span><span class="o">.</span><span class="n">basis</span><span class="p">()</span><span class="o">.</span><span class="n">keys</span><span class="p">()</span>
<span class="go">Dihedral group of order 6 as a permutation group</span>

<span class="gp">sage: </span><span class="p">[</span><span class="n">a</span><span class="p">,</span><span class="n">b</span><span class="p">]</span> <span class="o">=</span> <span class="n">A</span><span class="o">.</span><span class="n">algebra_generators</span><span class="p">()</span>
<span class="gp">sage: </span><span class="n">a</span><span class="p">,</span> <span class="n">b</span>
<span class="go">(B[(1,2,3)], B[(1,3)])</span>
<span class="gp">sage: </span><span class="n">a</span><span class="o">^</span><span class="mi">3</span><span class="p">,</span> <span class="n">b</span><span class="o">^</span><span class="mi">2</span>
<span class="go">(B[()], B[()])</span>
<span class="gp">sage: </span><span class="n">a</span><span class="o">*</span><span class="n">b</span>
<span class="go">B[(1,2)]</span>

<span class="gp">sage: </span><span class="n">A</span><span class="o">.</span><span class="n">product</span>           <span class="c"># todo: not quite ...</span>
<span class="go">&lt;bound method MyGroupAlgebra_with_category._product_from_product_on_basis_multiply of A&gt;</span>
<span class="gp">sage: </span><span class="n">A</span><span class="o">.</span><span class="n">product</span><span class="p">(</span><span class="n">b</span><span class="p">,</span><span class="n">b</span><span class="p">)</span>
<span class="go">B[()]</span>

<span class="gp">sage: </span><span class="n">A</span><span class="o">.</span><span class="n">zero</span><span class="p">()</span><span class="o">.</span><span class="n">coproduct</span><span class="p">()</span>
<span class="go">0</span>
<span class="gp">sage: </span><span class="n">A</span><span class="o">.</span><span class="n">zero</span><span class="p">()</span><span class="o">.</span><span class="n">coproduct</span><span class="p">()</span><span class="o">.</span><span class="n">parent</span><span class="p">()</span>
<span class="go">A # A</span>
<span class="gp">sage: </span><span class="n">a</span><span class="o">.</span><span class="n">coproduct</span><span class="p">()</span>
<span class="go">B[(1,2,3)] # B[(1,2,3)]</span>

<span class="gp">sage: </span><span class="n">TestSuite</span><span class="p">(</span><span class="n">A</span><span class="p">)</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="n">verbose</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
<span class="go">running ._test_additive_associativity() . . . pass</span>
<span class="go">running ._test_an_element() . . . pass</span>
<span class="go">running ._test_associativity() . . . pass</span>
<span class="go">running ._test_category() . . . pass</span>
<span class="go">running ._test_distributivity() . . . pass</span>
<span class="go">running ._test_elements() . . .</span>
<span class="go">  Running the test suite of Cat.an_element()</span>
<span class="go">  running ._test_category() . . . pass</span>
<span class="go">  running ._test_eq() . . . pass</span>
<span class="go">  running ._test_not_implemented_methods() . . . pass</span>
<span class="go">  running ._test_pickling() . . . pass</span>
<span class="go">  pass</span>
<span class="go">running ._test_elements_eq() . . . pass</span>
<span class="go">running ._test_eq() . . . pass</span>
<span class="go">running ._test_not_implemented_methods() . . . pass</span>
<span class="go">running ._test_one() . . . pass</span>
<span class="go">running ._test_pickling() . . . pass</span>
<span class="go">running ._test_prod() . . . pass</span>
<span class="go">running ._test_some_elements() . . . pass</span>
<span class="go">running ._test_zero() . . . pass</span>
<span class="gp">sage: </span><span class="n">A</span><span class="o">.</span><span class="n">__class__</span>
<span class="go">&lt;class &#39;sage.categories.examples.hopf_algebras_with_basis.MyGroupAlgebra_with_category&#39;&gt;</span>
<span class="gp">sage: </span><span class="n">A</span><span class="o">.</span><span class="n">element_class</span>
<span class="go">&lt;class &#39;sage.combinat.free_module.MyGroupAlgebra_with_category.element_class&#39;&gt;</span>
</pre></div>
</div>
<p>Let us look at the code for implementing A:</p>
<div class="highlight-python"><pre class="literal-block">sage: A??                       # todo: not implemented</pre>
</div>
<p>TESTS:</p>
<div class="highlight-python"><div class="highlight"><pre class="literal-block"><span class="gp">sage: </span><span class="n">TestSuite</span><span class="p">(</span><span class="n">A</span><span class="p">)</span><span class="o">.</span><span class="n">run</span><span class="p">()</span>
<span class="gp">sage: </span><span class="n">TestSuite</span><span class="p">(</span><span class="n">C</span><span class="p">)</span><span class="o">.</span><span class="n">run</span><span class="p">()</span>
</pre></div>
</div>
</div></blockquote>


</div>
</html>
}}}

{{{id=111|
H = Cat.example()
H
///
An example of Hopf algebra with basis: the group algebra of the Dihedral group of order 6 as a permutation group over Rational Field
}}}

{{{id=114|
H??
///
<html><!--notruncate-->

<div class="docstring">
    
  <p><strong>File:</strong> /home/stumpc5/progs/sage-4.8/local/lib/python2.6/site-packages/sage/categories/examples/hopf_algebras_with_basis.py</p>
<p><strong>Source Code</strong> (starting at line 17):</p>
<div class="highlight-python"><div class="highlight"><pre class="literal-block"><span class="k">class</span> <span class="nc">MyGroupAlgebra</span><span class="p">(</span><span class="n">CombinatorialFreeModule</span><span class="p">):</span>
    <span class="s">r&quot;&quot;&quot;</span>
<span class="s">    An of a Hopf algebra with basis: the group algebra of a group</span>

<span class="s">    This class illustrates a minimal implementation of a Hopf algebra with basis.</span>
<span class="s">    &quot;&quot;&quot;</span>

    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">R</span><span class="p">,</span> <span class="n">G</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot;</span>
<span class="sd">        EXAMPLES::</span>

<span class="sd">            sage: from sage.categories.examples.hopf_algebras_with_basis import MyGroupAlgebra</span>
<span class="sd">            sage: A = MyGroupAlgebra(QQ, DihedralGroup(6))</span>
<span class="sd">            sage: A.category()</span>
<span class="sd">            Category of hopf algebras with basis over Rational Field</span>
<span class="sd">            sage: TestSuite(A).run()</span>
<span class="sd">        &quot;&quot;&quot;</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">_group</span> <span class="o">=</span> <span class="n">G</span>
        <span class="n">CombinatorialFreeModule</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">R</span><span class="p">,</span> <span class="n">G</span><span class="p">,</span> <span class="n">category</span> <span class="o">=</span> <span class="n">HopfAlgebrasWithBasis</span><span class="p">(</span><span class="n">R</span><span class="p">))</span>

    <span class="k">def</span> <span class="nf">_repr_</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot;</span>
<span class="sd">        EXAMPLES::</span>

<span class="sd">            sage: HopfAlgebrasWithBasis(QQ).example() # indirect doctest</span>
<span class="sd">            An example of Hopf algebra with basis: the group algebra of the Dihedral group of order 6 as a permutation group over Rational Field</span>
<span class="sd">        &quot;&quot;&quot;</span>
        <span class="k">return</span> <span class="s">&quot;An example of Hopf algebra with basis: the group algebra of the </span><span class="si">%s</span><span class="s"> over </span><span class="si">%s</span><span class="s">&quot;</span><span class="o">%</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_group</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">base_ring</span><span class="p">())</span>

    <span class="nd">@cached_method</span>
    <span class="k">def</span> <span class="nf">one_basis</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot;</span>
<span class="sd">        Returns the one of the group, which index the one of this algebra,</span>
<span class="sd">        as per :meth:`AlgebrasWithBasis.ParentMethods.one_basis`.</span>

<span class="sd">        EXAMPLES::</span>

<span class="sd">            sage: A = HopfAlgebrasWithBasis(QQ).example()</span>
<span class="sd">            sage: A.one_basis()</span>
<span class="sd">            ()</span>
<span class="sd">            sage: A.one()</span>
<span class="sd">            B[()]</span>
<span class="sd">        &quot;&quot;&quot;</span>
        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_group</span><span class="o">.</span><span class="n">one</span><span class="p">()</span>

    <span class="k">def</span> <span class="nf">product_on_basis</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">g1</span><span class="p">,</span> <span class="n">g2</span><span class="p">):</span>
        <span class="s">r&quot;&quot;&quot;</span>
<span class="s">        Product, on basis elements, as per :meth:`AlgebrasWithBasis.ParentMethods.product_on_basis`.</span>

<span class="s">        The product of two basis elements is induced by the product of</span>
<span class="s">        the corresponding elements of the group.</span>

<span class="s">        EXAMPLES::</span>

<span class="s">            sage: A = HopfAlgebrasWithBasis(QQ).example()</span>
<span class="s">            sage: (a, b) = A._group.gens()</span>
<span class="s">            sage: a*b</span>
<span class="s">            (1,2)</span>
<span class="s">            sage: A.product_on_basis(a, b)</span>
<span class="s">            B[(1,2)]</span>
<span class="s">        &quot;&quot;&quot;</span>
        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">basis</span><span class="p">()[</span><span class="n">g1</span> <span class="o">*</span> <span class="n">g2</span><span class="p">]</span>

    <span class="nd">@cached_method</span>
    <span class="k">def</span> <span class="nf">algebra_generators</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="s">r&quot;&quot;&quot;</span>
<span class="s">        The generators of this algebra, as per :meth:`Algebras.ParentMethods.algebra_generators`.</span>

<span class="s">        They correspond to the generators of the group.</span>

<span class="s">        EXAMPLES::</span>

<span class="s">            sage: A = HopfAlgebrasWithBasis(QQ).example(); A</span>
<span class="s">            An example of Hopf algebra with basis: the group algebra of the Dihedral group of order 6 as a permutation group over Rational Field</span>
<span class="s">            sage: A.algebra_generators()</span>
<span class="s">            Finite family {(1,2,3): B[(1,2,3)], (1,3): B[(1,3)]}</span>
<span class="s">        &quot;&quot;&quot;</span>
        <span class="k">return</span> <span class="n">Family</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_group</span><span class="o">.</span><span class="n">gens</span><span class="p">(),</span> <span class="bp">self</span><span class="o">.</span><span class="n">monomial</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">coproduct_on_basis</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">g</span><span class="p">):</span>
        <span class="s">r&quot;&quot;&quot;</span>
<span class="s">        Coproduct, on basis elements, as per :meth:`HopfAlgebrasWithBasis.ParentMethods.coproduct_on_basis`.</span>

<span class="s">        The basis elements are group like: `\Delta(g) = g \otimes g`.</span>

<span class="s">        EXAMPLES::</span>

<span class="s">            sage: A = HopfAlgebrasWithBasis(QQ).example()</span>
<span class="s">            sage: (a, b) = A._group.gens()</span>
<span class="s">            sage: A.coproduct_on_basis(a)</span>
<span class="s">            B[(1,2,3)] # B[(1,2,3)]</span>
<span class="s">        &quot;&quot;&quot;</span>
        <span class="n">g</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">monomial</span><span class="p">(</span><span class="n">g</span><span class="p">)</span>
        <span class="k">return</span> <span class="n">tensor</span><span class="p">([</span><span class="n">g</span><span class="p">,</span> <span class="n">g</span><span class="p">])</span>

    <span class="k">def</span> <span class="nf">counit_on_basis</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">g</span><span class="p">):</span>
        <span class="s">r&quot;&quot;&quot;</span>
<span class="s">        Counit, on basis elements, as per :meth:`HopfAlgebrasWithBasis.ParentMethods.counit_on_basis`.</span>

<span class="s">        The counit on the basis elements is 1.</span>

<span class="s">        EXAMPLES::</span>

<span class="s">            sage: A = HopfAlgebrasWithBasis(QQ).example()</span>
<span class="s">            sage: (a, b) = A._group.gens()</span>
<span class="s">            sage: A.counit_on_basis(a)</span>
<span class="s">            1</span>
<span class="s">        &quot;&quot;&quot;</span>
        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">base_ring</span><span class="p">()</span><span class="o">.</span><span class="n">one</span><span class="p">()</span>

    <span class="k">def</span> <span class="nf">antipode_on_basis</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">g</span><span class="p">):</span>
        <span class="s">r&quot;&quot;&quot;</span>
<span class="s">        Antipode, on basis elements, as per :meth:`HopfAlgebrasWithBasis.ParentMethods.antipode_on_basis`.</span>

<span class="s">        It is given, on basis elements, by `\nu(g) = g^{-1}`</span>

<span class="s">        EXAMPLES::</span>

<span class="s">            sage: A = HopfAlgebrasWithBasis(QQ).example()</span>
<span class="s">            sage: (a, b) = A._group.gens()</span>
<span class="s">            sage: A.antipode_on_basis(a)</span>
<span class="s">            B[(1,3,2)]</span>
<span class="s">        &quot;&quot;&quot;</span>
        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">monomial</span><span class="p">(</span><span class="o">~</span><span class="n">g</span><span class="p">)</span>
</pre></div>
</div>


</div>
</html>
}}}