diff --git a/algo.py b/algo.py index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..cf8e4440164b192dac2d16fa056920beb6f7a818 100644 --- a/algo.py +++ b/algo.py @@ -0,0 +1,111 @@ +import math + +def bachet_bezout(a, b): + """Does the Bachet-Bezout algorithm on a of b + + Args: + a (uint): the number + b (uint): the modulo + + Returns: + uint: An array with the pgdc and the coefficients of bachet_bezout, [pgdc, u, v] + """ + + if (a == 0): + return 0 + if (b == 0): + return -1 + + u = [1, 0] + v = [0, 1] + q = 1 + r = 1 + i = 2 + while (r > 0): + q = a // b + r = a % b + + u.append(u[i-2] - q * u[i-1]) + v.append(v[i-2] - q * v[i-1]) + + a = b + b = r + i += 1 + + return a, u[i-2], v[i-2] + +def exponentiation_rapide(a, exp, n): + """Does the quick explanation of a pow x modulo n + + Args: + a (uint): the number + exp (uint): the exponent of the number + n (uint): the modulo + + Returns: + uint: An array with the pgdc and the coefficients of bachet_bezout, [pgdc, u, v] + """ + + if (a == 0): + return 0 + if (exp == 0): + return 1 + + r = 1 + b = a % n + while (exp > 0): + y = exp % 2 + r = (r * b**y) % n + b = (b**2) % n + exp = exp // 2 + + return r + +def is_square(a): + """Check if a number is a perfect square, using the Newton methode + from https://stackoverflow.com/questions/2489435/check-if-a-number-is-a-perfect-square + + Args: + a (uint): number checked + + Returns: + bool: true if the number is a perfect square, otherwise flase + """ + + x = a // 2 + seen = set([x]) + + while x * x != a: + x = (x + (a // x)) // 2 + + if x in seen: + return False + + seen.add(x) + + return True + +def fermat_factorization(n): + """Does the Fermat's factorization on n, + n = a² - b² = (a + b) * (a - b) = p * q <=> b² = a² - n + + Args: + n (uint): number used + + Returns: + tuple of uint: the two coeficient a and b + """ + + a = math.ceil(math.sqrt(n)) + b = 0 + while(True): + b2 = a**2 - n + + if (is_square(b2)): + b = math.sqrt(b2) + break + + a += 1 + + return (a, b) +