commit c743ca0b850386908d9f0c7a7f9b368f964c80ee Author: Emile Clark-Boman Date: Wed Jun 11 11:11:35 2025 +1000 lalalala diff --git a/m.py b/m.py new file mode 100644 index 0000000..925fa35 --- /dev/null +++ b/m.py @@ -0,0 +1,31 @@ +# Modulo Test +from prbraid.math import * +from prbraid.color import * + +def main(): + while True: + x = None + try: + uprint('This is red!', color=Color.Red, end=' ', flush=False) + uprint('And this is green!', color=Color.Green, flush=True) + x = int(input('[n]: ')) + except ValueError: + continue + + # calculate left padding to align i values + lpadded = len(str(x)) + + # find all invertible elements (skipped for now) + for i in range(x): + lpad = ' ' * (lpadded - len(str(i))) + grp = orbit(i, x) + print(f'{lpad}{i} -> {len(grp)} | {grp}') + print() # empty new line + +if __name__ == '__main__': + try: + main() + except (KeyboardInterrupt, EOFError): + pass + + diff --git a/prbraid/color.py b/prbraid/color.py new file mode 100644 index 0000000..e7d0f38 --- /dev/null +++ b/prbraid/color.py @@ -0,0 +1,48 @@ +from enum import Enum + +class Color(Enum): + Black = 0 + Red = 1 + Green = 2 + Yellow = 3 + Blue = 4 + Magenta = 5 + Cyan = 6 + White = 7 + + # escape sequence format string + __fescseq = '\033[3{0}m' + # ansi reset code + __ansi_rst = '\033[0m' + + __ansi_black = '\033[30m' + __ansi_red = '\033[31m' + __ansi_green = '\033[32m' + __ansi_yellow = '\033[33m' + __ansi_blue = '\033[34m' + __ansi_magenta = '\033[35m' + __ansi_cyan= '\033[36m' + __ansi_white = '\033[37m' + + @staticmethod + def _ansi_ret(ansi): + return ansi, Color.__ansi_white + + @staticmethod + def code(color: 'Color'): + return Color.__fescseq.format(color.value) + + def ansi(self): + code = Color.code(self) + if self == Color.White: + return code, '' + return code, Color.__ansi_rst + +# !! ULTRA PRINT !! +def uprint(text: str, + color: Color = Color.White, + end: str = '\n', + flush: bool = True): + c = color.ansi() + text = f'{c[0]}{text}{c[1]}' + print(text, end=end, flush=flush) diff --git a/prbraid/math.py b/prbraid/math.py new file mode 100644 index 0000000..896faa2 --- /dev/null +++ b/prbraid/math.py @@ -0,0 +1,24 @@ +# Euler's Totient (Phi) Function +def totient(n): + phi = int(n > 1 and n) + for p in range(2, int(n ** .5) + 1): + if not n % p: + phi -= phi // p + while not n % p: + n //= p + #if n is > 1 it means it is prime + if n > 1: phi -= phi // n + return phi + + +def orbit(b, m): + generated = [] + x = b + for i in range(m): + x = (x * b) % m + if x not in generated: + generated.append(x) + return generated + +def order(b, m): + return len(orbit(b, m))