''' This library exists to isolate all math functions related to groups and their representations. ''' from math import gcd ''' Returns the multiplicative cyclic subgroup generated by an element g modulo m. Returns the cyclic subgroup as a list[int], the order of that subgroup, and a boolean indicating whether g is infinitely repeating with period == ord (or otherwise if it terminates with g**ord == 0). ''' def cyclic_subgrp(g: int, m: int, ignore_zero: bool = True) -> tuple[list[int], int, bool]: G = [] order = 0 periodic = True a = 1 # start at identity for _ in range(m): a = (a * g) % m if a == 0: if not ignore_zero: G.append(a) order += 1 periodic = False break # check if we've reached something periodic elif a in G[:1]: break G.append(a) order += 1 return G, order, periodic