From 47261053882d8cd015c1b58f5ac0fb32fef08471 Mon Sep 17 00:00:00 2001 From: coderbeta1 Date: Fri, 6 Oct 2023 21:59:21 +0530 Subject: [PATCH 1/6] Added Derangement calculator --- maths/derangement.py | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 maths/derangement.py diff --git a/maths/derangement.py b/maths/derangement.py new file mode 100644 index 000000000000..4e6dc56bce86 --- /dev/null +++ b/maths/derangement.py @@ -0,0 +1,43 @@ +""" +A Python implementation for finding number of +derangements possible for k objects +https://en.wikipedia.org/wiki/Derangement +""" + +def derangement(k: int) -> int: + """ + Calculates the number of derangements of k objects. + :param k:the number of objects ( -1 < k < 1560 ) + :return :the number of derangements + :raises :ValueError: If k is negative. + + Examples: + >>> derangements(3) + 2 + >>> derangements(5) + 44 + >>> derangements(10) + 1334961 + """ + if k < 0: + raise ValueError("k must be a non-negative integer. Retry") + + # Base cases + if k == 0: + return 0 + if k == 1: + return 0 + + # Initialize the derangement counts + derange_1 = 1 + derange_2 = 0 + answer = 1 + + # Calculate derangements using dynamic programming + # Answer: F(n) = (n - 1) * ( F(n - 1) + F(n - 2) ) + for i in range(3, k + 1): + answer = (i - 1) * (derange_1 + derange_2) + derange_2 = derange_1 + derange_1 = answer + + return answer From 65789b05d1e8e520a7cb662c7db0d2e0ed349910 Mon Sep 17 00:00:00 2001 From: Achal Jain Date: Fri, 6 Oct 2023 22:13:35 +0530 Subject: [PATCH 2/6] Updated derangement.py --- maths/derangement.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/maths/derangement.py b/maths/derangement.py index 4e6dc56bce86..99f705eea857 100644 --- a/maths/derangement.py +++ b/maths/derangement.py @@ -4,12 +4,12 @@ https://en.wikipedia.org/wiki/Derangement """ -def derangement(k: int) -> int: +def derangement(objects: int) -> int: """ Calculates the number of derangements of k objects. - :param k:the number of objects ( -1 < k < 1560 ) + :param objects:the number of objects ( -1 < objects < 1560 ) :return :the number of derangements - :raises :ValueError: If k is negative. + :raises :ValueError: If objects is negative. Examples: >>> derangements(3) @@ -19,13 +19,13 @@ def derangement(k: int) -> int: >>> derangements(10) 1334961 """ - if k < 0: + if objects < 0: raise ValueError("k must be a non-negative integer. Retry") # Base cases - if k == 0: + if objects == 0: return 0 - if k == 1: + if objects == 1: return 0 # Initialize the derangement counts @@ -35,7 +35,7 @@ def derangement(k: int) -> int: # Calculate derangements using dynamic programming # Answer: F(n) = (n - 1) * ( F(n - 1) + F(n - 2) ) - for i in range(3, k + 1): + for i in range(3, objects + 1): answer = (i - 1) * (derange_1 + derange_2) derange_2 = derange_1 derange_1 = answer From ed67202f268d748c4dcd9524b50c93d18e20ac7d Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 6 Oct 2023 16:45:43 +0000 Subject: [PATCH 3/6] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- maths/derangement.py | 1 + 1 file changed, 1 insertion(+) diff --git a/maths/derangement.py b/maths/derangement.py index 99f705eea857..39421d3729cc 100644 --- a/maths/derangement.py +++ b/maths/derangement.py @@ -4,6 +4,7 @@ https://en.wikipedia.org/wiki/Derangement """ + def derangement(objects: int) -> int: """ Calculates the number of derangements of k objects. From 0b6dcdbb5d7d363e07f782d8ade66122831c67b4 Mon Sep 17 00:00:00 2001 From: Achal Jain Date: Fri, 6 Oct 2023 22:24:35 +0530 Subject: [PATCH 4/6] Updated derangement.py --- maths/derangement.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/maths/derangement.py b/maths/derangement.py index 39421d3729cc..aca10814e892 100644 --- a/maths/derangement.py +++ b/maths/derangement.py @@ -13,12 +13,12 @@ def derangement(objects: int) -> int: :raises :ValueError: If objects is negative. Examples: - >>> derangements(3) - 2 - >>> derangements(5) - 44 - >>> derangements(10) - 1334961 + >>> derangement(3) + 2 + >>> derangement(5) + 44 + >>> derangement(10) + 1334961 """ if objects < 0: raise ValueError("k must be a non-negative integer. Retry") From c6c457826fc448796495c224a4cb64620e170060 Mon Sep 17 00:00:00 2001 From: cclauss Date: Tue, 8 Sep 2026 12:49:40 +0000 Subject: [PATCH 5/6] updating DIRECTORY.md --- DIRECTORY.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/DIRECTORY.md b/DIRECTORY.md index 6d098f1f845a..7d18029ade79 100644 --- a/DIRECTORY.md +++ b/DIRECTORY.md @@ -726,6 +726,7 @@ * [Continued Fraction](maths/continued_fraction.py) * [Decimal Isolate](maths/decimal_isolate.py) * [Decimal To Fraction](maths/decimal_to_fraction.py) + * [Derangement](maths/derangement.py) * [Dodecahedron](maths/dodecahedron.py) * [Double Factorial](maths/double_factorial.py) * [Dual Number Automatic Differentiation](maths/dual_number_automatic_differentiation.py) @@ -876,6 +877,7 @@ * [Two Pointer](maths/two_pointer.py) * [Two Sum](maths/two_sum.py) * [Volume](maths/volume.py) + * [Weighted Average](maths/weighted_average.py) * [Zellers Congruence](maths/zellers_congruence.py) ## [Matrix](matrix) From c2ef1ce0f08ed33d65e38acbf04c23c6670bee43 Mon Sep 17 00:00:00 2001 From: Christian Clauss Date: Tue, 8 Sep 2026 14:53:33 +0200 Subject: [PATCH 6/6] Apply suggestion from @cclauss --- maths/derangement.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/maths/derangement.py b/maths/derangement.py index aca10814e892..238c798e7983 100644 --- a/maths/derangement.py +++ b/maths/derangement.py @@ -24,9 +24,7 @@ def derangement(objects: int) -> int: raise ValueError("k must be a non-negative integer. Retry") # Base cases - if objects == 0: - return 0 - if objects == 1: + if objects in (0, 1): return 0 # Initialize the derangement counts