Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
181 views
unlisted
ubuntu2004
a

��cj�@s�dZddlZddlmZddlmZddlmZddlm	Z	m
Z
mZmZm
Z
mZmZmZmZmZmZmZmZddlmZmZmZmZmZdd	lmZmZd
d�Zedefd
d��Z defdd�Z!edd��Z"edd��Z#edefdd��Z$edefdd��Z%defdd�Z&defdd�Z'efdd�Z(efdd �Z)ed!fd"d#�Z*eefd$d%��Z+eefd&d'��Z,defd(d)�Z-eed!fd*d+��Z.dS),z'
Multiplication in the strata algebra.
�N)�cached_function)�ZZ)�vector�)
�Graph�R�X�
all_strata�all_pure_strata�
num_strata�single_stratum�unpurify_map�contraction_table�pure_strata_autom_count�automorphism_cosets�graph_isomorphic�num_of_stratum)�	MODULI_SM�	MODULI_CT�	MODULI_ST�MODULI_SMALL�dim_form)�simplify_sparse�setparts_with_autscCs8|dkrttd|d��Sd|ttd||d��S)Nrr�r�)�tuple�range)�n�symm�r �8/home/user/Introduction lectures/admcycles/DR/algebra.py�	get_markssr"r c5sXt�||���}t�||���}	t�||���}
dd�t|
�D�}���fdd�t|d�D�}t�|���}
t|�|���}t|�|���}t|j�}t|j�}|��|��|�	�t
��}|�	�t
��}d}tt
||��D]*}|j|||jkr�||f}d}�qq�|�s&Jd��d}tt
||��D].}|j|||jk�r:||f}d}�qj�q:|�sxJd��||k�r�t||||�|���S||f|
v�r�|S|
||fD�	]�}||d	d	|d	d�g}�tk�r<td�j�
��D]D}td�j���D],��j|�fd	d
k�r
|�|�f��q
�q�t|d	d�|d	d	���}|d}t
|�|k�r�t
|�|k�r�|d
9}t|�|���}t|�|���}||d	|d	}|dD�]�}|dD�]v}t�j�} dd�t|j�
��D�}!td|j�
��D]:}|d
d	|dd	|d	|ddd|!|<�q
d
d�t|j���D�}"td|j���D]:}|d
d|dd|d|ddd|"|<�qndd�t|j�
��D�}#td|j�
��D]:}|dd	|dd	|d	|ddd|#|<�q�dd�t|j���D�}$td|j���D]:}|dd|dd|d|ddd|$|<�q6g}%g}&t��}'td|j�
��D�]�}td|j���D�]j�|j|�fd	d	k�r�|j|�fd	dk�rR|j|�fdd	k�r|"�}(|!|D]H})�j|)|(fd	k�r| j|)|(f|j|�fdt7<�q�qn�|j|�fdd	k�rt|'d
9}'n�|"�}(|%�|j|�fd|j|�fd
g|j|�fd
|j|�fdgg�|&�|(g�|!|D]2})t�j|)|(fd	�D]}*|&d�|)��q��qސq��q�td|j�
��D�]�}td|j���D�]��|j|�fd	d	k�r@|j|�fd	dk�r|j|�fdd	k�r�|j|�fd	dk�r�|$�}(|#|D]H})�j|)|(fd	k�r�| j|)|(f|j|�fdt7<�qq�n�|j|�fdd	k�r$|'d
9}'n�|$�}(|%�|j|�fd|j|�fd
g|j|�fd
|j|�fdgg�|&�|(g�|#|D]2})t�j|)|(fd	�D]}*|&d�|)��q��q��q@�q*g}+g},td|j�
��D]R}td|d�D]<}-t|j|d	f|-�D]}*|+�|!|�|,�|-��q�q��q�td|j�
��D]R}td|d�D]<}-t|j|d	f|-�D]}*|+�|#|�|,�|-��qr�qX�qFg}.|D]����fdd�td�j�
��D�}/t
|/�d
k�r�|.�|/d	�g|/d�gg�n.|%�d	dgdd	gg�|&��|/d	|/d	g��q�tj|%�D�]}0tj|+�D�]}1tj|.�D�]�}2t| j�}3tt
|&��D]�}|3j|&|d|&|d	f|0|d	t7<|&|d|&|d
k�	r�|3j|&|d|&|d	f|0|dtd
7<n2|3j|&|d
|&|d	f|0|dt7<�	qltt
|,��D](}|3j|1|d	ft|,|7<�
q6|2D]$}|3j|d	|dft7<�
qd|D]Z}*|3j|*d
|3j|*dk�
r�|3j|*|3j|*d
|3j|*dttd
7<�
q�|3��||d	D]<}4t|3|	|4��
r�||4dt
|�|'|7<�	qP�
q��	qP�	q@�	q0�qҐqĐq�|S)aC
    Return the result of the multiplication of the ``(r1, i1)``-th generator
    with the ``(r2, i2)`` one.

    The output is a list representing the coefficients with respect to the
    generators in rank ``r1+r2``.

    EXAMPLES::

        sage: from admcycles.DR.graph import num_strata
        sage: from admcycles.DR.algebra import multiply
        sage: r1 = 1
        sage: r2 = 2
        sage: for i1 in range(num_strata(2, r1)):
        ....:     for i2 in range(num_strata(2, r2)):
        ....:         print(i1, i2, multiply(r1, i1, r2, i2, 2, r1 + r2))
        0 0 [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
        0 1 [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
        0 2 [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
        0 3 [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
        0 4 [0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
        0 5 [0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0]
        0 6 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0]
        0 7 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0]
        1 0 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
        1 1 [0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
        1 2 [0, 0, 0, 0, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
        1 3 [0, 0, 0, 0, 0, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
        1 4 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0]
        1 5 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
        1 6 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, 0, 0, 0, 0]
        1 7 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0]
        2 0 [0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
        2 1 [0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
        2 2 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0]
        2 3 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0]
        2 4 [0, 0, 0, 0, 0, 0, 0, 0, -4, 0, 0, 0, 0, 1, 0, 0, 0]
        2 5 [0, 0, 0, 0, 0, 0, 0, 0, 0, -2, -2, 0, 0, 0, 1, 0, 0]
        2 6 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0]
        2 7 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -8, 0, 4]
    cSsg|]}d�qS�rr ��.0�ir r r!�
