From da416c94f6737f1d39d0abea2e2077a36d4e98b2 Mon Sep 17 00:00:00 2001 From: Sandeep Murthy Date: Fri, 15 Mar 2024 19:32:50 +0000 Subject: [PATCH] docs: improvements to the docs for "negative" continued fractions + README + contributing docs --- README.md | 9 ++- docs/_static/logo-dark.png | Bin 0 -> 20269 bytes docs/sources/contributing.rst | 2 +- docs/sources/creating-continued-fractions.rst | 71 ++++++++++++++++-- 4 files changed, 75 insertions(+), 7 deletions(-) create mode 100644 docs/_static/logo-dark.png diff --git a/README.md b/README.md index 59083d3..9a65140 100644 --- a/README.md +++ b/README.md @@ -19,6 +19,13 @@ A simple extension of the Python [`fractions`](https://docs.python.org/3/library/fractions.html) standard library for working with [continued fractions](https://en.wikipedia.org/wiki/Continued_fraction) as Python objects. +The [PyPI package](https://pypi.org/project/continuedfractions/) only uses standard libraries and can be installed on any Python 3.10, 3.11, or 3.12 installation on Linux, Mac OS or Windows. +```shell + pip install continuedfractions +``` + +See the [project docs](https://continuedfractions.readthedocs.io/en/latest) for more details. + [Continued fractions](https://en.wikipedia.org/wiki/Continued_fraction) are beautiful and interesting mathematical objects, with many connections in [number theory](https://en.wikipedia.org/wiki/Number_theory) and also very useful practical applications, including the [rational approximation of real numbers](https://en.wikipedia.org/wiki/Continued_fraction#Best_rational_approximations). The `continuedfractions` package is designed to: @@ -29,4 +36,4 @@ The `continuedfractions` package is designed to: The project is [licensed](LICENSE) under the [Mozilla Public License 2.0](https://opensource.org/licenses/MPL-2.0). -See the [project docs](https://continuedfractions.readthedocs.io/en/latest) for more details. + diff --git a/docs/_static/logo-dark.png b/docs/_static/logo-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..818c80b28cd0a9e272ed5bc7bb894e3d0ede65d5 GIT binary patch literal 20269 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 w@)XJ|VBGK12?D7RWiEm69mcvFMDqy__Y3 literal 0 HcmV?d00001 diff --git a/docs/sources/contributing.rst b/docs/sources/contributing.rst index e606a1a..dd063e9 100644 --- a/docs/sources/contributing.rst +++ b/docs/sources/contributing.rst @@ -92,7 +92,7 @@ The CI/CD pipelines are defined in the `CI YML <.github/workflows/ci.yml>`_, and Versioning and Releases ======================= -The package is currently at version ``0.11.13`` - `semantic versioning `_ is used. +The `PyPI package `_ is currently at version ``0.11.13`` - `semantic versioning `_ is used. There is currently no dedicated pipeline for releases - both `GitHub releases `_ and `PyPI packages `_ are published manually, but both have the same version tag. diff --git a/docs/sources/creating-continued-fractions.rst b/docs/sources/creating-continued-fractions.rst index 3f65fcb..80de300 100644 --- a/docs/sources/creating-continued-fractions.rst +++ b/docs/sources/creating-continued-fractions.rst @@ -276,7 +276,68 @@ Compare this with :math:`[4; 2, 6, 7]`, which is the continued fraction represen \frac{415}{93} = 4 + \cfrac{1}{2 + \cfrac{1}{6 + \cfrac{1}{7}}} -:py:class:`~continuedfractions.continuedfraction.ContinuedFraction` objects for negative numbers are constructed in the same way as with positive numbers, subject to the validation rules described above. And to avoid zero division problems if a fraction has a negative denominator the minus sign is “transferred” to the numerator. A few examples are given below. +To understand the difference in the sequence of elements more generally, we can start with `Euclid's division lemma `_ that for a positive rational number :math:`\frac{a}{b} > 1`, with :math:`a, b` coprime (no common divisors), there are positive integers :math:`q, v`, with :math:`0 < v < b`, such that :math:`a = qb + v`, so that: + +.. math:: + + \begin{align} + \frac{a}{b} &= q + \frac{v}{b} \\ + &= q + \frac{1}{\frac{b}{v}} \\ + &= q + \frac{1}{R_1} \\ + &= [a_0 = q; a_1, \ldots, a_n] + \end{align} + +where :math:`R_1 = [a_1; a_2, \ldots, a_n] = \frac{b}{v}` is an :math:`(n - 1)`-order continued fraction which is the 1st :ref:`remainder ` of the finite, simple continued fraction representation :math:`[a_0;a_1,\ldots,a_n]` of :math:`\frac{a}{b}`. Note that + +.. math:: + + -a = -qb - v = -qb - b + b - v = -(q + 1)b + (b - v) + +so we can write: + +.. math:: + + \begin{align} + -\frac{a}{b} &= -(q + 1) + \frac{b - v}{b} \\ + &= -(q + 1) + \frac{1}{\frac{b}{b - v}} \\ + &= -(q + 1) + \frac{1}{1 + \frac{v}{b - v}} \\ + &= -(q + 1) + \frac{1}{1 + \frac{1}{\frac{b}{v} - 1}} \\ + &= -(q + 1) + \frac{1}{1 + \frac{1}{R_1 - 1}} \\ + &= [a_0 = -(q + 1); 1, a_1 - 1,a_2,a_3,\ldots,a_n] + \end{align} + +where :math:`R_1 - 1 = [a_1 - 1;a_2,\ldots,a_n]` and :math:`\frac{1}{R_1 - 1} = [0; a_1 - 1, a_2, a_3, \ldots,a_n]`. There are two cases: (1) :math:`a_1 = 1` in which case :math:`R_1` (for :math:`-\frac{a}{b}`) is the :math:`(n - 2)`-order continued fraction :math:`[1; a_2,\ldots, a_n] = [a_2 + 1; a_3,\ldots,a_n]`, or case (2) where :math:`R_1` is unchanged. + +Thus, we can say that if :math:`[a_0;a_1,\ldots,a_n]` is the :math:`n`-order simple continued fraction representation of a positive rational number :math:`\frac{a}{b} > 1` then :math:`-\frac{a}{b}` has the following :math:`(n - 1)` and :math:`(n + 1)` simple continued representations for the cases :math:`a_1 = 1` and :math:`a_1 > 1`, respectively: + +.. math:: + + -\frac{a}{b} = + \begin{cases} + [-(a_0 + 1); a_2 + 1,a_3,\ldots,a_n], & a_1 = 1 \\ + [-(a_0 + 1); 1, a_1 - 1,a_2,a_3,\ldots,a_n], & a_1 > 1 + \end{cases} + +As :math:`n \to \infty` then :math:`\lim_{n \to \infty} [a_0;a_1,\ldots,a_n] = [a_0;a_1,\ldots]` represents an irrational number, and the same relations hold. + +We can see this in action with :py:class:`~continuedfractions.continuedfraction.ContinuedFraction` objects: + +.. code:: python + + >>> ContinuedFraction(382, 225).elements + (1, 1, 2, 3, 4, 5) + >>> ContinuedFraction(-382, 225).elements + (-2, 3, 3, 4, 5) + >>> ContinuedFraction.from_elements(-2, 3, 3, 4, 5) + ContinuedFraction(-382, 225) + >>> ContinuedFraction(225, 157).elements + (1, 2, 3, 4, 5) + >>> ContinuedFraction(-225, 157).elements + (-2, 1, 1, 3, 4, 5) + >>> ContinuedFraction.from_elements(-2, 1, 1, 3, 4, 5) + ContinuedFraction(-225, 157) + +The construction of :py:class:`~continuedfractions.continuedfraction.ContinuedFraction` objects via the ``__new__() -> __init__()`` cycle works the same way for negative numbers as with positive numbers, subject to the validation rules described above. And to avoid zero division problems if a fraction has a negative denominator the minus sign is “transferred” to the numerator. A few examples are given below. .. code:: python @@ -288,10 +349,10 @@ Compare this with :math:`[4; 2, 6, 7]`, which is the continued fraction represen (-5, 1, 1, 6, 7) >>> ContinuedFraction(-415, 93).convergents mappingproxy({0: Fraction(-5, 1), 1: Fraction(-4, 1), 2: Fraction(-9, 2), 3: Fraction(-58, 13), 4: Fraction(-415, 93)}) - >>> ContinuedFraction(-415, 93).as_float() - -4.462365591397849 - >>> ContinuedFraction(415, 93).as_float() - 4.462365591397849 + >>> ContinuedFraction(-415, 93).as_decimal() + Decimal('-4.462365591397849462365591397849462365591397849462365591397849462365591397849462365591397849462365591') + >>> ContinuedFraction(415, 93).as_decimal() + Decimal('4.462365591397849462365591397849462365591397849462365591397849462365591397849462365591397849462365591') **Note** As negation of numbers is a unary operation, the minus sign in a “negative” :py:class:`~continuedfractions.continuedfraction.ContinuedFraction` object must be attached to the fraction, before enclosure in parentheses.