Source code for py3nt.core.base

"""Base classes"""

from abc import ABC, abstractmethod
from dataclasses import dataclass, field

import numpy as np
from sympy.ntheory import primepi

from py3nt.defaults import LARGEST_SMALL_NUMBER


[docs] @dataclass class BaseSieve(ABC): """ Abstract base class for sieve. Methods ------- generate_primes: Generate primes when size is small. """ limit: int primes_: np.ndarray = field(init=False) num_primes: int = field(default=0) def __post_init__(self) -> None: self.num_primes = primepi(self.limit) self.primes_ = np.empty(shape=(self.num_primes,), dtype=int)
[docs] @abstractmethod def generate_primes(self) -> None: """Generate primes when size is small."""
[docs] @dataclass class BaseFactorization(ABC): """ Abstract base class for factorization. Methods ------- factorize: Factorize a positive integer. """
[docs] @abstractmethod def factorize(self, n) -> dict[int, int]: """Factorize positive integers not exceeding 10^70. :param n: Positive integer to be factorized. :type n: ``int`` :return: Dictionary of canonical prime factorization. Keys correspond to prime factors and values correspond to their multiplicity. :rtype: ``dict`` """
[docs] @dataclass class BaseSieveFactorization(BaseFactorization): """ Base Factorization class with sieve. Methods ------- regenerate_primes: Generate primes if necessary. """ sieve: BaseSieve largest_small_number: int = field(default=LARGEST_SMALL_NUMBER)
[docs] def regenerate_primes(self) -> None: """Generate primes if necessary.""" self.sieve.generate_primes()