<listcomp>E�zmultiply.<locals>.<listcomp>csg|]}t�|����qSr )r
)r%�r)�g�markings�moduli_typer r!r'Fs�rFTzG1 purification failedzG2 purification failedrrcSsg|]}d�qSr#r r$r r r!r'wr(�cSsg|]}d�qSr#r r$r r r!r'{r(cSsg|]}d�qSr#r r$r r r!r'r(��cSsg|]}d�qSr#r r$r r r!r'�r(�����cs&g|]}�j|�fddkr|�qSr#��Mr$)�H�jr r!r'�r()r
r	rrrrrr2Zpurify�	num_edges�len�multiplyr�nrows�ncols�appendrrr�oner�	itertools�productZcompute_invariantr)5�r1�i1�r2�i2r*�rmaxr+r,Zunpurify�gens�ngens�answerZpure_strataZcontraction_dict�G1�G2ZG1copyZG2copyZpure_r1Zpure_r2�foundr&ZG1_keyZG2_key�LZHloops�auts�BZaut_cosets1Zaut_cosets2Zisom1Zisom2ZHcopyZvmap1Zemap1Zvmap2Zemap2ZpsilooplistZpsiindexlistZloop_factor�jj�ii�kZ
KlocationlistZ
Kindexlistr)�psilist�SZpsiloopvalsZKlocsZpsilocsZ	HcopycopyZ	which_genr )r3r*r4r+r,r!r7s�+
�




