6#include "utils/factorize.h"
12std::pair<unsigned long long, unsigned long long> utils::factorize(
unsigned long long input,
13 unsigned int acceptable_delta) {
14 unsigned long long root = sqrt(input);
15 if (root * root > input - acceptable_delta)
16 return std::make_pair(root, root);
18 unsigned long long x = root, y = root;
21 if (x * y > input + acceptable_delta) {
25 }
else if (x * y < input - acceptable_delta) {
30 return std::make_pair(x, y);
34bool utils::factorize3(uint64_t n, uint32_t &a, uint32_t &b, uint32_t &c) {
35 constexpr uint64_t MAX16 = 0xFFFFu;
36 if (n <= MAX16 * MAX16) {
37 auto f = utils::factorize(n);
38 a = f.first; b = f.second; c = 1;
39 return a <= MAX16 && b <= MAX16;
41 c = (uint32_t)((n + MAX16 * MAX16 - 1) / (MAX16 * MAX16));
42 if (c > MAX16)
return false;
43 uint64_t ab = (n + c - 1) / c;
44 auto f = utils::factorize(ab);
45 a = f.first; b = f.second;
46 return a <= MAX16 && b <= MAX16;