Guest User

Untitled

a guest
Jan 15th, 2019
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.33 KB | None | 0 0
  1. import sys
  2. import unicodedata
  3. from math import floor
  4. from math import log
  5. from math import sqrt
  6. from typing import List
  7. from typing import Tuple
  8.  
  9.  
  10. class prime_iterable:
  11. def __init__(self):
  12. self._memoized = [2, 3]
  13.  
  14. def _gen_primes(self):
  15. sentinel = 0
  16. for sentinel in self._memoized:
  17. yield sentinel
  18. while True:
  19. sentinel += 2
  20. if self.is_prime(sentinel):
  21. self._memoized.append(sentinel)
  22. yield sentinel
  23.  
  24. @staticmethod
  25. def is_prime(n):
  26. for candidate in range(2, floor(sqrt(n)) + 1):
  27. if n % candidate == 0:
  28. return False
  29. return True
  30.  
  31. def __call__(self, end, start=1):
  32. for prime in self._gen_primes():
  33. if prime <= start:
  34. continue
  35. elif prime >= end:
  36. break
  37. yield prime
  38.  
  39.  
  40. primes = prime_iterable()
  41.  
  42.  
  43. def factorize(n: int) -> List[Tuple[int, int]]:
  44. factors: List[Tuple[int, int]] = []
  45. factorized = n
  46. for candidate_m in primes(n - 1):
  47. if factorized == 1:
  48. break
  49. elif candidate_m > factorized:
  50. raise ValueError(f"No prime factorization found for {n}")
  51. if factorized % candidate_m == 0:
  52. for candidate_e in range(1, floor(log(factorized, candidate_m)) + 2):
  53. if factorized % (candidate_m ** (candidate_e)) != 0:
  54. candidate_e -= 1
  55. factors.append((candidate_m, candidate_e))
  56. factorized = factorized // (candidate_m ** candidate_e)
  57. break
  58. else:
  59. factors = [(n, 1)]
  60. return factors
  61.  
  62.  
  63. def superscript(n: int) -> str:
  64. return "".join(
  65. unicodedata.lookup(unicodedata.name(digit).replace("DIGIT", "SUPERSCRIPT"))
  66. for digit in str(n)
  67. )
  68.  
  69.  
  70. if __name__ == "__main__":
  71. try:
  72. factorands = map(int, sys.argv[1:])
  73. for factorand in factorands:
  74. factors = factorize(factorand)
  75. factor_string = " × ".join(
  76. f"{mantissa}{superscript(exponent)}" for mantissa, exponent in factors
  77. )
  78. print(f"{factorand} = {factor_string}")
  79. except (ValueError, IndexError):
  80. print(
  81. f"Usage: {sys.argv[0]} number_to_be_factored [other_number_to_be_factored ...]",
  82. file=sys.stderr,
  83. )
Add Comment
Please, Sign In to add comment