Example #1
0
    def find_adjacent_classes(self, m):
        result = []

        if self.type == OperationType.MULTIPLE:
            count_anjacent_classes = euler(m)[0] / len(self.elements) - 1

            for i in range(1, m):
                if count_anjacent_classes == 0:
                    break

                if get_nod(i, m) != 1 or i in self.elements:
                    continue

                tmp = []
                for each in self.elements:
                    tmp.append(each * i % m)

                count_anjacent_classes -= 1
                result.append(tmp)
        elif self.type == OperationType.ADDITION:
            if euler(m)[0] == m - 1:
                return []

            for i in range(1, int(m / len(self.elements))):
                tmp = []

                for each in self.elements:
                    tmp.append(int((each + i) % m))

                result.append(tmp)

        return result
def get_inverse_of(m: int, a: int):
    subtract = getSubtractClassFor(m)
    if a > m:
        a = a % m

    if a == 0:
        raise ValueError(f'Can not find inverse element for {a} by m = {m}')

    # SKIP 1?
    for each in subtract:
        if a == each:
            tmp_euler = euler(m)[0]
            u = each**(tmp_euler - 1)
            return u % m
def getInverseOf(m: int, a: int):
    answ = {}
    subtract = getSubtractClassFor(m)
    if abs(a) > m:
        a = a % m

    # SKIP 1?
    for each in subtract:
        if a == each or (a < 0 and a + m == each):
            tmp_euler = euler(m)[0]
            u = each**(tmp_euler - 1)
            answ[a] = u % m

    # return dictionary [K:V],
    #   K - a
    #   V - u
    return answ
def getAllInverseOf(m: int):
    answ = {}
    subtract = getSubtractClassFor(m)

    # SKIP 1?
    for each in subtract:
        if each == 1:
            answ[1] = 1
        else:
            tmp_euler = euler(m)[0]
            u = each**(tmp_euler - 1)
            answ[each] = u % m

    # return dictionary [K:V],
    #   K - a
    #   V - u
    return answ
Example #5
0
def order_multiple_group(m: int):
    eul = euler_script_5.euler(m)[0]
    canon = canonic_view_script_4.prime_factors_list(eul)
    elem_basis = []

    # find order for each elem
    for a in range(1, m):
        ri = []
        # bypass prime list
        for prime_elem in canon.keys():
            w = canon[prime_elem]  # get max W
            for wi in reversed(range(w + 1)):
                if (a**((m - 1) / (prime_elem**wi))) % m == 1 or wi == 0:
                    ri.append(prime_elem**(w - wi))
                    break

        elem_basis.append(f'ord({a}):={reduce(lambda x, y: x * y, ri)}')

    return elem_basis
Example #6
0
def find_root_and_system(m: int, print_solution: bool):
    eul = euler_script_5.euler(m)[0]
    canonic_number = canonic_view_script_4.to_list_prime(canonic_view_script_4.prime_factors_list(eul))
    if print_solution:
        print(f'Euler: φ({m}) = {eul}')
        print(f'Canon view: {eul} = {canonic_view_script_4.pretty_str(canonic_view_script_4.prime_factors_list(eul))}')

    a = 2
    while a < eul:
        isRoot = True
        for each in canonic_number:
            if isRoot:
                degree = int(eul / each)
                if (a ** degree) % m == 1:
                    isRoot = False
            else:
                break
        if isRoot and nod_script_1_2.get_nod(a, m) == 1:
            system = get_system(a, canonic_view_script_4.get_all_prime(m), m)
            return a, system
        a += 1
    return -1, []
Example #7
0
def get_euler(m):
    return euler(m)[0]