From d0c43444d8e780084ee6e977336b077d4d1c3b5d Mon Sep 17 00:00:00 2001 From: kuco23 Date: Wed, 22 Jun 2022 17:38:32 +0200 Subject: [PATCH] enable pairing for large integers (issue #3) --- pairing_functions/cantor.py | 16 +++++++++------- pairing_functions/szudzik.py | 16 +++++----------- 2 files changed, 14 insertions(+), 18 deletions(-) diff --git a/pairing_functions/cantor.py b/pairing_functions/cantor.py index 8579038..3e9e0f5 100644 --- a/pairing_functions/cantor.py +++ b/pairing_functions/cantor.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- from collections import deque -from math import pow, floor, sqrt +from math import pow, floor, isqrt def pair(*numbers: int) -> int: @@ -51,12 +51,14 @@ def unpair(number: int, n: int = 2) -> tuple: """ if (number < 0) or (not isinstance(number, int)): raise ValueError('Cantor unpairing function requires a non-negative integer') - - w = floor((sqrt(8 * number + 1) - 1) / 2) - t = (pow(w, 2) + w) / 2 - - n2 = int(number - t) - n1 = int(w - n2) + + # calculate cantor unpairing using integer square root + m = isqrt(25 * (8 * number + 1)) + w = m // 10 + if m % 10 < 5: w -= 1 + t = (w * w + w) // 2 + n2 = number - t + n1 = w - n2 if n > 2: return unpair(n1, n - 1) + (n2,) diff --git a/pairing_functions/szudzik.py b/pairing_functions/szudzik.py index a53d231..311c45c 100644 --- a/pairing_functions/szudzik.py +++ b/pairing_functions/szudzik.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- from collections import deque -from math import pow, floor, sqrt +from math import pow, floor, isqrt def pair(*numbers: int) -> int: @@ -55,16 +55,10 @@ def unpair(number: int, n: int = 2) -> tuple: if (number < 0) or (not isinstance(number, int)): raise ValueError('Szudzik unpairing function requires a non-negative integer') - if number - pow(floor(sqrt(number)), 2) < floor(sqrt(number)): - - n1 = number - pow(floor(sqrt(number)), 2) - n2 = floor(sqrt(number)) - - else: - n1 = floor(sqrt(number)) - n2 = number - pow(floor(sqrt(number)), 2) - floor(sqrt(number)) - - n1, n2 = int(n1), int(n2) + q = isqrt(number) + l = number - q * q + + n1, n2 = (l, q) if l < q else (q, l - q) if n > 2: return unpair(n1, n - 1) + (n2,)