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

��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|dkr
ttd|d��Sd|ttd||d��S)Nrr�r�)�tuple�range)�n�symm�r �8/home/user/Introduction lectures/admcycles/DR/algebra.py�	get_markssr"r c5s<t�||���}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}nqv|s�Jd��d}tt
||��D]}|j|||jkr�||f}d}nq�|s�Jd��||kr�t||||�|���S||f|
vr�|S|
||fD�]�}||d	d	|d	d�g}�tk�rtd�j�
��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�]A}|dD�]8}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|"|<�q�dd�t|j�
��D�}#td|j�
��D]}|dd	|dd	|d	|ddd|#|<�q�dd�t|j���D�}$td|j���D]}|dd|dd|d|ddd|$|<�qg}%g}&t��}'td|j�
��D]�}td|j���D]��|j|�fd	d	k�r�|j|�fd	dk�r�|j|�fdd	k�r�|"�}(|!|D]#})�j|)|(fd	k�r�| j|)|(f|j|�fdt7<n�qw�qI|j|�fdd	k�r�|'d
9}'�qI|"�}(|%�|j|�fd|j|�fd
g|j|�fd
|j|�fdgg�|&�|(g�|!|D]})t�j|)|(fd	�D]
}*|&d�|)��q�q�qI�q?td|j�
��D]�}td|j���D]‰|j|�fd	d	k�r�|j|�fd	dk�rt|j|�fdd	k�rr|j|�fd	dk�rr|$�}(|#|D]#})�j|)|(fd	k�rp| j|)|(f|j|�fdt7<n�qN�q|j|�fdd	k�r�|'d
9}'�q|$�}(|%�|j|�fd|j|�fd
g|j|�fd
|j|�fdgg�|&�|(g�|#|D]})t�j|)|(fd	�D]
}*|&d�|)��qȐq��q�q
g}+g},td|j�
��D])}td|d�D]}-t|j|d	f|-�D]}*|+�|!|�|,�|-��q��q�q�td|j�
��D])}td|d�D]}-t|j|d	f|-�D]}*|+�|#|�|,�|-��q-�q �qg}.|D]B���fdd�td�j�
��D�}/t
|/�d
k�ro|.�|/d	�g|/d�gg��qE|%�d	dgdd	gg�|&��|/d	|/d	g��qEtj|%�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<�q�|3j|&|d
|&|d	f|0|dt7<�q�tt
|,��D]}|3j|1|d	ft|,|7<�q|2D]}|3j|d	|dft7<�q&|D]-}*|3j|*d
|3j|*dk�rg|3j|*|3j|*d
|3j|*dttd
7<�q;|3��||d	D]}4t|3|	|4��r�||4dt
|�|'|7<n�qs�q��q��q��q_�qXq�|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]
    cS�g|]}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 failedrrcSr#r$r r%r r r!r(wr)�cSr#r$r r%r r r!r({r)cSr#r$r r%r r r!r(r)��cSr#r$r r%r r r!r(�r)�����cs&g|]}�j|�fddkr|�qSr$��Mr%)�H�jr r!r(�s&)r
r	rrrrrr3Zpurify�	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 )r4r+r5r,r-r!r8s�+
�

��
���
������������(��& ��������& �������� "

��
�
�
�
�
�

�"��
�����������tr8cCs�t||||�}t||||�}t||||�}t�t|�t|�t|��D]�\}	}
}t||	||
||||||�}tdd�tt||||||��D��}
tt|||||��D]"}||dkr^qU|
||tt|||||||||||��7}
qUt||	||||||||�}tdd�tt||||||��D��}tt|||||��D]"}||dkr�q�|||tt|||||
||||||��7}q�|
|kr�td|	|
|f��q"dS)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)
    cSr#r$r r%r r r!r(�r)z'check_associativity.<locals>.<listcomp>rcSr#r$r r%r r r!r(r)zi1=%s i2=%s i3=%sN)rr=r>rr8r�
ValueError)r+r?rAZr3r,r-Zngens1Zngens2Zngens3r@rB�i3�aZanswer1r5Zanswer2r r r!�check_associativity�sH$��"����"����rUcCsng}tt|��D],}|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�listrrr7�	factorialr�sumr;��sigmarF�spart�coeff�poly�partr r r!�kappa_conversions	r_cCsng}tt|��D],}|ddt|�t|d�}td�}|dD]
}|tt|�7}q"|�||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]]
    rr1r)rrVr7rrrXr;rYr r r!�kappa_conversion_inverse$s	 r`c	C�2g}t|||||�}g}g}td|j���D]<}	|�|j|	dfd�|�g�td|d�D]}
t|j|	df|
�D]	}|d�|
�q=q0tt|d��|d<qtj|�D]>}d}
t	|j�}td|j���D]}	||	d||	dd|j|	df<|
||	dd9}
qi|�t
|||||�|
f�qX|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)]
    rrr1)rrr3r9r;r_rr=r>rr��numr+r*r,r-rF�GZ	genus_vecZ	kappa_vecr'r5rO�choicer\�GGr r r!�convert_to_monomial_basis7s(
�
&rgc	Cra)Nrrr1)rrr3r9r;r`rr=r>rrrbr r r!�convert_to_pushforward_basisYs,
�

�
&rhc	C�nt|�}dd�t|�D�}t|�D]#}||dkr4t|||||�D]}||d|d||7<q!q|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]
    cSr#r$r r%r r r!r(�r)z4convert_vector_to_monomial_basis.<locals>.<listcomp>rr)r7rrg�	�vecr+r*r,r-�l�vec2r'�xr r r!� convert_vector_to_monomial_basisqs"�roc	Cri)NcSr#r$r r%r r r!r(�r)z7convert_vector_to_pushforward_basis.<locals>.<listcomp>rr)r7rrhrjr r r!�#convert_vector_to_pushforward_basis�s"�rpc	C�Jg}|D]\}}	t|||||||�D]
\}
}|�|
|	|g�qqt|�S)zR
    Return the multiplication of the sparse vector ``vec`` by a kappa-class.
    )�single_kappa_multipler;r)rk�which_kappar+r*rrr-rmrcr\�num2�coeff2r r r!�kappa_multiple���rvc	Crq)zP
    Return the multiplication of the sparse vector ``vec`` by a psi-class.
    )�single_psi_multipler;r)rk�	which_psir+r*rrr-rmrcr\rtrur r r!�psi_multiple�rwrzFc
CsTg}|D]!}	t|	d|||||||�D]}
|�|
d|	d|
dg�qqt|�S)zd
    For a relation ``vec`` we return its pullback along the forgetfulmap that forgets a point.
    rr)�single_insertion_pullbackr;r)rk�new_markr+r*rrr-�
from_smallrmrn�yr r r!�insertion_pullback�s �rc	Csft||�}t|||||�}g}	td|j���D]}
|jd|
f|kr&|
}nqtd|j���D]�}|j||fdkr�d}
d}td|d�D]}
||
|j|df|
7}qEtd|j���D]!}
||j||
fd|j||
fd7}|
|j||
fd7}
q]|t|j|dfd|
|�kr�t|j�}|j||ft7<|	�	t
|||d||�df�|	Sq/|	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rr3r:r9rrrr;r)rcryr+r*rrr-r,rdrFr5Zgood_jr'�deg�dim_usedrfr r r!rx�s6

�(
��rxc
Cs�t||�}t|||||�}g}	td|j���D]�}
d}d}td|d�D]}
||
|j|
df|
7}q$td|j���D]!}
||j|
|
fd|j|
|
fd7}||j|
|
fd7}q<||t|j|
dfd||�kr�t|j�}|j|
dft|7<|	�	t
||||||�df�td|d�D]E}
|j|
df|
dkr�t|j�}|j|
dft|
|7<|j|
dft|
8<|	�	t
||||||�|j|
df|
f�q�q|	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rr3r9r:rrrr;r)rcrsr+r*rrr-r,rdrFr'r�r�r5rfr r r!rr�s>
("
��
���rrc	sttd|d��}t|||||��t�j�}td�j���D]9}	|jd|	fdkrWtd�j���D]%}
|j|
|	fdkrV|j|
|	f||jd|	fddt7<nq1q|t|�t|�}g}�fdd�tt	|��D�}
t
j|
�D]�}t|j�}tt	|��D]}
|j||
dft||
7<q�d}td|j���D]Z}
d}d}td|d�D]}	||	|j|
df|	7}q�td|j���D]!}	||j|
|	fd|j|
|	fd7}||j|
|	fd7}q�|t|j|
dfd||�kr�d}nq�|r�qv|�
t|||||�df�qv|S)Nrrcs g|]}ttd�j�����qSr)rVrr3r9r%�rdr r!r(s�z-single_kappa_psi_multiple.<locals>.<listcomp>FrT)rrrrr3r:r9rrXr7r=r>rr;r)rcZkappa_partitionZpsi_expsr+r*rr-r,rfr5r'�rnewrFZ
kappa_optionsZ
kappa_distrib�GGGZis_badr�r�r r�r!�single_kappa_psi_multiplesN
0��

�
$(��r�cs t||�}|dkrt|d|d�}	nt|d|�}	|r%t||||t�}
nt|||||�}
g}td|
j���D�]Չt|
j��|dkrG|dkshtd|
j���D]}�jd|fd|krg�jd|fd7<qO���d|�|�	t
�|||	|�df�td|d�D]<}t�j�df|�D].}
t�j�}|j�dft|8<|j�df|t7<|�	t
||||	|�df�q�q�|tkr�q7td|
j���D�]>}|
j�|fddk�rB|
j�|fddk�rB|
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�si|
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�q7|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)]
    rrr1c�g|]	}�j�|f�qSr r2�r&rO�rfr'r r!r(Y�z-single_insertion_pullback.<locals>.<listcomp>cSr#r$r r�r r r!r(Zr))�����r1rcr�r r2r�r�r r!r(ir�cSr#r$r r�r r r!r(jr))r"rrrr3r9rr:�add_edger;rrrZsplit_vertex)rcr|r+r*rrr-r}r,�new_markingsrdrFr5rOr�rn�row1�row2r~r r�r!r{&s�

��
��


��0



��



����+r{)/�__doc__r=�sage.misc.cachefuncr�sage.rings.integer_ringr� sage.modules.free_module_elementr�graphrrrr	r
rrr
rrrrr�modulirrrrr�utilsrrr"r8rUr_r`rgrhrorprvrzrrxrrr�r{r r r r!�<module>sB<T%

!
& &