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 phi

Usage:

>>> 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 / den

Exact 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_hist

Sorted 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 phi

Euler 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