{
	"cells" : 
	[
		{
			"cell_origin" : "client",
			"cell_type" : "latex",
			"cells" : 
			[
				{
					"cell_origin" : "client",
					"cell_type" : "latex_view",
					"source" : "\\algorithm{canonicalise}{Bring a tensorial expression to canonical form by re-ordering indices.}\n\nCanonicalise a product of tensors, using the mono-term \nindex symmetries of the individual tensors and the\nexchange symmetries of identical tensors. Tensor exchange takes into\naccount commutativity properties of identical tensors.\n\n\nNote that this algorithm does not take into account multi-term\nsymmetries such as the Ricci identity of the Riemann tensor; those\ncanonicalisation procedures require the use\nof \\algo{young\\_project\\_tensor}\nor \\algo{young\\_project\\_product}. Similarly,\ndimension-dependent identities are not taken into account, use\n\\algo{decompose_product} for those.\n\n\nIn order to specify symmetries of tensors you need to use symmetry\nproperties such as \\prop{Symmetric}, \\prop{AntiSymmetric}\nor \\prop{TableauSymmetry}. The following example illustrates this."
				}
			],
			"hidden" : true,
			"source" : "\\algorithm{canonicalise}{Bring a tensorial expression to canonical form by re-ordering indices.}\n\nCanonicalise a product of tensors, using the mono-term \nindex symmetries of the individual tensors and the\nexchange symmetries of identical tensors. Tensor exchange takes into\naccount commutativity properties of identical tensors.\n\n\nNote that this algorithm does not take into account multi-term\nsymmetries such as the Ricci identity of the Riemann tensor; those\ncanonicalisation procedures require the use\nof \\algo{young\\_project\\_tensor}\nor \\algo{young\\_project\\_product}. Similarly,\ndimension-dependent identities are not taken into account, use\n\\algo{decompose_product} for those.\n\n\nIn order to specify symmetries of tensors you need to use symmetry\nproperties such as \\prop{Symmetric}, \\prop{AntiSymmetric}\nor \\prop{TableauSymmetry}. The following example illustrates this."
		},
		{
			"cell_origin" : "client",
			"cell_type" : "input",
			"cells" : 
			[
				{
					"cell_origin" : "server",
					"cell_type" : "latex_view",
					"source" : "\\begin{dmath*}{}A_{m n} B_{m n}\\end{dmath*}"
				},
				{
					"cell_origin" : "server",
					"cell_type" : "latex_view",
					"source" : "\\begin{dmath*}{}0\\end{dmath*}"
				}
			],
			"source" : "A_{m n}::AntiSymmetric.\nB_{p q}::Symmetric.\nex:=A_{m n} B_{m n};\ncanonicalise(_);"
		},
		{
			"cell_origin" : "client",
			"cell_type" : "latex",
			"cells" : 
			[
				{
					"cell_origin" : "client",
					"cell_type" : "latex_view",
					"source" : "If the various terms in an expression use different index names, you\nmay need an additional call to \\algo{rename\\_dummies}\nbefore the terms get collected together:"
				}
			],
			"hidden" : true,
			"source" : "If the various terms in an expression use different index names, you\nmay need an additional call to \\algo{rename\\_dummies}\nbefore the terms get collected together:"
		},
		{
			"cell_origin" : "client",
			"cell_type" : "input",
			"cells" : 
			[
				{
					"cell_origin" : "server",
					"cell_type" : "latex_view",
					"source" : "\\begin{dmath*}{}A_{m n} C_{m n q}+A_{s r} C_{s q r}\\end{dmath*}"
				},
				{
					"cell_origin" : "server",
					"cell_type" : "latex_view",
					"source" : "\\begin{dmath*}{}A_{m n} C_{q m n}-A_{r s} C_{q r s}\\end{dmath*}"
				}
			],
			"source" : "{m,n,p,q,r,s}::Indices.\nA_{m n}::AntiSymmetric.\nC_{p q r}::AntiSymmetric.\nex:=A_{m n} C_{m n q} + A_{s r} C_{s q r};\ncanonicalise(_);"
		},
		{
			"cell_origin" : "client",
			"cell_type" : "input",
			"cells" : 
			[
				{
					"cell_origin" : "server",
					"cell_type" : "latex_view",
					"source" : "\\begin{dmath*}{}0\\end{dmath*}"
				}
			],
			"source" : "rename_dummies(_);"
		},
		{
			"cell_origin" : "client",
			"cell_type" : "latex",
			"cells" : 
			[
				{
					"cell_origin" : "client",
					"cell_type" : "latex_view",
					"source" : "If you have symmetric or anti-symmetric tensors with many indices, it\nsometimes pays off to sort them to the end of the expression (this may\nspeed up the canonicalisation process considerably).\n"
				}
			],
			"hidden" : true,
			"source" : "If you have symmetric or anti-symmetric tensors with many indices, it\nsometimes pays off to sort them to the end of the expression (this may\nspeed up the canonicalisation process considerably).\n"
		},
		{
			"cell_origin" : "client",
			"cell_type" : "input",
			"source" : ""
		}
	],
	"description" : "Cadabra JSON notebook format",
	"version" : 1
}
