Newton Polygons¶
This module implements finite Newton polygons and infinite Newton polygons having a finite number of slopes (and hence a last infinite slope).
- class sage.geometry.newton_polygon.NewtonPolygon_element(polyhedron, parent)[source]¶
Bases:
Element
Class for infinite Newton polygons with last slope.
- last_slope()[source]¶
Return the last (infinite) slope of this Newton polygon if it is infinite and
+Infinity
otherwise.EXAMPLES:
sage: from sage.geometry.newton_polygon import NewtonPolygon sage: NP1 = NewtonPolygon([ (0,0), (1,1), (2,8), (3,5) ], last_slope=3) sage: NP1.last_slope() 3 sage: NP2 = NewtonPolygon([ (0,0), (1,1), (2,5) ]) sage: NP2.last_slope() +Infinity
>>> from sage.all import * >>> from sage.geometry.newton_polygon import NewtonPolygon >>> NP1 = NewtonPolygon([ (Integer(0),Integer(0)), (Integer(1),Integer(1)), (Integer(2),Integer(8)), (Integer(3),Integer(5)) ], last_slope=Integer(3)) >>> NP1.last_slope() 3 >>> NP2 = NewtonPolygon([ (Integer(0),Integer(0)), (Integer(1),Integer(1)), (Integer(2),Integer(5)) ]) >>> NP2.last_slope() +Infinity
from sage.geometry.newton_polygon import NewtonPolygon NP1 = NewtonPolygon([ (0,0), (1,1), (2,8), (3,5) ], last_slope=3) NP1.last_slope() NP2 = NewtonPolygon([ (0,0), (1,1), (2,5) ]) NP2.last_slope()
We check that the last slope of a sum (resp. a product) is the minimum of the last slopes of the summands (resp. the factors):
sage: (NP1 + NP2).last_slope() 3 sage: (NP1 * NP2).last_slope() 3
>>> from sage.all import * >>> (NP1 + NP2).last_slope() 3 >>> (NP1 * NP2).last_slope() 3
(NP1 + NP2).last_slope() (NP1 * NP2).last_slope()
- plot(**kwargs)[source]¶
Plot this Newton polygon.
Note
All usual rendering options (color, thickness, etc.) are available.
EXAMPLES:
sage: from sage.geometry.newton_polygon import NewtonPolygon sage: NP = NewtonPolygon([ (0,0), (1,1), (2,6) ]) sage: polygon = NP.plot() # needs sage.plot
>>> from sage.all import * >>> from sage.geometry.newton_polygon import NewtonPolygon >>> NP = NewtonPolygon([ (Integer(0),Integer(0)), (Integer(1),Integer(1)), (Integer(2),Integer(6)) ]) >>> polygon = NP.plot() # needs sage.plot
from sage.geometry.newton_polygon import NewtonPolygon NP = NewtonPolygon([ (0,0), (1,1), (2,6) ]) polygon = NP.plot() # needs sage.plot
- reverse(degree=None)[source]¶
Return the symmetric of
self
.INPUT:
degree
– integer (default: the top right abscissa of this Newton polygon)
OUTPUT:
The image this Newton polygon under the symmetry ‘(x,y) mapsto (degree-x, y)`.
EXAMPLES:
sage: from sage.geometry.newton_polygon import NewtonPolygon sage: NP = NewtonPolygon([ (0,0), (1,1), (2,5) ]) sage: NP2 = NP.reverse(); NP2 Finite Newton polygon with 3 vertices: (0, 5), (1, 1), (2, 0)
>>> from sage.all import * >>> from sage.geometry.newton_polygon import NewtonPolygon >>> NP = NewtonPolygon([ (Integer(0),Integer(0)), (Integer(1),Integer(1)), (Integer(2),Integer(5)) ]) >>> NP2 = NP.reverse(); NP2 Finite Newton polygon with 3 vertices: (0, 5), (1, 1), (2, 0)
from sage.geometry.newton_polygon import NewtonPolygon NP = NewtonPolygon([ (0,0), (1,1), (2,5) ]) NP2 = NP.reverse(); NP2
We check that the slopes of the symmetric Newton polygon are the opposites of the slopes of the original Newton polygon:
sage: NP.slopes() [1, 4] sage: NP2.slopes() [-4, -1]
>>> from sage.all import * >>> NP.slopes() [1, 4] >>> NP2.slopes() [-4, -1]
NP.slopes() NP2.slopes()
- slopes(repetition=True)[source]¶
Return the slopes of this Newton polygon.
INPUT:
repetition
– boolean (default:True
)
OUTPUT:
The consecutive slopes (not including the last slope if the polygon is infinity) of this Newton polygon.
If
repetition
is True, each slope is repeated a number of times equal to its length. Otherwise, it appears only one time.EXAMPLES:
sage: from sage.geometry.newton_polygon import NewtonPolygon sage: NP = NewtonPolygon([ (0,0), (1,1), (3,6) ]); NP Finite Newton polygon with 3 vertices: (0, 0), (1, 1), (3, 6) sage: NP.slopes() [1, 5/2, 5/2] sage: NP.slopes(repetition=False) [1, 5/2]
>>> from sage.all import * >>> from sage.geometry.newton_polygon import NewtonPolygon >>> NP = NewtonPolygon([ (Integer(0),Integer(0)), (Integer(1),Integer(1)), (Integer(3),Integer(6)) ]); NP Finite Newton polygon with 3 vertices: (0, 0), (1, 1), (3, 6) >>> NP.slopes() [1, 5/2, 5/2] >>> NP.slopes(repetition=False) [1, 5/2]
from sage.geometry.newton_polygon import NewtonPolygon NP = NewtonPolygon([ (0,0), (1,1), (3,6) ]); NP NP.slopes() NP.slopes(repetition=False)
- vertices(copy=True)[source]¶
Return the list of vertices of this Newton polygon.
INPUT:
copy
– boolean (default:True
)
OUTPUT: the list of vertices of this Newton polygon (or a copy of it if
copy
is set to True)EXAMPLES:
sage: from sage.geometry.newton_polygon import NewtonPolygon sage: NP = NewtonPolygon([ (0,0), (1,1), (2,5) ]); NP Finite Newton polygon with 3 vertices: (0, 0), (1, 1), (2, 5) sage: v = NP.vertices(); v [(0, 0), (1, 1), (2, 5)]
>>> from sage.all import * >>> from sage.geometry.newton_polygon import NewtonPolygon >>> NP = NewtonPolygon([ (Integer(0),Integer(0)), (Integer(1),Integer(1)), (Integer(2),Integer(5)) ]); NP Finite Newton polygon with 3 vertices: (0, 0), (1, 1), (2, 5) >>> v = NP.vertices(); v [(0, 0), (1, 1), (2, 5)]
from sage.geometry.newton_polygon import NewtonPolygon NP = NewtonPolygon([ (0,0), (1,1), (2,5) ]); NP v = NP.vertices(); v
- class sage.geometry.newton_polygon.ParentNewtonPolygon[source]¶
Bases:
Parent
,UniqueRepresentation
Construct a Newton polygon.
INPUT:
arg
– list/tuple/iterable of vertices or of slopes. Currently, slopes must be rational numberssort_slopes
– boolean (default:True
); whether slopes must be first sortedlast_slope
– rational or infinity (default:Infinity
); the last slope of the Newton polygon
OUTPUT: the corresponding Newton polygon
Note
By convention, a Newton polygon always contains the point at infinity \((0, \infty)\). These polygons are attached to polynomials or series over discrete valuation rings (e.g. padics).
EXAMPLES:
We specify here a Newton polygon by its vertices:
sage: from sage.geometry.newton_polygon import NewtonPolygon sage: NewtonPolygon([ (0,0), (1,1), (3,5) ]) Finite Newton polygon with 3 vertices: (0, 0), (1, 1), (3, 5)
>>> from sage.all import * >>> from sage.geometry.newton_polygon import NewtonPolygon >>> NewtonPolygon([ (Integer(0),Integer(0)), (Integer(1),Integer(1)), (Integer(3),Integer(5)) ]) Finite Newton polygon with 3 vertices: (0, 0), (1, 1), (3, 5)
from sage.geometry.newton_polygon import NewtonPolygon NewtonPolygon([ (0,0), (1,1), (3,5) ])
We note that the convex hull of the vertices is automatically computed:
sage: NewtonPolygon([ (0,0), (1,1), (2,8), (3,5) ]) Finite Newton polygon with 3 vertices: (0, 0), (1, 1), (3, 5)
>>> from sage.all import * >>> NewtonPolygon([ (Integer(0),Integer(0)), (Integer(1),Integer(1)), (Integer(2),Integer(8)), (Integer(3),Integer(5)) ]) Finite Newton polygon with 3 vertices: (0, 0), (1, 1), (3, 5)
NewtonPolygon([ (0,0), (1,1), (2,8), (3,5) ])
Note that the value
+Infinity
is allowed as the second coordinate of a vertex:sage: NewtonPolygon([ (0,0), (1,Infinity), (2,8), (3,5) ]) Finite Newton polygon with 2 vertices: (0, 0), (3, 5)
>>> from sage.all import * >>> NewtonPolygon([ (Integer(0),Integer(0)), (Integer(1),Infinity), (Integer(2),Integer(8)), (Integer(3),Integer(5)) ]) Finite Newton polygon with 2 vertices: (0, 0), (3, 5)
NewtonPolygon([ (0,0), (1,Infinity), (2,8), (3,5) ])
If last_slope is set, the returned Newton polygon is infinite and ends with an infinite line having the specified slope:
sage: NewtonPolygon([ (0,0), (1,1), (2,8), (3,5) ], last_slope=3) Infinite Newton polygon with 3 vertices: (0, 0), (1, 1), (3, 5) ending by an infinite line of slope 3
>>> from sage.all import * >>> NewtonPolygon([ (Integer(0),Integer(0)), (Integer(1),Integer(1)), (Integer(2),Integer(8)), (Integer(3),Integer(5)) ], last_slope=Integer(3)) Infinite Newton polygon with 3 vertices: (0, 0), (1, 1), (3, 5) ending by an infinite line of slope 3
NewtonPolygon([ (0,0), (1,1), (2,8), (3,5) ], last_slope=3)
Specifying a last slope may discard some vertices:
sage: NewtonPolygon([ (0,0), (1,1), (2,8), (3,5) ], last_slope=3/2) Infinite Newton polygon with 2 vertices: (0, 0), (1, 1) ending by an infinite line of slope 3/2
>>> from sage.all import * >>> NewtonPolygon([ (Integer(0),Integer(0)), (Integer(1),Integer(1)), (Integer(2),Integer(8)), (Integer(3),Integer(5)) ], last_slope=Integer(3)/Integer(2)) Infinite Newton polygon with 2 vertices: (0, 0), (1, 1) ending by an infinite line of slope 3/2
NewtonPolygon([ (0,0), (1,1), (2,8), (3,5) ], last_slope=3/2)
Next, we define a Newton polygon by its slopes:
sage: NP = NewtonPolygon([0, 1/2, 1/2, 2/3, 2/3, 2/3, 1, 1]) sage: NP Finite Newton polygon with 5 vertices: (0, 0), (1, 0), (3, 1), (6, 3), (8, 5) sage: NP.slopes() [0, 1/2, 1/2, 2/3, 2/3, 2/3, 1, 1]
>>> from sage.all import * >>> NP = NewtonPolygon([Integer(0), Integer(1)/Integer(2), Integer(1)/Integer(2), Integer(2)/Integer(3), Integer(2)/Integer(3), Integer(2)/Integer(3), Integer(1), Integer(1)]) >>> NP Finite Newton polygon with 5 vertices: (0, 0), (1, 0), (3, 1), (6, 3), (8, 5) >>> NP.slopes() [0, 1/2, 1/2, 2/3, 2/3, 2/3, 1, 1]
NP = NewtonPolygon([0, 1/2, 1/2, 2/3, 2/3, 2/3, 1, 1]) NP NP.slopes()
By default, slopes are automatically sorted:
sage: NP2 = NewtonPolygon([0, 1, 1/2, 2/3, 1/2, 2/3, 1, 2/3]) sage: NP2 Finite Newton polygon with 5 vertices: (0, 0), (1, 0), (3, 1), (6, 3), (8, 5) sage: NP == NP2 True
>>> from sage.all import * >>> NP2 = NewtonPolygon([Integer(0), Integer(1), Integer(1)/Integer(2), Integer(2)/Integer(3), Integer(1)/Integer(2), Integer(2)/Integer(3), Integer(1), Integer(2)/Integer(3)]) >>> NP2 Finite Newton polygon with 5 vertices: (0, 0), (1, 0), (3, 1), (6, 3), (8, 5) >>> NP == NP2 True
NP2 = NewtonPolygon([0, 1, 1/2, 2/3, 1/2, 2/3, 1, 2/3]) NP2 NP == NP2
except if the contrary is explicitly mentioned:
sage: NewtonPolygon([0, 1, 1/2, 2/3, 1/2, 2/3, 1, 2/3], sort_slopes=False) Finite Newton polygon with 4 vertices: (0, 0), (1, 0), (6, 10/3), (8, 5)
>>> from sage.all import * >>> NewtonPolygon([Integer(0), Integer(1), Integer(1)/Integer(2), Integer(2)/Integer(3), Integer(1)/Integer(2), Integer(2)/Integer(3), Integer(1), Integer(2)/Integer(3)], sort_slopes=False) Finite Newton polygon with 4 vertices: (0, 0), (1, 0), (6, 10/3), (8, 5)
NewtonPolygon([0, 1, 1/2, 2/3, 1/2, 2/3, 1, 2/3], sort_slopes=False)
Slopes greater that or equal last_slope (if specified) are discarded:
sage: NP = NewtonPolygon([0, 1/2, 1/2, 2/3, 2/3, 2/3, 1, 1], last_slope=2/3) sage: NP Infinite Newton polygon with 3 vertices: (0, 0), (1, 0), (3, 1) ending by an infinite line of slope 2/3 sage: NP.slopes() [0, 1/2, 1/2]
>>> from sage.all import * >>> NP = NewtonPolygon([Integer(0), Integer(1)/Integer(2), Integer(1)/Integer(2), Integer(2)/Integer(3), Integer(2)/Integer(3), Integer(2)/Integer(3), Integer(1), Integer(1)], last_slope=Integer(2)/Integer(3)) >>> NP Infinite Newton polygon with 3 vertices: (0, 0), (1, 0), (3, 1) ending by an infinite line of slope 2/3 >>> NP.slopes() [0, 1/2, 1/2]
NP = NewtonPolygon([0, 1/2, 1/2, 2/3, 2/3, 2/3, 1, 1], last_slope=2/3) NP NP.slopes()
Be careful, do not confuse Newton polygons provided by this class with Newton polytopes. Compare:
sage: NP = NewtonPolygon([ (0,0), (1,45), (3,6) ]); NP Finite Newton polygon with 2 vertices: (0, 0), (3, 6) sage: x, y = polygen(QQ,'x, y') sage: p = 1 + x*y**45 + x**3*y**6 sage: p.newton_polytope() A 2-dimensional polyhedron in ZZ^2 defined as the convex hull of 3 vertices sage: p.newton_polytope().vertices() (A vertex at (0, 0), A vertex at (1, 45), A vertex at (3, 6))
>>> from sage.all import * >>> NP = NewtonPolygon([ (Integer(0),Integer(0)), (Integer(1),Integer(45)), (Integer(3),Integer(6)) ]); NP Finite Newton polygon with 2 vertices: (0, 0), (3, 6) >>> x, y = polygen(QQ,'x, y') >>> p = Integer(1) + x*y**Integer(45) + x**Integer(3)*y**Integer(6) >>> p.newton_polytope() A 2-dimensional polyhedron in ZZ^2 defined as the convex hull of 3 vertices >>> p.newton_polytope().vertices() (A vertex at (0, 0), A vertex at (1, 45), A vertex at (3, 6))
NP = NewtonPolygon([ (0,0), (1,45), (3,6) ]); NP x, y = polygen(QQ,'x, y') p = 1 + x*y**45 + x**3*y**6 p.newton_polytope() p.newton_polytope().vertices()
- Element[source]¶
alias of
NewtonPolygon_element