�
������������(
& ���
& �  

��
��
��

�
�
"��
���"r7cCs�t||||�}t||||�}t||||�}t�t|�t|�t|��D�]n\}	}
}t||	||
||||||�}tdd�tt||||||��D��}
tt|||||��D]D}||dkr�q�|
||tt|||||||||||��7}
q�t||	||||||||�}tdd�tt||||||��D��}tt|||||��D]J}||dk�rd�qN|||tt|||||
||||||��7}�qN|
|krDtd|	|
|f��qDdS)z�
    Check associativity of the strata algebra.

    If it fails a ``ValueError`` is raised.

    EXAMPLES::

        sage: from admcycles.DR.algebra import check_associativity
        sage: check_associativity(2, 1, 1, 1)
    cSsg|]}d�qSr#r r$r r r!r'�r(z'check_associativity.<locals>.<listcomp>rcSsg|]}d�qSr#r r$r r r!r'r(zi1=%s i2=%s i3=%sN)rr<r=rr7r�
ValueError)r*r>r@Zr3r+r,Zngens1Zngens2Zngens3r?rA�i3�aZanswer1r4Zanswer2r r r!�check_associativity�sD&��"����"��rTcCsng}tt|��D]X}|d}td�}|dD],}|tt|�d���9}|tt|�7}q,|�||g�q|S)z�
    EXAMPLES::

        sage: from admcycles.DR.algebra import kappa_conversion
        sage: kappa_conversion((1, 1, 1))
        [[3*X, 1], [X^2 + X, 3], [X^3, 2]]
    rr)	r�listrrr6�	factorialr�sumr:��sigmarE�spart�coeff�poly�partr r r!�kappa_conversions	r^cCsng}tt|��D]X}|ddt|�t|d�}td�}|dD]}|tt|�7}qD|�||g�q|S)z�
    EXAMPLES::

        sage: from admcycles.DR.algebra import kappa_conversion_inverse
        sage: kappa_conversion_inverse((1, 1, 1))
        [[3*X, 1], [X^2 + X, -3], [X^3, 1]]
    rr0r)rrUr6rrrWr:rXr r r!�kappa_conversion_inverse$s	 r_c	Cs2g}t|||||�}g}g}td|j���D]x}	|�|j|	dfd�|�g�td|d�D].}
