129129from sage .rings .asymptotic .asymptotic_ring import AsymptoticRing
130130from sage .rings .ideal import Ideal
131131from sage .rings .imaginary_unit import I
132+ from sage .rings .fraction_field import FractionField
132133from sage .rings .polynomial .polynomial_ring_constructor import PolynomialRing
133134from sage .rings .qqbar import AA , QQbar
134135from sage .rings .rational_field import QQ
136+ from sage .schemes .affine .affine_space import AffineSpace
135137from sage .symbolic .constants import pi
136138from sage .symbolic .ring import SR
137139
138140from sage_acsv .kronecker import _kronecker_representation
139141from sage_acsv .helpers import (
140142 ACSVException ,
143+ Restriction ,
141144 is_contributing ,
142145 compute_newton_series ,
143146 rational_function_reduce ,
148151from sage_acsv .debug import Timer , acsv_logger
149152from sage_acsv .settings import ACSVSettings
150153from sage_acsv .whitney import whitney_stratification
151- from sage_acsv .groebner import compute_primary_decomposition , compute_saturation
154+ from sage_acsv .groebner import compute_primary_decomposition , compute_saturation , compute_radical
152155
153156
154157# we need to monkeypatch a function from the asymptotics module such that creating
@@ -778,18 +781,28 @@ def compute_asymptotic_contribution(
778781 unit , all_factors , all_multiplicities = _get_factorization (R (H ))
779782 unit , all_factors , all_multiplicities = SR (unit ), [SR (f ) for f in all_factors ], [SR (f ) for f in all_multiplicities ]
780783
784+ fvs = list (set ([v for ri in r for v in SR (ri ).variables ()] + [v for cpi in cp for v in SR (cpi ).variables ()]))
785+ Rf = PolynomialRing (QQ , len (fvs ), fvs )
786+
781787 asymptotics = []
788+ restrictions = []
782789
783790 # Since critical point might be symbolic, we need to consider all flats it may lie on
784- for factor_multiplicities in Combinations (zip ( all_factors , all_multiplicities )):
785- if not factor_multiplicities :
791+ for combo in Combinations (list ( range ( len ( all_factors )) )):
792+ if not combo :
786793 continue
787- factors , multiplicities = zip (* factor_multiplicities )
794+ factors = [all_factors [i ] for i in combo ]
795+ multiplicities = [all_multiplicities [i ] for i in combo ]
796+
797+ valid_set = Restriction (Rf )
798+ valid_set .setminus (
799+ [all_factors [j ] for j in range (len (all_factors )) if j not in combo ]
800+ )
801+
788802 # Determine whether it's possible for the critical point vanish in this
789803 # combination of factors
790804 if any ([f .subs (subs_dict ) != 0 for f in factors ]):
791- # TODO - check if some parameters allow this to hold in certain conditions
792- continue
805+ valid_set .intersection ([f .subs (subs_dict ) for f in factors ])
793806
794807 s = len (factors )
795808 normals = matrix (
@@ -799,6 +812,12 @@ def compute_asymptotic_contribution(
799812 raise ACSVException (
800813 "Not a transverse intersection. Cannot deal with this case."
801814 )
815+ else :
816+ try :
817+ Id_minors = [Rf (f ) for f in normals .minors (s )]
818+ valid_set .setminus (Id_minors )
819+ except :
820+ valid_set = None
802821
803822 # Step 2: Find the locally parametrizing coordinates of the point pt
804823 # Since we have d variables and s factors, there should be d-s of these
@@ -815,6 +834,11 @@ def compute_asymptotic_contribution(
815834 if Jac .determinant () != 0 :
816835 break
817836
837+ try :
838+ valid_set = valid_set .setminus ([Jac .determinant ()])
839+ except :
840+ valid_set = None
841+
818842 acsv_logger .info ("Variables do not parametrize, shuffling" )
819843 vs_r_cp = list (zip (vs , r , cp ))
820844 shuffle (vs_r_cp ) # shuffle mutates the list
@@ -823,16 +847,17 @@ def compute_asymptotic_contribution(
823847 raise ACSVException ("Cannot find parametrizing set." )
824848
825849 expansion , constant_squared , base , exponent , s = _compute_asm_quantity (
826- G , H , vs , cp , r , subs_dict , unit ,factors , multiplicities , 1
850+ G , H , vs , cp , r , subs_dict , unit ,factors , multiplicities , 1
827851 )
828852 constant = constant_squared .sqrt ()
829853
830854 n = SR .var ("n" )
831855 asymptotics .append (base ** n * n ** exponent * (pi ** (s - d )).sqrt () * constant * expansion )
856+ restrictions .append (valid_set )
832857
833858 # TODO: If input parameters are rational, do some extra checking of validity
834859
835- return asymptotics
860+ return restrictions , asymptotics
836861
837862def _compute_asm_quantity (G , H , vs , cp , r , subs_dict , unit , factors , multiplicities , expansion_precision ):
838863 s = len (factors )
0 commit comments