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
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
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, []
def get_euler(m): return euler(m)[0]