Source code for polymerist.maths.numbersys.commonbases

'''Specialized cases of general positional numbering systems which are more common in usage'''

__author__ = 'Timotej Bernat'
__email__ = 'timotej.bernat@colorado.edu'

from typing import Callable, Generator, Iterable
from .positional import PositionalNumberingSystem


[docs] def hypergeometric_ratios(funct : Callable[[int], int]) -> Generator[int, None, None]: '''Generates ratios between successive natural number terms according to a provided function''' i = 0 while True: yield funct(i) i += 1
[docs] class FixedRadixNumberSystem(PositionalNumberingSystem): '''Positional numbering system with a single fixed radix''' def __init__(self, radix : int=10) -> None: self._radix = radix @property def radix(self) -> int: return self._radix base = radix @property def radices(self) -> Iterable[int]: # override radices getter with generator return hypergeometric_ratios(lambda i : self.radix)
[docs] class FactorialNumberSystem(PositionalNumberingSystem): '''For representing factoradic numbers, useful in enmerating permutations via Lehmer codes''' def __init__(self) -> None: pass @property def radices(self) -> Iterable[int]: return hypergeometric_ratios(lambda i : i + 1)