Symbolic method

In mathematics, the symbolic method in invariant theory is an algorithm developed by Cayley (1846), Siegfried Heinrich Aronhold (1858), Alfred Clebsch (1861), and Paul Gordan (1887) in the 19th century for computing invariants of algebraic forms. It is based on treating the form as if it were a power of a degree one form, which corresponds to embedding a symmetric power of a vector space into the symmetric elements of a tensor product of copies of it.

Symbolic notation

The symbolic method uses a compact, but rather confusing and mysterious notation for invariants, depending on the introduction of new symbols a, b, c, ... (from which the symbolic method gets its name) with apparently contradictory properties.

Example: the discriminant of a binary quadratic form

These symbols can be explained by the following example from (Gordan 1887, v. 2, p.g. 1-3). Suppose that

is a binary quadratic form with an invariant given by the discriminant

The symbolic representation of the discriminant is

where a and b are the symbols. The meaning of the expression (ab)2 is as follows. First of all, (ab) is a shorthand form for the determinant of a matrix whose rows are a1, a2 and b1, b2, so

Squaring this we get

Next we pretend that

so that

and we ignore the fact that this does not seem to make sense if f is not a power of a linear form. Substituting these values gives

Higher degrees

More generally if

is a binary form of higher degree, then one introduces new variables a1, a2, b1, b2, c1, c2, with the properties

What this means is that the following two vector spaces are naturally isomorphic:

  • The vector space of homogeneous polynomials in A0,...An of degree m
  • The vector space of polynomials in 2m variables a1, a2, b1, b2, c1, c2, ... that have degree n in each of the m pairs of variables (a1, a2), (b1, b2), (c1, c2), ... and are symmetric under permutations of the m symbols a, b, ....,

The isomorphism is given by mapping anj
1
aj
2
, bnj
1
bj
2
, .... to Aj. This mapping does not preserve products of polynomials.

More variables

The extension to a form f in more than two variables x1, x2,x3,... is similar: one introduces symbols a1, a2,a3 and so on with the properties

Symmetric products

The rather mysterious formalism of the symbolic method corresponds to embedding a symmetric product Sn(V) of a vector space V into a tensor product of n copies of V, as the elements preserved by the action of the symmetric group. In fact this is done twice, because the invariants of degree n of a quantic of degree m are the invariant elements of SnSm(V), which gets embedded into a tensor product of mn copies of V, as the elements invariant under a wreath product of the two symmetric groups. The brackets of the symbolic method are really invariant linear forms on this tensor product, which give invariants of SnSm(V) by restriction.

