On Saturday, July 2, 2016 at 7:13:41 PM UTC+1, saad khalid wrote:
>
> Hey everyone:
>
> I was hoping some of you could provide some insight where my knowledge is 
> lacking. I'm trying to add to the M2/Sage interface by adding a conversion 
> for the M2 Divide class. Sage can already convert polynomials, so my hope 
> was to just have it treat the Divide class as two polynomials, one in the 
> numerator and the other in the denominator. 
>

Why? Sage can work with multivariate rational functions just fine:

sage: R.<x,y>=QQ[]
sage: f=x*y
sage: g=x^2+y^2
sage: f/g
x*y/(x^2 + y^2)
sage: type(f/g)
<type 'sage.rings.fraction_field_element.FractionFieldElement'>
sage: 


 

> Here is an example of an object in the divide class:
> macaulay2.eval("""
> K = toField(QQ[zet]/(zet^8 - zet^7 +zet^5 - zet^4 +zet^3 -zet + 1))
> A=matrix{{zet^1,0},{0,zet^13}}
> needsPackage "InvariantRing"
> G=generateGroup({A},K)
> P = molienSeries G
>  """)
>
> M2 can provide you numerator and denominator of a Divide object, and then
you can use the existing Sage code to convert these two polynomials, and 
then form the fraction.


HTH,
Dmitrii


 

> P is a "Divide" object. Here is an example of Sage converting a polynomial 
> from M2 to Sage:
> macaulay2.eval(""" 
> needsPackage "Points"; 
> M = matrix{{1,2,3},{4,5,6}}
> R = QQ[x,y,MonomialOrder=>Lex]; 
> (Q,inG,G) = points(M,R) 
> G#0
> ring G#0
> """) 
> G0 = macaulay2('G#0').to_sage(); G0
>
> G in M2 is a list of polynomials, and G#0 is the first one. Here's what it 
> looks like:
>
>  3      2
> y  - 15y  + 74y - 120
>
> I convert this to a sage object, G0, and it appears as:
>
> y^3 - 15*y^2 + 74*y - 120
>
> The part that I really need is where Sage changes M2's two-line display for 
> exponents on variables to just the standard Sage notation. I'm looking at the 
> to_sage()
> method in the source code but I can't seem to figure out how it's doing it. 
> Am I missing something obvious? G#0 is a polynomial ring I believe, and here 
> is the code in the to_sage function for PolynomialRings:
>             elif cls_str == "PolynomialRing":
>                 from sage.rings.all import PolynomialRing
>                 from sage.rings.polynomial.term_order import 
> inv_macaulay2_name_mapping
>
>                 #Get the base ring
>                 base_ring = self.coefficientRing().to_sage()
>
>                 #Get a string list of generators
>                 gens = str(self.gens())[1:-1]
>
>                 # Check that we are dealing with default degrees, i.e. 1's.
>                 if self.degrees().any("x -> x != {1}").to_sage():
>                     raise ValueError("cannot convert Macaulay2 polynomial 
> ring with non-default degrees to Sage")
>                 #Handle the term order
>                 external_string = self.external_string()
>                 order = None
>                 if "MonomialOrder" not in external_string:
>                     order = "degrevlex"
>                 else:
>                     for order_name in inv_macaulay2_name_mapping:
>                         if order_name in external_string:
>                             order = inv_macaulay2_name_mapping[order_name]
>                 if len(gens) > 1 and order is None:
>                     raise ValueError("cannot convert Macaulay2's term order 
> to a Sage term order")
>
>                 return PolynomialRing(base_ring, order=order, names=gens)
>
>
> Where in this code does that conversion happen? It's like parsing ascii 
> art...
>
> Thanks!
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"sage-devel" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to sage-devel+unsubscr...@googlegroups.com.
To post to this group, send email to sage-devel@googlegroups.com.
Visit this group at https://groups.google.com/group/sage-devel.
For more options, visit https://groups.google.com/d/optout.

Reply via email to