"""Interface to macaulay2."""fromsage.categories.homsetimportHomfromsage.rings.polynomial.polynomial_ring_constructorimportPolynomialRingfromsage.rings.rational_fieldimportQQfromsage_acsv.settingsimportACSVSettingsdef_construct_m2_morphims(ideal):R=ideal.gens()[0].parent()n=len(R.gens())RM2=PolynomialRing(QQ,n,[f"x{i}"foriinrange(n)])vs=list(RM2.gens())mor=Hom(R,RM2)(vs)inv=mor.inverse()returnmor,inv
[docs]defcompute_primary_decomposition(ideal):"""Return the primary decomposition of an ideal, computed via Macaulay2. INPUT: * ``ideal`` - A polynomial ideal """mor,inv=_construct_m2_morphims(ideal)ideal=ideal.apply_morphism(mor)m2=ACSVSettings.get_macaulay2()returniter(J.sage().apply_morphism(inv)forJinm2.decompose(ideal))
[docs]defcompute_groebner_basis(ideal):"""Return a Groebner basis of an ideal, computed via Macaulay2. INPUT: * ``ideal`` - A polynomial ideal """mor,inv=_construct_m2_morphims(ideal)ideal=ideal.apply_morphism(mor)m2=ACSVSettings.get_macaulay2()# This is really roundabout but for some reason returning the generators# from M2 to sage puts them in the wrong ringreturnm2.ideal(m2.gb(ideal).generators()).sage().apply_morphism(inv).gens()
[docs]defcompute_radical(ideal):"""Return the radical of an ideal, computed via Macaulay2. INPUT: * ``ideal`` - A polynomial ideal """mor,inv=_construct_m2_morphims(ideal)ideal=ideal.apply_morphism(mor)m2=ACSVSettings.get_macaulay2()returnm2.radical(ideal).sage().apply_morphism(inv)