gollark: So, I finished that to highly dubious demand. I'd like to know how #11 and such work.
gollark: > `x = _(int(0, e), int(e, е))`You may note that this would produce slices of 0 size. However, one of the `e`s is a homoglyph; it contains `2 * e`.`return Result[0][0], x, m@set({int(e, 0), int(е, e)}), w`From this, it's fairly obvious what `strassen` *really* does - partition `m1` into 4 block matrices of half (rounded up to the nearest power of 2) size.> `E = typing(lookup[2])`I forgot what this is meant to contain. It probably isn't important.> `def exponentiate(m1, m2):`This is the actual multiplication bit.> `if m1.n == 1: return Mаtrix([[m1.bigData[0] * m2.bigData[0]]])`Recursion base case. 1-sized matrices are merely multiplied scalarly.> `aa, ab, ac, ad = strassen(m1)`> `аa, аb, аc, аd = strassen(m2)`More use of homoglyph confusion here. The matrices are quartered.> `m = m1.subtract(exponentiate(aa, аa) ** exponentiate(ab, аc), exponentiate(aa, аb) ** exponentiate(ab, аd), exponentiate(ac, аa) ** exponentiate(ad, аc), exponentiate(ac, аb) ** exponentiate(ad, аd)) @ [-0j, int.abs(m2.n * 3, m1.n)]`This does matrix multiplication in an inefficient *recursive* way; the Strassen algorithm could save one of eight multiplications here, which is more efficient (on big matrices). It also removes the zero padding.> `m = exponentiate(Mаtrix(m1), Mаtrix(m2)) @ (0j * math.sin(math.asin(math.sin(math.asin(math.sin(math.e))))), int(len(m1), len(m1)))`This multiples them and I think also removes the zero padding again, as we want it to be really very removed.> `i += 1`This was added as a counter used to ensure that it was usably performant during development.> `math.factorial = math.sinh`Unfortunately, Python's factorial function has really rather restrictive size limits.> `for row in range(m.n):`This converts back into the 2D array format.> `for performance in sorted(dir(gc)): getattr(gc, performance)()`Do random fun things to the GC.
gollark: > `globals()[Row + Row] = random.randint(*sys.version_info[:2])`Never actually got used anywhere.> `ε = sys.float_info.epsilon`Also not used. I just like epsilons.> `def __exit__(self, _, _________, _______):`This is also empty, because cleaning up the `_` global would be silly. It'll be overwritten anyway. This does serve a purpose, however, and not just in making it usable as a context manager. This actually swallows all errors, which is used in some places.> `def __pow__(self, m2):`As ever, this is not actual exponentiation. `for i, (ι, 𐌉) in enumerate(zip(self.bigData, m2.bigData)): e.bigData[i] = ι + 𐌉` is in fact just plain and simple addition of two matrices.> `def subtract(forth, 𝕒, polynomial, c, vector_space):`This just merges 4 submatrices back into one matrix.> `with out as out, out, forth:`Apart from capturing the exceptions, this doesn't really do much either. The `_` provided by the context manager is not used.> `_(0j, int(0, 𝕒.n))`Yes, it's used in this line. However, this doesn't actually have any effect whatsoever on the execution of this. So I ignore it. It was merely a distraction.> `with Mаtrix(ℤ(ℤ(4))):`It is used again to swallow exceptions. After this is just some fluff again.> `def strassen(m, x= 3.1415935258989):`This is an interesting part. Despite being called `strassen`, it does not actually implement the Strassen algorithm, which is a somewhat more efficient way to multiply matrices than the naive way used in - as far as I can tell - every entry.> `e = 2 ** (math.ceil(math.log2(m.n)) - 1)`This gets the next power of two in a fairly obvious way. It is used to pad out the matrix to the next power of 2 size.> `with m:`The context manager is used again for nicer lookups.> `Result[0] += [_(0j, int(e, e))]`Weird pythonoquirkiness again. You can append to lists in tuples with `+=`, but it throws an exception as they're sort of immutable.> `typing(lookup[4])(input())`It's entirely possible that this does things.
gollark: > `def __eq__(self, xy): return self.bigData[math.floor(xy.real * self.n + xy.imag)]`This actually gets indices into the matrix. I named it badly for accursedness. It uses complex number coordinates.> `def __matmul__(self, ǫ):`*This* function gets a 2D "slice" of the matrix between the specified coordinates. > `for (fοr, k), (b, р), (whіle, namedtuple) in itertools.product(I(*int.ℝ(start, end)), enumerate(range(ℤ(start.imag), math.floor(end.imag))), (ǫ, ǫ)):`This is really just bizarre obfuscation for the basic "go through every X/Y in the slice" thing.> `out[b * 1j + fοr] = 0`In case the matrix is too big, just pad it with zeros.> `except ZeroDivisionError:`In case of zero divisions, which cannot actually *happen*, we replace 0 with 1 except this doesn't actually work.> `import hashlib`As ever, we need hashlib.> `memmove(id(0), id(1), 27)`It *particularly* doesn't work because we never imported this name.> `def __setitem__(octonion, self, v):`This sets either slices or single items of the matrix. I would have made it use a cool™️ operator, but this has three parameters, unlike the other ones. It's possible that I could have created a temporary "thing setting handle" or something like that and used two operators, but I didn't.> `octonion[sedenion(malloc, entry, 20290, 15356, 44155, 30815, 37242, 61770, 64291, 20834, 47111, 326, 11094, 37556, 28513, 11322)] = v == int(bool, b)`Set each element in the slice. The sharp-eyed may wonder where `sedenion` comes from.> `"""`> `for testing`> `def __repr__(m):`This was genuinely for testing, although the implementation here was more advanced.> `def __enter__(The_Matrix: 2):`This allows use of `Matrix` objects as context managers.> `globals()[f"""_"""] = lambda h, Ĥ: The_Matrix@(h,Ĥ)`This puts the matrix slicing thing into a convenient function accessible globally (as long as the context manager is running). This is used a bit below.
gollark: * desired

See also

References

  • Aronhold, Siegfried Heinrich (1858), "Theorie der homogenen Functionen dritten Grades von drei Veränderlichen.", Journal für die reine und angewandte Mathematik (in German), 1858 (55): 97–191, doi:10.1515/crll.1858.55.97, ISSN 0075-4102
  • Cayley, Arthur (1846), "On linear transformations", Cambridge and Dublin Mathematical Journal: 104–122
  • Clebsch, A. (1861), "Ueber symbolische Darstellung algebraischer Formen", Journal für die Reine und Angewandte Mathematik (in German), 1861 (59): 1–62, doi:10.1515/crll.1861.59.1, ISSN 0075-4102
  • Dieudonné, Jean; Carrell, James B. (1970), "Invariant theory, old and new", Advances in Mathematics, 4: 1–80, doi:10.1016/0001-8708(70)90015-0, pages 32–37, "Invariants of n-ary forms: the symbolic method. Reprinted as Dieudonné, Jean; Carrell, James B. (1971), Invariant theory, old and new, Academic Press, ISBN 0-12-215540-8
  • Dolgachev, Igor (2003), Lectures on invariant theory, London Mathematical Society Lecture Note Series, 296, Cambridge University Press, doi:10.1017/CBO9780511615436, ISBN 978-0-521-52548-0, MR 2004511
  • Gordan, Paul (1887), Kerschensteiner, Georg (ed.), Vorlesungen über Invariantentheorie (2nd ed.), New York: Chelsea Publishing Co., ISBN 978-0-8284-0328-3, MR 0917266
  • Grace, John Hilton; Young, Alfred (1903), The Algebra of invariants, Cambridge University Press
  • Hilbert, David (1993) [1897], Theory of algebraic invariants, Cambridge University Press, ISBN 978-0-521-44457-6, MR 1266168
  • Koh, Sebastian S., ed. (1987), Invariant Theory, Lecture Notes in Mathematics, 1278, ISBN 3-540-18360-4
  • Kung, Joseph P. S.; Rota, Gian-Carlo (1984), "The invariant theory of binary forms", American Mathematical Society. Bulletin. New Series, 10 (1): 27–85, doi:10.1090/S0273-0979-1984-15188-7, ISSN 0002-9904, MR 0722856
This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.