Initial commit
|
@ -0,0 +1,93 @@
|
||||||
|
# Byte-compiled / optimized / DLL files
|
||||||
|
__pycache__/
|
||||||
|
*.py[cod]
|
||||||
|
*$py.class
|
||||||
|
|
||||||
|
# C extensions
|
||||||
|
*.so
|
||||||
|
|
||||||
|
# Distribution / packaging
|
||||||
|
.Python
|
||||||
|
env/
|
||||||
|
build/
|
||||||
|
develop-eggs/
|
||||||
|
dist/
|
||||||
|
downloads/
|
||||||
|
eggs/
|
||||||
|
.eggs/
|
||||||
|
lib/
|
||||||
|
lib64/
|
||||||
|
parts/
|
||||||
|
sdist/
|
||||||
|
var/
|
||||||
|
*.egg-info/
|
||||||
|
.installed.cfg
|
||||||
|
*.egg
|
||||||
|
|
||||||
|
# PyInstaller
|
||||||
|
# Usually these files are written by a python script from a template
|
||||||
|
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
||||||
|
*.manifest
|
||||||
|
*.spec
|
||||||
|
|
||||||
|
# Installer logs
|
||||||
|
pip-log.txt
|
||||||
|
pip-delete-this-directory.txt
|
||||||
|
|
||||||
|
# Unit test / coverage reports
|
||||||
|
htmlcov/
|
||||||
|
.tox/
|
||||||
|
.coverage
|
||||||
|
.coverage.*
|
||||||
|
.cache
|
||||||
|
nosetests.xml
|
||||||
|
coverage.xml
|
||||||
|
*,cover
|
||||||
|
.hypothesis/
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
*.mo
|
||||||
|
*.pot
|
||||||
|
|
||||||
|
# Django stuff:
|
||||||
|
*.log
|
||||||
|
local_settings.py
|
||||||
|
|
||||||
|
# Flask stuff:
|
||||||
|
instance/
|
||||||
|
.webassets-cache
|
||||||
|
|
||||||
|
# Scrapy stuff:
|
||||||
|
.scrapy
|
||||||
|
|
||||||
|
# Sphinx documentation
|
||||||
|
docs/_build/
|
||||||
|
|
||||||
|
# PyBuilder
|
||||||
|
target/
|
||||||
|
|
||||||
|
# IPython Notebook
|
||||||
|
.ipynb_checkpoints
|
||||||
|
|
||||||
|
# pyenv
|
||||||
|
.python-version
|
||||||
|
|
||||||
|
# celery beat schedule file
|
||||||
|
celerybeat-schedule
|
||||||
|
|
||||||
|
# dotenv
|
||||||
|
.env
|
||||||
|
|
||||||
|
# virtualenv
|
||||||
|
venv/
|
||||||
|
ENV/
|
||||||
|
|
||||||
|
# Spyder project settings
|
||||||
|
.spyderproject
|
||||||
|
|
||||||
|
# Rope project settings
|
||||||
|
.ropeproject
|
||||||
|
|
||||||
|
/.travis_ci_gh_pages_deploy_key
|
||||||
|
/.travis_ci_gh_pages_deploy_key.pub
|
||||||
|
/gh-pages
|
|
@ -0,0 +1,10 @@
|
||||||
|
# Dockerfile for binder
|
||||||
|
# Reference: https://mybinder.readthedocs.io/en/latest/dockerfile.html#preparing-your-dockerfile
|
||||||
|
|
||||||
|
FROM sagemath/sagemath:latest
|
||||||
|
|
||||||
|
# Copy the contents of the repo in ${HOME}
|
||||||
|
COPY --chown=sage:sage . ${HOME}
|
||||||
|
|
||||||
|
# Install this package and dependencies
|
||||||
|
RUN sage -pip install .
|
|
@ -0,0 +1,674 @@
|
||||||
|
GNU GENERAL PUBLIC LICENSE
|
||||||
|
Version 3, 29 June 2007
|
||||||
|
|
||||||
|
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
|
||||||
|
Everyone is permitted to copy and distribute verbatim copies
|
||||||
|
of this license document, but changing it is not allowed.
|
||||||
|
|
||||||
|
Preamble
|
||||||
|
|
||||||
|
The GNU General Public License is a free, copyleft license for
|
||||||
|
software and other kinds of works.
|
||||||
|
|
||||||
|
The licenses for most software and other practical works are designed
|
||||||
|
to take away your freedom to share and change the works. By contrast,
|
||||||
|
the GNU General Public License is intended to guarantee your freedom to
|
||||||
|
share and change all versions of a program--to make sure it remains free
|
||||||
|
software for all its users. We, the Free Software Foundation, use the
|
||||||
|
GNU General Public License for most of our software; it applies also to
|
||||||
|
any other work released this way by its authors. You can apply it to
|
||||||
|
your programs, too.
|
||||||
|
|
||||||
|
When we speak of free software, we are referring to freedom, not
|
||||||
|
price. Our General Public Licenses are designed to make sure that you
|
||||||
|
have the freedom to distribute copies of free software (and charge for
|
||||||
|
them if you wish), that you receive source code or can get it if you
|
||||||
|
want it, that you can change the software or use pieces of it in new
|
||||||
|
free programs, and that you know you can do these things.
|
||||||
|
|
||||||
|
To protect your rights, we need to prevent others from denying you
|
||||||
|
these rights or asking you to surrender the rights. Therefore, you have
|
||||||
|
certain responsibilities if you distribute copies of the software, or if
|
||||||
|
you modify it: responsibilities to respect the freedom of others.
|
||||||
|
|
||||||
|
For example, if you distribute copies of such a program, whether
|
||||||
|
gratis or for a fee, you must pass on to the recipients the same
|
||||||
|
freedoms that you received. You must make sure that they, too, receive
|
||||||
|
or can get the source code. And you must show them these terms so they
|
||||||
|
know their rights.
|
||||||
|
|
||||||
|
Developers that use the GNU GPL protect your rights with two steps:
|
||||||
|
(1) assert copyright on the software, and (2) offer you this License
|
||||||
|
giving you legal permission to copy, distribute and/or modify it.
|
||||||
|
|
||||||
|
For the developers' and authors' protection, the GPL clearly explains
|
||||||
|
that there is no warranty for this free software. For both users' and
|
||||||
|
authors' sake, the GPL requires that modified versions be marked as
|
||||||
|
changed, so that their problems will not be attributed erroneously to
|
||||||
|
authors of previous versions.
|
||||||
|
|
||||||
|
Some devices are designed to deny users access to install or run
|
||||||
|
modified versions of the software inside them, although the manufacturer
|
||||||
|
can do so. This is fundamentally incompatible with the aim of
|
||||||
|
protecting users' freedom to change the software. The systematic
|
||||||
|
pattern of such abuse occurs in the area of products for individuals to
|
||||||
|
use, which is precisely where it is most unacceptable. Therefore, we
|
||||||
|
have designed this version of the GPL to prohibit the practice for those
|
||||||
|
products. If such problems arise substantially in other domains, we
|
||||||
|
stand ready to extend this provision to those domains in future versions
|
||||||
|
of the GPL, as needed to protect the freedom of users.
|
||||||
|
|
||||||
|
Finally, every program is threatened constantly by software patents.
|
||||||
|
States should not allow patents to restrict development and use of
|
||||||
|
software on general-purpose computers, but in those that do, we wish to
|
||||||
|
avoid the special danger that patents applied to a free program could
|
||||||
|
make it effectively proprietary. To prevent this, the GPL assures that
|
||||||
|
patents cannot be used to render the program non-free.
|
||||||
|
|
||||||
|
The precise terms and conditions for copying, distribution and
|
||||||
|
modification follow.
|
||||||
|
|
||||||
|
TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
0. Definitions.
|
||||||
|
|
||||||
|
"This License" refers to version 3 of the GNU General Public License.
|
||||||
|
|
||||||
|
"Copyright" also means copyright-like laws that apply to other kinds of
|
||||||
|
works, such as semiconductor masks.
|
||||||
|
|
||||||
|
"The Program" refers to any copyrightable work licensed under this
|
||||||
|
License. Each licensee is addressed as "you". "Licensees" and
|
||||||
|
"recipients" may be individuals or organizations.
|
||||||
|
|
||||||
|
To "modify" a work means to copy from or adapt all or part of the work
|
||||||
|
in a fashion requiring copyright permission, other than the making of an
|
||||||
|
exact copy. The resulting work is called a "modified version" of the
|
||||||
|
earlier work or a work "based on" the earlier work.
|
||||||
|
|
||||||
|
A "covered work" means either the unmodified Program or a work based
|
||||||
|
on the Program.
|
||||||
|
|
||||||
|
To "propagate" a work means to do anything with it that, without
|
||||||
|
permission, would make you directly or secondarily liable for
|
||||||
|
infringement under applicable copyright law, except executing it on a
|
||||||
|
computer or modifying a private copy. Propagation includes copying,
|
||||||
|
distribution (with or without modification), making available to the
|
||||||
|
public, and in some countries other activities as well.
|
||||||
|
|
||||||
|
To "convey" a work means any kind of propagation that enables other
|
||||||
|
parties to make or receive copies. Mere interaction with a user through
|
||||||
|
a computer network, with no transfer of a copy, is not conveying.
|
||||||
|
|
||||||
|
An interactive user interface displays "Appropriate Legal Notices"
|
||||||
|
to the extent that it includes a convenient and prominently visible
|
||||||
|
feature that (1) displays an appropriate copyright notice, and (2)
|
||||||
|
tells the user that there is no warranty for the work (except to the
|
||||||
|
extent that warranties are provided), that licensees may convey the
|
||||||
|
work under this License, and how to view a copy of this License. If
|
||||||
|
the interface presents a list of user commands or options, such as a
|
||||||
|
menu, a prominent item in the list meets this criterion.
|
||||||
|
|
||||||
|
1. Source Code.
|
||||||
|
|
||||||
|
The "source code" for a work means the preferred form of the work
|
||||||
|
for making modifications to it. "Object code" means any non-source
|
||||||
|
form of a work.
|
||||||
|
|
||||||
|
A "Standard Interface" means an interface that either is an official
|
||||||
|
standard defined by a recognized standards body, or, in the case of
|
||||||
|
interfaces specified for a particular programming language, one that
|
||||||
|
is widely used among developers working in that language.
|
||||||
|
|
||||||
|
The "System Libraries" of an executable work include anything, other
|
||||||
|
than the work as a whole, that (a) is included in the normal form of
|
||||||
|
packaging a Major Component, but which is not part of that Major
|
||||||
|
Component, and (b) serves only to enable use of the work with that
|
||||||
|
Major Component, or to implement a Standard Interface for which an
|
||||||
|
implementation is available to the public in source code form. A
|
||||||
|
"Major Component", in this context, means a major essential component
|
||||||
|
(kernel, window system, and so on) of the specific operating system
|
||||||
|
(if any) on which the executable work runs, or a compiler used to
|
||||||
|
produce the work, or an object code interpreter used to run it.
|
||||||
|
|
||||||
|
The "Corresponding Source" for a work in object code form means all
|
||||||
|
the source code needed to generate, install, and (for an executable
|
||||||
|
work) run the object code and to modify the work, including scripts to
|
||||||
|
control those activities. However, it does not include the work's
|
||||||
|
System Libraries, or general-purpose tools or generally available free
|
||||||
|
programs which are used unmodified in performing those activities but
|
||||||
|
which are not part of the work. For example, Corresponding Source
|
||||||
|
includes interface definition files associated with source files for
|
||||||
|
the work, and the source code for shared libraries and dynamically
|
||||||
|
linked subprograms that the work is specifically designed to require,
|
||||||
|
such as by intimate data communication or control flow between those
|
||||||
|
subprograms and other parts of the work.
|
||||||
|
|
||||||
|
The Corresponding Source need not include anything that users
|
||||||
|
can regenerate automatically from other parts of the Corresponding
|
||||||
|
Source.
|
||||||
|
|
||||||
|
The Corresponding Source for a work in source code form is that
|
||||||
|
same work.
|
||||||
|
|
||||||
|
2. Basic Permissions.
|
||||||
|
|
||||||
|
All rights granted under this License are granted for the term of
|
||||||
|
copyright on the Program, and are irrevocable provided the stated
|
||||||
|
conditions are met. This License explicitly affirms your unlimited
|
||||||
|
permission to run the unmodified Program. The output from running a
|
||||||
|
covered work is covered by this License only if the output, given its
|
||||||
|
content, constitutes a covered work. This License acknowledges your
|
||||||
|
rights of fair use or other equivalent, as provided by copyright law.
|
||||||
|
|
||||||
|
You may make, run and propagate covered works that you do not
|
||||||
|
convey, without conditions so long as your license otherwise remains
|
||||||
|
in force. You may convey covered works to others for the sole purpose
|
||||||
|
of having them make modifications exclusively for you, or provide you
|
||||||
|
with facilities for running those works, provided that you comply with
|
||||||
|
the terms of this License in conveying all material for which you do
|
||||||
|
not control copyright. Those thus making or running the covered works
|
||||||
|
for you must do so exclusively on your behalf, under your direction
|
||||||
|
and control, on terms that prohibit them from making any copies of
|
||||||
|
your copyrighted material outside their relationship with you.
|
||||||
|
|
||||||
|
Conveying under any other circumstances is permitted solely under
|
||||||
|
the conditions stated below. Sublicensing is not allowed; section 10
|
||||||
|
makes it unnecessary.
|
||||||
|
|
||||||
|
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
|
||||||
|
|
||||||
|
No covered work shall be deemed part of an effective technological
|
||||||
|
measure under any applicable law fulfilling obligations under article
|
||||||
|
11 of the WIPO copyright treaty adopted on 20 December 1996, or
|
||||||
|
similar laws prohibiting or restricting circumvention of such
|
||||||
|
measures.
|
||||||
|
|
||||||
|
When you convey a covered work, you waive any legal power to forbid
|
||||||
|
circumvention of technological measures to the extent such circumvention
|
||||||
|
is effected by exercising rights under this License with respect to
|
||||||
|
the covered work, and you disclaim any intention to limit operation or
|
||||||
|
modification of the work as a means of enforcing, against the work's
|
||||||
|
users, your or third parties' legal rights to forbid circumvention of
|
||||||
|
technological measures.
|
||||||
|
|
||||||
|
4. Conveying Verbatim Copies.
|
||||||
|
|
||||||
|
You may convey verbatim copies of the Program's source code as you
|
||||||
|
receive it, in any medium, provided that you conspicuously and
|
||||||
|
appropriately publish on each copy an appropriate copyright notice;
|
||||||
|
keep intact all notices stating that this License and any
|
||||||
|
non-permissive terms added in accord with section 7 apply to the code;
|
||||||
|
keep intact all notices of the absence of any warranty; and give all
|
||||||
|
recipients a copy of this License along with the Program.
|
||||||
|
|
||||||
|
You may charge any price or no price for each copy that you convey,
|
||||||
|
and you may offer support or warranty protection for a fee.
|
||||||
|
|
||||||
|
5. Conveying Modified Source Versions.
|
||||||
|
|
||||||
|
You may convey a work based on the Program, or the modifications to
|
||||||
|
produce it from the Program, in the form of source code under the
|
||||||
|
terms of section 4, provided that you also meet all of these conditions:
|
||||||
|
|
||||||
|
a) The work must carry prominent notices stating that you modified
|
||||||
|
it, and giving a relevant date.
|
||||||
|
|
||||||
|
b) The work must carry prominent notices stating that it is
|
||||||
|
released under this License and any conditions added under section
|
||||||
|
7. This requirement modifies the requirement in section 4 to
|
||||||
|
"keep intact all notices".
|
||||||
|
|
||||||
|
c) You must license the entire work, as a whole, under this
|
||||||
|
License to anyone who comes into possession of a copy. This
|
||||||
|
License will therefore apply, along with any applicable section 7
|
||||||
|
additional terms, to the whole of the work, and all its parts,
|
||||||
|
regardless of how they are packaged. This License gives no
|
||||||
|
permission to license the work in any other way, but it does not
|
||||||
|
invalidate such permission if you have separately received it.
|
||||||
|
|
||||||
|
d) If the work has interactive user interfaces, each must display
|
||||||
|
Appropriate Legal Notices; however, if the Program has interactive
|
||||||
|
interfaces that do not display Appropriate Legal Notices, your
|
||||||
|
work need not make them do so.
|
||||||
|
|
||||||
|
A compilation of a covered work with other separate and independent
|
||||||
|
works, which are not by their nature extensions of the covered work,
|
||||||
|
and which are not combined with it such as to form a larger program,
|
||||||
|
in or on a volume of a storage or distribution medium, is called an
|
||||||
|
"aggregate" if the compilation and its resulting copyright are not
|
||||||
|
used to limit the access or legal rights of the compilation's users
|
||||||
|
beyond what the individual works permit. Inclusion of a covered work
|
||||||
|
in an aggregate does not cause this License to apply to the other
|
||||||
|
parts of the aggregate.
|
||||||
|
|
||||||
|
6. Conveying Non-Source Forms.
|
||||||
|
|
||||||
|
You may convey a covered work in object code form under the terms
|
||||||
|
of sections 4 and 5, provided that you also convey the
|
||||||
|
machine-readable Corresponding Source under the terms of this License,
|
||||||
|
in one of these ways:
|
||||||
|
|
||||||
|
a) Convey the object code in, or embodied in, a physical product
|
||||||
|
(including a physical distribution medium), accompanied by the
|
||||||
|
Corresponding Source fixed on a durable physical medium
|
||||||
|
customarily used for software interchange.
|
||||||
|
|
||||||
|
b) Convey the object code in, or embodied in, a physical product
|
||||||
|
(including a physical distribution medium), accompanied by a
|
||||||
|
written offer, valid for at least three years and valid for as
|
||||||
|
long as you offer spare parts or customer support for that product
|
||||||
|
model, to give anyone who possesses the object code either (1) a
|
||||||
|
copy of the Corresponding Source for all the software in the
|
||||||
|
product that is covered by this License, on a durable physical
|
||||||
|
medium customarily used for software interchange, for a price no
|
||||||
|
more than your reasonable cost of physically performing this
|
||||||
|
conveying of source, or (2) access to copy the
|
||||||
|
Corresponding Source from a network server at no charge.
|
||||||
|
|
||||||
|
c) Convey individual copies of the object code with a copy of the
|
||||||
|
written offer to provide the Corresponding Source. This
|
||||||
|
alternative is allowed only occasionally and noncommercially, and
|
||||||
|
only if you received the object code with such an offer, in accord
|
||||||
|
with subsection 6b.
|
||||||
|
|
||||||
|
d) Convey the object code by offering access from a designated
|
||||||
|
place (gratis or for a charge), and offer equivalent access to the
|
||||||
|
Corresponding Source in the same way through the same place at no
|
||||||
|
further charge. You need not require recipients to copy the
|
||||||
|
Corresponding Source along with the object code. If the place to
|
||||||
|
copy the object code is a network server, the Corresponding Source
|
||||||
|
may be on a different server (operated by you or a third party)
|
||||||
|
that supports equivalent copying facilities, provided you maintain
|
||||||
|
clear directions next to the object code saying where to find the
|
||||||
|
Corresponding Source. Regardless of what server hosts the
|
||||||
|
Corresponding Source, you remain obligated to ensure that it is
|
||||||
|
available for as long as needed to satisfy these requirements.
|
||||||
|
|
||||||
|
e) Convey the object code using peer-to-peer transmission, provided
|
||||||
|
you inform other peers where the object code and Corresponding
|
||||||
|
Source of the work are being offered to the general public at no
|
||||||
|
charge under subsection 6d.
|
||||||
|
|
||||||
|
A separable portion of the object code, whose source code is excluded
|
||||||
|
from the Corresponding Source as a System Library, need not be
|
||||||
|
included in conveying the object code work.
|
||||||
|
|
||||||
|
A "User Product" is either (1) a "consumer product", which means any
|
||||||
|
tangible personal property which is normally used for personal, family,
|
||||||
|
or household purposes, or (2) anything designed or sold for incorporation
|
||||||
|
into a dwelling. In determining whether a product is a consumer product,
|
||||||
|
doubtful cases shall be resolved in favor of coverage. For a particular
|
||||||
|
product received by a particular user, "normally used" refers to a
|
||||||
|
typical or common use of that class of product, regardless of the status
|
||||||
|
of the particular user or of the way in which the particular user
|
||||||
|
actually uses, or expects or is expected to use, the product. A product
|
||||||
|
is a consumer product regardless of whether the product has substantial
|
||||||
|
commercial, industrial or non-consumer uses, unless such uses represent
|
||||||
|
the only significant mode of use of the product.
|
||||||
|
|
||||||
|
"Installation Information" for a User Product means any methods,
|
||||||
|
procedures, authorization keys, or other information required to install
|
||||||
|
and execute modified versions of a covered work in that User Product from
|
||||||
|
a modified version of its Corresponding Source. The information must
|
||||||
|
suffice to ensure that the continued functioning of the modified object
|
||||||
|
code is in no case prevented or interfered with solely because
|
||||||
|
modification has been made.
|
||||||
|
|
||||||
|
If you convey an object code work under this section in, or with, or
|
||||||
|
specifically for use in, a User Product, and the conveying occurs as
|
||||||
|
part of a transaction in which the right of possession and use of the
|
||||||
|
User Product is transferred to the recipient in perpetuity or for a
|
||||||
|
fixed term (regardless of how the transaction is characterized), the
|
||||||
|
Corresponding Source conveyed under this section must be accompanied
|
||||||
|
by the Installation Information. But this requirement does not apply
|
||||||
|
if neither you nor any third party retains the ability to install
|
||||||
|
modified object code on the User Product (for example, the work has
|
||||||
|
been installed in ROM).
|
||||||
|
|
||||||
|
The requirement to provide Installation Information does not include a
|
||||||
|
requirement to continue to provide support service, warranty, or updates
|
||||||
|
for a work that has been modified or installed by the recipient, or for
|
||||||
|
the User Product in which it has been modified or installed. Access to a
|
||||||
|
network may be denied when the modification itself materially and
|
||||||
|
adversely affects the operation of the network or violates the rules and
|
||||||
|
protocols for communication across the network.
|
||||||
|
|
||||||
|
Corresponding Source conveyed, and Installation Information provided,
|
||||||
|
in accord with this section must be in a format that is publicly
|
||||||
|
documented (and with an implementation available to the public in
|
||||||
|
source code form), and must require no special password or key for
|
||||||
|
unpacking, reading or copying.
|
||||||
|
|
||||||
|
7. Additional Terms.
|
||||||
|
|
||||||
|
"Additional permissions" are terms that supplement the terms of this
|
||||||
|
License by making exceptions from one or more of its conditions.
|
||||||
|
Additional permissions that are applicable to the entire Program shall
|
||||||
|
be treated as though they were included in this License, to the extent
|
||||||
|
that they are valid under applicable law. If additional permissions
|
||||||
|
apply only to part of the Program, that part may be used separately
|
||||||
|
under those permissions, but the entire Program remains governed by
|
||||||
|
this License without regard to the additional permissions.
|
||||||
|
|
||||||
|
When you convey a copy of a covered work, you may at your option
|
||||||
|
remove any additional permissions from that copy, or from any part of
|
||||||
|
it. (Additional permissions may be written to require their own
|
||||||
|
removal in certain cases when you modify the work.) You may place
|
||||||
|
additional permissions on material, added by you to a covered work,
|
||||||
|
for which you have or can give appropriate copyright permission.
|
||||||
|
|
||||||
|
Notwithstanding any other provision of this License, for material you
|
||||||
|
add to a covered work, you may (if authorized by the copyright holders of
|
||||||
|
that material) supplement the terms of this License with terms:
|
||||||
|
|
||||||
|
a) Disclaiming warranty or limiting liability differently from the
|
||||||
|
terms of sections 15 and 16 of this License; or
|
||||||
|
|
||||||
|
b) Requiring preservation of specified reasonable legal notices or
|
||||||
|
author attributions in that material or in the Appropriate Legal
|
||||||
|
Notices displayed by works containing it; or
|
||||||
|
|
||||||
|
c) Prohibiting misrepresentation of the origin of that material, or
|
||||||
|
requiring that modified versions of such material be marked in
|
||||||
|
reasonable ways as different from the original version; or
|
||||||
|
|
||||||
|
d) Limiting the use for publicity purposes of names of licensors or
|
||||||
|
authors of the material; or
|
||||||
|
|
||||||
|
e) Declining to grant rights under trademark law for use of some
|
||||||
|
trade names, trademarks, or service marks; or
|
||||||
|
|
||||||
|
f) Requiring indemnification of licensors and authors of that
|
||||||
|
material by anyone who conveys the material (or modified versions of
|
||||||
|
it) with contractual assumptions of liability to the recipient, for
|
||||||
|
any liability that these contractual assumptions directly impose on
|
||||||
|
those licensors and authors.
|
||||||
|
|
||||||
|
All other non-permissive additional terms are considered "further
|
||||||
|
restrictions" within the meaning of section 10. If the Program as you
|
||||||
|
received it, or any part of it, contains a notice stating that it is
|
||||||
|
governed by this License along with a term that is a further
|
||||||
|
restriction, you may remove that term. If a license document contains
|
||||||
|
a further restriction but permits relicensing or conveying under this
|
||||||
|
License, you may add to a covered work material governed by the terms
|
||||||
|
of that license document, provided that the further restriction does
|
||||||
|
not survive such relicensing or conveying.
|
||||||
|
|
||||||
|
If you add terms to a covered work in accord with this section, you
|
||||||
|
must place, in the relevant source files, a statement of the
|
||||||
|
additional terms that apply to those files, or a notice indicating
|
||||||
|
where to find the applicable terms.
|
||||||
|
|
||||||
|
Additional terms, permissive or non-permissive, may be stated in the
|
||||||
|
form of a separately written license, or stated as exceptions;
|
||||||
|
the above requirements apply either way.
|
||||||
|
|
||||||
|
8. Termination.
|
||||||
|
|
||||||
|
You may not propagate or modify a covered work except as expressly
|
||||||
|
provided under this License. Any attempt otherwise to propagate or
|
||||||
|
modify it is void, and will automatically terminate your rights under
|
||||||
|
this License (including any patent licenses granted under the third
|
||||||
|
paragraph of section 11).
|
||||||
|
|
||||||
|
However, if you cease all violation of this License, then your
|
||||||
|
license from a particular copyright holder is reinstated (a)
|
||||||
|
provisionally, unless and until the copyright holder explicitly and
|
||||||
|
finally terminates your license, and (b) permanently, if the copyright
|
||||||
|
holder fails to notify you of the violation by some reasonable means
|
||||||
|
prior to 60 days after the cessation.
|
||||||
|
|
||||||
|
Moreover, your license from a particular copyright holder is
|
||||||
|
reinstated permanently if the copyright holder notifies you of the
|
||||||
|
violation by some reasonable means, this is the first time you have
|
||||||
|
received notice of violation of this License (for any work) from that
|
||||||
|
copyright holder, and you cure the violation prior to 30 days after
|
||||||
|
your receipt of the notice.
|
||||||
|
|
||||||
|
Termination of your rights under this section does not terminate the
|
||||||
|
licenses of parties who have received copies or rights from you under
|
||||||
|
this License. If your rights have been terminated and not permanently
|
||||||
|
reinstated, you do not qualify to receive new licenses for the same
|
||||||
|
material under section 10.
|
||||||
|
|
||||||
|
9. Acceptance Not Required for Having Copies.
|
||||||
|
|
||||||
|
You are not required to accept this License in order to receive or
|
||||||
|
run a copy of the Program. Ancillary propagation of a covered work
|
||||||
|
occurring solely as a consequence of using peer-to-peer transmission
|
||||||
|
to receive a copy likewise does not require acceptance. However,
|
||||||
|
nothing other than this License grants you permission to propagate or
|
||||||
|
modify any covered work. These actions infringe copyright if you do
|
||||||
|
not accept this License. Therefore, by modifying or propagating a
|
||||||
|
covered work, you indicate your acceptance of this License to do so.
|
||||||
|
|
||||||
|
10. Automatic Licensing of Downstream Recipients.
|
||||||
|
|
||||||
|
Each time you convey a covered work, the recipient automatically
|
||||||
|
receives a license from the original licensors, to run, modify and
|
||||||
|
propagate that work, subject to this License. You are not responsible
|
||||||
|
for enforcing compliance by third parties with this License.
|
||||||
|
|
||||||
|
An "entity transaction" is a transaction transferring control of an
|
||||||
|
organization, or substantially all assets of one, or subdividing an
|
||||||
|
organization, or merging organizations. If propagation of a covered
|
||||||
|
work results from an entity transaction, each party to that
|
||||||
|
transaction who receives a copy of the work also receives whatever
|
||||||
|
licenses to the work the party's predecessor in interest had or could
|
||||||
|
give under the previous paragraph, plus a right to possession of the
|
||||||
|
Corresponding Source of the work from the predecessor in interest, if
|
||||||
|
the predecessor has it or can get it with reasonable efforts.
|
||||||
|
|
||||||
|
You may not impose any further restrictions on the exercise of the
|
||||||
|
rights granted or affirmed under this License. For example, you may
|
||||||
|
not impose a license fee, royalty, or other charge for exercise of
|
||||||
|
rights granted under this License, and you may not initiate litigation
|
||||||
|
(including a cross-claim or counterclaim in a lawsuit) alleging that
|
||||||
|
any patent claim is infringed by making, using, selling, offering for
|
||||||
|
sale, or importing the Program or any portion of it.
|
||||||
|
|
||||||
|
11. Patents.
|
||||||
|
|
||||||
|
A "contributor" is a copyright holder who authorizes use under this
|
||||||
|
License of the Program or a work on which the Program is based. The
|
||||||
|
work thus licensed is called the contributor's "contributor version".
|
||||||
|
|
||||||
|
A contributor's "essential patent claims" are all patent claims
|
||||||
|
owned or controlled by the contributor, whether already acquired or
|
||||||
|
hereafter acquired, that would be infringed by some manner, permitted
|
||||||
|
by this License, of making, using, or selling its contributor version,
|
||||||
|
but do not include claims that would be infringed only as a
|
||||||
|
consequence of further modification of the contributor version. For
|
||||||
|
purposes of this definition, "control" includes the right to grant
|
||||||
|
patent sublicenses in a manner consistent with the requirements of
|
||||||
|
this License.
|
||||||
|
|
||||||
|
Each contributor grants you a non-exclusive, worldwide, royalty-free
|
||||||
|
patent license under the contributor's essential patent claims, to
|
||||||
|
make, use, sell, offer for sale, import and otherwise run, modify and
|
||||||
|
propagate the contents of its contributor version.
|
||||||
|
|
||||||
|
In the following three paragraphs, a "patent license" is any express
|
||||||
|
agreement or commitment, however denominated, not to enforce a patent
|
||||||
|
(such as an express permission to practice a patent or covenant not to
|
||||||
|
sue for patent infringement). To "grant" such a patent license to a
|
||||||
|
party means to make such an agreement or commitment not to enforce a
|
||||||
|
patent against the party.
|
||||||
|
|
||||||
|
If you convey a covered work, knowingly relying on a patent license,
|
||||||
|
and the Corresponding Source of the work is not available for anyone
|
||||||
|
to copy, free of charge and under the terms of this License, through a
|
||||||
|
publicly available network server or other readily accessible means,
|
||||||
|
then you must either (1) cause the Corresponding Source to be so
|
||||||
|
available, or (2) arrange to deprive yourself of the benefit of the
|
||||||
|
patent license for this particular work, or (3) arrange, in a manner
|
||||||
|
consistent with the requirements of this License, to extend the patent
|
||||||
|
license to downstream recipients. "Knowingly relying" means you have
|
||||||
|
actual knowledge that, but for the patent license, your conveying the
|
||||||
|
covered work in a country, or your recipient's use of the covered work
|
||||||
|
in a country, would infringe one or more identifiable patents in that
|
||||||
|
country that you have reason to believe are valid.
|
||||||
|
|
||||||
|
If, pursuant to or in connection with a single transaction or
|
||||||
|
arrangement, you convey, or propagate by procuring conveyance of, a
|
||||||
|
covered work, and grant a patent license to some of the parties
|
||||||
|
receiving the covered work authorizing them to use, propagate, modify
|
||||||
|
or convey a specific copy of the covered work, then the patent license
|
||||||
|
you grant is automatically extended to all recipients of the covered
|
||||||
|
work and works based on it.
|
||||||
|
|
||||||
|
A patent license is "discriminatory" if it does not include within
|
||||||
|
the scope of its coverage, prohibits the exercise of, or is
|
||||||
|
conditioned on the non-exercise of one or more of the rights that are
|
||||||
|
specifically granted under this License. You may not convey a covered
|
||||||
|
work if you are a party to an arrangement with a third party that is
|
||||||
|
in the business of distributing software, under which you make payment
|
||||||
|
to the third party based on the extent of your activity of conveying
|
||||||
|
the work, and under which the third party grants, to any of the
|
||||||
|
parties who would receive the covered work from you, a discriminatory
|
||||||
|
patent license (a) in connection with copies of the covered work
|
||||||
|
conveyed by you (or copies made from those copies), or (b) primarily
|
||||||
|
for and in connection with specific products or compilations that
|
||||||
|
contain the covered work, unless you entered into that arrangement,
|
||||||
|
or that patent license was granted, prior to 28 March 2007.
|
||||||
|
|
||||||
|
Nothing in this License shall be construed as excluding or limiting
|
||||||
|
any implied license or other defenses to infringement that may
|
||||||
|
otherwise be available to you under applicable patent law.
|
||||||
|
|
||||||
|
12. No Surrender of Others' Freedom.
|
||||||
|
|
||||||
|
If conditions are imposed on you (whether by court order, agreement or
|
||||||
|
otherwise) that contradict the conditions of this License, they do not
|
||||||
|
excuse you from the conditions of this License. If you cannot convey a
|
||||||
|
covered work so as to satisfy simultaneously your obligations under this
|
||||||
|
License and any other pertinent obligations, then as a consequence you may
|
||||||
|
not convey it at all. For example, if you agree to terms that obligate you
|
||||||
|
to collect a royalty for further conveying from those to whom you convey
|
||||||
|
the Program, the only way you could satisfy both those terms and this
|
||||||
|
License would be to refrain entirely from conveying the Program.
|
||||||
|
|
||||||
|
13. Use with the GNU Affero General Public License.
|
||||||
|
|
||||||
|
Notwithstanding any other provision of this License, you have
|
||||||
|
permission to link or combine any covered work with a work licensed
|
||||||
|
under version 3 of the GNU Affero General Public License into a single
|
||||||
|
combined work, and to convey the resulting work. The terms of this
|
||||||
|
License will continue to apply to the part which is the covered work,
|
||||||
|
but the special requirements of the GNU Affero General Public License,
|
||||||
|
section 13, concerning interaction through a network will apply to the
|
||||||
|
combination as such.
|
||||||
|
|
||||||
|
14. Revised Versions of this License.
|
||||||
|
|
||||||
|
The Free Software Foundation may publish revised and/or new versions of
|
||||||
|
the GNU General Public License from time to time. Such new versions will
|
||||||
|
be similar in spirit to the present version, but may differ in detail to
|
||||||
|
address new problems or concerns.
|
||||||
|
|
||||||
|
Each version is given a distinguishing version number. If the
|
||||||
|
Program specifies that a certain numbered version of the GNU General
|
||||||
|
Public License "or any later version" applies to it, you have the
|
||||||
|
option of following the terms and conditions either of that numbered
|
||||||
|
version or of any later version published by the Free Software
|
||||||
|
Foundation. If the Program does not specify a version number of the
|
||||||
|
GNU General Public License, you may choose any version ever published
|
||||||
|
by the Free Software Foundation.
|
||||||
|
|
||||||
|
If the Program specifies that a proxy can decide which future
|
||||||
|
versions of the GNU General Public License can be used, that proxy's
|
||||||
|
public statement of acceptance of a version permanently authorizes you
|
||||||
|
to choose that version for the Program.
|
||||||
|
|
||||||
|
Later license versions may give you additional or different
|
||||||
|
permissions. However, no additional obligations are imposed on any
|
||||||
|
author or copyright holder as a result of your choosing to follow a
|
||||||
|
later version.
|
||||||
|
|
||||||
|
15. Disclaimer of Warranty.
|
||||||
|
|
||||||
|
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
|
||||||
|
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
|
||||||
|
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
|
||||||
|
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||||
|
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
|
||||||
|
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
|
||||||
|
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||||
|
|
||||||
|
16. Limitation of Liability.
|
||||||
|
|
||||||
|
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||||
|
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
|
||||||
|
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
|
||||||
|
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
|
||||||
|
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
|
||||||
|
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
|
||||||
|
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
|
||||||
|
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
|
||||||
|
SUCH DAMAGES.
|
||||||
|
|
||||||
|
17. Interpretation of Sections 15 and 16.
|
||||||
|
|
||||||
|
If the disclaimer of warranty and limitation of liability provided
|
||||||
|
above cannot be given local legal effect according to their terms,
|
||||||
|
reviewing courts shall apply local law that most closely approximates
|
||||||
|
an absolute waiver of all civil liability in connection with the
|
||||||
|
Program, unless a warranty or assumption of liability accompanies a
|
||||||
|
copy of the Program in return for a fee.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
How to Apply These Terms to Your New Programs
|
||||||
|
|
||||||
|
If you develop a new program, and you want it to be of the greatest
|
||||||
|
possible use to the public, the best way to achieve this is to make it
|
||||||
|
free software which everyone can redistribute and change under these terms.
|
||||||
|
|
||||||
|
To do so, attach the following notices to the program. It is safest
|
||||||
|
to attach them to the start of each source file to most effectively
|
||||||
|
state the exclusion of warranty; and each file should have at least
|
||||||
|
the "copyright" line and a pointer to where the full notice is found.
|
||||||
|
|
||||||
|
<one line to give the program's name and a brief idea of what it does.>
|
||||||
|
Copyright (C) <year> <name of author>
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
Also add information on how to contact you by electronic and paper mail.
|
||||||
|
|
||||||
|
If the program does terminal interaction, make it output a short
|
||||||
|
notice like this when it starts in an interactive mode:
|
||||||
|
|
||||||
|
<program> Copyright (C) <year> <name of author>
|
||||||
|
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||||
|
This is free software, and you are welcome to redistribute it
|
||||||
|
under certain conditions; type `show c' for details.
|
||||||
|
|
||||||
|
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||||
|
parts of the General Public License. Of course, your program's commands
|
||||||
|
might be different; for a GUI interface, you would use an "about box".
|
||||||
|
|
||||||
|
You should also get your employer (if you work as a programmer) or school,
|
||||||
|
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
||||||
|
For more information on this, and how to apply and follow the GNU GPL, see
|
||||||
|
<https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
The GNU General Public License does not permit incorporating your program
|
||||||
|
into proprietary programs. If your program is a subroutine library, you
|
||||||
|
may consider it more useful to permit linking proprietary applications with
|
||||||
|
the library. If this is what you want to do, use the GNU Lesser General
|
||||||
|
Public License instead of this License. But first, please read
|
||||||
|
<https://www.gnu.org/licenses/why-not-lgpl.html>.
|
|
@ -0,0 +1,64 @@
|
||||||
|
==============
|
||||||
|
Vector Bundles
|
||||||
|
==============
|
||||||
|
|
||||||
|
This is a `SageMath <http://www.sagemath.org>`_ implementing algorithms for creating and
|
||||||
|
manipulating Vector Bundles over algebraic curves on finite field. All manipulations are
|
||||||
|
done using algebra on function fields.
|
||||||
|
|
||||||
|
Installation
|
||||||
|
------------
|
||||||
|
|
||||||
|
Local install from source
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
Download the source from the git repository::
|
||||||
|
|
||||||
|
$ git clone https://github.com/sagemath/sage_sample.git
|
||||||
|
|
||||||
|
Change to the root directory and run::
|
||||||
|
|
||||||
|
$ sage -pip install --upgrade --no-index -v .
|
||||||
|
|
||||||
|
For convenience this package contains a `makefile <makefile>`_ with this
|
||||||
|
and other often used commands. Should you wish too, you can use the
|
||||||
|
shorthand::
|
||||||
|
|
||||||
|
$ make install
|
||||||
|
|
||||||
|
Usage
|
||||||
|
-----
|
||||||
|
|
||||||
|
|
||||||
|
Once the package is installed, you can use it in Sage with::
|
||||||
|
|
||||||
|
sage: from vector_bundle import *
|
||||||
|
|
||||||
|
See also the `demo notebook <demo.ipynb>`_ and the documentation.
|
||||||
|
|
||||||
|
Documentation
|
||||||
|
-------------
|
||||||
|
|
||||||
|
The documentation of the package can be generated using Sage's
|
||||||
|
``Sphinx`` installation::
|
||||||
|
|
||||||
|
$ cd docs
|
||||||
|
$ sage -sh -c "make html"
|
||||||
|
|
||||||
|
Shorthand::
|
||||||
|
|
||||||
|
$ make doc
|
||||||
|
|
||||||
|
TEST
|
||||||
|
----
|
||||||
|
|
||||||
|
To run the test suite of the package, simply run the command::
|
||||||
|
|
||||||
|
$make test
|
||||||
|
|
||||||
|
from the root of the repository.
|
||||||
|
|
||||||
|
CONTACT
|
||||||
|
-------
|
||||||
|
|
||||||
|
Mickaël Montessinos: mickael.montessinos@mif.vu.lt
|
|
@ -0,0 +1,234 @@
|
||||||
|
{
|
||||||
|
"cells": [
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"metadata": {},
|
||||||
|
"source": [
|
||||||
|
"# A demo of the vector_bundle package."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 2,
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"from vector_bundle import *\n",
|
||||||
|
"F.<x> = FunctionField(GF(101))"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"metadata": {},
|
||||||
|
"source": [
|
||||||
|
"## Constructing an indecomposable bundle on an elliptic curve\n",
|
||||||
|
"We construct an indecomposable vector bundle of rank 5 and degree 3 on a function field of genus 1. \n",
|
||||||
|
"This construction may be done automatically using the ```atiyah_bundle``` function but we break it down step by step."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 5,
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"name": "stdout",
|
||||||
|
"output_type": "stream",
|
||||||
|
"text": [
|
||||||
|
"[Ideal (1) of Maximal order of Function field in y defined by y^2 + 100*x^3 + 100*x]\n",
|
||||||
|
"[(1)]\n",
|
||||||
|
"[((x/(x^2 + 1))*y)]\n"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"R.<y> = F[]\n",
|
||||||
|
"K.<y> = F.extension(y^2 - x^3 - x)\n",
|
||||||
|
"deg_1_bundle = VectorBundle(K, K.places_infinite()[0].divisor())\n",
|
||||||
|
"E = deg_1_bundle\n",
|
||||||
|
"print(E.coefficient_ideals())\n",
|
||||||
|
"print(E.basis_finite())\n",
|
||||||
|
"print(E.basis_infinite())"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 7,
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"name": "stdout",
|
||||||
|
"output_type": "stream",
|
||||||
|
"text": [
|
||||||
|
"[Ideal (x^2/(x^2 + 3)) of Maximal order of Function field in y defined by y^2 + 100*x^3 + 100*x, Ideal (1) of Maximal order of Function field in y defined by y^2 + 100*x^3 + 100*x]\n",
|
||||||
|
"[(1, 0), (0, 1)]\n",
|
||||||
|
"[(1, 0), (100*x^3/(x^2 + 1), (x/(x^2 + 1))*y)]\n"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"E = E.extension_by_global_sections()\n",
|
||||||
|
"print(E.coefficient_ideals())\n",
|
||||||
|
"print(E.basis_finite())\n",
|
||||||
|
"print(E.basis_infinite())"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 8,
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"name": "stdout",
|
||||||
|
"output_type": "stream",
|
||||||
|
"text": [
|
||||||
|
"[Ideal (x^2/(x^2 + 3)) of Maximal order of Function field in y defined by y^2 + 100*x^3 + 100*x, Ideal (1) of Maximal order of Function field in y defined by y^2 + 100*x^3 + 100*x]\n",
|
||||||
|
"[(1, 0), (0, 1)]\n",
|
||||||
|
"[((x/(x^2 + 1))*y, 0), ((100*x^4/(x^4 + 2*x^2 + 1))*y, x^3/(x^2 + 1))]\n"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"E = E.tensor_product(deg_1_bundle)\n",
|
||||||
|
"print(E.coefficient_ideals())\n",
|
||||||
|
"print(E.basis_finite())\n",
|
||||||
|
"print(E.basis_infinite())"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 9,
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"name": "stdout",
|
||||||
|
"output_type": "stream",
|
||||||
|
"text": [
|
||||||
|
"[Ideal (x^2/(x^2 + 3)) of Maximal order of Function field in y defined by y^2 + 100*x^3 + 100*x, Ideal (x^2/(x^2 + 3)) of Maximal order of Function field in y defined by y^2 + 100*x^3 + 100*x, Ideal (x^2/(x^2 + 3)) of Maximal order of Function field in y defined by y^2 + 100*x^3 + 100*x, Ideal (x^2/(x^2 + 3)) of Maximal order of Function field in y defined by y^2 + 100*x^3 + 100*x, Ideal (1) of Maximal order of Function field in y defined by y^2 + 100*x^3 + 100*x]\n",
|
||||||
|
"[(1, 0, 0, 0, 0), (0, 1, 0, 0, 0), (0, 0, 1, 0, 0), (0, 0, 0, 1, 0), (0, 0, 0, 0, 1)]\n",
|
||||||
|
"[(1, 0, 0, 0, 0), (0, 1, 0, 0, 0), (0, 0, 1, 0, 0), (100*x^3/(x^2 + 1), 0, 100/x^2*y, (x/(x^2 + 1))*y, 0), (x^6/(x^4 + 2*x^2 + 1), (100*x^4/(x^4 + 2*x^2 + 1))*y, (x/(x^2 + 1))*y, (100*x^4/(x^4 + 2*x^2 + 1))*y, x^3/(x^2 + 1))]\n"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"E = E.extension_by_global_sections()\n",
|
||||||
|
"print(E.coefficient_ideals())\n",
|
||||||
|
"print(E.basis_finite())\n",
|
||||||
|
"print(E.basis_infinite())"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 10,
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"name": "stdout",
|
||||||
|
"output_type": "stream",
|
||||||
|
"text": [
|
||||||
|
"5\n",
|
||||||
|
"3\n"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"print(E.rank())\n",
|
||||||
|
"print(E.degree())"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"metadata": {},
|
||||||
|
"source": [
|
||||||
|
"We check the algebra of global endomorphisms of E to ensure that it is indecomposable."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 11,
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"text/plain": [
|
||||||
|
"[\n",
|
||||||
|
"[1 0 0 0 0]\n",
|
||||||
|
"[0 1 0 0 0]\n",
|
||||||
|
"[0 0 1 0 0]\n",
|
||||||
|
"[0 0 0 1 0]\n",
|
||||||
|
"[0 0 0 0 1]\n",
|
||||||
|
"]"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"execution_count": 11,
|
||||||
|
"metadata": {},
|
||||||
|
"output_type": "execute_result"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"E.end().h0()"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"metadata": {},
|
||||||
|
"source": [
|
||||||
|
"## Constructing a weakly stable vector bundle following Savin's method\n",
|
||||||
|
"We construct a weakly stable vector bundle of rank 3 and degree 5 by successive extensions by line bundles. \n",
|
||||||
|
"See [Sav07] in the references for details. \n",
|
||||||
|
"This, again, may be achieved directly using the ```savin_bundle``` function."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 12,
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"name": "stdout",
|
||||||
|
"output_type": "stream",
|
||||||
|
"text": [
|
||||||
|
"3\n",
|
||||||
|
"5\n",
|
||||||
|
"[Ideal (1, 1/x*y) of Maximal order of Function field in y defined by y^2 + 100*x^3 + 100*x, Ideal (1) of Maximal order of Function field in y defined by y^2 + 100*x^3 + 100*x, Ideal (1) of Maximal order of Function field in y defined by y^2 + 100*x^3 + 100*x]\n",
|
||||||
|
"[(1, 0, 0), (0, 1, 0), (0, 0, 1)]\n",
|
||||||
|
"[(1, 0, 0), ((100*x/(x^2 + 1))*y, x^3/(x^2 + 1), 0), (0, (100*x^4/(x^4 + 2*x^2 + 1))*y, x^3/(x^2 + 1))]\n"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"F = VectorBundle(K, 2*K.places_infinite()[0].divisor())\n",
|
||||||
|
"F1 = VectorBundle(K, K.places_finite()[0].divisor())\n",
|
||||||
|
"E1 = F1\n",
|
||||||
|
"E2 = F.non_trivial_extension(E1)\n",
|
||||||
|
"E3 = F.non_trivial_extension(E2)\n",
|
||||||
|
"print(E3.rank())\n",
|
||||||
|
"print(E3.degree())\n",
|
||||||
|
"print(E3.coefficient_ideals())\n",
|
||||||
|
"print(E3.basis_finite())\n",
|
||||||
|
"print(E3.basis_infinite())"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"metadata": {
|
||||||
|
"kernelspec": {
|
||||||
|
"display_name": "SageMath 10.3.beta8",
|
||||||
|
"language": "sage",
|
||||||
|
"name": "sagemath"
|
||||||
|
},
|
||||||
|
"language_info": {
|
||||||
|
"codemirror_mode": {
|
||||||
|
"name": "ipython",
|
||||||
|
"version": 3
|
||||||
|
},
|
||||||
|
"file_extension": ".py",
|
||||||
|
"mimetype": "text/x-python",
|
||||||
|
"name": "python",
|
||||||
|
"nbconvert_exporter": "python",
|
||||||
|
"pygments_lexer": "ipython3",
|
||||||
|
"version": "3.11.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nbformat": 4,
|
||||||
|
"nbformat_minor": 4
|
||||||
|
}
|
|
@ -0,0 +1,177 @@
|
||||||
|
# Makefile for Sphinx documentation
|
||||||
|
#
|
||||||
|
|
||||||
|
# You can set these variables from the command line.
|
||||||
|
SPHINXOPTS =
|
||||||
|
SPHINXBUILD = sphinx-build
|
||||||
|
PAPER =
|
||||||
|
BUILDDIR = build
|
||||||
|
|
||||||
|
# User-friendly check for sphinx-build
|
||||||
|
ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1)
|
||||||
|
$(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/)
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Internal variables.
|
||||||
|
PAPEROPT_a4 = -D latex_paper_size=a4
|
||||||
|
PAPEROPT_letter = -D latex_paper_size=letter
|
||||||
|
ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source
|
||||||
|
# the i18n builder cannot share the environment and doctrees with the others
|
||||||
|
I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source
|
||||||
|
|
||||||
|
.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext
|
||||||
|
|
||||||
|
help:
|
||||||
|
@echo "Please use \`make <target>' where <target> is one of"
|
||||||
|
@echo " html to make standalone HTML files"
|
||||||
|
@echo " dirhtml to make HTML files named index.html in directories"
|
||||||
|
@echo " singlehtml to make a single large HTML file"
|
||||||
|
@echo " pickle to make pickle files"
|
||||||
|
@echo " json to make JSON files"
|
||||||
|
@echo " htmlhelp to make HTML files and a HTML help project"
|
||||||
|
@echo " qthelp to make HTML files and a qthelp project"
|
||||||
|
@echo " devhelp to make HTML files and a Devhelp project"
|
||||||
|
@echo " epub to make an epub"
|
||||||
|
@echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
|
||||||
|
@echo " latexpdf to make LaTeX files and run them through pdflatex"
|
||||||
|
@echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx"
|
||||||
|
@echo " text to make text files"
|
||||||
|
@echo " man to make manual pages"
|
||||||
|
@echo " texinfo to make Texinfo files"
|
||||||
|
@echo " info to make Texinfo files and run them through makeinfo"
|
||||||
|
@echo " gettext to make PO message catalogs"
|
||||||
|
@echo " changes to make an overview of all changed/added/deprecated items"
|
||||||
|
@echo " xml to make Docutils-native XML files"
|
||||||
|
@echo " pseudoxml to make pseudoxml-XML files for display purposes"
|
||||||
|
@echo " linkcheck to check all external links for integrity"
|
||||||
|
@echo " doctest to run all doctests embedded in the documentation (if enabled)"
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -rf $(BUILDDIR)/*
|
||||||
|
|
||||||
|
html:
|
||||||
|
$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
|
||||||
|
@echo
|
||||||
|
@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
|
||||||
|
|
||||||
|
dirhtml:
|
||||||
|
$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
|
||||||
|
@echo
|
||||||
|
@echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
|
||||||
|
|
||||||
|
singlehtml:
|
||||||
|
$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
|
||||||
|
@echo
|
||||||
|
@echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
|
||||||
|
|
||||||
|
pickle:
|
||||||
|
$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
|
||||||
|
@echo
|
||||||
|
@echo "Build finished; now you can process the pickle files."
|
||||||
|
|
||||||
|
json:
|
||||||
|
$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
|
||||||
|
@echo
|
||||||
|
@echo "Build finished; now you can process the JSON files."
|
||||||
|
|
||||||
|
htmlhelp:
|
||||||
|
$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
|
||||||
|
@echo
|
||||||
|
@echo "Build finished; now you can run HTML Help Workshop with the" \
|
||||||
|
".hhp project file in $(BUILDDIR)/htmlhelp."
|
||||||
|
|
||||||
|
qthelp:
|
||||||
|
$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
|
||||||
|
@echo
|
||||||
|
@echo "Build finished; now you can run "qcollectiongenerator" with the" \
|
||||||
|
".qhcp project file in $(BUILDDIR)/qthelp, like this:"
|
||||||
|
@echo "# qcollectiongenerator $(BUILDDIR)/qthelp/slabbe.qhcp"
|
||||||
|
@echo "To view the help file:"
|
||||||
|
@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/slabbe.qhc"
|
||||||
|
|
||||||
|
devhelp:
|
||||||
|
$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
|
||||||
|
@echo
|
||||||
|
@echo "Build finished."
|
||||||
|
@echo "To view the help file:"
|
||||||
|
@echo "# mkdir -p $$HOME/.local/share/devhelp/slabbe"
|
||||||
|
@echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/slabbe"
|
||||||
|
@echo "# devhelp"
|
||||||
|
|
||||||
|
epub:
|
||||||
|
$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
|
||||||
|
@echo
|
||||||
|
@echo "Build finished. The epub file is in $(BUILDDIR)/epub."
|
||||||
|
|
||||||
|
latex:
|
||||||
|
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
|
||||||
|
@echo
|
||||||
|
@echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
|
||||||
|
@echo "Run \`make' in that directory to run these through (pdf)latex" \
|
||||||
|
"(use \`make latexpdf' here to do that automatically)."
|
||||||
|
|
||||||
|
latexpdf:
|
||||||
|
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
|
||||||
|
@echo "Running LaTeX files through pdflatex..."
|
||||||
|
$(MAKE) -C $(BUILDDIR)/latex all-pdf
|
||||||
|
@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
|
||||||
|
|
||||||
|
latexpdfja:
|
||||||
|
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
|
||||||
|
@echo "Running LaTeX files through platex and dvipdfmx..."
|
||||||
|
$(MAKE) -C $(BUILDDIR)/latex all-pdf-ja
|
||||||
|
@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
|
||||||
|
|
||||||
|
text:
|
||||||
|
$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
|
||||||
|
@echo
|
||||||
|
@echo "Build finished. The text files are in $(BUILDDIR)/text."
|
||||||
|
|
||||||
|
man:
|
||||||
|
$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
|
||||||
|
@echo
|
||||||
|
@echo "Build finished. The manual pages are in $(BUILDDIR)/man."
|
||||||
|
|
||||||
|
texinfo:
|
||||||
|
$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
|
||||||
|
@echo
|
||||||
|
@echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo."
|
||||||
|
@echo "Run \`make' in that directory to run these through makeinfo" \
|
||||||
|
"(use \`make info' here to do that automatically)."
|
||||||
|
|
||||||
|
info:
|
||||||
|
$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
|
||||||
|
@echo "Running Texinfo files through makeinfo..."
|
||||||
|
make -C $(BUILDDIR)/texinfo info
|
||||||
|
@echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo."
|
||||||
|
|
||||||
|
gettext:
|
||||||
|
$(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale
|
||||||
|
@echo
|
||||||
|
@echo "Build finished. The message catalogs are in $(BUILDDIR)/locale."
|
||||||
|
|
||||||
|
changes:
|
||||||
|
$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
|
||||||
|
@echo
|
||||||
|
@echo "The overview file is in $(BUILDDIR)/changes."
|
||||||
|
|
||||||
|
linkcheck:
|
||||||
|
$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
|
||||||
|
@echo
|
||||||
|
@echo "Link check complete; look for any errors in the above output " \
|
||||||
|
"or in $(BUILDDIR)/linkcheck/output.txt."
|
||||||
|
|
||||||
|
doctest:
|
||||||
|
$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
|
||||||
|
@echo "Testing of doctests in the sources finished, look at the " \
|
||||||
|
"results in $(BUILDDIR)/doctest/output.txt."
|
||||||
|
|
||||||
|
xml:
|
||||||
|
$(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml
|
||||||
|
@echo
|
||||||
|
@echo "Build finished. The XML files are in $(BUILDDIR)/xml."
|
||||||
|
|
||||||
|
pseudoxml:
|
||||||
|
$(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml
|
||||||
|
@echo
|
||||||
|
@echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml."
|
|
@ -0,0 +1,445 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
#
|
||||||
|
# sample documentation build configuration file,
|
||||||
|
# inspried by slabbe configuration file created sphinx-quickstart
|
||||||
|
#
|
||||||
|
# This file is execfile()d with the current directory set to its
|
||||||
|
# containing dir.
|
||||||
|
#
|
||||||
|
# Note that not all possible configuration values are present in this
|
||||||
|
# autogenerated file.
|
||||||
|
#
|
||||||
|
# All configuration values have a default; values that are commented out
|
||||||
|
# serve to show the default.
|
||||||
|
|
||||||
|
# General information about the project.
|
||||||
|
project = u"A SageMath package implementing vector bundles on algebraic curves using only function fields"
|
||||||
|
copyright = u'2024, Mickaël Montessinos'
|
||||||
|
package_name = 'vector_bundle'
|
||||||
|
package_folder = "../../"
|
||||||
|
authors = u"Mickaël Montessinos"
|
||||||
|
|
||||||
|
import six
|
||||||
|
import sys
|
||||||
|
import os
|
||||||
|
from sage.env import SAGE_DOC_SRC, SAGE_DOC, SAGE_SRC
|
||||||
|
|
||||||
|
try:
|
||||||
|
import sage.all
|
||||||
|
except ImportError:
|
||||||
|
raise RuntimeError("to build the documentation you need to be inside a Sage shell (run first the command 'sage -sh' in a shell")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# If extensions (or modules to document with autodoc) are in another directory,
|
||||||
|
# add these directories to sys.path here. If the directory is relative to the
|
||||||
|
# documentation root, use os.path.abspath to make it absolute, like shown here.
|
||||||
|
sys.path.insert(0, os.path.abspath(package_folder))
|
||||||
|
#sys.path.append(os.path.join(SAGE_SRC, "sage_setup", "docbuild", "ext"))
|
||||||
|
|
||||||
|
|
||||||
|
print("Using sys.path = {}".format(sys.path))
|
||||||
|
|
||||||
|
# -- General configuration ------------------------------------------------
|
||||||
|
|
||||||
|
# If your documentation needs a minimal Sphinx version, state it here.
|
||||||
|
#needs_sphinx = '1.0'
|
||||||
|
|
||||||
|
# Add any Sphinx extension module names here, as strings. They can be
|
||||||
|
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
|
||||||
|
# ones.
|
||||||
|
extensions = [
|
||||||
|
'sphinx.ext.autodoc',
|
||||||
|
#'sage_autodoc', ## Not available on conda-forge sage!
|
||||||
|
#'sage_package.sphinx',
|
||||||
|
'sphinx.ext.doctest',
|
||||||
|
'sphinx.ext.coverage',
|
||||||
|
'sphinx.ext.extlinks',
|
||||||
|
'matplotlib.sphinxext.plot_directive',
|
||||||
|
#'sphinxcontrib.bibtex'
|
||||||
|
]
|
||||||
|
|
||||||
|
### from Sage src/doc/common/conf.py
|
||||||
|
# This code is executed before each ".. PLOT::" directive in the Sphinx
|
||||||
|
# documentation. It defines a 'sphinx_plot' function that displays a Sage object
|
||||||
|
# through matplotlib, so that it will be displayed in the HTML doc.
|
||||||
|
plot_html_show_source_link = False
|
||||||
|
plot_pre_code = """
|
||||||
|
def sphinx_plot(graphics, **kwds):
|
||||||
|
import matplotlib.image as mpimg
|
||||||
|
from sage.misc.temporary_file import tmp_filename
|
||||||
|
import matplotlib.pyplot as plt
|
||||||
|
## Option handling is taken from Graphics.save
|
||||||
|
try:
|
||||||
|
from sage.plot.multigraphics import GraphicsArray
|
||||||
|
except ImportError:
|
||||||
|
from sage.plot.graphics import GraphicsArray
|
||||||
|
options = dict()
|
||||||
|
if not isinstance(graphics, GraphicsArray):
|
||||||
|
options.update(graphics.SHOW_OPTIONS)
|
||||||
|
options.update(graphics._extra_kwds)
|
||||||
|
options.update(kwds)
|
||||||
|
dpi = options.pop('dpi', None)
|
||||||
|
transparent = options.pop('transparent', None)
|
||||||
|
fig_tight = options.pop('fig_tight', None)
|
||||||
|
figsize = options.pop('figsize', None)
|
||||||
|
## figsize handling is taken from Graphics.matplotlib()
|
||||||
|
if figsize is not None and not isinstance(figsize, (list, tuple)):
|
||||||
|
# in this case, figsize is a number and should be positive
|
||||||
|
try:
|
||||||
|
figsize = float(figsize) # to pass to mpl
|
||||||
|
except TypeError:
|
||||||
|
raise TypeError("figsize should be a positive number, not {0}".format(figsize))
|
||||||
|
if figsize > 0:
|
||||||
|
default_width, default_height=rcParams['figure.figsize']
|
||||||
|
figsize=(figsize, default_height*figsize/default_width)
|
||||||
|
else:
|
||||||
|
raise ValueError("figsize should be positive, not {0}".format(figsize))
|
||||||
|
|
||||||
|
if figsize is not None:
|
||||||
|
# then the figsize should be two positive numbers
|
||||||
|
if len(figsize) != 2:
|
||||||
|
raise ValueError("figsize should be a positive number "
|
||||||
|
"or a list of two positive numbers, not {0}".format(figsize))
|
||||||
|
figsize = (float(figsize[0]),float(figsize[1])) # floats for mpl
|
||||||
|
if not (figsize[0] > 0 and figsize[1] > 0):
|
||||||
|
raise ValueError("figsize should be positive numbers, "
|
||||||
|
"not {0} and {1}".format(figsize[0],figsize[1]))
|
||||||
|
|
||||||
|
plt.figure(figsize=figsize)
|
||||||
|
if isinstance(graphics, GraphicsArray):
|
||||||
|
## from GraphicsArray.save
|
||||||
|
figure = plt.gcf()
|
||||||
|
rows = graphics.nrows()
|
||||||
|
cols = graphics.ncols()
|
||||||
|
for i, g in enumerate(graphics):
|
||||||
|
subplot = figure.add_subplot(rows, cols, i + 1)
|
||||||
|
g_options = copy(options)
|
||||||
|
g_options.update(g.SHOW_OPTIONS)
|
||||||
|
g_options.update(g._extra_kwds)
|
||||||
|
g_options.pop('dpi', None)
|
||||||
|
g_options.pop('transparent', None)
|
||||||
|
g_options.pop('fig_tight', None)
|
||||||
|
g.matplotlib(figure=figure, sub=subplot, **g_options)
|
||||||
|
else:
|
||||||
|
figure = graphics.matplotlib(figure=plt.gcf(), figsize=figsize, **options)
|
||||||
|
plt.tight_layout(pad=0)
|
||||||
|
plt.margins(0)
|
||||||
|
plt.show()
|
||||||
|
|
||||||
|
from sage.all_cmdline import *
|
||||||
|
"""
|
||||||
|
|
||||||
|
plot_html_show_formats = False
|
||||||
|
plot_formats = ['svg', 'pdf', 'png']
|
||||||
|
|
||||||
|
# Add any paths that contain templates here, relative to this directory.
|
||||||
|
# templates_path = ['_templates']
|
||||||
|
templates_path = [os.path.join(SAGE_DOC_SRC, 'common', 'templates'), '_templates']
|
||||||
|
|
||||||
|
# The suffix of source filenames.
|
||||||
|
source_suffix = '.rst'
|
||||||
|
|
||||||
|
# The encoding of source files.
|
||||||
|
#source_encoding = 'utf-8-sig'
|
||||||
|
|
||||||
|
# The master toctree document.
|
||||||
|
master_doc = 'index'
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# The version info for the project you're documenting, acts as replacement for
|
||||||
|
# |version| and |release|, also used in various other places throughout the
|
||||||
|
# built documents.
|
||||||
|
#
|
||||||
|
from pkg_resources import get_distribution, DistributionNotFound
|
||||||
|
# The full version, including alpha/beta/rc tags.
|
||||||
|
try:
|
||||||
|
release = get_distribution('sage-numerical-interactive-mip').version
|
||||||
|
except DistributionNotFound:
|
||||||
|
release = "0.2"
|
||||||
|
#print("############# release reported: {} ##################".format(release))
|
||||||
|
# The short X.Y version.
|
||||||
|
version = '.'.join(release.split('.')[:2])
|
||||||
|
|
||||||
|
# The language for content autogenerated by Sphinx. Refer to documentation
|
||||||
|
# for a list of supported languages.
|
||||||
|
#language = None
|
||||||
|
|
||||||
|
# There are two options for replacing |today|: either, you set today to some
|
||||||
|
# non-false value, then it is used:
|
||||||
|
#today = ''
|
||||||
|
# Else, today_fmt is used as the format for a strftime call.
|
||||||
|
#today_fmt = '%B %d, %Y'
|
||||||
|
|
||||||
|
# List of patterns, relative to source directory, that match files and
|
||||||
|
# directories to ignore when looking for source files.
|
||||||
|
exclude_patterns = []
|
||||||
|
|
||||||
|
# The reST default role (used for this markup: `text`) to use for all
|
||||||
|
# documents.
|
||||||
|
default_role = 'math'
|
||||||
|
|
||||||
|
# If true, '()' will be appended to :func: etc. cross-reference text.
|
||||||
|
#add_function_parentheses = True
|
||||||
|
|
||||||
|
# If true, the current module name will be prepended to all description
|
||||||
|
# unit titles (such as .. function::).
|
||||||
|
#add_module_names = True
|
||||||
|
|
||||||
|
# If true, sectionauthor and moduleauthor directives will be shown in the
|
||||||
|
# output. They are ignored by default.
|
||||||
|
#show_authors = False
|
||||||
|
|
||||||
|
# The name of the Pygments (syntax highlighting) style to use.
|
||||||
|
pygments_style = 'sphinx'
|
||||||
|
|
||||||
|
# A list of ignored prefixes for module index sorting.
|
||||||
|
#modindex_common_prefix = []
|
||||||
|
|
||||||
|
# If true, keep warnings as "system message" paragraphs in the built documents.
|
||||||
|
#keep_warnings = False
|
||||||
|
|
||||||
|
# -- Options for HTML output ----------------------------------------------
|
||||||
|
|
||||||
|
# The theme to use for HTML and HTML Help pages. See the documentation for
|
||||||
|
# a list of builtin themes.
|
||||||
|
html_theme = 'sage-classic'
|
||||||
|
html_theme_path = ['../themes']
|
||||||
|
|
||||||
|
# Theme options are theme-specific and customize the look and feel of a theme
|
||||||
|
# further. For a list of options available for each theme, see the
|
||||||
|
# documentation.
|
||||||
|
html_theme_options = {}
|
||||||
|
|
||||||
|
# The name for this set of Sphinx documents. If None, it defaults to
|
||||||
|
# "<project> v<release> documentation".
|
||||||
|
|
||||||
|
# A shorter title for the navigation bar. Default is the same as html_title.
|
||||||
|
#html_short_title = None
|
||||||
|
|
||||||
|
# The name of an image file (relative to this directory) to place at the top
|
||||||
|
# of the sidebar.
|
||||||
|
#html_logo = None
|
||||||
|
|
||||||
|
# The name of an image file (within the static path) to use as favicon of the
|
||||||
|
# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
|
||||||
|
# pixels large.
|
||||||
|
#html_favicon = None
|
||||||
|
|
||||||
|
# Add any paths that contain custom static files (such as style sheets) here,
|
||||||
|
# relative to this directory. They are copied after the builtin static files,
|
||||||
|
# so a file named "default.css" will overwrite the builtin "default.css".
|
||||||
|
html_static_path = [] #['_static']
|
||||||
|
|
||||||
|
# Add any extra paths that contain custom files (such as robots.txt or
|
||||||
|
# .htaccess) here, relative to this directory. These files are copied
|
||||||
|
# directly to the root of the documentation.
|
||||||
|
#html_extra_path = []
|
||||||
|
|
||||||
|
# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
|
||||||
|
# using the given strftime format.
|
||||||
|
#html_last_updated_fmt = '%b %d, %Y'
|
||||||
|
|
||||||
|
# If true, SmartyPants will be used to convert quotes and dashes to
|
||||||
|
# typographically correct entities.
|
||||||
|
#html_use_smartypants = True
|
||||||
|
|
||||||
|
# Custom sidebar templates, maps document names to template names.
|
||||||
|
#html_sidebars = {}
|
||||||
|
|
||||||
|
# Additional templates that should be rendered to pages, maps page names to
|
||||||
|
# template names.
|
||||||
|
#html_additional_pages = {}
|
||||||
|
|
||||||
|
# If false, no module index is generated.
|
||||||
|
#html_domain_indices = True
|
||||||
|
|
||||||
|
# If false, no index is generated.
|
||||||
|
#html_use_index = True
|
||||||
|
|
||||||
|
# If true, the index is split into individual pages for each letter.
|
||||||
|
#html_split_index = False
|
||||||
|
|
||||||
|
# If true, links to the reST sources are added to the pages.
|
||||||
|
#html_show_sourcelink = True
|
||||||
|
|
||||||
|
# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
|
||||||
|
#html_show_sphinx = True
|
||||||
|
|
||||||
|
# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
|
||||||
|
#html_show_copyright = True
|
||||||
|
|
||||||
|
# If true, an OpenSearch description file will be output, and all pages will
|
||||||
|
# contain a <link> tag referring to it. The value of this option must be the
|
||||||
|
# base URL from which the finished HTML is served.
|
||||||
|
#html_use_opensearch = ''
|
||||||
|
|
||||||
|
# This is the file name suffix for HTML files (e.g. ".xhtml").
|
||||||
|
#html_file_suffix = None
|
||||||
|
|
||||||
|
# Output file base name for HTML help builder.
|
||||||
|
htmlhelp_basename = package_name + "doc"
|
||||||
|
|
||||||
|
|
||||||
|
# -- Options for LaTeX output ---------------------------------------------
|
||||||
|
|
||||||
|
latex_elements = {
|
||||||
|
# The paper size ('letterpaper' or 'a4paper').
|
||||||
|
#'papersize': 'letterpaper',
|
||||||
|
|
||||||
|
# The font size ('10pt', '11pt' or '12pt').
|
||||||
|
#'pointsize': '10pt',
|
||||||
|
|
||||||
|
# Additional stuff for the LaTeX preamble.
|
||||||
|
'preamble': '',
|
||||||
|
}
|
||||||
|
|
||||||
|
# Grouping the document tree into LaTeX files. List of tuples
|
||||||
|
# (source start file, target name, title,
|
||||||
|
# author, documentclass [howto, manual, or own class]).
|
||||||
|
latex_documents = [
|
||||||
|
('index', package_name + '.tex', u'Documentation of ' + six.text_type(package_name),
|
||||||
|
authors, 'manual'),
|
||||||
|
]
|
||||||
|
|
||||||
|
# The name of an image file (relative to this directory) to place at the top of
|
||||||
|
# the title page.
|
||||||
|
#latex_logo = None
|
||||||
|
|
||||||
|
# For "manual" documents, if this is true, then toplevel headings are parts,
|
||||||
|
# not chapters.
|
||||||
|
#latex_use_parts = False
|
||||||
|
|
||||||
|
# If true, show page references after internal links.
|
||||||
|
#latex_show_pagerefs = False
|
||||||
|
|
||||||
|
# If true, show URL addresses after external links.
|
||||||
|
#latex_show_urls = False
|
||||||
|
|
||||||
|
# Documents to append as an appendix to all manuals.
|
||||||
|
#latex_appendices = []
|
||||||
|
|
||||||
|
# If false, no module index is generated.
|
||||||
|
#latex_domain_indices = True
|
||||||
|
|
||||||
|
|
||||||
|
# -- Options for manual page output ---------------------------------------
|
||||||
|
|
||||||
|
# One entry per manual page. List of tuples
|
||||||
|
# (source start file, name, description, authors, manual section).
|
||||||
|
man_pages = [
|
||||||
|
('index', package_name, six.text_type(package_name) + u" documentation",
|
||||||
|
[authors], 1)
|
||||||
|
]
|
||||||
|
|
||||||
|
# If true, show URL addresses after external links.
|
||||||
|
#man_show_urls = False
|
||||||
|
|
||||||
|
|
||||||
|
# -- Options for Texinfo output -------------------------------------------
|
||||||
|
|
||||||
|
# Grouping the document tree into Texinfo files. List of tuples
|
||||||
|
# (source start file, target name, title, author,
|
||||||
|
# dir menu entry, description, category)
|
||||||
|
texinfo_documents = [
|
||||||
|
('index', package_name, six.text_type(package_name) + u" documentation",
|
||||||
|
authors, package_name, project,
|
||||||
|
'Miscellaneous'),
|
||||||
|
]
|
||||||
|
|
||||||
|
# Documents to append as an appendix to all manuals.
|
||||||
|
#texinfo_appendices = []
|
||||||
|
|
||||||
|
# If false, no module index is generated.
|
||||||
|
#texinfo_domain_indices = True
|
||||||
|
|
||||||
|
# How to display URL addresses: 'footnote', 'no', or 'inline'.
|
||||||
|
#texinfo_show_urls = 'footnote'
|
||||||
|
|
||||||
|
# If true, do not generate a @detailmenu in the "Top" node's menu.
|
||||||
|
#texinfo_no_detailmenu = False
|
||||||
|
|
||||||
|
# -- Options copied from Sagemath conf.py file -------------------------------
|
||||||
|
|
||||||
|
# We use MathJax to build the documentation unless the environment
|
||||||
|
# variable SAGE_DOC_MATHJAX is set to "no" or "False". (Note that if
|
||||||
|
# the user does not set this variable, then the script sage-env sets
|
||||||
|
# it to "True".)
|
||||||
|
|
||||||
|
if (os.environ.get('SAGE_DOC_MATHJAX', 'no') != 'no'
|
||||||
|
and os.environ.get('SAGE_DOC_MATHJAX', 'no') != 'False'):
|
||||||
|
|
||||||
|
extensions.append('sphinx.ext.mathjax')
|
||||||
|
mathjax_path = 'MathJax.js?config=TeX-AMS_HTML-full,../mathjax_sage.js'
|
||||||
|
|
||||||
|
from sage.misc.latex_macros import sage_mathjax_macros
|
||||||
|
# this is broken for now
|
||||||
|
# html_theme_options['mathjax_macros'] = sage_mathjax_macros()
|
||||||
|
|
||||||
|
## from pkg_resources import Requirement, working_set
|
||||||
|
## sagenb_path = working_set.find(Requirement.parse('sagenb')).location
|
||||||
|
## mathjax_relative = os.path.join('sagenb','data','mathjax')
|
||||||
|
|
||||||
|
## # It would be really nice if sphinx would copy the entire mathjax directory,
|
||||||
|
## # (so we could have a _static/mathjax directory), rather than the contents of the directory
|
||||||
|
|
||||||
|
## mathjax_static = os.path.join(sagenb_path, mathjax_relative)
|
||||||
|
## html_static_path.append(mathjax_static)
|
||||||
|
## exclude_patterns=['**/'+os.path.join(mathjax_relative, i) for i in ('docs', 'README*', 'test',
|
||||||
|
## 'unpacked', 'LICENSE')]
|
||||||
|
from sage.env import SAGE_LOCAL, SAGE_SHARE
|
||||||
|
html_static_path.append(SAGE_LOCAL + "/lib/mathjax") # conda
|
||||||
|
html_static_path.append(SAGE_SHARE + "/mathjax") # sage distribution
|
||||||
|
else:
|
||||||
|
extensions.append('sphinx.ext.imgmath')
|
||||||
|
|
||||||
|
# This is to make the verbatim font smaller;
|
||||||
|
# Verbatim environment is not breaking long lines
|
||||||
|
from sphinx.highlighting import PygmentsBridge
|
||||||
|
from pygments.formatters.latex import LatexFormatter
|
||||||
|
|
||||||
|
class CustomLatexFormatter(LatexFormatter):
|
||||||
|
def __init__(self, **options):
|
||||||
|
super(CustomLatexFormatter, self).__init__(**options)
|
||||||
|
self.verboptions = r"formatcom=\footnotesize"
|
||||||
|
|
||||||
|
PygmentsBridge.latex_formatter = CustomLatexFormatter
|
||||||
|
|
||||||
|
latex_elements['preamble'] += r'''
|
||||||
|
% One-column index
|
||||||
|
\makeatletter
|
||||||
|
\renewenvironment{theindex}{
|
||||||
|
\chapter*{\indexname}
|
||||||
|
\markboth{\MakeUppercase\indexname}{\MakeUppercase\indexname}
|
||||||
|
\setlength{\parskip}{0.1em}
|
||||||
|
\relax
|
||||||
|
\let\item\@idxitem
|
||||||
|
}{}
|
||||||
|
\makeatother
|
||||||
|
\renewcommand{\ttdefault}{txtt}
|
||||||
|
'''
|
||||||
|
|
||||||
|
#####################################################
|
||||||
|
# add LaTeX macros for Sage
|
||||||
|
|
||||||
|
from sage.misc.latex_macros import sage_latex_macros
|
||||||
|
|
||||||
|
try:
|
||||||
|
pngmath_latex_preamble # check whether this is already defined
|
||||||
|
except NameError:
|
||||||
|
pngmath_latex_preamble = ""
|
||||||
|
|
||||||
|
for macro in sage_latex_macros():
|
||||||
|
# used when building latex and pdf versions
|
||||||
|
latex_elements['preamble'] += macro + '\n'
|
||||||
|
# used when building html version
|
||||||
|
pngmath_latex_preamble += macro + '\n'
|
||||||
|
|
||||||
|
|
||||||
|
## The following is needed on conda-forge sagemath
|
||||||
|
from sage.repl.user_globals import initialize_globals
|
||||||
|
import sage.all
|
||||||
|
my_globs = dict()
|
||||||
|
initialize_globals(sage.all, my_globs)
|
|
@ -0,0 +1,10 @@
|
||||||
|
.. nodoctest
|
||||||
|
|
||||||
|
Constructions
|
||||||
|
=============
|
||||||
|
|
||||||
|
.. automodule:: vector_bundle.constructions
|
||||||
|
:members:
|
||||||
|
:undoc-members:
|
||||||
|
:show-inheritance:
|
||||||
|
|
|
@ -0,0 +1,10 @@
|
||||||
|
.. nodoctest
|
||||||
|
|
||||||
|
Ext group
|
||||||
|
=========
|
||||||
|
|
||||||
|
.. automodule:: vector_bundle.ext_group
|
||||||
|
:members:
|
||||||
|
:undoc-members:
|
||||||
|
:show-inheritance:
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
.. nodoctest
|
||||||
|
|
||||||
|
Hom bundle
|
||||||
|
==========
|
||||||
|
|
||||||
|
.. automodule:: vector_bundle.hom_bundle
|
||||||
|
:members:
|
||||||
|
:undoc-members:
|
||||||
|
:show-inheritance:
|
|
@ -0,0 +1,36 @@
|
||||||
|
==========================
|
||||||
|
Sage Vector Bundle Package
|
||||||
|
==========================
|
||||||
|
|
||||||
|
This is a SageMath package implementing vector bundles on algebraic curves
|
||||||
|
|
||||||
|
To use this module, you need to import it::
|
||||||
|
|
||||||
|
from vector_bundle import *
|
||||||
|
|
||||||
|
This work is licensed under a `Creative Commons Attribution-Share Alike
|
||||||
|
3.0 License`__.
|
||||||
|
|
||||||
|
The source code for building this documentation and its theme are taken from
|
||||||
|
the `sage_sample`__ github repository.
|
||||||
|
|
||||||
|
__ https://creativecommons.org/licenses/by-sa/3.0/
|
||||||
|
__ https://github.com/sagemath/sage_sample
|
||||||
|
|
||||||
|
Vector Bundle
|
||||||
|
=============
|
||||||
|
|
||||||
|
.. toctree::
|
||||||
|
:maxdepth: 1
|
||||||
|
|
||||||
|
vector_bundle
|
||||||
|
hom_bundle
|
||||||
|
ext_group
|
||||||
|
constructions
|
||||||
|
|
||||||
|
Indices and Tables
|
||||||
|
==================
|
||||||
|
|
||||||
|
* :ref:`genindex`
|
||||||
|
* :ref:`modindex`
|
||||||
|
* :ref:`search`
|
|
@ -0,0 +1,9 @@
|
||||||
|
.. nodoctest
|
||||||
|
|
||||||
|
Vector bundle
|
||||||
|
=================
|
||||||
|
|
||||||
|
.. automodule:: vector_bundle.vector_bundle
|
||||||
|
:members:
|
||||||
|
:undoc-members:
|
||||||
|
:show-inheritance:
|
|
@ -0,0 +1,69 @@
|
||||||
|
{#
|
||||||
|
This is a customized version for Sage documentation theme.
|
||||||
|
|
||||||
|
Changes: at line 42, "slice(2)" -> "slice(1)"
|
||||||
|
#}
|
||||||
|
|
||||||
|
{#
|
||||||
|
basic/genindex-single.html
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Template for a "single" page of a split index.
|
||||||
|
|
||||||
|
:copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS.
|
||||||
|
:license: BSD, see LICENSE for details.
|
||||||
|
#}
|
||||||
|
{% macro indexentries(firstname, links) %}
|
||||||
|
{%- if links -%}
|
||||||
|
<a href="{{ links[0][1] }}">
|
||||||
|
{%- if links[0][0] %}<strong>{% endif -%}
|
||||||
|
{{ firstname|e }}
|
||||||
|
{%- if links[0][0] %}</strong>{% endif -%}
|
||||||
|
</a>
|
||||||
|
|
||||||
|
{%- for ismain, link in links[1:] -%}
|
||||||
|
, <a href="{{ link }}">{% if ismain %}<strong>{% endif -%}
|
||||||
|
[{{ loop.index }}]
|
||||||
|
{%- if ismain %}</strong>{% endif -%}
|
||||||
|
</a>
|
||||||
|
{%- endfor %}
|
||||||
|
{%- else %}
|
||||||
|
{{ firstname|e }}
|
||||||
|
{%- endif %}
|
||||||
|
{% endmacro %}
|
||||||
|
|
||||||
|
{%- extends "layout.html" %}
|
||||||
|
{% set title = _('Index') %}
|
||||||
|
{% block body %}
|
||||||
|
|
||||||
|
<h1 id="index">{% trans key=key %}Index – {{ key }}{% endtrans %}</h1>
|
||||||
|
|
||||||
|
<table style="width: 100%" class="indextable"><tr>
|
||||||
|
{%- for column in entries|slice(1) if column %}
|
||||||
|
<td style="width: 33%; vertical-align: top;"><ul>
|
||||||
|
{%- for entryname, (links, subitems, _) in column %}
|
||||||
|
<li>{{ indexentries(entryname, links) }}
|
||||||
|
{%- if subitems %}
|
||||||
|
<ul>
|
||||||
|
{%- for subentryname, subentrylinks in subitems %}
|
||||||
|
<li>{{ indexentries(subentryname, subentrylinks) }}</li>
|
||||||
|
{%- endfor %}
|
||||||
|
</ul>
|
||||||
|
{%- endif -%}</li>
|
||||||
|
{%- endfor %}
|
||||||
|
</ul></td>
|
||||||
|
{%- endfor %}
|
||||||
|
</tr></table>
|
||||||
|
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block sidebarrel %}
|
||||||
|
<h4>{{ _('Index') }}</h4>
|
||||||
|
<p>{% for key, dummy in genindexentries -%}
|
||||||
|
<a href="{{ pathto('genindex-' + key) }}"><strong>{{ key }}</strong></a>
|
||||||
|
{% if not loop.last %}| {% endif %}
|
||||||
|
{%- endfor %}</p>
|
||||||
|
|
||||||
|
<p><a href="{{ pathto('genindex-all') }}"><strong>{{ _('Full index on one page') }}</strong></a></p>
|
||||||
|
{{ super() }}
|
||||||
|
{% endblock %}
|
|
@ -0,0 +1,47 @@
|
||||||
|
{#
|
||||||
|
This is a customized version for Sage documentation theme.
|
||||||
|
|
||||||
|
Changes: no change
|
||||||
|
#}
|
||||||
|
|
||||||
|
{#
|
||||||
|
basic/genindex-split.html
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Template for a "split" index overview page.
|
||||||
|
|
||||||
|
:copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS.
|
||||||
|
:license: BSD, see LICENSE for details.
|
||||||
|
#}
|
||||||
|
{%- extends "layout.html" %}
|
||||||
|
{% set title = _('Index') %}
|
||||||
|
{% block body %}
|
||||||
|
|
||||||
|
<h1 id="index">{{ _('Index') }}</h1>
|
||||||
|
|
||||||
|
<p>{{ _('Index pages by letter') }}:</p>
|
||||||
|
|
||||||
|
<div class="genindex-jumpbox">
|
||||||
|
<p>{% for key, dummy in genindexentries -%}
|
||||||
|
<a href="{{ pathto('genindex-' + key) }}"><strong>{{ key }}</strong></a>
|
||||||
|
{% if not loop.last %}| {% endif %}
|
||||||
|
{%- endfor %}</p>
|
||||||
|
|
||||||
|
<p><a href="{{ pathto('genindex-all') }}"><strong>{{ _('Full index on one page') }}</strong>
|
||||||
|
({{ _('can be huge') }})</a></p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block sidebarrel %}
|
||||||
|
{% if split_index %}
|
||||||
|
<h4>Index</h4>
|
||||||
|
<p>{% for key, dummy in genindexentries -%}
|
||||||
|
<a href="{{ pathto('genindex-' + key) }}"><strong>{{ key }}</strong></a>
|
||||||
|
{% if not loop.last %}| {% endif %}
|
||||||
|
{%- endfor %}</p>
|
||||||
|
|
||||||
|
<p><a href="{{ pathto('genindex-all') }}"><strong>{{ _('Full index on one page') }}</strong></a></p>
|
||||||
|
{% endif %}
|
||||||
|
{{ super() }}
|
||||||
|
{% endblock %}
|
|
@ -0,0 +1,82 @@
|
||||||
|
{#
|
||||||
|
This is a customized version for Sage documentation theme.
|
||||||
|
|
||||||
|
Changes: at line 52, "slice(2)" -> "slice(1)"
|
||||||
|
#}
|
||||||
|
|
||||||
|
{#
|
||||||
|
basic/genindex.html
|
||||||
|
~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Template for an "all-in-one" index.
|
||||||
|
|
||||||
|
:copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS.
|
||||||
|
:license: BSD, see LICENSE for details.
|
||||||
|
#}
|
||||||
|
{%- extends "layout.html" %}
|
||||||
|
{% set title = _('Index') %}
|
||||||
|
|
||||||
|
{% macro indexentries(firstname, links) %}
|
||||||
|
{%- if links -%}
|
||||||
|
<a href="{{ links[0][1] }}">
|
||||||
|
{%- if links[0][0] %}<strong>{% endif -%}
|
||||||
|
{{ firstname|e }}
|
||||||
|
{%- if links[0][0] %}</strong>{% endif -%}
|
||||||
|
</a>
|
||||||
|
|
||||||
|
{%- for ismain, link in links[1:] -%}
|
||||||
|
, <a href="{{ link }}">{% if ismain %}<strong>{% endif -%}
|
||||||
|
[{{ loop.index }}]
|
||||||
|
{%- if ismain %}</strong>{% endif -%}
|
||||||
|
</a>
|
||||||
|
{%- endfor %}
|
||||||
|
{%- else %}
|
||||||
|
{{ firstname|e }}
|
||||||
|
{%- endif %}
|
||||||
|
{% endmacro %}
|
||||||
|
|
||||||
|
{% block body %}
|
||||||
|
|
||||||
|
<h1 id="index">{{ _('Index') }}</h1>
|
||||||
|
|
||||||
|
<div class="genindex-jumpbox">
|
||||||
|
{% for key, dummy in genindexentries -%}
|
||||||
|
<a href="#{{ key }}"><strong>{{ key }}</strong></a>
|
||||||
|
{% if not loop.last %}| {% endif %}
|
||||||
|
{%- endfor %}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{%- for key, entries in genindexentries %}
|
||||||
|
<h2 id="{{ key }}">{{ key }}</h2>
|
||||||
|
<table style="width: 100%" class="indextable genindextable"><tr>
|
||||||
|
{%- for column in entries|slice_index(1) if column %}
|
||||||
|
<td style="width: 33%; vertical-align: top;"><ul>
|
||||||
|
{%- for entryname, (links, subitems, _) in column %}
|
||||||
|
<li>{{ indexentries(entryname, links) }}
|
||||||
|
{%- if subitems %}
|
||||||
|
<ul>
|
||||||
|
{%- for subentryname, subentrylinks in subitems %}
|
||||||
|
<li>{{ indexentries(subentryname, subentrylinks) }}</li>
|
||||||
|
{%- endfor %}
|
||||||
|
</ul>
|
||||||
|
{%- endif -%}</li>
|
||||||
|
{%- endfor %}
|
||||||
|
</ul></td>
|
||||||
|
{%- endfor %}
|
||||||
|
</tr></table>
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block sidebarrel %}
|
||||||
|
{% if split_index %}
|
||||||
|
<h4>{{ _('Index') }}</h4>
|
||||||
|
<p>{% for key, dummy in genindexentries -%}
|
||||||
|
<a href="{{ pathto('genindex-' + key) }}"><strong>{{ key }}</strong></a>
|
||||||
|
{% if not loop.last %}| {% endif %}
|
||||||
|
{%- endfor %}</p>
|
||||||
|
|
||||||
|
<p><a href="{{ pathto('genindex-all') }}"><strong>{{ _('Full index on one page') }}</strong></a></p>
|
||||||
|
{% endif %}
|
||||||
|
{{ super() }}
|
||||||
|
{% endblock %}
|
|
@ -0,0 +1,181 @@
|
||||||
|
{% extends "classic/layout.html" %}
|
||||||
|
|
||||||
|
{% block rootrellink %}
|
||||||
|
<li class="nav-item nav-item-0">
|
||||||
|
<a href="http://www.sagemath.org"><img src="{{ pathto('_static/logo_sagemath_black.svg', 1) }}" class="sage-logo" title="Sage Logo"></a>
|
||||||
|
{% if website %}
|
||||||
|
<a href="index.html">{{ documentation_title|e }}</a>{{ reldelim1 }}
|
||||||
|
{% else %}
|
||||||
|
<a href="{{ documentation_root }}">{{ documentation_title|e }}</a>{{ reldelim1 }}
|
||||||
|
{% if refsub %}
|
||||||
|
<a href="{{ reference_root }}">{{ reference_title|e }}</a>{{ reldelim1 }}
|
||||||
|
{% endif %}
|
||||||
|
<a href="{{ pathto(root_doc)|e }}">{{ shorttitle|e }}</a>{{ reldelim1 }}
|
||||||
|
{% endif %}
|
||||||
|
</li>
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block extrahead %}
|
||||||
|
<link rel="icon" href="{{ pathto('_static/sageicon.png', 1) }}" type="image/x-icon" />
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{%- block footer %}
|
||||||
|
{{ super() }}
|
||||||
|
<script type="text/javascript">
|
||||||
|
/*global jQuery, window */
|
||||||
|
/* Sphinx sidebar toggle. Putting this code at the end of the body
|
||||||
|
* enables the toggle for the live, static, and offline docs. Note:
|
||||||
|
* sage.misc.html.math_parse() eats jQuery's dollar-sign shortcut. */
|
||||||
|
var jq = jQuery;
|
||||||
|
jq(document).ready(function () {
|
||||||
|
var bar, bod, bg, fg, key, tog, wid_old, wid_new, get_state, set_state;
|
||||||
|
bod = jq('div.bodywrapper');
|
||||||
|
bar = jq('div.sphinxsidebar');
|
||||||
|
tog = jq('<div class="sphinxsidebartoggle"></div>');
|
||||||
|
|
||||||
|
/* The sidebar toggle adapts its height to the bodywrapper height. */
|
||||||
|
const resizeObserver = new ResizeObserver(entries => {
|
||||||
|
tog.height(bod.height());
|
||||||
|
});
|
||||||
|
resizeObserver.observe(bod[0]);
|
||||||
|
|
||||||
|
/* Setup and add the toggle. See Sphinx v0.5.1 default.css. */
|
||||||
|
fg = jq('div.sphinxsidebar p a').css('color') || 'rgb(152, 219, 204)';
|
||||||
|
bg = jq('div.document').css('background-color') || 'rgb(28, 78, 99)';
|
||||||
|
wid_old = '230px';
|
||||||
|
wid_new = '5px';
|
||||||
|
tog.css('background-color', bg)
|
||||||
|
.css('border-width', '0px')
|
||||||
|
.css('border-right', wid_new + ' ridge ' + bg)
|
||||||
|
.css('cursor', 'pointer')
|
||||||
|
.css('position', 'absolute')
|
||||||
|
.css('left', '-' + wid_new)
|
||||||
|
.css('top', '0px')
|
||||||
|
.css('width', wid_new);
|
||||||
|
bod.css('position', 'relative');
|
||||||
|
bod.prepend(tog);
|
||||||
|
|
||||||
|
/* Cookie helpers. */
|
||||||
|
key = 'sphinxsidebar=';
|
||||||
|
set_state = function (s) {
|
||||||
|
var date = new Date();
|
||||||
|
/* Expiry in 7 days. */
|
||||||
|
date.setTime(date.getTime() + (7 * 24 * 3600 * 1000));
|
||||||
|
document.cookie = key + encodeURIComponent(s) + '; expires=' +
|
||||||
|
date.toUTCString() + '; path=/';
|
||||||
|
};
|
||||||
|
get_state = function () {
|
||||||
|
var i, c, crumbs = document.cookie.split(';');
|
||||||
|
for (i = 0; i < crumbs.length; i += 1) {
|
||||||
|
c = crumbs[i].replace(/^\s+/, '');
|
||||||
|
if (c.indexOf(key) === 0) {
|
||||||
|
return decodeURIComponent(c.substring(key.length, c.length));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Event handlers. */
|
||||||
|
tog.mouseover(function (ev) {
|
||||||
|
tog.css('border-right-color', fg);
|
||||||
|
}).mouseout(function (ev) {
|
||||||
|
tog.css('border-right-color', bg);
|
||||||
|
}).click(function (ev) {
|
||||||
|
if (bod.hasClass('wide')) {
|
||||||
|
bod.removeClass('wide');
|
||||||
|
bod.css('margin-left', wid_old);
|
||||||
|
bar.css('width', wid_old);
|
||||||
|
bar.show();
|
||||||
|
set_state('visible');
|
||||||
|
} else {
|
||||||
|
set_state('hidden');
|
||||||
|
bar.hide();
|
||||||
|
bar.css('width', '0px');
|
||||||
|
bod.css('margin-left', wid_new);
|
||||||
|
bod.addClass('wide');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
/* Hide the normally visible sidebar? */
|
||||||
|
if (get_state() === 'hidden') {
|
||||||
|
tog.trigger('click');
|
||||||
|
} else {
|
||||||
|
set_state('visible');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
<script type="text/javascript">
|
||||||
|
/* detex the document title by removing "\(", "\)", "\", "$" */
|
||||||
|
document.title = document.title.replace(/\\\(/g, '').replace(/\\\)/g, '').replace(/\\/g, '').replace(/\$/g, '');
|
||||||
|
</script>
|
||||||
|
{%- endblock %}
|
||||||
|
|
||||||
|
<!-- This macro block for the sidebar is heavily borrowed from the basic -->
|
||||||
|
<!-- theme of Sphinx. In particular, we borrowed from the file -->
|
||||||
|
<!-- themes/basic/layout.html distributed with Sphinx. -->
|
||||||
|
{%- macro sidebar() %}
|
||||||
|
{%- if not embedded %}{% if not theme_nosidebar|tobool %}
|
||||||
|
<div class="sphinxsidebar">
|
||||||
|
<div class="sphinxsidebarwrapper">
|
||||||
|
{%- block sidebarlogo %}
|
||||||
|
{%- if logo %}
|
||||||
|
<p class="logo"><a href="{{ pathto(master_doc) }}">
|
||||||
|
<img class="logo" src="{{ pathto('_static/' + logo, 1) }}" alt="Logo"/>
|
||||||
|
</a></p>
|
||||||
|
{%- endif %}
|
||||||
|
{%- endblock %}
|
||||||
|
{%- block sidebartoc %}
|
||||||
|
{%- if display_toc %}
|
||||||
|
<h3><a href="{{ pathto(master_doc) }}">{{ _('Table Of Contents') }}</a></h3>
|
||||||
|
{{ toc }}
|
||||||
|
{%- endif %}
|
||||||
|
{%- endblock %}
|
||||||
|
{%- block sidebarrel %}
|
||||||
|
{%- if prev %}
|
||||||
|
<h4>{{ _('Previous topic') }}</h4>
|
||||||
|
<p class="topless"><a href="{{ prev.link|e }}"
|
||||||
|
title="{{ _('previous chapter') }}">{{ prev.title }}</a></p>
|
||||||
|
{%- endif %}
|
||||||
|
{%- if next %}
|
||||||
|
<h4>{{ _('Next topic') }}</h4>
|
||||||
|
<p class="topless"><a href="{{ next.link|e }}"
|
||||||
|
title="{{ _('next chapter') }}">{{ next.title }}</a></p>
|
||||||
|
{%- endif %}
|
||||||
|
{%- endblock %}
|
||||||
|
{%- block sidebarsourcelink %}
|
||||||
|
{%- if show_source and has_source and sourcename %}
|
||||||
|
<h3>{{ _('This Page') }}</h3>
|
||||||
|
<ul class="this-page-menu">
|
||||||
|
<li><a href="{{ pathto('_sources/' + sourcename, true)|e }}"
|
||||||
|
rel="nofollow">{{ _('Show Source') }}</a></li>
|
||||||
|
</ul>
|
||||||
|
{%- endif %}
|
||||||
|
{%- endblock %}
|
||||||
|
{%- if customsidebar %}
|
||||||
|
{% include customsidebar %}
|
||||||
|
{%- endif %}
|
||||||
|
{%- block sidebarsearch %}
|
||||||
|
{%- if pagename != "search" and builder != "singlehtml" %}
|
||||||
|
<div id="searchbox" style="display: none" role="search">
|
||||||
|
<h3 id="searchlabel">{{ _('Quick search') }}</h3>
|
||||||
|
<div class="searchformwrapper">
|
||||||
|
<form class="search" action="{{ pathto('search') }}" method="get">
|
||||||
|
<input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
|
||||||
|
<!-- The shading of the "Go" button should be consistent -->
|
||||||
|
<!-- with the colour of the header and footer. See the file -->
|
||||||
|
<!-- doc/common/themes/sage/theme.conf for colours used by -->
|
||||||
|
<!-- the Sage theme. -->
|
||||||
|
<input type="submit" style="background-color: #B8B9F6" value="{{ _('Go') }}" />
|
||||||
|
</form>
|
||||||
|
<p class="searchtip" style="font-size: 90%">
|
||||||
|
{{ _('Enter search terms or a module, class or function name.') }}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<script>$('#searchbox').show(0);</script>
|
||||||
|
{%- endif %}
|
||||||
|
{%- endblock %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{%- endif %}{% endif %}
|
||||||
|
{%- endmacro %}
|
|
@ -0,0 +1,70 @@
|
||||||
|
{#
|
||||||
|
basic/search.html
|
||||||
|
~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Template for the search page.
|
||||||
|
|
||||||
|
:copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS.
|
||||||
|
:license: BSD, see LICENSE for details.
|
||||||
|
#}
|
||||||
|
{%- extends "layout.html" %}
|
||||||
|
{% set title = _('Search') %}
|
||||||
|
{%- block scripts %}
|
||||||
|
{{ super() }}
|
||||||
|
<script src="{{ pathto('_static/searchtools.js', 1) }}"></script>
|
||||||
|
<script src="{{ pathto('_static/language_data.js', 1) }}"></script>
|
||||||
|
{%- endblock %}
|
||||||
|
{% block extrahead %}
|
||||||
|
<script src="{{ pathto('searchindex.js', 1) }}" defer></script>
|
||||||
|
{{ super() }}
|
||||||
|
{% endblock %}
|
||||||
|
{% block body %}
|
||||||
|
<h1 id="search-documentation">{{ _('Search') }}</h1>
|
||||||
|
{% block scriptwarning %}
|
||||||
|
<noscript>
|
||||||
|
<div class="admonition warning">
|
||||||
|
<p>
|
||||||
|
{% trans %}Please activate JavaScript to enable the search
|
||||||
|
functionality.{% endtrans %}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</noscript>
|
||||||
|
{% endblock %}
|
||||||
|
{% block searchtext %}
|
||||||
|
<p>
|
||||||
|
{% trans %}Searching for multiple words only shows matches that contain
|
||||||
|
all words.{% endtrans %}
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
{% trans %}Note also that you can also call "search_src(...)"
|
||||||
|
while running Sage to search Sage's source code.{% endtrans %}
|
||||||
|
</p>
|
||||||
|
{% endblock %}
|
||||||
|
{% block searchbox %}
|
||||||
|
<form action="" method="get">
|
||||||
|
<input type="text" name="q" aria-labelledby="search-documentation" value="" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
|
||||||
|
<input type="submit" value="{{ _('search') }}" />
|
||||||
|
<span id="search-progress" style="padding-left: 10px"></span>
|
||||||
|
</form>
|
||||||
|
{% endblock %}
|
||||||
|
{% block searchresults %}
|
||||||
|
{% if search_performed %}
|
||||||
|
<h2>{{ _('Search Results') }}</h2>
|
||||||
|
{% if not search_results %}
|
||||||
|
<p>{{ _('Your search did not match any documents.') }}</p>
|
||||||
|
{% endif %}
|
||||||
|
{% endif %}
|
||||||
|
<div id="search-results">
|
||||||
|
{% if search_results %}
|
||||||
|
<ul>
|
||||||
|
{% for href, caption, context in search_results %}
|
||||||
|
<li><a href="{{ pathto(item.href) }}">{{ caption }}</a>
|
||||||
|
<div class="context">{{ context|e }}</div>
|
||||||
|
</li>
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
|
{% endblock %}
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-check" width="44" height="44" viewBox="0 0 24 24" stroke-width="2" stroke="#22863a" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
|
||||||
|
<path d="M5 12l5 5l10 -10" />
|
||||||
|
</svg>
|
After Width: | Height: | Size: 313 B |
|
@ -0,0 +1,5 @@
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-copy" width="44" height="44" viewBox="0 0 24 24" stroke-width="1.5" stroke="#000000" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
|
||||||
|
<rect x="8" y="8" width="12" height="12" rx="2" />
|
||||||
|
<path d="M16 8v-2a2 2 0 0 0 -2 -2h-8a2 2 0 0 0 -2 2v8a2 2 0 0 0 2 2h2" />
|
||||||
|
</svg>
|
After Width: | Height: | Size: 411 B |
After Width: | Height: | Size: 286 B |
|
@ -0,0 +1 @@
|
||||||
|
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" width="570" height="230" viewBox="23 2 114 46"><g style="stroke-width:4;stroke-linejoin:round;stroke:#000;fill:none"><rect x="0" y="0" width="150" height="50" style="fill:none"/><polyline points="55,10 38,10 38,20 53,20 53,30 28,30"/><polyline points="97,30 85,30 75,10 60,10 60,30 75,30 85,10 100,10 100,40 80,40"/><polyline points="132,30 107,30 107,10 122,10 122,20 110,20"/></g></svg>
|
After Width: | Height: | Size: 564 B |
|
@ -0,0 +1 @@
|
||||||
|
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" width="570" height="230" viewBox="23 2 114 46"><g style="stroke-width:4;stroke-linejoin:round;stroke:#fff;fill:none"><rect x="0" y="0" width="150" height="50" style="fill:blue;fill-opacity:0.0"/><polyline points="55,10 38,10 38,20 53,20 53,30 28,30"/><polyline points="97,30 85,30 75,10 60,10 60,30 75,30 85,10 100,10 100,40 80,40"/><polyline points="132,30 107,30 107,10 122,10 122,20 110,20"/></g></svg>
|
After Width: | Height: | Size: 581 B |
After Width: | Height: | Size: 90 B |
After Width: | Height: | Size: 483 B |
After Width: | Height: | Size: 90 B |
|
@ -0,0 +1,382 @@
|
||||||
|
/*
|
||||||
|
* This style sheet is borrowed from the Sphinx classic theme style sheet
|
||||||
|
* distributed as the file themes/classic/static/classic.css_t in Sphinx 4.4.0.
|
||||||
|
*
|
||||||
|
* Customizations for Sage follow from the end of the original style sheet.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
@import url("basic.css");
|
||||||
|
|
||||||
|
/* -- page layout ----------------------------------------------------------- */
|
||||||
|
|
||||||
|
html {
|
||||||
|
/* CSS hack for macOS's scrollbar */
|
||||||
|
background-color: #FFFFFF;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
font-family: {{ theme_bodyfont }};
|
||||||
|
font-size: 100%;
|
||||||
|
background-color: {{ theme_footerbgcolor }};
|
||||||
|
color: #000;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.document {
|
||||||
|
background-color: {{ theme_sidebarbgcolor }};
|
||||||
|
}
|
||||||
|
|
||||||
|
div.documentwrapper {
|
||||||
|
float: left;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.bodywrapper {
|
||||||
|
margin: 0 0 0 {{ theme_sidebarwidth|todim }};
|
||||||
|
}
|
||||||
|
|
||||||
|
div.body {
|
||||||
|
background-color: {{ theme_bgcolor }};
|
||||||
|
color: {{ theme_textcolor }};
|
||||||
|
padding: 0 20px 30px 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
{%- if theme_rightsidebar|tobool %}
|
||||||
|
div.bodywrapper {
|
||||||
|
margin: 0 {{ theme_sidebarwidth|todim }} 0 0;
|
||||||
|
}
|
||||||
|
{%- endif %}
|
||||||
|
|
||||||
|
div.footer {
|
||||||
|
color: {{ theme_footertextcolor }};
|
||||||
|
width: 100%;
|
||||||
|
padding: 9px 0 9px 0;
|
||||||
|
text-align: center;
|
||||||
|
font-size: 75%;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.footer a {
|
||||||
|
color: {{ theme_footertextcolor }};
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.related {
|
||||||
|
background-color: {{ theme_relbarbgcolor }};
|
||||||
|
line-height: 30px;
|
||||||
|
color: {{ theme_relbartextcolor }};
|
||||||
|
}
|
||||||
|
|
||||||
|
div.related a {
|
||||||
|
color: {{ theme_relbarlinkcolor }};
|
||||||
|
}
|
||||||
|
|
||||||
|
div.sphinxsidebar {
|
||||||
|
{%- if theme_stickysidebar|tobool %}
|
||||||
|
top: 30px;
|
||||||
|
bottom: 0;
|
||||||
|
margin: 0;
|
||||||
|
position: fixed;
|
||||||
|
overflow: auto;
|
||||||
|
height: auto;
|
||||||
|
{%- endif %}
|
||||||
|
{%- if theme_rightsidebar|tobool %}
|
||||||
|
float: right;
|
||||||
|
{%- if theme_stickysidebar|tobool %}
|
||||||
|
right: 0;
|
||||||
|
{%- endif %}
|
||||||
|
{%- endif %}
|
||||||
|
}
|
||||||
|
|
||||||
|
{%- if theme_stickysidebar|tobool %}
|
||||||
|
/* this is nice, but it leads to hidden headings when jumping
|
||||||
|
to an anchor */
|
||||||
|
/*
|
||||||
|
div.related {
|
||||||
|
position: fixed;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.documentwrapper {
|
||||||
|
margin-top: 30px;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
{%- endif %}
|
||||||
|
|
||||||
|
div.sphinxsidebar h3 {
|
||||||
|
font-family: {{ theme_headfont }};
|
||||||
|
color: {{ theme_sidebartextcolor }};
|
||||||
|
font-size: 1.4em;
|
||||||
|
font-weight: normal;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.sphinxsidebar h3 a {
|
||||||
|
color: {{ theme_sidebartextcolor }};
|
||||||
|
}
|
||||||
|
|
||||||
|
div.sphinxsidebar h4 {
|
||||||
|
font-family: {{ theme_headfont }};
|
||||||
|
color: {{ theme_sidebartextcolor }};
|
||||||
|
font-size: 1.3em;
|
||||||
|
font-weight: normal;
|
||||||
|
margin: 5px 0 0 0;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.sphinxsidebar p {
|
||||||
|
color: {{ theme_sidebartextcolor }};
|
||||||
|
}
|
||||||
|
|
||||||
|
div.sphinxsidebar p.topless {
|
||||||
|
margin: 5px 10px 10px 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.sphinxsidebar ul {
|
||||||
|
margin: 10px;
|
||||||
|
padding: 0;
|
||||||
|
color: {{ theme_sidebartextcolor }};
|
||||||
|
}
|
||||||
|
|
||||||
|
div.sphinxsidebar a {
|
||||||
|
color: {{ theme_sidebarlinkcolor }};
|
||||||
|
}
|
||||||
|
|
||||||
|
div.sphinxsidebar input {
|
||||||
|
border: 1px solid {{ theme_sidebarlinkcolor }};
|
||||||
|
font-family: sans-serif;
|
||||||
|
font-size: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
{% if theme_collapsiblesidebar|tobool %}
|
||||||
|
/* for collapsible sidebar */
|
||||||
|
div#sidebarbutton {
|
||||||
|
background-color: {{ theme_sidebarbtncolor }};
|
||||||
|
}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
/* -- hyperlink styles ------------------------------------------------------ */
|
||||||
|
|
||||||
|
a {
|
||||||
|
color: {{ theme_linkcolor }};
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
a:visited {
|
||||||
|
color: {{ theme_visitedlinkcolor }};
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
a:hover {
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
|
||||||
|
{% if theme_externalrefs|tobool %}
|
||||||
|
a.external {
|
||||||
|
text-decoration: none;
|
||||||
|
border-bottom: 1px dashed {{ theme_linkcolor }};
|
||||||
|
}
|
||||||
|
|
||||||
|
a.external:hover {
|
||||||
|
text-decoration: none;
|
||||||
|
border-bottom: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
a.external:visited {
|
||||||
|
text-decoration: none;
|
||||||
|
border-bottom: 1px dashed {{ theme_visitedlinkcolor }};
|
||||||
|
}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
/* -- body styles ----------------------------------------------------------- */
|
||||||
|
|
||||||
|
div.body h1,
|
||||||
|
div.body h2,
|
||||||
|
div.body h3,
|
||||||
|
div.body h4,
|
||||||
|
div.body h5,
|
||||||
|
div.body h6 {
|
||||||
|
font-family: {{ theme_headfont }};
|
||||||
|
background-color: {{ theme_headbgcolor }};
|
||||||
|
font-weight: normal;
|
||||||
|
color: {{ theme_headtextcolor }};
|
||||||
|
border-bottom: 1px solid #ccc;
|
||||||
|
margin: 20px -20px 10px -20px;
|
||||||
|
padding: 3px 0 3px 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.body h1 { margin-top: 0; font-size: 200%; }
|
||||||
|
div.body h2 { font-size: 160%; }
|
||||||
|
div.body h3 { font-size: 140%; }
|
||||||
|
div.body h4 { font-size: 120%; }
|
||||||
|
div.body h5 { font-size: 110%; }
|
||||||
|
div.body h6 { font-size: 100%; }
|
||||||
|
|
||||||
|
a.headerlink {
|
||||||
|
color: {{ theme_headlinkcolor }};
|
||||||
|
font-size: 0.8em;
|
||||||
|
padding: 0 4px 0 4px;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
a.headerlink:hover {
|
||||||
|
background-color: {{ theme_headlinkcolor }};
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.body p, div.body dd, div.body li, div.body blockquote {
|
||||||
|
text-align: justify;
|
||||||
|
line-height: 130%;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.admonition p.admonition-title + p {
|
||||||
|
display: inline;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.admonition p {
|
||||||
|
margin-bottom: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.admonition pre {
|
||||||
|
margin-bottom: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.admonition ul, div.admonition ol {
|
||||||
|
margin-bottom: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.note {
|
||||||
|
background-color: #eee;
|
||||||
|
border: 1px solid #ccc;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.seealso {
|
||||||
|
background-color: #ffc;
|
||||||
|
border: 1px solid #ff6;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.topic {
|
||||||
|
background-color: #eee;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.warning {
|
||||||
|
background-color: #ffe4e4;
|
||||||
|
border: 1px solid #f66;
|
||||||
|
}
|
||||||
|
|
||||||
|
p.admonition-title {
|
||||||
|
display: inline;
|
||||||
|
}
|
||||||
|
|
||||||
|
p.admonition-title:after {
|
||||||
|
content: ":";
|
||||||
|
}
|
||||||
|
|
||||||
|
pre {
|
||||||
|
padding: 5px;
|
||||||
|
background-color: {{ theme_codebgcolor }};
|
||||||
|
color: {{ theme_codetextcolor }};
|
||||||
|
line-height: 120%;
|
||||||
|
border: 1px solid #ac9;
|
||||||
|
border-left: none;
|
||||||
|
border-right: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
code {
|
||||||
|
background-color: #ecf0f3;
|
||||||
|
padding: 0 1px 0 1px;
|
||||||
|
font-size: 0.95em;
|
||||||
|
}
|
||||||
|
|
||||||
|
th, dl.field-list > dt {
|
||||||
|
background-color: #ede;
|
||||||
|
}
|
||||||
|
|
||||||
|
.warning code {
|
||||||
|
background: #efc2c2;
|
||||||
|
}
|
||||||
|
|
||||||
|
.note code {
|
||||||
|
background: #d6d6d6;
|
||||||
|
}
|
||||||
|
|
||||||
|
.viewcode-back {
|
||||||
|
font-family: {{ theme_bodyfont }};
|
||||||
|
}
|
||||||
|
|
||||||
|
div.viewcode-block:target {
|
||||||
|
background-color: #f4debf;
|
||||||
|
border-top: 1px solid #ac9;
|
||||||
|
border-bottom: 1px solid #ac9;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.code-block-caption {
|
||||||
|
color: #efefef;
|
||||||
|
background-color: #1c4e63;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Customizations for Sage
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* -- sage logo -------------------------- */
|
||||||
|
|
||||||
|
img.sage-logo {
|
||||||
|
height: 28px;
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -- hyperlink styles ------------------- */
|
||||||
|
|
||||||
|
a,
|
||||||
|
a:visited {
|
||||||
|
color: {{ theme_linkcolor }};
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -- commands or code within text ------- */
|
||||||
|
|
||||||
|
tt {
|
||||||
|
background-color: #EAEAF8;
|
||||||
|
padding: 0 1px 0 1px;
|
||||||
|
font-size: 0.95em;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -- class and method headlines --------- */
|
||||||
|
|
||||||
|
dl.py.class > dt,
|
||||||
|
dl.py.method > dt {
|
||||||
|
overflow-x: scroll;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
dl.py.class > dd > p:first-child {
|
||||||
|
overflow-x: scroll;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -- search page ------------------------ */
|
||||||
|
|
||||||
|
ul.search li {
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -- references ------------------------- */
|
||||||
|
|
||||||
|
dl.citation p {
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -- jupyter-sphinx ------------------------------------------------------ */
|
||||||
|
|
||||||
|
#thebelab-activate-button {
|
||||||
|
position: fixed;
|
||||||
|
right: 10px;
|
||||||
|
bottom: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.jupyter_cell .thebelab-input {
|
||||||
|
display: none;
|
||||||
|
}
|
After Width: | Height: | Size: 551 B |
After Width: | Height: | Size: 2.4 KiB |
|
@ -0,0 +1,42 @@
|
||||||
|
[theme]
|
||||||
|
inherit = classic
|
||||||
|
stylesheet = sage.css
|
||||||
|
pygments_style = sphinx
|
||||||
|
|
||||||
|
[options]
|
||||||
|
# Background color for the footer line: dark blue
|
||||||
|
footerbgcolor = #8C8DE6
|
||||||
|
|
||||||
|
# Text color for the footer line: white
|
||||||
|
footertextcolor = #FFFFFF
|
||||||
|
|
||||||
|
# Background color for the sidebar: light bluish gray
|
||||||
|
sidebarbgcolor = #EAEAF8
|
||||||
|
|
||||||
|
# Text color for the sidebar: black
|
||||||
|
sidebartextcolor = #000000
|
||||||
|
|
||||||
|
# Link color for the sidebar: light dark blue
|
||||||
|
sidebarlinkcolor = #090999
|
||||||
|
|
||||||
|
# Background color for the relation bar: light grayish blue
|
||||||
|
relbarbgcolor = #B8B9F6
|
||||||
|
|
||||||
|
# Text color for the relation bar: light dark blue
|
||||||
|
relbartextcolor = #090999
|
||||||
|
|
||||||
|
# Link color for the relation bar: light dark blue
|
||||||
|
relbarlinkcolor = #090999
|
||||||
|
|
||||||
|
# Body text color: black
|
||||||
|
textcolor = #000000
|
||||||
|
|
||||||
|
# Background color for headings: light gray
|
||||||
|
headbgcolor = #F2F2F2
|
||||||
|
|
||||||
|
# Body link color: dark greenish blue
|
||||||
|
linkcolor = #45529B
|
||||||
|
|
||||||
|
# Background color for code blocks: very pale yellow
|
||||||
|
codebgcolor = #FFFFE5
|
||||||
|
|
|
@ -0,0 +1,37 @@
|
||||||
|
# This Makefile is for convenience as a reminder and shortcut for the most used commands
|
||||||
|
|
||||||
|
# Package folder
|
||||||
|
PACKAGE = vector_bundle
|
||||||
|
|
||||||
|
# change to your sage command if needed
|
||||||
|
SAGE = sage
|
||||||
|
|
||||||
|
all: install test
|
||||||
|
|
||||||
|
install:
|
||||||
|
$(SAGE) -pip install --upgrade -v .
|
||||||
|
|
||||||
|
uninstall:
|
||||||
|
$(SAGE) -pip uninstall $(PACKAGE)
|
||||||
|
|
||||||
|
develop:
|
||||||
|
$(SAGE) -pip install --upgrade -e .
|
||||||
|
|
||||||
|
test:
|
||||||
|
$(SAGE) setup.py test
|
||||||
|
|
||||||
|
coverage:
|
||||||
|
$(SAGE) -coverage $(PACKAGE)/*
|
||||||
|
|
||||||
|
doc:
|
||||||
|
cd docs && $(SAGE) -sh -c "make html"
|
||||||
|
|
||||||
|
doc-pdf:
|
||||||
|
cd docs && $(SAGE) -sh -c "make latexpdf"
|
||||||
|
|
||||||
|
clean: clean-doc
|
||||||
|
|
||||||
|
clean-doc:
|
||||||
|
cd docs && $(SAGE) -sh -c "make clean"
|
||||||
|
|
||||||
|
.PHONY: all install develop test coverage clean clean-doc doc doc-pdf
|
|
@ -0,0 +1,50 @@
|
||||||
|
## -*- encoding: utf-8 -*-
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
from setuptools import setup
|
||||||
|
from codecs import open # To open the README file with proper encoding
|
||||||
|
from setuptools.command.test import test as TestCommand # for tests
|
||||||
|
|
||||||
|
|
||||||
|
# Get information from separate files (README, VERSION)
|
||||||
|
def readfile(filename):
|
||||||
|
with open(filename, encoding='utf-8') as f:
|
||||||
|
return f.read()
|
||||||
|
|
||||||
|
# For the tests
|
||||||
|
class SageTest(TestCommand):
|
||||||
|
def run_tests(self):
|
||||||
|
errno = os.system("sage -t --force-lib vector_bundle")
|
||||||
|
if errno != 0:
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
setup(
|
||||||
|
name = "vector_bundle",
|
||||||
|
version = readfile("VERSION").strip(), # the VERSION file is shared with the documentation
|
||||||
|
description='A sage package implementing vector bundles on algebraic curves using only function fields',
|
||||||
|
long_description = readfile("README.rst"), # get the long description from the README
|
||||||
|
# For a Markdown README replace the above line by the following two lines:
|
||||||
|
# long_description = readfile("README.md"),
|
||||||
|
# long_description_content_type="text/markdown",
|
||||||
|
# url='https://github.com/sagemath/sage_sample',
|
||||||
|
author='Mickaël Montessinos',
|
||||||
|
author_email='mickael.montessinos@mif.vu.lt', # choose a main contact email
|
||||||
|
license='GPLv2+', # This should be consistent with the LICENCE file
|
||||||
|
classifiers=[
|
||||||
|
# How mature is this project? Common values are
|
||||||
|
# 3 - Alpha
|
||||||
|
# 4 - Beta
|
||||||
|
# 5 - Production/Stable
|
||||||
|
'Development Status :: 3 - Alpha',
|
||||||
|
'Intended Audience :: Science/Research',
|
||||||
|
'Topic :: Software Development :: Build Tools',
|
||||||
|
'Topic :: Scientific/Engineering :: Mathematics',
|
||||||
|
'License :: OSI Approved :: GNU General Public License v2 or later (GPLv2+)',
|
||||||
|
'Programming Language :: Python :: 3.7',
|
||||||
|
], # classifiers list: https://pypi.python.org/pypi?%3Aaction=list_classifiers
|
||||||
|
keywords = "Algebraic Geometry Number Theory Curves Vector Bundles",
|
||||||
|
packages = ['vector_bundle'],
|
||||||
|
cmdclass = {'test': SageTest}, # adding a special setup command for tests
|
||||||
|
setup_requires = ['sage-package'],
|
||||||
|
install_requires = ['sage-package', 'sphinx'],
|
||||||
|
)
|
|
@ -0,0 +1,4 @@
|
||||||
|
from __future__ import absolute_import
|
||||||
|
# Add the import for which you want to give a direct access
|
||||||
|
from .vector_bundle import VectorBundle
|
||||||
|
from .constructions import *
|
|
@ -0,0 +1,229 @@
|
||||||
|
r"""
|
||||||
|
This module provides functions for various interesting constructions of vector bundles.
|
||||||
|
|
||||||
|
AUTHORS:
|
||||||
|
|
||||||
|
_Mickaël Montessinos: initial implementation
|
||||||
|
"""
|
||||||
|
|
||||||
|
###########################################################################
|
||||||
|
# Copyright (C) 2024 Mickaël Montessinos (mickael.montessinos@mif.vu.lt),#
|
||||||
|
# #
|
||||||
|
# Distributed under the terms of the GNU General Public License (GPL) #
|
||||||
|
# either version 3, or (at your option) any later version #
|
||||||
|
# #
|
||||||
|
# http://www.gnu.org/licenses/ #
|
||||||
|
###########################################################################
|
||||||
|
|
||||||
|
from sage.matrix.constructor import matrix
|
||||||
|
from vector_bundle import VectorBundle
|
||||||
|
from . import function_field_utility
|
||||||
|
|
||||||
|
def trivial_bundle(K):
|
||||||
|
r"""
|
||||||
|
Return the structure sheaf of the algebraic curve with function field K.
|
||||||
|
|
||||||
|
EXAMPLES ::
|
||||||
|
|
||||||
|
sage: from vector_bundle import trivial_bundle
|
||||||
|
sage: F.<x> = FunctionField(GF(3))
|
||||||
|
sage: R.<y> = F[]
|
||||||
|
sage: K.<y> = F.extension(y^2 + x + 2)
|
||||||
|
sage: O = K.maximal_order()
|
||||||
|
sage: V = trivial_bundle(K)
|
||||||
|
sage: V._ideals
|
||||||
|
[Ideal (1) of Maximal order of Function field in y defined by y^2 + x + 2]
|
||||||
|
sage: V._g_finite
|
||||||
|
[1]
|
||||||
|
sage: V._g_infinite
|
||||||
|
[1]
|
||||||
|
"""
|
||||||
|
return VectorBundle(K, K.one().divisor())
|
||||||
|
|
||||||
|
def canonical_bundle(K):
|
||||||
|
r"""
|
||||||
|
Return a canonical line bundle over K suitable for explicit Serre duality.
|
||||||
|
|
||||||
|
EXAMPLES ::
|
||||||
|
|
||||||
|
sage: from vector_bundle import canonical_bundle, trivial_bundle
|
||||||
|
sage: F.<x> = FunctionField(GF(3))
|
||||||
|
sage: canonical_bundle(F).degree()
|
||||||
|
-2
|
||||||
|
sage: R.<y> = F[]
|
||||||
|
sage: K.<y> = F.extension(y^2 - x^3 - x)
|
||||||
|
sage: L = canonical_bundle(K); L
|
||||||
|
Vector bundle of rank 1 over Function field in y defined by y^2 + 2*x^3 + 2*x
|
||||||
|
sage: L == trivial_bundle(K)
|
||||||
|
True
|
||||||
|
"""
|
||||||
|
pi,_ = function_field_utility.safe_uniformizer(K)
|
||||||
|
return VectorBundle(K, pi.differential().divisor())
|
||||||
|
|
||||||
|
def _euclid(a,b):
|
||||||
|
r"""
|
||||||
|
The Euclidian algorithm in `N` but outputs intermediate steps.
|
||||||
|
"""
|
||||||
|
u1 = a
|
||||||
|
u2 = b
|
||||||
|
res = []
|
||||||
|
while u2 != 0:
|
||||||
|
q, r = u1.quo_rem(u2)
|
||||||
|
res.append((u1, u2, q, r))
|
||||||
|
u1 = u2
|
||||||
|
u2 = r
|
||||||
|
return res
|
||||||
|
|
||||||
|
|
||||||
|
def atiyah_bundle(field, rank, degree, base=None):
|
||||||
|
r"""
|
||||||
|
Return `\alpha_{r,d}(F_r \otimes base)` in the notation of Theorem 6 [At57]_
|
||||||
|
, where `r` is ``rank`` and `d` is ``degree``.
|
||||||
|
|
||||||
|
INPUT:
|
||||||
|
|
||||||
|
- ``field`` - FunctionField; of genus 1 with an infinite place of degree 1
|
||||||
|
- ``rank`` - integer
|
||||||
|
- ``degree`` - integer
|
||||||
|
- ``base`` - line bundle of degree 0 over field ; (default = ``trivial_bundle(field)``)
|
||||||
|
|
||||||
|
EXAMPLES ::
|
||||||
|
|
||||||
|
sage: from vector_bundle import atiyah_bundle
|
||||||
|
sage: from vector_bundle import VectorBundle
|
||||||
|
sage: F.<x> = FunctionField(GF(11))
|
||||||
|
sage: R.<y> = F[]
|
||||||
|
sage: K.<y> = F.extension(y^2 - x^3 - x)
|
||||||
|
sage: base = VectorBundle(K, K.places_finite()[0].divisor())
|
||||||
|
sage: E = atiyah_bundle(K, 5, 3, base)
|
||||||
|
sage: E.rank()
|
||||||
|
5
|
||||||
|
sage: E.degree()
|
||||||
|
3
|
||||||
|
sage: E.hom(E).h0()
|
||||||
|
[
|
||||||
|
[1 0 0 0 0]
|
||||||
|
[0 1 0 0 0]
|
||||||
|
[0 0 1 0 0]
|
||||||
|
[0 0 0 1 0]
|
||||||
|
[0 0 0 0 1]
|
||||||
|
]
|
||||||
|
"""
|
||||||
|
if base is None:
|
||||||
|
base = trivial_bundle(field)
|
||||||
|
if rank <= 0 :
|
||||||
|
raise ValueError('rank must be positive')
|
||||||
|
if field.genus() != 1:
|
||||||
|
raise ValueError('field must have genus 1')
|
||||||
|
if base.function_field() != field:
|
||||||
|
raise ValueError('base must have field as its function_field.')
|
||||||
|
if degree < 0:
|
||||||
|
return atiyah_bundle(field, rank, -degree, base).dual()
|
||||||
|
divisor = field.places_infinite()[0].divisor()
|
||||||
|
gcd = _euclid(rank, degree)
|
||||||
|
plan = [(i % 2,q) for i,(_, _, q, _) in enumerate(gcd)]
|
||||||
|
a, b = plan[-1]
|
||||||
|
plan[-1] = (a, b - 1)
|
||||||
|
starting_rank = gcd[-1][1]
|
||||||
|
result = trivial_bundle(field)
|
||||||
|
line_bundle = VectorBundle(field, divisor)
|
||||||
|
for _ in range(starting_rank - 1):
|
||||||
|
result = result.extension_by_global_sections()
|
||||||
|
result = result.tensor_product(line_bundle)
|
||||||
|
for move, reps in reversed(plan):
|
||||||
|
for _ in range(reps):
|
||||||
|
if move == 0:
|
||||||
|
result = result.extension_by_global_sections()
|
||||||
|
else:
|
||||||
|
result = result.tensor_product(line_bundle)
|
||||||
|
return result
|
||||||
|
|
||||||
|
|
||||||
|
def savin_bundle(field, rank, degree, line, line_1, line_2):
|
||||||
|
r"""
|
||||||
|
Return a weakly stable bundle over field of rank ``rank`` and degree
|
||||||
|
``degree``
|
||||||
|
|
||||||
|
ALGORITHM:
|
||||||
|
|
||||||
|
Section V of [Sav08]_
|
||||||
|
|
||||||
|
INPUT:
|
||||||
|
|
||||||
|
- ``field`` -- FunctionField: the base of the bundle. Must have genus at least 2.
|
||||||
|
|
||||||
|
- ``rank`` -- Integer: the rank of the output bundle
|
||||||
|
|
||||||
|
- ``degree`` -- Integer: the degree of the output bundle
|
||||||
|
|
||||||
|
- ``line`` -- VectorBundle: line bundle of degree ``degree//rank + 1`` plays the role of `F` in the algorithm
|
||||||
|
|
||||||
|
- ``line_1`` -- VectorBundle: line bundle of degree ``degree // rank`` plays the role of `F_1` in the algorithm
|
||||||
|
|
||||||
|
- ``line_2`` -- VectorBundle: line bundle of degree ``degree // rank`` plays the role of `F_2` in the algorithm
|
||||||
|
|
||||||
|
EXAMPLE ::
|
||||||
|
|
||||||
|
sage: from vector_bundle import VectorBundle, savin_bundle
|
||||||
|
sage: F.<x> = FunctionField(GF(11))
|
||||||
|
sage: R.<y> = F[]
|
||||||
|
sage: K.<y> = F.extension(y^2 - x^5 + x)
|
||||||
|
sage: line = VectorBundle(K, 3 * K.places_infinite()[0].divisor())
|
||||||
|
sage: line_1 = VectorBundle(K, 2 * K.places_finite()[0].divisor())
|
||||||
|
sage: line_2 = VectorBundle(K, 2 * K.places_finite()[1].divisor())
|
||||||
|
sage: E = savin_bundle(K, 3, 7, line, line_1, line_2)
|
||||||
|
sage: E.rank()
|
||||||
|
3
|
||||||
|
sage: E.degree()
|
||||||
|
7
|
||||||
|
"""
|
||||||
|
if degree < 0:
|
||||||
|
return savin_bundle(field, rank, -degree, line, line_1, line_2).dual()
|
||||||
|
q, r = degree.quo_rem(rank)
|
||||||
|
if line.rank() != 1 or line_1.rank() != 1 or line_2.rank() != 1:
|
||||||
|
raise ValueError('The input bundles must have rank 1')
|
||||||
|
if line_1.degree() != q or line_1.degree() != q or line.degree() != q+1:
|
||||||
|
raise ValueError('At least one of the input line bundles has'
|
||||||
|
+ 'invalid degree')
|
||||||
|
E = line_1
|
||||||
|
for _ in range(rank - r - 1):
|
||||||
|
E = line_2.non_trivial_extension(E)
|
||||||
|
for _ in range(r):
|
||||||
|
E = line.non_trivial_extension(E)
|
||||||
|
return E
|
||||||
|
|
||||||
|
def rank_2_trivial_determinant_semistable_bundle(ksi, ext=None):
|
||||||
|
r"""
|
||||||
|
Construct the semi-stable vector bundle of rank 2 and trivial determinant
|
||||||
|
defined by the extension of ``ksi`` by ``ksi.dual()`` and nonzero extension
|
||||||
|
class ``ext``.
|
||||||
|
|
||||||
|
The fact that this vector bundle is semi-stable is Lemma 5.1 in [NR69]_.
|
||||||
|
If ``ext`` is None, we default to a default nonzero extension class.
|
||||||
|
|
||||||
|
INPUT:
|
||||||
|
|
||||||
|
- ``ksi`` -- a degree 1 line bundle over a function field of genus at least 2
|
||||||
|
- ``ext`` -- an object representing a class of extensions of ``ksi`` by ``ksi.dual()``. (Default: None)
|
||||||
|
|
||||||
|
EXAMPLES ::
|
||||||
|
|
||||||
|
sage: from vector_bundle import VectorBundle, trivial_bundle, rank_2_trivial_determinant_semistable_bundle
|
||||||
|
sage: F.<x> = FunctionField(GF(11))
|
||||||
|
sage: R.<y> = F[]
|
||||||
|
sage: K.<y> = F.extension(y^2 - x^5 - 1)
|
||||||
|
sage: ksi = VectorBundle(K, K.places_finite()[0].divisor())
|
||||||
|
sage: V = rank_2_trivial_determinant_semistable_bundle(ksi)
|
||||||
|
sage: V.rank()
|
||||||
|
2
|
||||||
|
sage: V.determinant() == trivial_bundle(K)
|
||||||
|
True
|
||||||
|
"""
|
||||||
|
if ksi.rank() != 1:
|
||||||
|
raise ValueError('ksi must have rank one')
|
||||||
|
if ksi.degree() != 1:
|
||||||
|
raise ValueError('ksi must have degree one')
|
||||||
|
if ksi.function_field().genus() < 2:
|
||||||
|
raise ValueError('The function field of ksi must have genus at least 2')
|
||||||
|
ext_group = ksi.extension_group(ksi.dual())
|
||||||
|
return ext_group.extension(ext)
|
|
@ -0,0 +1,252 @@
|
||||||
|
r"""
|
||||||
|
This module implements the ExtGroup and ExtGroupElement classes used for
|
||||||
|
building extensions of vector bundles.
|
||||||
|
|
||||||
|
AUTHORS:
|
||||||
|
|
||||||
|
_Mickaël Montessinos: initial implementation
|
||||||
|
"""
|
||||||
|
|
||||||
|
###########################################################################
|
||||||
|
# Copyright (C) 2024 Mickaël Montessinos (mickael.montessinos@mif.vu.lt),#
|
||||||
|
# #
|
||||||
|
# Distributed under the terms of the GNU General Public License (GPL) #
|
||||||
|
# either version 3, or (at your option) any later version #
|
||||||
|
# #
|
||||||
|
# http://www.gnu.org/licenses/ #
|
||||||
|
###########################################################################
|
||||||
|
|
||||||
|
from sage.structure.sage_object import SageObject
|
||||||
|
from sage.structure.element import is_Matrix
|
||||||
|
from sage.matrix.special import block_matrix
|
||||||
|
from sage.modules.free_module_element import vector
|
||||||
|
|
||||||
|
class ExtGroup(SageObject):
|
||||||
|
r"""
|
||||||
|
The group of extensions of ``left`` by ``right``.
|
||||||
|
|
||||||
|
The group `Ext^1(\mathrm{left},\mathrm{right})` is
|
||||||
|
`H^1(\mathrm{left}^\vee \otimes \mathrm{right})`.
|
||||||
|
Its elements may be represented as matrices of infinite répartitions
|
||||||
|
lying in `M_{\mathrm{right}.rank(),\mathrm{left}.rank()}(R)` or as
|
||||||
|
vectors of length ``self.dim()`` with coefficients in the coefficient
|
||||||
|
field, representing linear forms on
|
||||||
|
`H^0(\omega \otimes \mathrm{right}^\vee \otimes \mathrm{left})`, where
|
||||||
|
`\omega` is the canonical bundle of the function field of ``left`` and
|
||||||
|
``right``
|
||||||
|
The two representations are related via Serre duality.
|
||||||
|
|
||||||
|
If ``precompute_basis`` is set to ``True``, a basis of répartition
|
||||||
|
matrices is computed. Its element represent the linear forms
|
||||||
|
``vector([0,...,0,1,0,...,0])``. Otherwise, linear forms are converted
|
||||||
|
to elements of the `H^1` on the fly. You should set ``precompute_basis``
|
||||||
|
to ``True`` only if you plan to create several extensions with this group.
|
||||||
|
|
||||||
|
INPUT:
|
||||||
|
|
||||||
|
- ``left`` -- VectorBundle
|
||||||
|
- ``right`` -- VectorBundle; must have the same function field as left
|
||||||
|
- ``precompute_basis`` -- boolean
|
||||||
|
|
||||||
|
EXAMPLES ::
|
||||||
|
|
||||||
|
sage: from vector_bundle import VectorBundle, trivial_bundle
|
||||||
|
sage: F.<x> = FunctionField(GF(3))
|
||||||
|
sage: triv = trivial_bundle(F)
|
||||||
|
sage: triv.extension_group(triv)
|
||||||
|
Extension group of Vector bundle of rank 1 over Rational function field in x over Finite Field of size 3 by Vector bundle of rank 1 over Rational function field in x over Finite Field of size 3.
|
||||||
|
"""
|
||||||
|
def __init__(self, left, right, precompute_basis=False):
|
||||||
|
if not left._function_field == right._function_field:
|
||||||
|
raise ValueError('left and right should have the same function'
|
||||||
|
+ 'field')
|
||||||
|
self._left = left
|
||||||
|
self._right = right
|
||||||
|
self._hom = left.hom(right)
|
||||||
|
self._ext_dual_basis, self._ext_dual_bundle = self._hom.h1_dual()
|
||||||
|
self._s = len(self._ext_dual_basis)
|
||||||
|
if precompute_basis:
|
||||||
|
self._compute_basis()
|
||||||
|
else:
|
||||||
|
self._basis = None
|
||||||
|
|
||||||
|
def __hash__(self):
|
||||||
|
return hash((self._left, self._right))
|
||||||
|
|
||||||
|
def __eq__(self, other):
|
||||||
|
return self._left == other._left and self._right == other._right
|
||||||
|
|
||||||
|
def _repr_(self):
|
||||||
|
return "Extension group of %s by %s." % (self._left, self._right)
|
||||||
|
|
||||||
|
def _compute_basis(self):
|
||||||
|
r"""
|
||||||
|
Compute the representation of basis elements of ``self`` as elements of the `H^1`
|
||||||
|
"""
|
||||||
|
if self._basis is None:
|
||||||
|
self._basis = [self._hom.h1_element(
|
||||||
|
vector([0] * i + [1] + [0] * (self._s-i-1)))
|
||||||
|
for i in range(self._s)]
|
||||||
|
|
||||||
|
def dim(self):
|
||||||
|
r"""
|
||||||
|
Return the dimension of the extension group as a vector space over the
|
||||||
|
base coefficient field
|
||||||
|
|
||||||
|
EXAMPLES ::
|
||||||
|
|
||||||
|
sage: from vector_bundle import VectorBundle
|
||||||
|
sage: F.<x> = FunctionField(GF(11))
|
||||||
|
sage: R.<y> = F[]
|
||||||
|
sage: K.<y> = F.extension(y^2 - x^5 - 1)
|
||||||
|
sage: ksi = VectorBundle(K, K.places_finite()[0].divisor())
|
||||||
|
sage: ext = ksi.extension_group(ksi.dual()); ext.dim()
|
||||||
|
3
|
||||||
|
"""
|
||||||
|
return self._s
|
||||||
|
|
||||||
|
def left(self):
|
||||||
|
r"""
|
||||||
|
Return the left vector bundle of ``self``.
|
||||||
|
|
||||||
|
EXAMPLES ::
|
||||||
|
|
||||||
|
sage: from vector_bundle import VectorBundle
|
||||||
|
sage: F.<x> = FunctionField(GF(3))
|
||||||
|
sage: L1 = VectorBundle(F, x.zeros()[0].divisor())
|
||||||
|
sage: L2 = VectorBundle(F, x.poles()[0].divisor())
|
||||||
|
sage: ext = L1.extension_group(L2); ext.left() == L1
|
||||||
|
True
|
||||||
|
"""
|
||||||
|
return self._left
|
||||||
|
|
||||||
|
def right(self):
|
||||||
|
r"""
|
||||||
|
Return the right vector bundle of ``self``.
|
||||||
|
|
||||||
|
EXAMPLES ::
|
||||||
|
|
||||||
|
sage: from vector_bundle import VectorBundle
|
||||||
|
sage: F.<x> = FunctionField(GF(3))
|
||||||
|
sage: L1 = VectorBundle(F, x.zeros()[0].divisor())
|
||||||
|
sage: L2 = VectorBundle(F, x.poles()[0].divisor())
|
||||||
|
sage: ext = L1.extension_group(L2); ext.right() == L2
|
||||||
|
True
|
||||||
|
"""
|
||||||
|
return self._right
|
||||||
|
|
||||||
|
def dual_basis(self):
|
||||||
|
r"""
|
||||||
|
Return a basis of the dual of the `Ext^1` group. This is a basis of
|
||||||
|
`H^0(\omega \otimes \mathrm{right}^\vee \otimes \mathrm{left})`, where
|
||||||
|
`\omega` is a canonical line bundle.
|
||||||
|
|
||||||
|
EXAMPLES ::
|
||||||
|
|
||||||
|
sage: from vector_bundle import VectorBundle
|
||||||
|
sage: F.<x> = FunctionField(GF(11))
|
||||||
|
sage: R.<y> = F[]
|
||||||
|
sage: K.<y> = F.extension(y^2 - x^5 - 1)
|
||||||
|
sage: ksi = VectorBundle(K, K.places_finite()[0].divisor())
|
||||||
|
sage: ext = ksi.extension_group(ksi.dual()); ext.dual_basis()
|
||||||
|
[[x^4/(x^5 + 6)], [x^5/(x^5 + 6)], [(x^2/(x^5 + 6))*y + 10*x^2/(x^5 + 6)]]
|
||||||
|
"""
|
||||||
|
return self._ext_dual_basis
|
||||||
|
|
||||||
|
def basis(self):
|
||||||
|
r"""Return a basis of `Ext^1` group. Its element are matrices of
|
||||||
|
infinite répartitions represented by field elements.
|
||||||
|
|
||||||
|
Computes and stores the basis if it was not precomputed yet.
|
||||||
|
|
||||||
|
EXAMPLES ::
|
||||||
|
|
||||||
|
sage: from vector_bundle import VectorBundle
|
||||||
|
sage: F.<x> = FunctionField(GF(11))
|
||||||
|
sage: R.<y> = F[]
|
||||||
|
sage: K.<y> = F.extension(y^2 - x^5 - 1)
|
||||||
|
sage: ksi = VectorBundle(K, K.places_finite()[0].divisor())
|
||||||
|
sage: ext = ksi.extension_group(ksi.dual()); ext.basis()
|
||||||
|
[[(x^9/(x^10 + 2*x^5 + 1))*y], [(x^3/(x^5 + 1))*y], [x^6/(x^5 + 1)]]
|
||||||
|
"""
|
||||||
|
self._compute_basis()
|
||||||
|
return self._basis
|
||||||
|
|
||||||
|
def _extension_from_ext_element(self, ext):
|
||||||
|
r"""
|
||||||
|
Return the extension of ``self.left() by ``self.right()`` encoded by
|
||||||
|
``ext``.
|
||||||
|
|
||||||
|
``ext`` is a matrix of elements of ``self._function_field`` which
|
||||||
|
represents the constant value over the infinite places of a répartition
|
||||||
|
matrix with support at infinity representing an element of
|
||||||
|
`H^1(\mathrm{hom}(\mathrm{left},\mathrm{right}))`.
|
||||||
|
Such an element encodes an extension `V`:
|
||||||
|
`0 \to \mathrm{other} \to V \to \mathrm{self} \to 0`
|
||||||
|
|
||||||
|
INPUT:
|
||||||
|
|
||||||
|
- ``ext`` -- a matrix of dimension ``right.rank(),left.rank()``
|
||||||
|
"""
|
||||||
|
from vector_bundle import VectorBundle
|
||||||
|
function_field = self._left._function_field
|
||||||
|
ideals = self._right._ideals + self._left._ideals
|
||||||
|
g_finite = block_matrix([[self._right._g_finite, 0],
|
||||||
|
[0, self._left._g_finite]])
|
||||||
|
g_infinite = block_matrix([[self._right._g_infinite,
|
||||||
|
-ext * self._left._g_infinite],
|
||||||
|
[0, self._left._g_infinite]])
|
||||||
|
return VectorBundle(function_field, ideals, g_finite, g_infinite)
|
||||||
|
|
||||||
|
def _extension_from_linear_form(self, form):
|
||||||
|
if self._basis is None:
|
||||||
|
ext = self._hom.h1_element(form)
|
||||||
|
ext = self._ext_dual_bundle._vector_to_matrix(ext).transpose()
|
||||||
|
else:
|
||||||
|
ext = sum([coeff * e for coeff, e in zip(form, self._basis)])
|
||||||
|
return self._extension_from_ext_element(ext)
|
||||||
|
|
||||||
|
def extension(self, ext=None):
|
||||||
|
r"""
|
||||||
|
Return the extension of ``self.left()`` by ``self.right()`` encoded by
|
||||||
|
``ext``.
|
||||||
|
|
||||||
|
``ext`` can be a matrix of elements of ``self._function_field``
|
||||||
|
which represents the constant value over the infinite places of a
|
||||||
|
répartition matrix with support at infinity representing an element of
|
||||||
|
`H^1(\mathrm{hom}(\mathrm{left},\mathrm{right}))`.
|
||||||
|
Such an element encodes an extension `V`:
|
||||||
|
`0 \to \mathrm{other} \to V \to \mathrm{self} \to 0`
|
||||||
|
|
||||||
|
``ext`` can also be a vector of length `self.dim()` representing an
|
||||||
|
extension in the basis of the Ext vector space.
|
||||||
|
|
||||||
|
By default, ``ext`` is chosen as any non trivial extension.
|
||||||
|
|
||||||
|
EXAMPLES ::
|
||||||
|
|
||||||
|
sage: from vector_bundle import VectorBundle, trivial_bundle
|
||||||
|
sage: F.<x> = FunctionField(GF(11))
|
||||||
|
sage: R.<y> = F[]
|
||||||
|
sage: K.<y> = F.extension(y^2 - x^3 - x)
|
||||||
|
sage: triv = trivial_bundle(K)
|
||||||
|
sage: ext = triv.extension_group(triv)
|
||||||
|
sage: V = ext.extension()
|
||||||
|
sage: V.rank()
|
||||||
|
2
|
||||||
|
sage: V.determinant() == triv
|
||||||
|
True
|
||||||
|
sage: V.h0()
|
||||||
|
[(1, 0)]
|
||||||
|
sage: V.end().h0()
|
||||||
|
[
|
||||||
|
[0 1] [1 0]
|
||||||
|
[0 0], [0 1]
|
||||||
|
]
|
||||||
|
"""
|
||||||
|
if ext is None:
|
||||||
|
ext = vector([1] + [0]*(self._s-1))
|
||||||
|
if is_Matrix(ext):
|
||||||
|
return self._extension_from_ext_element(ext)
|
||||||
|
else:
|
||||||
|
return self._extension_from_linear_form(ext)
|
|
@ -0,0 +1,466 @@
|
||||||
|
###########################################################################
|
||||||
|
# Copyright (C) 2024 Mickaël Montessinos (mickael.montessinos@mif.vu.lt),#
|
||||||
|
# #
|
||||||
|
# Distributed under the terms of the GNU General Public License (GPL) #
|
||||||
|
# either version 3, or (at your option) any later version #
|
||||||
|
# #
|
||||||
|
# http://www.gnu.org/licenses/ #
|
||||||
|
###########################################################################
|
||||||
|
|
||||||
|
from sage.matrix.constructor import matrix
|
||||||
|
from sage.rings.infinity import Infinity
|
||||||
|
from copy import copy
|
||||||
|
from sage.misc.cachefunc import cached_function
|
||||||
|
from sage.misc.misc_c import prod
|
||||||
|
from sage.matrix.constructor import matrix
|
||||||
|
from sage.matrix.special import block_matrix, elementary_matrix,\
|
||||||
|
identity_matrix
|
||||||
|
from sage.rings.function_field.function_field_rational\
|
||||||
|
import RationalFunctionField
|
||||||
|
from sage.rings.function_field.order_rational\
|
||||||
|
import FunctionFieldMaximalOrderInfinite_rational
|
||||||
|
|
||||||
|
@cached_function
|
||||||
|
def all_infinite_places(K):
|
||||||
|
r"""
|
||||||
|
Return a list of the infinite places of K of all degrees
|
||||||
|
|
||||||
|
INPUT:
|
||||||
|
- ``K`` -- FunctionField
|
||||||
|
"""
|
||||||
|
if isinstance(K,RationalFunctionField):
|
||||||
|
return [K.gen().poles()[0]]
|
||||||
|
deg = K.degree()
|
||||||
|
return sum([K.places_infinite(degree = deg) for deg in range(1, deg + 1)],
|
||||||
|
[])
|
||||||
|
|
||||||
|
|
||||||
|
def infinite_valuation(a):
|
||||||
|
r"""
|
||||||
|
Returns the valuation -deg of an element of a rational function field
|
||||||
|
|
||||||
|
The degree method returns the "height" of the element.
|
||||||
|
|
||||||
|
EXAMPLES:
|
||||||
|
|
||||||
|
sage: from vector_bundle.function_field_utility import infinite_valuation
|
||||||
|
sage: F.<x> = FunctionField(GF(3))
|
||||||
|
sage: infinite_valuation(x**-1 + x**-2)
|
||||||
|
1
|
||||||
|
"""
|
||||||
|
if a == 0:
|
||||||
|
return Infinity
|
||||||
|
return a.denominator().degree() - a.numerator().degree()
|
||||||
|
|
||||||
|
|
||||||
|
def infinite_mod(a,i):
|
||||||
|
r"""
|
||||||
|
Returns a mod x**-i
|
||||||
|
|
||||||
|
EXAMPLES:
|
||||||
|
|
||||||
|
sage: from vector_bundle.function_field_utility import infinite_mod
|
||||||
|
sage: K.<x> = FunctionField(GF(3))
|
||||||
|
sage: infinite_mod(x**-1 + x**-3,2)
|
||||||
|
1/x
|
||||||
|
"""
|
||||||
|
x = a.parent().gen()
|
||||||
|
b = a * x**(i-1)
|
||||||
|
return x**(1-i) * (b.numerator() // b.denominator())
|
||||||
|
|
||||||
|
|
||||||
|
def infinite_integral_matrix(mat):
|
||||||
|
r"""
|
||||||
|
Return an matrix with coefficient in the infinite maximal order and its denominator.
|
||||||
|
|
||||||
|
INPUT:
|
||||||
|
|
||||||
|
- ``mat`` -- Matrix with coefficients in a rational function field K
|
||||||
|
|
||||||
|
OUTPUT:
|
||||||
|
|
||||||
|
- ``int_mat`` -- Matrix with coefficients in K.maximal_order_infinite()
|
||||||
|
- ``den`` -- Element of K.maximal_order_infinite such that mat = int_mat/den
|
||||||
|
|
||||||
|
EXAMPLES:
|
||||||
|
|
||||||
|
sage: from vector_bundle.function_field_utility import infinite_integral_matrix
|
||||||
|
sage: F.<x> = FunctionField(GF(11))
|
||||||
|
sage: mat = matrix([[x, 1], [x**-1, 2]])
|
||||||
|
sage: infinite_integral_matrix(mat)
|
||||||
|
(
|
||||||
|
[ 1 1/x]
|
||||||
|
[1/x^2 2/x], 1/x
|
||||||
|
)
|
||||||
|
"""
|
||||||
|
K = mat[0,0].parent()
|
||||||
|
if isinstance(K,FunctionFieldMaximalOrderInfinite_rational):
|
||||||
|
return mat,1
|
||||||
|
if not isinstance(K,RationalFunctionField):
|
||||||
|
raise ValueError('mat must have coefficients in a rational function'
|
||||||
|
+ 'field or its infinite maximal order')
|
||||||
|
x = K.gen()
|
||||||
|
R = K.maximal_order_infinite()
|
||||||
|
den = x**min([infinite_valuation(e) for e in mat.list()])
|
||||||
|
int_mat = matrix(R,mat.nrows(),mat.ncols(),(den*mat).list())
|
||||||
|
return int_mat, den
|
||||||
|
|
||||||
|
|
||||||
|
def infinite_hermite_form(mat,include_zero_cols=True,transformation=False):
|
||||||
|
r"""
|
||||||
|
Return the hermite form of a matrix with coefficient in a rational infinite maximal order.
|
||||||
|
|
||||||
|
EXAMPLE:
|
||||||
|
|
||||||
|
sage: from vector_bundle.function_field_utility import infinite_hermite_form
|
||||||
|
sage: K.<x> = FunctionField(GF(3))
|
||||||
|
sage: R = K.maximal_order_infinite()
|
||||||
|
sage: mat = matrix(R,[[1, x**-1, x**-2, (x**3+1) / x**3], [(2*x+2) / (x**3+2), x**-2, (x**2+2) / (x**4+1), 1]])
|
||||||
|
sage: H,T = infinite_hermite_form(mat,transformation=True); H
|
||||||
|
[0 0 1 0]
|
||||||
|
[0 0 0 1]
|
||||||
|
sage: mat*T == H
|
||||||
|
True
|
||||||
|
|
||||||
|
TESTS:
|
||||||
|
|
||||||
|
sage: F.<x> = FunctionField(GF(3))
|
||||||
|
sage: R = F.maximal_order_infinite()
|
||||||
|
sage: mat = matrix(R,[[x**-1, 0, 2, 1], [0, x**-1, 1, 1], [0, 0, 1, 0], [0, 0, 0, 1]])
|
||||||
|
sage: infinite_hermite_form(mat) == mat
|
||||||
|
True
|
||||||
|
"""
|
||||||
|
R = mat.base_ring()
|
||||||
|
if not isinstance(R,FunctionFieldMaximalOrderInfinite_rational):
|
||||||
|
raise ValueError('mat must have base ring a rational infinite maximal'
|
||||||
|
+ ' order.')
|
||||||
|
n = mat.nrows()
|
||||||
|
r = mat.ncols()
|
||||||
|
x = R.function_field().gen()
|
||||||
|
H = copy(mat)
|
||||||
|
T = identity_matrix(R,r)
|
||||||
|
#First, make mat upper triangular with diagonal coefficient of the form
|
||||||
|
#x**-k.
|
||||||
|
for i in range(1,n+1):
|
||||||
|
degs = [infinite_valuation(H[-i,j]) for j in range(r+1-i)]
|
||||||
|
d0 = min(degs)
|
||||||
|
j0 = degs.index(d0)
|
||||||
|
E = elementary_matrix(R,r,row1=j0,row2=r-i)
|
||||||
|
T *= E
|
||||||
|
H *= E
|
||||||
|
E = elementary_matrix(R,r,row1=r-i,scale=(x**d0 * H[-i,-i])**-1)
|
||||||
|
T *= E
|
||||||
|
H *= E
|
||||||
|
for j in range(r-i):
|
||||||
|
E = elementary_matrix(R,r,row1=r-i,row2=j,scale=-H[-i,j]/H[-i,-i])
|
||||||
|
T *= E
|
||||||
|
H *= E
|
||||||
|
for i in range(2,n+1):
|
||||||
|
d = infinite_valuation(H[-i,-i])
|
||||||
|
for j in range(1,i):
|
||||||
|
E = elementary_matrix(
|
||||||
|
R,r,row1=r-i,row2=r-j,
|
||||||
|
scale=(infinite_mod(H[-i,-j],d)-H[-i,-j])/H[-i,-i])
|
||||||
|
T *= E
|
||||||
|
H *= E
|
||||||
|
if not include_zero_cols:
|
||||||
|
H = H[:,r-n:]
|
||||||
|
if transformation:
|
||||||
|
return H,T
|
||||||
|
return H
|
||||||
|
|
||||||
|
|
||||||
|
def infinite_ideal_hnf(I,transformation=False):
|
||||||
|
r"""
|
||||||
|
Return the Hermite form of an ideal of the infinite maximal order.
|
||||||
|
"""
|
||||||
|
O = I.ring()
|
||||||
|
K = O.function_field()
|
||||||
|
x = K.gen()
|
||||||
|
F = K.base_field()
|
||||||
|
R = F.maximal_order_infinite()
|
||||||
|
n = K.degree()
|
||||||
|
order_basis = O.basis()
|
||||||
|
order_matrix = matrix(R,[gen.list() for gen in O.basis()]).transpose()
|
||||||
|
ideal_basis = I.gens_over_base();
|
||||||
|
ideal_matrix = order_matrix**-1 * matrix(F,[gen.list()
|
||||||
|
for gen in ideal_basis]).transpose()
|
||||||
|
mat,den = infinite_integral_matrix(ideal_matrix)
|
||||||
|
#This is awkward but if transformation is False, hnf,U = ().hermite_form()
|
||||||
|
#will unpack the matrix.
|
||||||
|
if transformation:
|
||||||
|
hnf,U = infinite_hermite_form(mat, transformation=True)
|
||||||
|
return hnf/den,U
|
||||||
|
hnf = infinite_hermite_form(mat)
|
||||||
|
return hnf/den
|
||||||
|
|
||||||
|
def infinite_order_xgcd(ideals):
|
||||||
|
r"""
|
||||||
|
Performs the extended gcd algorithm for ideals in the infinite order.
|
||||||
|
|
||||||
|
INPUT:
|
||||||
|
|
||||||
|
- ``ideals`` -- list of ideals over the infinite maximal order of a function field
|
||||||
|
|
||||||
|
OUTPUT:
|
||||||
|
|
||||||
|
- ``coeffs`` --- list of elements of the function field such that as[i] in ideals[i] and sum(as) = 1
|
||||||
|
|
||||||
|
ALGORITHM:
|
||||||
|
|
||||||
|
Proposition 1.3.7 from [Coh00]
|
||||||
|
|
||||||
|
EXAMPLES:
|
||||||
|
|
||||||
|
sage: from vector_bundle.function_field_utility import infinite_order_xgcd
|
||||||
|
sage: F.<x> = FunctionField(GF(3))
|
||||||
|
sage: R.<y> = F[]
|
||||||
|
sage: K.<y> = F.extension(y**2 - x**-5 - 1)
|
||||||
|
sage: primes = [p.prime_ideal() for p in K.places_infinite()]; len(primes)
|
||||||
|
2
|
||||||
|
sage: a = infinite_order_xgcd(primes); a
|
||||||
|
[2*y + 2, y + 2]
|
||||||
|
sage: sum(a)
|
||||||
|
1
|
||||||
|
sage: all([a[i] in primes[i] for i in range(2)])
|
||||||
|
True
|
||||||
|
"""
|
||||||
|
order_basis = ideals[0].ring().basis()
|
||||||
|
if order_basis[0] != 1:
|
||||||
|
raise ValueError('The first element of the basis of the order should'
|
||||||
|
+ ' be 1.')
|
||||||
|
n = len(order_basis)
|
||||||
|
k = len(ideals)
|
||||||
|
y = ideals[0].ring().function_field().gen()
|
||||||
|
ideals_hnf = [infinite_ideal_hnf(I) for I in ideals]
|
||||||
|
ideals_bases = [[sum([order_basis[i]*mat[i,j] for i in range(n)])
|
||||||
|
for j in range(n)]
|
||||||
|
for mat in ideals_hnf]
|
||||||
|
C = block_matrix([ideals_hnf])
|
||||||
|
C, den = infinite_integral_matrix(C)
|
||||||
|
H,U = infinite_hermite_form(C, include_zero_cols=False, transformation=True)
|
||||||
|
if not (H/den).is_one():
|
||||||
|
raise ValueError("The ideals should be coprime.")
|
||||||
|
v = U[:,-n].list()
|
||||||
|
return [sum([ideals_bases[i][j]*v[n*i+j] for j in range(n)]) for i in range(k)]
|
||||||
|
|
||||||
|
|
||||||
|
def infinite_approximation(places,valuations,residues):
|
||||||
|
r"""
|
||||||
|
Return a in the function field of places such that
|
||||||
|
(a - residues[i]) has valuation at least valuations[i] at places[i].
|
||||||
|
|
||||||
|
INPUT:
|
||||||
|
|
||||||
|
- ``places`` -- list of FunctionFieldPlace. Infinite places only.
|
||||||
|
- ``valuations`` -- list of integers of same length as places.
|
||||||
|
- ``residues`` -- list of elements of the function field.
|
||||||
|
|
||||||
|
ALGORITHM:
|
||||||
|
|
||||||
|
Proposition 1.3.11 from [Coh00]
|
||||||
|
"""
|
||||||
|
if len(places) == 1:
|
||||||
|
return residues[0]
|
||||||
|
valuations = [max(0,val) for val in valuations]
|
||||||
|
primes = [place.prime_ideal() for place in places]
|
||||||
|
I = prod([prime**(val+1) for prime, val in zip(primes, valuations)])
|
||||||
|
ideals = [I * prime**(-val-1)
|
||||||
|
for prime, val in zip(primes, valuations)]
|
||||||
|
coefficients = infinite_order_xgcd(ideals)
|
||||||
|
return sum([c * res for c,res in zip(coefficients,residues)])
|
||||||
|
|
||||||
|
|
||||||
|
@cached_function
|
||||||
|
def safe_uniformizer(K):
|
||||||
|
r"""
|
||||||
|
Return a safe uniformizer and an infinite place of self._function_field
|
||||||
|
A uniformizer is safe if its valuation at other infinite places is 0.
|
||||||
|
|
||||||
|
EXAMPLES:
|
||||||
|
|
||||||
|
sage: from vector_bundle.function_field_utility import safe_uniformizer
|
||||||
|
sage: F.<x> = FunctionField(GF(3))
|
||||||
|
sage: R.<y> = F[]
|
||||||
|
sage: K.<y> = F.extension(y^2 - x**-5 - 1)
|
||||||
|
sage: places = K.places_infinite()
|
||||||
|
sage: pi, place = safe_uniformizer(K); pi
|
||||||
|
((2*x + 1)/x)*y + (2*x + 2)/x
|
||||||
|
sage: place == places[0]
|
||||||
|
True
|
||||||
|
sage: pi.valuation(place)
|
||||||
|
1
|
||||||
|
sage: pi.valuation(places[1])
|
||||||
|
0
|
||||||
|
|
||||||
|
TESTS:
|
||||||
|
|
||||||
|
sage: from vector_bundle.function_field_utility import all_infinite_places
|
||||||
|
sage: F.<x> = FunctionField(GF(3))
|
||||||
|
sage: R.<y> = F[]
|
||||||
|
sage: K.<y> = F.extension(y^2 + x + 2)
|
||||||
|
sage: places = K.places_infinite()
|
||||||
|
sage: pi, place = safe_uniformizer(K); pi
|
||||||
|
1/x*y
|
||||||
|
sage: place == places[0]
|
||||||
|
True
|
||||||
|
sage: pi.valuation(place)
|
||||||
|
1
|
||||||
|
sage: R.<y> = F[]
|
||||||
|
sage: K.<y> = F.extension(y^4 + (2*x^2 + 2)/x^2)
|
||||||
|
sage: pi, _ = safe_uniformizer(K)
|
||||||
|
sage: [pi.valuation(place) for place in all_infinite_places(K)]
|
||||||
|
[1, 0, 0]
|
||||||
|
sage: safe_uniformizer(F)
|
||||||
|
(1/x, Place (1/x))
|
||||||
|
"""
|
||||||
|
places = all_infinite_places(K)
|
||||||
|
n = len(places)
|
||||||
|
return (infinite_approximation(
|
||||||
|
places,
|
||||||
|
[2] + ([1]*(n-1)),
|
||||||
|
[places[0].local_uniformizer()] + ([1]*(n-1))),
|
||||||
|
places[0])
|
||||||
|
|
||||||
|
def local_expansion(place,pi,f):
|
||||||
|
r"""
|
||||||
|
Return a function giving the i-th coefficient of the expansion of f.
|
||||||
|
|
||||||
|
This uses code from sage.rings.function_field.maps.FunctionFieldCompletion.
|
||||||
|
While somewhat redundant, it adds the possibility to chose the uniformizer
|
||||||
|
with respect to which the expansion is computed.
|
||||||
|
|
||||||
|
INPUT:
|
||||||
|
|
||||||
|
- ``place`` -- FunctionFieldPlace; the place at which to expand
|
||||||
|
- ``pi`` -- The uniformizer giving variable for the power series
|
||||||
|
- ``f`` -- The function to expand
|
||||||
|
|
||||||
|
OUTPUT:
|
||||||
|
|
||||||
|
- a function taking as input an integer i and returning the coefficient of degree i
|
||||||
|
|
||||||
|
EXAMPLES:
|
||||||
|
|
||||||
|
sage: from vector_bundle.function_field_utility import local_expansion
|
||||||
|
sage: from vector_bundle.function_field_utility import safe_uniformizer
|
||||||
|
sage: F.<x> = FunctionField(GF(3))
|
||||||
|
sage: R.<y> = F[]
|
||||||
|
sage: K.<y> = F.extension(y^2 - x**-5 - 1)
|
||||||
|
sage: pi, place = safe_uniformizer(K)
|
||||||
|
sage: f = 1 / (1-pi)
|
||||||
|
sage: exp = local_expansion(place, pi, f)
|
||||||
|
sage: all([exp(i) == 1 for i in range(20)])
|
||||||
|
True
|
||||||
|
"""
|
||||||
|
if f == 0:
|
||||||
|
return lambda i : 0
|
||||||
|
K = place.function_field()
|
||||||
|
der = K.higher_derivation()
|
||||||
|
k, _, to_k = place.residue_field()
|
||||||
|
val = f.valuation(place)
|
||||||
|
e = f * pi**(-val)
|
||||||
|
return lambda i : to_k(der._derive(e, i - val, pi)) if i >= val else 0
|
||||||
|
|
||||||
|
def residue(place,pi,f):
|
||||||
|
r"""
|
||||||
|
Return the residue of constant répartition f at place with respect
|
||||||
|
to local uniformizer pi.
|
||||||
|
"""
|
||||||
|
if pi.valuation(place) != 1:
|
||||||
|
raise ValueError('pi must be a local uniformizer at place')
|
||||||
|
k, _, _ = place.residue_field()
|
||||||
|
kc = place.function_field().constant_base_field()
|
||||||
|
exp = local_expansion(place,pi,f)
|
||||||
|
high_res = exp(-1)
|
||||||
|
return k.over(kc)(high_res).trace()
|
||||||
|
|
||||||
|
|
||||||
|
def invert_trace(field,base,target):
|
||||||
|
r"""
|
||||||
|
Find an element of trace 1 over base in field.
|
||||||
|
|
||||||
|
EXAMPLES:
|
||||||
|
sage: from vector_bundle.function_field_utility import invert_trace
|
||||||
|
sage: base = GF(9)
|
||||||
|
sage: field = GF(9**3)
|
||||||
|
sage: a = invert_trace(field, base, 1); a
|
||||||
|
2*z6^4 + 2*z6^3 + z6 + 1
|
||||||
|
sage: field.over(base)(a).trace()
|
||||||
|
1
|
||||||
|
"""
|
||||||
|
if field == base:
|
||||||
|
if target not in field:
|
||||||
|
raise ValueError('Since field = base, target should be an element'
|
||||||
|
+ ' of field')
|
||||||
|
return target
|
||||||
|
as_ext = field.over(base)
|
||||||
|
d = as_ext.degree(base)
|
||||||
|
t = as_ext.gen()
|
||||||
|
i = [(t**j).trace() != 0 for j in range(d)].index(True)
|
||||||
|
return field(target * t**i/((t**i).trace()))
|
||||||
|
|
||||||
|
def insert_row(mat,i,row):
|
||||||
|
r"""
|
||||||
|
Return matrix mat with row inserted in ith position.
|
||||||
|
|
||||||
|
EXAMPLES:
|
||||||
|
sage: from vector_bundle.function_field_utility import insert_row
|
||||||
|
sage: mat = matrix(GF(3), 2, 2, [1, 2, 2, 1])
|
||||||
|
sage: insert_row(mat, 1, [0, 1])
|
||||||
|
[1 2]
|
||||||
|
[0 1]
|
||||||
|
[2 1]
|
||||||
|
"""
|
||||||
|
return matrix([mat[j] for j in range(i)]
|
||||||
|
+ [row]
|
||||||
|
+ [mat[j] for j in range(i,mat.nrows())])
|
||||||
|
|
||||||
|
|
||||||
|
def norm(v):
|
||||||
|
r"""
|
||||||
|
Return the norm of vector v: the maximal degree of its coefficients.
|
||||||
|
|
||||||
|
Input:
|
||||||
|
|
||||||
|
- v -- vector with coefficients in a RationalFunctionField
|
||||||
|
|
||||||
|
EXAMPLES:
|
||||||
|
|
||||||
|
sage: from vector_bundle.function_field_utility import norm
|
||||||
|
sage: R.<x> = GF(3)[]
|
||||||
|
sage: v = vector([x^3 + 3 + 1, x^2])
|
||||||
|
sage: norm(v)
|
||||||
|
3
|
||||||
|
"""
|
||||||
|
return max([c.degree() for c in v.list()])
|
||||||
|
|
||||||
|
def smallest_norm_first(mat,i = 0,norms=[]):
|
||||||
|
r"""
|
||||||
|
Swap rows of M so that the i-th row has smaller norm than rows below.
|
||||||
|
|
||||||
|
INPUT:
|
||||||
|
|
||||||
|
``mat`` -- matrix with coefficients in a RationalFunctionField
|
||||||
|
``i`` -- integer (default: `0`)
|
||||||
|
|
||||||
|
EXAMPLES:
|
||||||
|
|
||||||
|
sage: from vector_bundle.function_field_utility import smallest_norm_first
|
||||||
|
sage: R.<x> = GF(3)[]
|
||||||
|
sage: mat = matrix([[1, 1], [x^2, x^3], [1, x]])
|
||||||
|
sage: smallest_norm_first(mat, 1)
|
||||||
|
[0, 1, 3]
|
||||||
|
sage: mat
|
||||||
|
[ 1 1]
|
||||||
|
[ 1 x]
|
||||||
|
[x^2 x^3]
|
||||||
|
"""
|
||||||
|
if norms == []:
|
||||||
|
norms = [norm(row) for row in mat]
|
||||||
|
j = norms[i:].index(min(norms[i:]))
|
||||||
|
mat.swap_rows(i,i+j)
|
||||||
|
n = norms[i]
|
||||||
|
norms[i] = norms[j+i]
|
||||||
|
norms[j+i] = n
|
||||||
|
return norms
|
|
@ -0,0 +1,305 @@
|
||||||
|
r"""
|
||||||
|
This module implements the HomBundle class, for vector bundles constructed
|
||||||
|
as homomorphism sheaves between two vector bundles.
|
||||||
|
|
||||||
|
The class inherits from the VectorBundle class, but sections, either local
|
||||||
|
or global, are displayed as matrices.
|
||||||
|
|
||||||
|
EXAMPLES ::
|
||||||
|
|
||||||
|
sage: from vector_bundle import VectorBundle, trivial_bundle, savin_bundle
|
||||||
|
sage: F.<x> = FunctionField(GF(3))
|
||||||
|
sage: R.<y> = F[]
|
||||||
|
sage: K.<y> = F.extension(y^2 - x^5 - 1)
|
||||||
|
|
||||||
|
We construct a vector bundle of rank 2 and degree 4::
|
||||||
|
|
||||||
|
sage: F = VectorBundle(K, 3 * K.places_infinite()[0].divisor())
|
||||||
|
sage: F1 = VectorBundle(K, 2 * K.places_finite()[0].divisor())
|
||||||
|
sage: F2 = VectorBundle(K, 2 * K.places_finite()[1].divisor())
|
||||||
|
sage: V = savin_bundle(K, 2, 4, F, F1, F2); V.h0()
|
||||||
|
[(1, 0), (2*x, 1)]
|
||||||
|
|
||||||
|
We construct the ``HomBundle`` from `\mathcal{O}_X^2` to ``V``. Its global
|
||||||
|
sections should represent linear maps from `k^2` to `H^0(V)`, where `k`
|
||||||
|
is the constant field of `K`::
|
||||||
|
|
||||||
|
sage: domain = trivial_bundle(K).direct_sum_repeat(2)
|
||||||
|
sage: hom_bundle = domain.hom(V); hom_bundle.h0()
|
||||||
|
[
|
||||||
|
[1 0] [0 1] [2*x 0] [ 0 2*x]
|
||||||
|
[0 0], [0 0], [ 1 0], [ 0 1]
|
||||||
|
]
|
||||||
|
"""
|
||||||
|
###########################################################################
|
||||||
|
# Copyright (C) 2024 Mickaël Montessinos (mickael.montessinos@mif.vu.lt),#
|
||||||
|
# #
|
||||||
|
# Distributed under the terms of the GNU General Public License (GPL) #
|
||||||
|
# either version 3, or (at your option) any later version #
|
||||||
|
# #
|
||||||
|
# http://www.gnu.org/licenses/ #
|
||||||
|
###########################################################################
|
||||||
|
|
||||||
|
from sage.matrix.constructor import matrix
|
||||||
|
from sage.modules.free_module_element import vector
|
||||||
|
from vector_bundle import VectorBundle
|
||||||
|
|
||||||
|
class HomBundle(VectorBundle):
|
||||||
|
r"""
|
||||||
|
Vector bundles representing homomorphism sheaves of vector bundles.
|
||||||
|
|
||||||
|
EXAMPLES ::
|
||||||
|
|
||||||
|
sage: from vector_bundle import VectorBundle
|
||||||
|
sage: F.<x> = FunctionField(GF(3))
|
||||||
|
sage: R.<y> = F[]
|
||||||
|
sage: K.<y> = F.extension(y^2 + x + 2)
|
||||||
|
sage: ideals = [P.prime_ideal() for P in K.places_finite()[:2]]
|
||||||
|
sage: g_finite = matrix([[1, x], [2, y]])
|
||||||
|
sage: g_infinite = matrix([[x, 1], [2, y]])
|
||||||
|
sage: V1 = VectorBundle(K, ideals, g_finite, g_infinite)
|
||||||
|
sage: V2 = VectorBundle(K, K.places_infinite()[0].divisor())
|
||||||
|
sage: V = V1.hom(V2); V
|
||||||
|
Homomorphism bundle from Vector bundle of rank 2 over Function field in y defined by y^2 + x + 2 to Vector bundle of rank 1 over Function field in y defined by y^2 + x + 2
|
||||||
|
"""
|
||||||
|
def __init__(self,domain,codomain):
|
||||||
|
if (not isinstance(domain,VectorBundle) or
|
||||||
|
not isinstance(codomain,VectorBundle)):
|
||||||
|
raise TypeError
|
||||||
|
if domain._function_field != codomain._function_field:
|
||||||
|
raise ValueError
|
||||||
|
self._domain = domain
|
||||||
|
self._codomain = codomain
|
||||||
|
ideals = [ideal_domain**-1 * ideal_codomain
|
||||||
|
for ideal_domain in domain._ideals
|
||||||
|
for ideal_codomain in codomain._ideals]
|
||||||
|
g_finite = (domain._g_finite.transpose()**-1)\
|
||||||
|
.tensor_product(codomain._g_finite)
|
||||||
|
g_infinite = (domain._g_infinite.transpose()**-1)\
|
||||||
|
.tensor_product(codomain._g_infinite)
|
||||||
|
super().__init__(domain._function_field, ideals,g_finite,g_infinite)
|
||||||
|
|
||||||
|
def __hash__(self):
|
||||||
|
return hash((self._domain, self._codomain))
|
||||||
|
|
||||||
|
def __eq__(self,other):
|
||||||
|
return (super().__eq__(other)
|
||||||
|
and self._domain == other._domain
|
||||||
|
and self._codomain == other._codomain)
|
||||||
|
|
||||||
|
def _repr_(self):
|
||||||
|
return "Homomorphism bundle from %s to %s" % (
|
||||||
|
self._domain,
|
||||||
|
self._codomain,
|
||||||
|
)
|
||||||
|
|
||||||
|
def domain(self):
|
||||||
|
r"""
|
||||||
|
Return the domain of self
|
||||||
|
|
||||||
|
EXAMPLES ::
|
||||||
|
|
||||||
|
sage: from vector_bundle import VectorBundle
|
||||||
|
sage: F.<x> = FunctionField(GF(3))
|
||||||
|
sage: L1 = VectorBundle(F, x.poles()[0].divisor())
|
||||||
|
sage: L2 = VectorBundle(F, x.zeros()[0].divisor())
|
||||||
|
sage: V = L1.hom(L2); V.domain() == L1
|
||||||
|
True
|
||||||
|
"""
|
||||||
|
return self._domain
|
||||||
|
|
||||||
|
def codomain(self):
|
||||||
|
r"""
|
||||||
|
Return the codomain of self
|
||||||
|
|
||||||
|
EXAMPLES ::
|
||||||
|
|
||||||
|
sage: from vector_bundle import VectorBundle
|
||||||
|
sage: F.<x> = FunctionField(GF(3))
|
||||||
|
sage: L1 = VectorBundle(F, x.poles()[0].divisor())
|
||||||
|
sage: L2 = VectorBundle(F, x.zeros()[0].divisor())
|
||||||
|
sage: V = L1.hom(L2); V.codomain() == L2
|
||||||
|
True
|
||||||
|
"""
|
||||||
|
return self._codomain
|
||||||
|
|
||||||
|
def _vector_to_matrix(self,vec):
|
||||||
|
r"""
|
||||||
|
Return the matrix of the homomorphism encoded by vector vec.
|
||||||
|
"""
|
||||||
|
return matrix(self._domain.rank(),self._codomain.rank(),vec).transpose()
|
||||||
|
|
||||||
|
def _matrix_to_vector(self,mat):
|
||||||
|
r"""
|
||||||
|
Inverse operation of _vector_to_matrix()
|
||||||
|
"""
|
||||||
|
return vector(mat.transpose().list())
|
||||||
|
|
||||||
|
def basis_finite(self):
|
||||||
|
r"""
|
||||||
|
Return basis of the finite lattice of the hom bundle.
|
||||||
|
|
||||||
|
OUTPUT:
|
||||||
|
|
||||||
|
- The basis elements are represented as matrices.
|
||||||
|
|
||||||
|
EXAMPLES ::
|
||||||
|
|
||||||
|
sage: from vector_bundle import VectorBundle
|
||||||
|
sage: F.<x> = FunctionField(GF(3))
|
||||||
|
sage: R.<y> = F[]
|
||||||
|
sage: K.<y> = F.extension(y^2 + x + 2)
|
||||||
|
sage: ideals = [P.prime_ideal() for P in K.places_finite()[:2]]
|
||||||
|
sage: g_finite = matrix([[1, x], [2, y]])
|
||||||
|
sage: g_infinite = matrix([[x, 1], [2, y]])
|
||||||
|
sage: V1 = VectorBundle(K, ideals, g_finite, g_infinite)
|
||||||
|
sage: O = K.maximal_order()
|
||||||
|
sage: V2 = VectorBundle(K, K.places_finite()[2].prime_ideal(),1,x^2)
|
||||||
|
sage: V = V1.hom(V2)
|
||||||
|
sage: V.basis_finite()
|
||||||
|
[[(x/(x^2 + x + 2))*y + (x + 2)/(x^2 + x + 2) (x/(x^2 + x + 2))*y + 2*x^2/(x^2 + x + 2)],
|
||||||
|
[(2/(x^2 + x + 2))*y + x/(x^2 + x + 2) (2/(x^2 + x + 2))*y + x/(x^2 + x + 2)]]
|
||||||
|
"""
|
||||||
|
basis = super().basis_finite()
|
||||||
|
return [self._vector_to_matrix(v) for v in basis]
|
||||||
|
|
||||||
|
def basis_infinite(self):
|
||||||
|
r"""
|
||||||
|
Return basis of the infinite lattice of the hom bundle.
|
||||||
|
|
||||||
|
OUTPUT:
|
||||||
|
|
||||||
|
- The basis elements are represented as matrices.
|
||||||
|
|
||||||
|
EXAMPLES ::
|
||||||
|
|
||||||
|
sage: from vector_bundle import VectorBundle
|
||||||
|
sage: F.<x> = FunctionField(GF(3))
|
||||||
|
sage: R.<y> = F[]
|
||||||
|
sage: K.<y> = F.extension(y^2 + x + 2)
|
||||||
|
sage: ideals = [P.prime_ideal() for P in K.places_finite()[:2]]
|
||||||
|
sage: g_finite = matrix([[1, x], [2, y]])
|
||||||
|
sage: g_infinite = matrix([[x, 1],[2, y]])
|
||||||
|
sage: V1 = VectorBundle(K, ideals,g_finite,g_infinite)
|
||||||
|
sage: O = K.maximal_order()
|
||||||
|
sage: V2 = VectorBundle(K, K.places_finite()[2].prime_ideal(),1,x^2)
|
||||||
|
sage: V = V1.hom(V2)
|
||||||
|
sage: V.basis_infinite()
|
||||||
|
[[(x^2/(x^3 + 2*x^2 + 1))*y + (x^4 + 2*x^3)/(x^3 + 2*x^2 + 1) (x^3/(x^3 + 2*x^2 + 1))*y + 2*x^2/(x^3 + 2*x^2 + 1)],
|
||||||
|
[(2*x^3/(x^3 + 2*x^2 + 1))*y + x^2/(x^3 + 2*x^2 + 1) (2*x^4/(x^3 + 2*x^2 + 1))*y + x^3/(x^3 + 2*x^2 + 1)]]
|
||||||
|
"""
|
||||||
|
basis = super().basis_infinite()
|
||||||
|
return [self._vector_to_matrix(v) for v in basis]
|
||||||
|
|
||||||
|
def basis_local(self,place):
|
||||||
|
r"""
|
||||||
|
Return basis of the infinite lattice of the hom bundle.
|
||||||
|
|
||||||
|
OUTPUT:
|
||||||
|
|
||||||
|
- The basis elements are represented as matrices.
|
||||||
|
|
||||||
|
EXAMPLES ::
|
||||||
|
|
||||||
|
sage: from vector_bundle import VectorBundle
|
||||||
|
sage: F.<x> = FunctionField(GF(3))
|
||||||
|
sage: R.<y> = F[]
|
||||||
|
sage: K.<y> = F.extension(y^2 + x + 2)
|
||||||
|
sage: ideals = [P.prime_ideal() for P in K.places_finite()[:2]]
|
||||||
|
sage: g_finite = matrix([[1,x],[2,y]])
|
||||||
|
sage: g_infinite = matrix([[x,1],[2,y]])
|
||||||
|
sage: V1 = VectorBundle(K, ideals,g_finite,g_infinite)
|
||||||
|
sage: O = K.maximal_order()
|
||||||
|
sage: V2 = VectorBundle(K, K.places_finite()[2].prime_ideal(),1,x^2)
|
||||||
|
sage: V = V1.hom(V2)
|
||||||
|
sage: place = K.places_finite()[0]
|
||||||
|
sage: V.basis_local(place)
|
||||||
|
[[(1/(x^2 + x + 2))*y + (x + 2)/(x^3 + x^2 + 2*x) (1/(x^2 + x + 2))*y + 2*x/(x^2 + x + 2)],
|
||||||
|
[(2/(x^2 + x + 2))*y + x/(x^2 + x + 2) (2/(x^2 + x + 2))*y + x/(x^2 + x + 2)]]
|
||||||
|
sage: all([all([(mat * g_finite)[0, j].valuation(place) >= (V2._ideals[0] * V1._ideals[j]**-1).divisor().valuation(place) for j in range(2)]) for mat in V.basis_local(place)])
|
||||||
|
True
|
||||||
|
"""
|
||||||
|
basis = super().basis_local(place)
|
||||||
|
return [self._vector_to_matrix(v) for v in basis]
|
||||||
|
|
||||||
|
def hom(self, other):
|
||||||
|
r"""
|
||||||
|
Return the Hom bundle from self to other.
|
||||||
|
|
||||||
|
If other is a vector bundle, this is the hom bundle from ``self._codomain``
|
||||||
|
to ``self._domain.tensor_product(other)``.
|
||||||
|
If other is also a hom bundle, this is the hom bundle from
|
||||||
|
``self.codomain().tensor_product(other.domain())``
|
||||||
|
to ``self.domain().tensor_product(other.codomain()``
|
||||||
|
"""
|
||||||
|
if isinstance(other, HomBundle):
|
||||||
|
return self._codomain.tensor_product(other._domain)\
|
||||||
|
.hom(self._domain.tensor_product(other._codomain))
|
||||||
|
return self._codomain.hom(self._domain.tensor_product(other))
|
||||||
|
|
||||||
|
def tensor_product(self,other):
|
||||||
|
r"""
|
||||||
|
Return the tensor product of a hom bundle and a vector bundle.
|
||||||
|
This is the same thing as
|
||||||
|
``self._domain.hom(self._codomain.tensor_product(other))``
|
||||||
|
"""
|
||||||
|
return self._domain.hom(self._codomain.tensor_product(other))
|
||||||
|
|
||||||
|
def conorm(self,K):
|
||||||
|
r"""
|
||||||
|
Return the conorm of a hom bundle.
|
||||||
|
|
||||||
|
It is the same thing as the hom bundle of the conorms of its domain and
|
||||||
|
codomain.
|
||||||
|
|
||||||
|
EXAMPLES ::
|
||||||
|
|
||||||
|
sage: from vector_bundle import VectorBundle
|
||||||
|
sage: F.<x> = FunctionField(GF(3))
|
||||||
|
sage: R.<y> = F[]
|
||||||
|
sage: K.<y> = F.extension(y^2 + x + 2)
|
||||||
|
sage: ideals = [P.prime_ideal() for P in F.places_finite()[:2]]
|
||||||
|
sage: g_finite = matrix([[1, x], [2, x]])
|
||||||
|
sage: g_infinite = matrix([[x, 1], [2, x]])
|
||||||
|
sage: V1 = VectorBundle(F, ideals, g_finite, g_infinite)
|
||||||
|
sage: ideals = [P.prime_ideal() for P in F.places_finite()[1:3]]
|
||||||
|
sage: g_finite = matrix([[0, x], [1, 1/x]])
|
||||||
|
sage: g_infinite = matrix([[x, 2*x^2], [2, 1]])
|
||||||
|
sage: V2 = VectorBundle(F, ideals, g_finite, g_infinite)
|
||||||
|
sage: V1.conorm(K).hom(V2.conorm(K)) == V1.hom(V2).conorm(K)
|
||||||
|
True
|
||||||
|
"""
|
||||||
|
|
||||||
|
return self._domain.conorm(K).hom(self._codomain.conorm(K))
|
||||||
|
|
||||||
|
def h0(self):
|
||||||
|
r"""
|
||||||
|
Returns the 0th cohomology group of the hom bundle.
|
||||||
|
The global sections are output in matrix form, they are the global
|
||||||
|
homomorphisms from ``self._domain`` to ``self._codomain``.
|
||||||
|
|
||||||
|
EXAMPLES ::
|
||||||
|
|
||||||
|
sage: from vector_bundle import VectorBundle
|
||||||
|
sage: F.<x> = FunctionField(GF(3))
|
||||||
|
sage: R.<y> = F[]
|
||||||
|
sage: K.<y> = F.extension(y^2 + x + 2)
|
||||||
|
sage: ideals = [P.prime_ideal() for P in K.places_finite()[:2]]
|
||||||
|
sage: g_finite = matrix([[1, x], [2, y]])
|
||||||
|
sage: g_infinite = matrix([[x, 1], [2, y]])
|
||||||
|
sage: V1 = VectorBundle(K, ideals, g_finite, g_infinite)
|
||||||
|
sage: O = K.maximal_order()
|
||||||
|
sage: V2 = VectorBundle(K, K.places_finite()[2].prime_ideal(),1,x^2)
|
||||||
|
sage: V = V1.hom(V2)
|
||||||
|
sage: h0 = V.h0(); len(h0) == V.degree() + (1-K.genus())*V.rank()
|
||||||
|
True
|
||||||
|
sage: all([all([(mat * g_finite)[0, j] in V2._ideals[0] * V1._ideals[j]**-1 for j in range(2)]) for mat in h0])
|
||||||
|
True
|
||||||
|
sage: O_infinity = K.maximal_order_infinite()
|
||||||
|
sage: all([all([a in O_infinity for a in (x**-2 * mat * g_infinite).list()]) for mat in h0])
|
||||||
|
True
|
||||||
|
"""
|
||||||
|
h0 = super().h0()
|
||||||
|
return [self._vector_to_matrix(v) for v in h0]
|
||||||
|
|
||||||
|
|