Source code for pysymmpol.utils.tools

import sympy as sp
import numpy as np

from .inner import _accel_asc, _power_sum
from ..partitions.young import YoungDiagram
from ..partitions.conjugacy import ConjugacyClass


[docs] def vandermonde(x: tuple): # Vandermonde determinant ''' Function to calculate the Vandermonde polynomial. ''' m = len(x) vandermonde = 1 for i in range(m): for j in range(m): if i < j: vandermonde *= (x[i] - x[j]) return vandermonde
[docs] def newton_polynomial(x: tuple, vector: ConjugacyClass): ''' Function to calculate the Newton polynomials. ''' k = vector.conjugacy r = len(k) newton = 1 for j in range(r): newton *= _power_sum(x, j+1) ** (k[j]) return newton
[docs] def character(young_diagram: YoungDiagram, vector: ConjugacyClass): ''' Characters of the symmetric group using the Frobenius Character Formula. ''' young = young_diagram.partition m = len(young) x = create_x_coord(m) l = [] # These are the powers (l1, l2, ..., lm) defined in the formula. for i in range(m): l.append(young[i] + m - i -1) # the minus comes from the fact that python lists start at 0 power = 1 # This is the coefficient in x I need to extract for j in range(len(l)): power *= x[j]**l[j] polynomial = sp.poly( vandermonde(x) * newton_polynomial(x, vector) ) coeff = polynomial.coeff_monomial(power) return coeff
[docs] def partitions_of(n: int) -> int: ''' Function that returns the number of partitions of a given integer. ''' return sum(1 for x in _accel_asc(n))
[docs] def create_miwa(n: int) -> dict: ''' This function creates the appropriate Miwa coordinates as a dictionary. ''' return dict(enumerate(sp.symbols(f't1:{n+1}'), 1))
[docs] def create_x_coord(m) -> tuple: ''' This function creates the x coordinates as a tuple. ''' x = np.array(sp.symbols(f'x1:{m+1}')) return tuple(x)
[docs] def tx_power_sum(n: int, m: int=1) -> tuple: ''' This function creates the power sum. The integer n is the length of the Miwa coordinates. The integer m is the length of the x coordinates. ''' x = np.array(sp.symbols(f'x1:{m+1}')) t = [sum(x ** j) / j for j in range(1, n+1)] return tuple(t)