From 73fa0cad8185b505fd4b9ad25ea85e1371dbe117 Mon Sep 17 00:00:00 2001 From: aarav570 Date: Wed, 28 Oct 2026 10:32:41 +0000 Subject: [PATCH 1/3] feat(maths): add Farey sequence generator --- maths/farey_sequence.py | 71 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 maths/farey_sequence.py diff --git a/maths/farey_sequence.py b/maths/farey_sequence.py new file mode 100644 index 000000000000..26a58a177d6d --- /dev/null +++ b/maths/farey_sequence.py @@ -0,0 +1,71 @@ +""" +Farey Sequence Generator + +The Farey sequence of order n is the sequence of completely reduced +fractions between 0 and 1 which have denominators less than or equal to n, +arranged in increasing order. + +Reference: https://en.wikipedia.org/wiki/Farey_sequence +""" + +from fractions import Fraction + + +def farey_sequence(order: int) -> list[Fraction]: + """ + Generate the Farey sequence of a given order in ascending order. + + :param order: The maximum denominator allowed in the fractions. + :return: A list of Fraction objects in ascending order. + + >>> farey_sequence(1) + [Fraction(0, 1), Fraction(1, 1)] + >>> farey_sequence(2) + [Fraction(0, 1), Fraction(1, 2), Fraction(1, 1)] + >>> farey_sequence(5) + [Fraction(0, 1), Fraction(1, 5), Fraction(1, 4), Fraction(1, 3), Fraction(2, 5), Fraction(1, 2), Fraction(3, 5), Fraction(2, 3), Fraction(3, 4), Fraction(4, 5), Fraction(1, 1)] + >>> farey_sequence(0) + Traceback (most recent call last): + ... + ValueError: Order must be a positive integer + >>> farey_sequence(-3) + Traceback (most recent call last): + ... + ValueError: Order must be a positive integer + >>> farey_sequence("5") + Traceback (most recent call last): + ... + TypeError: Order must be an integer + """ + if not isinstance(order, int) or isinstance(order, bool): + raise TypeError("Order must be an integer") + if order < 1: + raise ValueError("Order must be a positive integer") + + sequence: list[Fraction] = [Fraction(0, 1)] + numerator1, denominator1 = 0, 1 + numerator2, denominator2 = 1, order + + sequence.append(Fraction(numerator2, denominator2)) + + while numerator2 != 1 or denominator2 != 1: + scale_factor = (denominator1 + order) // denominator2 + next_numerator = scale_factor * numerator2 - numerator1 + next_denominator = scale_factor * denominator2 - denominator1 + + sequence.append(Fraction(next_numerator, next_denominator)) + + numerator1, denominator1 = numerator2, denominator2 + numerator2, denominator2 = next_numerator, next_denominator + + return sequence + + +if __name__ == "__main__": + import doctest + + doctest.testmod() + + print("Farey sequence of order 4:") + print(farey_sequence(4)) + From de64e8df420436b9e23498286d2e28fd382c8a13 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 28 Oct 2026 10:39:36 +0000 Subject: [PATCH 2/3] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- maths/farey_sequence.py | 1 - 1 file changed, 1 deletion(-) diff --git a/maths/farey_sequence.py b/maths/farey_sequence.py index 26a58a177d6d..cdafd314501c 100644 --- a/maths/farey_sequence.py +++ b/maths/farey_sequence.py @@ -68,4 +68,3 @@ def farey_sequence(order: int) -> list[Fraction]: print("Farey sequence of order 4:") print(farey_sequence(4)) - From bb5aa0d7020daf631010ad09ff8d8d62405d0a7e Mon Sep 17 00:00:00 2001 From: aarav570 Date: Wed, 28 Oct 2026 10:48:19 +0000 Subject: [PATCH 3/3] style(maths): fix ruff E501 line length in doctests --- maths/farey_sequence.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/maths/farey_sequence.py b/maths/farey_sequence.py index cdafd314501c..e022399ecfe6 100644 --- a/maths/farey_sequence.py +++ b/maths/farey_sequence.py @@ -22,8 +22,10 @@ def farey_sequence(order: int) -> list[Fraction]: [Fraction(0, 1), Fraction(1, 1)] >>> farey_sequence(2) [Fraction(0, 1), Fraction(1, 2), Fraction(1, 1)] - >>> farey_sequence(5) - [Fraction(0, 1), Fraction(1, 5), Fraction(1, 4), Fraction(1, 3), Fraction(2, 5), Fraction(1, 2), Fraction(3, 5), Fraction(2, 3), Fraction(3, 4), Fraction(4, 5), Fraction(1, 1)] + >>> farey_sequence(3) + [Fraction(0, 1), Fraction(1, 3), Fraction(1, 2), Fraction(2, 3), Fraction(1, 1)] + >>> [(f.numerator, f.denominator) for f in farey_sequence(4)] + [(0, 1), (1, 4), (1, 3), (1, 2), (2, 3), (3, 4), (1, 1)] >>> farey_sequence(0) Traceback (most recent call last): ...