from __future__ import annotations import math from decimal import Decimal, ROUND_HALF_UP from typing import Iterable MAXINT32 = 2**32 MAXINT64 = 2**64 MAXINT32_SIGNED = 2**31 MAXINT64_SIGNED = 2**63 MAXINT32_UNSIGNED = MAXINT32 MAXINT64_UNSIGNED = MAXINT64 def round_half_up(number: int | float) -> int: """pythons round() rounds .5 to the *even* number; 0.5 == 0""" return int(Decimal(number).to_integral(ROUND_HALF_UP)) def get_factors(num: int) -> set: f = {num} for x in range(1, int(math.sqrt(num)) + 1): if num % x == 0: f.add(x) f.add(num // x) return f def mul(ints: Iterable[int]) -> int: """similar to sum(), just for multiplication""" ret = 1 for x in ints: ret *= x return ret def magnitude(value: int | float) -> int: return math.floor(math.log10(value))