// Copyright 2025 Jeisson Hidalgo-Cespedes. ECCI-UCR. CC-BY-4.0 #include #include #include "Factorization.hpp" Factorization::Factorization(const num_t number) : number(number) { if (number > 1) { this->factorize(); } } void Factorization::factorize() { this->powers.clear(); const num_t root = std::sqrt(number); num_t copy = Factorization::divide(number, 2); num_t divisor = 3; for (; copy > 1 && divisor <= root; divisor += 2) { copy = Factorization::divide(copy, divisor); } if (divisor > root && copy > 1) { this->powers.push_back(copy); this->powers.push_back(1); } } num_t Factorization::divide(num_t copy, const num_t divisor) { num_t times = 0; for (; copy % divisor == 0; ++times) { copy /= divisor; } if (times > 0) { this->powers.push_back(divisor); this->powers.push_back(times); } return copy; } std::ostream &Factorization::print(std::ostream &output) const { assert(this->powers.size() % 2 == 0); output << this->number << " ="; if (this->number < 0) { output << " invalid number"; } else if (number > 1) { for (size_t i = 0; i < this->powers.size(); i += 2) { output << " " << this->powers[i]; if (this->powers[i + 1] > 1) { output << "^" << this->powers[i + 1]; } } } else { output << " NA"; } return output; }