t|j|	df|
�D]}|d�|
�qzq`tt|d��|d<q,tj|�D]|}d}
t	|j�}td|j���D]>}	||	d||	dd|j|	df<|
||	dd9}
q�|�t
|||||�|
f�q�|S)a
    EXAMPLES::

        sage: from admcycles.DR.algebra import convert_to_monomial_basis

        sage: convert_to_monomial_basis(1, 2, 3, (1, 2, 3))
        [(1, 1), (0, 1)]
        sage: convert_to_monomial_basis(2, 2, 3, (1, 2, 3))
        [(2, 1), (1, 3), (0, 2)]
    rrr0)rrr2r8r:r^rr<r=rr��numr*r)r+r,rE�GZ	genus_vecZ	kappa_vecr&r4rN�choicer[�GGr r r!�convert_to_monomial_basis7s&

&rec	Cs2g}t|||||�}g}g}td|j���D]x}	|�|j|	dfd�|�g�td|d�D].}
t|j|	df|
�D]}|d�|
�qzq`tt|d��|d<q,tj|�D]|}d}
t	|j�}td|j���D]>}	||	d||	dd|j|	df<|
||	dd9}
q�|�t
|||||�|
f�q�|S)Nrrr0)rrr2r8r:r_rr<r=rrr`r r r!�convert_to_pushforward_basisYs*

�

&rfc	Csnt|�}dd�t|�D�}t|�D]F}||dkr"t|||||�D]$}||d|d||7<qBq"|S)a�
    EXAMPLES::

        sage: from admcycles.DR.moduli import MODULI_SM, MODULI_RT, MODULI_CT, MODULI_ST
        sage: from admcycles.DR.algebra import convert_vector_to_monomial_basis
        sage: convert_vector_to_monomial_basis(vec=(-24504480, 1663200, -36000), g=8, r=3, markings=(), moduli_type=MODULI_SM)
        [-22913280, 1555200, -36000]
        sage: convert_vector_to_monomial_basis(vec=(0, 0, -15, 0, 15, 15, 0, 0, 0), g=2, r=2, markings=(1, 2), moduli_type=MODULI_RT)
        [0, 0, -15, 0, 15, 15, 0, 0, 0]
        sage: convert_vector_to_monomial_basis(vec=(71820, -7020, 9720, -41580, 9288, -3240, -18900, 756), g=2, r=2, markings=(1,), moduli_type=MODULI_CT)
        [64800, -7020, 9720, -41580, 9288, -3240, -18900, 756]
        sage: convert_vector_to_monomial_basis(vec=(81/2, -45/2, -45/2, -45/2, 9/2, 9/2, 9/2, -27/2, -9/4), g=1, r=1, markings=(1, 2, 3), moduli_type=MODULI_ST)
        [81/2, -45/2, -45/2, -45/2, 9/2, 9/2, 9/2, -27/2, -9/4]
    cSsg|]}d�qSr#r r$r r r!r'�r(z4convert_vector_to_monomial_basis.<locals>.<listcomp>rr)r6rre�	�vecr*r)r+r,�l�vec2r&�xr r r!� convert_vector_to_monomial_basisqs$rlc	Csnt|�}dd�t|�D�}t|�D]F}||dkr"t|||||�D]$}||d|d||7<qBq"|S)NcSsg|]}d�qSr#r r$r r r!r'�r(z7convert_vector_to_pushforward_basis.<locals>.<listcomp>rr)r6rrfrgr r r!�#convert_vector_to_pushforward_basis�s$rmc	CsJg}|D]8\}}	t|||||||�D]\}
}|�|
|	|g�q$qt|�S)zR
    Return the multiplication of the sparse vector ``vec`` by a kappa-class.
    )�single_kappa_multipler:r)rh�which_kappar*r)rrr,rjrar[�num2�coeff2r r r!�kappa_multiple�s
rrc	CsJg}|D]8\}}	t|||||||�D]\}
}|�|
|	|g�q$qt|�S)zP
    Return the multiplication of the sparse vector ``vec`` by a psi-class.
    )�single_psi_multipler:r)rh�	which_psir*r)rrr,rjrar[rprqr r r!�psi_multiple�s
ruFc
CsTg}|D]B}	t|	d|||||||�D]"}
|�|
d|	d|
dg�q&qt|�S)zd
    For a relation ``vec`` we return its pullback along the forgetfulmap that forgets a point.
    rr)�single_insertion_pullbackr:r)rh�new_markr*r)rrr,�
from_smallrjrk�yr r r!�insertion_pullback�s
"rzc	Csjt||�}t|||||�}g}	td|j���D]}
|jd|
f|kr.|
}qNq.td|j���D�]}|j||fdkr^d}
d}td|d�D]}
||
|j|df|
7}q�td|j���D]B}
||j||
fd|j||
fd7}|
|j||
fd7}
q�|t|j|dfd|
|�k�r^t|j�}|j||ft7<|	�	t
|||d||�df��qfq^|	S)a�
    Takes the index of a stratum ``num`` and returns the stratum in degree ``r+1``
    (as a sparse vector of length 1) corresponding to its multiplication by a psi-class.

    EXAMPLES::

        sage: from admcycles.DR.moduli import MODULI_RT, MODULI_CT, MODULI_ST
        sage: from admcycles.DR.algebra import single_psi_multiple
        sage: single_psi_multiple(5, 1, 2, 2, 2, 0, MODULI_ST)
        [(11, 1)]
    rrr)r"rrr2r9r8rrrr:r)rartr*r)rrr,r+rbrEr4Zgood_jr&�deg�dim_usedrdr r r!rs�s0
( 
�rsc
Cs�t||�}t|||||�}g}	td|j���D�]�}
d}d}td|d�D]}
||
|j|
df|
7}qJtd|j���D]B}
||j|
|
fd|j|
|
fd7}||j|
|
fd7}qz||t|j|
dfd||�kr.t|j�}|j|
dft|7<|	�	t
||||||�df�td|d�D]�}
|j|
df|
dk�r0t|j�}|j|
dft|
|7<|j|
dft|
8<|	�	t
||||||�|j|
df|
f��q0q.|	S)z�
    Takes the index of a stratum ``num`` and returns the index of its multiplication by a kappa-class.
    This uses the multi-indexed pushforward kappa-classes, rather than monomials in kappa-classes.
    rrr)r"rrr2r8r9rrrr:r)raror*r)rrr,r+rbrEr&r{r|r4rdr r r!rn�s<
("
��
��rnc	s.ttd|d��}t|||||��t�j�}td�j���D]r}	|jd|	fdkr<td�j���D]J}
|j|
|	fdkrb|j|
|	f||jd|	fddt7<q<qbq<|t|�t|�}g}�fdd�tt	|��D�}
t
j|
�D�]:}t|j�}tt	|��D](}
|j||
dft||
7<�qd}td|j���D]�}
d}d}td|d�D] }	||	|j|
df|	7}�q`td|j���D]D}	||j|
|	fd|j|
|	fd7}||j|
|	fd7}�q�|t|j|
dfd||�k�rFd}�q�qF|�rq�|�
t|||||�df�q�|S)Nrrcs g|]}ttd�j�����qSr)rUrr2r8r$�rbr r!r's�z-single_kappa_psi_multiple.<locals>.<listcomp>FrT)rrrrr2r9r8rrWr6r<r=rr:r)raZkappa_partitionZpsi_expsr*r)rr,r+rdr4r&�rnewrEZ
kappa_optionsZ
kappa_distrib�GGGZis_badr{r|r r}r!�single_kappa_psi_multiplesH
0

