Module garoupa.algebra.dihedral.d
Classes
class D (n, seed=None)-
Expand source code
class D(Group): def __init__(self, n, seed=None): """ Usage: >>> G = D(1414343245, seed=0) >>> round(G.comm_degree, 2) 0.25 >>> G, ~G, G^2 (D1414343245, ds1627694678, D1414343245×D1414343245) """ self.r = lambda: (Dr(r, n) for r in range(n)) self.s = lambda: (Ds(s, n) for s in range(n)) sorted = lambda: chain(self.s(), self.r()) super().__init__(Dr(0, n), sorted, seed) self.n = n @property def comm_degree(self): """Exact commutativity degree""" num = (self.n + 6) if self.n % 2 == 0 else (self.n + 3) den = 2 * self.order return num / den def __iter__(self): while True: yield self.rnd.choice([Dr, Ds])(self.samplei(), self.n) def __repr__(self): return f"D{self.n}" def __xor__(self, other): return Product(*repeat(self, other)) __pow__ = __xor__ def replace(self, *args, **kwargs): """ Usage: >>> G = D(1414343245, seed=0) >>> ~G.replace(seed=1) dr1222356005 """ dic = {"n": self.n, "seed": self.seed} dic.update(kwargs) return self.__class__(**dic) @property def order_hist(self): """Sorted histogram of element orders. Based on Gabriel Dalforno code. Usage: >>> D(7).order_hist {1: 1, 2: 7, 7: 6} """ if self._order_hist is None: rule = self.n % 2 hist = {1: 1, 2: self.n if rule != 0 else self.n + 1} rng = range(3, self.n + 1, 2) if rule != 0 else range(3, self.n + 1) for d in rng: if self.n % d == 0: hist[d] = self.euler(d) self._order_hist = dict(sorted(hist.items())) return self._order_hist def euler(self, d): """Euler Totient Function Based on Gabriel Dalforno code.""" phi = 1 for i in range(2, d): if self.gcd(i, d) == 1: phi += 1 return phiUsage:
>>> G = D(1414343245, seed=0) >>> round(G.comm_degree, 2) 0.25 >>> G, ~G, G^2 (D1414343245, ds1627694678, D1414343245×D1414343245)Ancestors
Instance variables
prop comm_degree-
Expand source code
@property def comm_degree(self): """Exact commutativity degree""" num = (self.n + 6) if self.n % 2 == 0 else (self.n + 3) den = 2 * self.order return num / denExact commutativity degree
prop order_hist-
Expand source code
@property def order_hist(self): """Sorted histogram of element orders. Based on Gabriel Dalforno code. Usage: >>> D(7).order_hist {1: 1, 2: 7, 7: 6} """ if self._order_hist is None: rule = self.n % 2 hist = {1: 1, 2: self.n if rule != 0 else self.n + 1} rng = range(3, self.n + 1, 2) if rule != 0 else range(3, self.n + 1) for d in rng: if self.n % d == 0: hist[d] = self.euler(d) self._order_hist = dict(sorted(hist.items())) return self._order_histSorted histogram of element orders.
Based on Gabriel Dalforno code.
Usage:
>>> D(7).order_hist {1: 1, 2: 7, 7: 6}
Methods
def euler(self, d)-
Expand source code
def euler(self, d): """Euler Totient Function Based on Gabriel Dalforno code.""" phi = 1 for i in range(2, d): if self.gcd(i, d) == 1: phi += 1 return phiEuler Totient Function Based on Gabriel Dalforno code.
def replace(self, *args, **kwargs)-
Expand source code
def replace(self, *args, **kwargs): """ Usage: >>> G = D(1414343245, seed=0) >>> ~G.replace(seed=1) dr1222356005 """ dic = {"n": self.n, "seed": self.seed} dic.update(kwargs) return self.__class__(**dic)Usage:
>>> G = D(1414343245, seed=0) >>> ~G.replace(seed=1) dr1222356005
Inherited members