-
-
Notifications
You must be signed in to change notification settings - Fork 899
Retrieve more information of fundamental groups of plane curves #36768
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 92 commits
c7d36ca
26c64cc
0be51f8
9b83308
0d08854
6781a4b
ae49054
0c0a320
464a494
298c79b
4e53120
64f2bd8
93fa393
5bcb806
77dd950
99653de
f987349
093ef27
2d29cb8
6e7c9f6
2ce7bfe
f275cc9
22d67c1
7f91708
0d39122
7b10078
7aabdf0
2eaf0e5
9194a23
0259f36
e096e9f
4dafc7f
0df6c84
05f17b9
5429f6d
ee78c10
51cfe00
d289c2c
c996a59
af6853d
cd323ec
a6a2481
1715071
a7c2f9b
fff657b
06b614a
e97e7aa
afc4f22
bd6df7c
4e3acdb
8241fe0
6b69c2f
e5a44d0
88577a7
bb0f7c2
ce641a7
43fcdae
6bcdec4
598d832
b7e6270
d602f16
82e54b7
1fb3c76
e7053e4
a540ce8
8cddcde
833fac7
3fdbcea
83c802c
b87ef6f
df65666
7caaf76
d4682f3
54f926d
e8920d6
16f3608
98e0809
397224e
8785db1
2df222f
11a3fcd
e6c3757
e9b2fbb
339f220
4d1bfea
345bee5
483aa6c
9ffb6e2
520c365
38cf923
09dde99
76ad4d4
3770b4d
be89ec5
e9e458e
070db54
fa2c963
90e343d
281aa76
6f55218
2fa5790
c221ea5
5f664ae
42fd46c
45df0a5
416df49
2b2857f
830a006
580bdc0
7e76fd0
3140834
d32de82
2431c6b
cd9ecd7
630e0cf
1c1c30c
a896c65
74441b2
c3a8ada
c57aec8
2e472d4
73a728d
3cbafec
97ee135
f5e412f
f556fbf
b7b70a9
d98325a
5688d68
9cff70b
f83cf48
50cfa19
f112bf9
d724267
74ae1c9
25e8be4
5b047bf
61a4f66
5b6ba8c
816cf87
28cd23e
7f28f0c
03b5444
279a200
8bb020e
0339378
638fe01
ff9cfd6
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Large diffs are not rendered by default.
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -1725,7 +1725,6 @@ def tangent_line(self, p): | |
| defined by: -2*y + z + 1, x + y + z | ||
| sage: _ == C.tangent_line(p) | ||
| True | ||
|
|
||
| """ | ||
| A = self.ambient_space() | ||
| R = A.coordinate_ring() | ||
|
|
@@ -1752,8 +1751,48 @@ class AffinePlaneCurve_field(AffinePlaneCurve, AffineCurve_field): | |
| """ | ||
| _point = AffinePlaneCurvePoint_field | ||
|
|
||
| def has_vertical_asymptote(self): | ||
| """ | ||
| Check if the curve is not a line and has vertical asymptotes. | ||
|
|
||
| EXAMPLES:: | ||
|
|
||
| sage: A2.<x,y> = AffineSpace(2, QQ) | ||
| sage: Curve(x).has_vertical_asymptote() | ||
| False | ||
| sage: Curve(y^2 * x + x + y).has_vertical_asymptote() | ||
| True | ||
| """ | ||
| A = self.ambient_space() | ||
| R = A.coordinate_ring() | ||
| x, y = R.gens() | ||
| f = self.defining_polynomial().radical() | ||
| dy = f.degree(y) | ||
| dxy = f.coefficient({y: dy}).degree() | ||
| return dxy > 0 and f.degree() > 1 | ||
|
|
||
| def is_vertical_line(self): | ||
| """ | ||
| Check if the curve is a vertical line. | ||
|
|
||
| EXAMPLES:: | ||
|
|
||
| sage: A2.<x, y> = AffineSpace(2, QQ) | ||
| sage: Curve(x - 1).is_vertical_line() | ||
| True | ||
| sage: Curve(x - y).is_vertical_line() | ||
| False | ||
| sage: Curve(y^2 * x + x + y).is_vertical_line() | ||
| False | ||
| """ | ||
| A = self.ambient_space() | ||
| R = A.coordinate_ring() | ||
| x, y = R.gens() | ||
| f = self.defining_polynomial().radical() | ||
| return f.degree(y) == 0 and f.degree() == 1 | ||
|
|
||
| @cached_method | ||
| def fundamental_group(self, simplified=True, puiseux=False): | ||
| def fundamental_group(self, simplified=True, puiseux=True): | ||
| r""" | ||
| Return a presentation of the fundamental group of the complement | ||
| of ``self``. | ||
|
|
@@ -1762,7 +1801,7 @@ def fundamental_group(self, simplified=True, puiseux=False): | |
|
|
||
| - ``simplified`` -- (default: ``True``) boolean to simplify the presentation. | ||
|
|
||
| - ``puiseux`` -- (default: ``False``) boolean to decide if the | ||
| - ``puiseux`` -- (default: ``True``) boolean to decide if the | ||
| presentation is constructed in the classical way or using Puiseux | ||
| shortcut. If ``True``, ``simplified`` is set to ``False``. | ||
|
|
||
|
|
@@ -1788,10 +1827,10 @@ def fundamental_group(self, simplified=True, puiseux=False): | |
| sage: # optional - sirocco | ||
| sage: A.<x,y> = AffineSpace(QQ, 2) | ||
| sage: C = A.curve(y^2 - x^3 - x^2) | ||
| sage: C.fundamental_group() | ||
| sage: C.fundamental_group(puiseux=False) | ||
| Finitely presented group < x0 | > | ||
| sage: bm = C.braid_monodromy() | ||
| sage: g = C.fundamental_group(puiseux=True) | ||
| sage: g = C.fundamental_group(simplified=False) | ||
| sage: g.sorted_presentation() | ||
| Finitely presented group < x0, x1 | x1^-1*x0^-1*x1*x0, x1^-1*x0 > | ||
| sage: g.simplified() | ||
|
|
@@ -1800,22 +1839,41 @@ def fundamental_group(self, simplified=True, puiseux=False): | |
| In the case of number fields, they need to have an embedding | ||
| to the algebraic field:: | ||
|
|
||
| sage: # needs sage.rings.number_field | ||
| sage: a = QQ[x](x^2 + 5).roots(QQbar)[0][0] | ||
| sage: # needs sage.rings.number_field sirocco | ||
| sage: T.<t> = QQ[] | ||
| sage: a = (t^2 + 5).roots(QQbar)[0][0] | ||
| sage: F = NumberField(a.minpoly(), 'a', embedding=a) | ||
| sage: F.inject_variables() | ||
| Defining a | ||
| sage: A.<x,y> = AffineSpace(F, 2) | ||
| sage: C = A.curve(y^2 - a*x^3 - x^2) | ||
| sage: C.fundamental_group() # optional - sirocco | ||
| sage: C.fundamental_group() | ||
| Finitely presented group < x0 | > | ||
| sage: C = A.curve(x * (x - 1)) | ||
| sage: C.fundamental_group() | ||
| Finitely presented group < x0, x1 | > | ||
|
|
||
| .. WARNING:: | ||
|
|
||
| This functionality requires the sirocco package to be installed. | ||
| """ | ||
| from sage.schemes.curves.zariski_vankampen import fundamental_group_from_braid_mon | ||
| return fundamental_group_from_braid_mon(self.braid_monodromy(), simplified=simplified, puiseux=puiseux) | ||
| bm = self.braid_monodromy() | ||
| if bm == []: | ||
|
enriqueartal marked this conversation as resolved.
Outdated
|
||
| f = self.defining_polynomial() | ||
| x, y = f.parent().gens() | ||
| d0 = f.degree(y) | ||
| f0 = f.coefficient({y: d0}) | ||
| d = d0 + f0.degree(x) | ||
| else: | ||
| d = bm[0].parent().strands() | ||
| G = fundamental_group_from_braid_mon(self.braid_monodromy(), | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. why call again
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This is the main tool to compute the fundamental group. Once the braid monodromy has been computed by
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Sorry, I have just checked that there was not reason. Your point was not to call it, but with again. It was a |
||
| degree=d, | ||
| simplified=simplified, | ||
| puiseux=puiseux) | ||
| if simplified: | ||
| G = G.simplified() | ||
| return G | ||
|
|
||
| @cached_method | ||
| def braid_monodromy(self): | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This makes the default arguments inconsistent. This change also needs some justification.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You are right. Since
puiseuxwas added later, I preferred to keep it as optional, but it is usually faster, so finally it is the default option. On the other side, the unsimplified presentation gives more information since the homotopy type of the complement is also encoded. The theoretical simplification moves can change the information about the homotopy type, but actually, the only ones that can do this are the elimination of trivial relations. If this happen the homotopy type can be retreived. One solution is to keep the default consistent and to add something as the Euler characteristic; with these data the homotopy type can be obtained. What do you think?There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Okay, that is a good reason for the change. The main thing is then changing
simplifiedto have a default ofTrueto be consistent withpuiseuxbeingTruesettingsimplifiedtoTrue.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Sorry, I forgot to eliminate it, now both settings are independent.