�
&( 
�r�cs(t||�}|dkr&t|d|d�}	nt|d|�}	|rJt||||t�}
nt|||||�}
g}td|
j���D�]��t|
j��|dkr�|dks�td|
j���D]0}�jd|fd|kr��jd|fd7<q����d|�|�	t
�|||	|�df�td|d�D]|}t�j�df|�D]^}
t�j�}|j�dft|8<|j�df|t7<|�	t
||||	|�df��q �q|tk�r�qntd|
j���D�]~}|
j�|fddk�r�|
j�|fddk�r�|
j�|fd}t�j�}��fdd�t�j���D�}dd�t�j���D�}d||<d|d<d||<d|d<|�
�||�|jd|dt7<|�	t
||||	|�df�|�s�|
j�|fddk�r�|
j�|fddk�s�|
j�|fddk�r�|
j�|fd}|
j�|fd}��fd	d�t�j���D�}d
d�t�j���D�}d||<d|d<d||<d|d<|dk�r�d|t||<t�j�}|�
�||�|jd|dt7<|�	t
||||	|�df�|dk�r�d|t||<t�j�}|�
�||�|jd|dt7<|�	t
||||	|�df��q�qn|S)a"
    Takes the index of a stratum ``num`` and returns the sparse vector
    representation of its pullback along the forgetfulmap that foregets a
    point.

    EXAMPLES::

        sage: from admcycles.DR.algebra import single_insertion_pullback

        sage: single_insertion_pullback(0, 1, 5, 2, 0, 0, 1, False)
        [(0, 1), (3, -1)]
        sage: single_insertion_pullback(1, 1, 5, 2, 0, 0, 1, False)
        [(1, 1), (2, -1), (2, -1)]
        sage: single_insertion_pullback(10, 1, 2, 2, 1, 0, 3, False)
        [(25, 1), (27, -1)]
    rrr0csg|]}�j�|f�qSr r1�r%rN�rdr&r r!r'Yr(z-single_insertion_pullback.<locals>.<listcomp>cSsg|]}d�qSr#r r�r r r!r'Zr()�����r0rcsg|]}�j�|f�qSr r1r�r�r r!r'ir(cSsg|]}d�qSr#r r�r r r!r'jr()r"rrrr2r8rr9�add_edger:rrrZsplit_vertex)rarwr*r)rrr,rxr+�new_markingsrbrEr4rNrrk�row1�row2ryr r�r!rv&s�

�
�



��0



��



��
rv)/�__doc__r<�sage.misc.cachefuncr�sage.rings.integer_ringr� sage.modules.free_module_elementr�graphrrrr	r
rrr
rrrrr�modulirrrrr�utilsrrr"r7rTr^r_rerfrlrmrrrurzrsrnr�rvr r r r!�<module>s@<T%

!
& &