Skip to content

Int

Description

Arbitrary-precision unsigned integer value. Int stores the magnitude as a little-endian bit-vector with no sign bit.

Fields

Name Description
bits Backing bit storage for the integer magnitude. Treat as internal representation.

Usage example (from documentation)

  Int value = IntFrom(42);

Usage example (Cross-references)

Usage examples (Cross-references)
    #endif
    #if FEATURE_INT
    #    include <Misra/Std/Container/Int.h>
    #endif
    #if FEATURE_FLOAT
    #if FEATURE_INT
    #    define IOFMT_INT_CASE_(x, addr)                                                                                   \
    Int:                                                                                                                   \
            TO_TYPE_SPECIFIC_IO(Int, addr),
    #else
    #    define IOFMT_INT_CASE_(x, addr)                                                                                   \
    Int:                                                                                                                   \
            TO_TYPE_SPECIFIC_IO(Int, addr),
    #else
    #    define IOFMT_INT_CASE_(x, addr)
    #endif
    #if FEATURE_INT
    bool _write_Int(Str *o, FmtInfo *fmt_info, Int *value);
    #endif
    #endif
    #if FEATURE_INT
    Zstr _read_Int(Zstr i, FmtInfo *fmt_info, Int *value);
    #endif
    #define MISRA_STD_CONTAINER_INT_H
    
    #include "Int/Type.h"
    #include "Int/Init.h"
    #include "Int/Access.h"
    
    #include "Int/Type.h"
    #include "Int/Init.h"
    #include "Int/Access.h"
    #include "Int/Memory.h"
    #include "Int/Type.h"
    #include "Int/Init.h"
    #include "Int/Access.h"
    #include "Int/Memory.h"
    #include "Int/Convert.h"
    #include "Int/Init.h"
    #include "Int/Access.h"
    #include "Int/Memory.h"
    #include "Int/Convert.h"
    #include "Int/Private.h"
    #include "Int/Access.h"
    #include "Int/Memory.h"
    #include "Int/Convert.h"
    #include "Int/Private.h"
    #include "Int/Compare.h"
    #include "Int/Memory.h"
    #include "Int/Convert.h"
    #include "Int/Private.h"
    #include "Int/Compare.h"
    #include "Int/Math.h"
    #include "Int/Convert.h"
    #include "Int/Private.h"
    #include "Int/Compare.h"
    #include "Int/Math.h"
    #include "Int/Private.h"
    #include "Int/Compare.h"
    #include "Int/Math.h"
    
    #endif // MISRA_STD_CONTAINER_INT_H
                (rhs),                                                                                                     \
                Float *: float_compare,                                                                                    \
                Int *: float_compare_int,                                                                                  \
                unsigned char: float_compare_u64,                                                                          \
                unsigned short: float_compare_u64,                                                                         \
                (rhs),                                                                                                     \
                Float *: float_compare_with_error,                                                                         \
                Int *: float_compare_int_with_error,                                                                       \
                unsigned char: float_compare_u64_with_error,                                                               \
                unsigned short: float_compare_u64_with_error,                                                              \
    #define MISRA_STD_CONTAINER_FLOAT_TYPE_H
    
    #include <Misra/Std/Container/Int/Type.h>
    
    ///
    typedef struct {
        bool negative;
        Int  significand;
        i64  exponent;
    } Float;
    ///
    #    define FloatFrom(value, allocator_ptr)                                                                                                                                                                                                                                                                                                                                                                            \
            _Generic((value), Int *: float_from_int, unsigned char: float_from_u64, unsigned short: float_from_u64, unsigned int: float_from_u64, unsigned long: float_from_u64, unsigned long long: float_from_u64, signed char: float_from_i64, signed short: float_from_i64, signed int: float_from_i64, signed long: float_from_i64, signed long long: float_from_i64, float: float_from_f32, double: float_from_f64)( \
                (value),                                                                                                                                                                                                                                                                                                                                                                                                   \
                ALLOCATOR_OF(allocator_ptr)                                                                                                                                                                                                                                                                                                                                                                                \
        /// TAGS: Float, Convert, Int, Truncate
        ///
        bool FloatToInt(Int *result, const Float *value);
    
        ///
    
    #include "Type.h"
    #include <Misra/Std/Container/Int/Init.h>
    
    ///
    #define MISRA_STD_CONTAINER_FLOAT_ACCESS_H
    
    #include <Misra/Std/Container/Int/Access.h>
    
    #include "Type.h"
                (b),                                                                                                       \
                Float *: float_add,                                                                                        \
                Int *: float_add_int,                                                                                      \
                unsigned char: float_add_u64,                                                                              \
                unsigned short: float_add_u64,                                                                             \
                (b),                                                                                                       \
                Float *: float_sub,                                                                                        \
                Int *: float_sub_int,                                                                                      \
                unsigned char: float_sub_u64,                                                                              \
                unsigned short: float_sub_u64,                                                                             \
                (b),                                                                                                       \
                Float *: float_mul,                                                                                        \
                Int *: float_mul_int,                                                                                      \
                unsigned char: float_mul_u64,                                                                              \
                unsigned short: float_mul_u64,                                                                             \
                (b),                                                                                                       \
                Float *: float_div,                                                                                        \
                Int *: float_div_int,                                                                                      \
                unsigned char: float_div_u64,                                                                              \
                unsigned short: float_div_u64,                                                                             \
        /// TAGS: Int, Memory, Clone, Copy
        ///
        bool IntTryClone(Int *out, const Int *value);
    
        ///
        /// TAGS: Int, Memory, Clone, Copy
        ///
        Int IntClone(const Int *value);
    
    #ifdef __cplusplus
            _Generic(                                                                                                      \
                (rhs),                                                                                                     \
                Int *: int_compare,                                                                                        \
                unsigned char: int_compare_u64,                                                                            \
                unsigned short: int_compare_u64,                                                                           \
    typedef struct {
        BitVec bits;
    } Int;
    
    ///
    /// TAGS: Int, Validate, Safety, Debug
    ///
    static inline void ValidateInt(const Int *value) {
        ValidateBitVec(value ? &value->bits : NULL);
    }
        /// TAGS: Int, Convert, U64
        ///
        bool IntTryToU64(const Int *value, u64 *out);
    
        ///
        /// TAGS: Int, Convert, U64
        ///
        u64 IntToU64WithError(const Int *value, bool *error);
    
        ///
        /// TAGS: Int, Convert, Bytes, LE
        ///
        Int int_from_bytes_le(const u8 *bytes, u64 len, Allocator *alloc);
    #define IntFromBytesLE(...)                 OVERLOAD(IntFromBytesLE, __VA_ARGS__)
    #define IntFromBytesLE_2(bytes, len)        int_from_bytes_le((bytes), (len), MisraScope)
        /// TAGS: Int, Convert, Bytes, LE
        ///
        u64 IntToBytesLE(const Int *value, u8 *bytes, u64 max_len);
    
        ///
        /// TAGS: Int, Convert, Bytes, BE
        ///
        Int int_from_bytes_be(const u8 *bytes, u64 len, Allocator *alloc);
    #define IntFromBytesBE(...)                 OVERLOAD(IntFromBytesBE, __VA_ARGS__)
    #define IntFromBytesBE_2(bytes, len)        int_from_bytes_be((bytes), (len), MisraScope)
        /// TAGS: Int, Convert, Bytes, BE
        ///
        u64 IntToBytesBE(const Int *value, u8 *bytes, u64 max_len);
    
        ///
        /// TAGS: Int, Convert, Parse, Radix
        ///
        bool int_try_from_str_radix_zstr(Int *out, Zstr digits, u8 radix);
        bool int_try_from_str_radix_str(Int *out, const Str *digits, u8 radix);
    #define IntTryFromStrRadix(out, digits, radix)                                                                                     \
        ///
        bool int_try_from_str_radix_zstr(Int *out, Zstr digits, u8 radix);
        bool int_try_from_str_radix_str(Int *out, const Str *digits, u8 radix);
    #define IntTryFromStrRadix(out, digits, radix)                                                                                     \
        _Generic((digits), Str *: int_try_from_str_radix_str, Zstr: int_try_from_str_radix_zstr, char *: int_try_from_str_radix_zstr)( \
        /// TAGS: Int, Convert, Radix, String
        ///
        Int int_from_str_radix_zstr(Zstr digits, u8 radix, Allocator *alloc);
        Int int_from_str_radix_str(const Str *digits, u8 radix, Allocator *alloc);
    #define IntFromStrRadix(...) OVERLOAD(IntFromStrRadix, __VA_ARGS__)
        ///
        Int int_from_str_radix_zstr(Zstr digits, u8 radix, Allocator *alloc);
        Int int_from_str_radix_str(const Str *digits, u8 radix, Allocator *alloc);
    #define IntFromStrRadix(...) OVERLOAD(IntFromStrRadix, __VA_ARGS__)
    #define IntFromStrRadix_2(digits, radix)                                                                               \
        /// TAGS: Int, Convert, String, Radix, Allocator
        ///
        bool int_try_to_str_radix(Str *out, const Int *value, u8 radix, bool uppercase, Allocator *alloc);
        Str  int_to_str_radix(const Int *value, u8 radix, bool uppercase, Allocator *alloc);
        ///
        bool int_try_to_str_radix(Str *out, const Int *value, u8 radix, bool uppercase, Allocator *alloc);
        Str  int_to_str_radix(const Int *value, u8 radix, bool uppercase, Allocator *alloc);
    
        ///
        /// TAGS: Int, Convert, Parse, Decimal
        ///
        bool int_try_from_str_zstr(Int *out, Zstr decimal);
        bool int_try_from_str_str(Int *out, const Str *decimal);
    #define IntTryFromStr(out, decimal)                                                                                    \
        ///
        bool int_try_from_str_zstr(Int *out, Zstr decimal);
        bool int_try_from_str_str(Int *out, const Str *decimal);
    #define IntTryFromStr(out, decimal)                                                                                    \
        _Generic((decimal), Str *: int_try_from_str_str, Zstr: int_try_from_str_zstr, char *: int_try_from_str_zstr)(      \
        /// TAGS: Int, Convert, String
        ///
        Int int_from_str_zstr(Zstr decimal, Allocator *alloc);
        Int int_from_str_str(const Str *decimal, Allocator *alloc);
    #define IntFromStr(...) OVERLOAD(IntFromStr, __VA_ARGS__)
        ///
        Int int_from_str_zstr(Zstr decimal, Allocator *alloc);
        Int int_from_str_str(const Str *decimal, Allocator *alloc);
    #define IntFromStr(...) OVERLOAD(IntFromStr, __VA_ARGS__)
    #define IntFromStr_1(decimal)                                                                                          \
        /// TAGS: Int, Convert, String, Decimal, Allocator
        ///
        bool int_try_to_str(Str *out, const Int *value, Allocator *alloc);
        Str  int_to_str(const Int *value, Allocator *alloc);
        ///
        bool int_try_to_str(Str *out, const Int *value, Allocator *alloc);
        Str  int_to_str(const Int *value, Allocator *alloc);
    
        ///
        /// TAGS: Int, Convert, Parse, Binary
        ///
        bool int_try_from_binary_zstr(Int *out, Zstr binary);
        bool int_try_from_binary_str(Int *out, const Str *binary);
    #define IntTryFromBinary(out, binary)                                                                                     \
        ///
        bool int_try_from_binary_zstr(Int *out, Zstr binary);
        bool int_try_from_binary_str(Int *out, const Str *binary);
    #define IntTryFromBinary(out, binary)                                                                                     \
        _Generic((binary), Str *: int_try_from_binary_str, Zstr: int_try_from_binary_zstr, char *: int_try_from_binary_zstr)( \
        /// TAGS: Int, Convert, Binary
        ///
        Int int_from_binary_zstr(Zstr binary, Allocator *alloc);
        Int int_from_binary_str(const Str *binary, Allocator *alloc);
    #define IntFromBinary(...) OVERLOAD(IntFromBinary, __VA_ARGS__)
        ///
        Int int_from_binary_zstr(Zstr binary, Allocator *alloc);
        Int int_from_binary_str(const Str *binary, Allocator *alloc);
    #define IntFromBinary(...) OVERLOAD(IntFromBinary, __VA_ARGS__)
    #define IntFromBinary_1(binary)                                                                                        \
        /// TAGS: Int, Convert, Binary
        ///
        Str IntToBinary(const Int *value);
    
        ///
        /// TAGS: Int, Convert, Parse, Octal
        ///
        bool int_try_from_oct_str_zstr(Int *out, Zstr octal);
        bool int_try_from_oct_str_str(Int *out, const Str *octal);
    #define IntTryFromOctStr(out, octal)                                                                                        \
        ///
        bool int_try_from_oct_str_zstr(Int *out, Zstr octal);
        bool int_try_from_oct_str_str(Int *out, const Str *octal);
    #define IntTryFromOctStr(out, octal)                                                                                        \
        _Generic((octal), Str *: int_try_from_oct_str_str, Zstr: int_try_from_oct_str_zstr, char *: int_try_from_oct_str_zstr)( \
        /// TAGS: Int, Convert, Oct
        ///
        Int int_from_oct_str_zstr(Zstr octal, Allocator *alloc);
        Int int_from_oct_str_str(const Str *octal, Allocator *alloc);
    #define IntFromOctStr(...) OVERLOAD(IntFromOctStr, __VA_ARGS__)
        ///
        Int int_from_oct_str_zstr(Zstr octal, Allocator *alloc);
        Int int_from_oct_str_str(const Str *octal, Allocator *alloc);
    #define IntFromOctStr(...) OVERLOAD(IntFromOctStr, __VA_ARGS__)
    #define IntFromOctStr_1(octal)                                                                                         \
        /// TAGS: Int, Convert, Oct
        ///
        Str IntToOctStr(const Int *value);
    
        ///
        /// TAGS: Int, Convert, Parse, Hex
        ///
        bool int_try_from_hex_str_zstr(Int *out, Zstr hex);
        bool int_try_from_hex_str_str(Int *out, const Str *hex);
    #define IntTryFromHexStr(out, hex)                                                                                        \
        ///
        bool int_try_from_hex_str_zstr(Int *out, Zstr hex);
        bool int_try_from_hex_str_str(Int *out, const Str *hex);
    #define IntTryFromHexStr(out, hex)                                                                                        \
        _Generic((hex), Str *: int_try_from_hex_str_str, Zstr: int_try_from_hex_str_zstr, char *: int_try_from_hex_str_zstr)( \
        /// TAGS: Int, Convert, Hex
        ///
        Int int_from_hex_str_zstr(Zstr hex, Allocator *alloc);
        Int int_from_hex_str_str(const Str *hex, Allocator *alloc);
    #define IntFromHexStr(...) OVERLOAD(IntFromHexStr, __VA_ARGS__)
        ///
        Int int_from_hex_str_zstr(Zstr hex, Allocator *alloc);
        Int int_from_hex_str_str(const Str *hex, Allocator *alloc);
    #define IntFromHexStr(...) OVERLOAD(IntFromHexStr, __VA_ARGS__)
    #define IntFromHexStr_1(hex)                                                                                           \
        /// TAGS: Int, Convert, Hex
        ///
        Str IntToHexStr(const Int *value);
    
    #ifdef __cplusplus
    #endif
    
    static inline u64 int_to_u64_no_error(const Int *value) {
        return IntToU64WithError(value, NULL);
    }
    ///
    #define IntInit(...)             OVERLOAD(IntInit, __VA_ARGS__)
    #define IntInit_0()              ((Int) {.bits = BitVecInit_1(MisraScope)})
    #define IntInit_1(allocator_ptr) ((Int) {.bits = BitVecInit_1(allocator_ptr)})
    #define IntInit(...)             OVERLOAD(IntInit, __VA_ARGS__)
    #define IntInit_0()              ((Int) {.bits = BitVecInit_1(MisraScope)})
    #define IntInit_1(allocator_ptr) ((Int) {.bits = BitVecInit_1(allocator_ptr)})
    
    ///
        /// TAGS: Int, Access, BitLength
        ///
        u64 IntBitLength(const Int *value);
    
        ///
        /// TAGS: Int, Access, ByteLength
        ///
        u64 IntByteLength(const Int *value);
    
        ///
        /// TAGS: Int, Math, Log2, Access
        ///
        bool IntTryLog2(const Int *value, u64 *out);
    
        ///
        /// TAGS: Int, Math, Log2, Access
        ///
        u64 IntLog2WithError(const Int *value, bool *error);
    
        ///
        /// TAGS: Int, Access, TrailingZeros
        ///
        u64 IntTrailingZeroCount(const Int *value);
    
        ///
        /// TAGS: Int, Access, Predicate, IsZero
        ///
        bool IntIsZero(const Int *value);
    
        ///
        /// TAGS: Int, Access, Predicate, IsOne
        ///
        bool IntIsOne(const Int *value);
    
        ///
        /// TAGS: Int, Access, Predicate, IsEven
        ///
        bool IntIsEven(const Int *value);
    
        ///
        /// TAGS: Int, Access, Predicate, IsOdd
        ///
        bool IntIsOdd(const Int *value);
    
        ///
        /// TAGS: Int, Access, Predicate, FitsU64
        ///
        bool IntFitsU64(const Int *value);
    
        ///
        /// TAGS: Int, Access, Predicate, PowerOfTwo
        ///
        bool IntIsPowerOfTwo(const Int *value);
    
    #ifdef __cplusplus
    #endif
    
    static inline u64 int_log2_no_error(const Int *value) {
        return IntLog2WithError(value, NULL);
    }
        /// TAGS: Int, Math, ShiftLeft, Bits
        ///
        bool IntShiftLeft(Int *value, u64 positions);
        ///
        /// Shift an integer right by the given number of bit positions.
        /// TAGS: Int, Math, ShiftRight, Bits
        ///
        bool IntShiftRight(Int *value, u64 positions);
        ///
        /// Add two integers.
        /// TAGS: Int, Math, Add
        ///
        bool int_add(Int *result, const Int *a, const Int *b);
        ///
        /// Subtract one integer from another.
        /// TAGS: Int, Math, Subtract
        ///
        bool int_sub(Int *result, const Int *a, const Int *b);
        ///
        /// Multiply two integers.
        /// TAGS: Int, Math, Multiply
        ///
        bool int_mul(Int *result, const Int *a, const Int *b);
        ///
        /// Square an integer.
        /// TAGS: Int, Math, Square
        ///
        bool IntSquare(Int *result, const Int *value);
        ///
        /// Raise an integer to an arbitrary-precision power.
        /// TAGS: Int, Math, Power, Exponentiation
        ///
        bool int_pow(Int *result, const Int *base, const Int *exponent);
        ///
        /// Divide one integer by another using floor division.
        /// TAGS: Int, Math, Divide, Quotient
        ///
        bool int_div(Int *result, const Int *dividend, const Int *divisor);
        ///
        /// Divide one integer by another only when the division is exact.
        /// TAGS: Int, Math, DivideExact
        ///
        bool int_div_exact(Int *result, const Int *dividend, const Int *divisor);
        ///
        /// Compute `dividend mod divisor`.
        /// TAGS: Int, Math, Modulo
        ///
        bool int_mod(Int *result, const Int *dividend, const Int *divisor);
        ///
        /// Compute quotient and remainder in one call.
        /// TAGS: Int, Math, Divide, Modulo
        ///
        bool int_div_mod(Int *quotient, Int *remainder, const Int *dividend, const Int *divisor);
        ///
        /// Compute the greatest common divisor of two integers.
        /// TAGS: Int, Math, GCD, NumberTheory
        ///
        bool IntGCD(Int *result, const Int *a, const Int *b);
        ///
        /// Compute the least common multiple of two integers.
        /// TAGS: Int, Math, LCM, NumberTheory
        ///
        bool IntLCM(Int *result, const Int *a, const Int *b);
        ///
        /// Compute the integer `degree`-th root of a value (floor).
        /// TAGS: Int, Math, Root, NumberTheory
        ///
        bool IntRoot(Int *result, const Int *value, u64 degree);
        ///
        /// Compute an integer root and the leftover remainder.
        /// TAGS: Int, Math, Root, Remainder
        ///
        bool IntRootRem(Int *root, Int *remainder, const Int *value, u64 degree);
        ///
        /// Compute the integer square root (floor).
        /// TAGS: Int, Math, Sqrt
        ///
        bool IntSqrt(Int *result, const Int *value);
        ///
        /// Compute the integer square root and remainder.
        /// TAGS: Int, Math, Sqrt, Remainder
        ///
        bool IntSqrtRem(Int *root, Int *remainder, const Int *value);
        ///
        /// Test whether a value is a perfect square.
        /// TAGS: Int, Math, PerfectSquare, Predicate
        ///
        bool IntIsPerfectSquare(const Int *value);
        ///
        /// Test whether a value is a perfect power.
        /// TAGS: Int, Math, PerfectPower, Predicate
        ///
        bool IntIsPerfectPower(const Int *value);
        ///
        /// Compute the Jacobi symbol `(a/n)`.
        /// TAGS: Int, Math, Jacobi, NumberTheory
        ///
        bool IntTryJacobi(int *out, const Int *a, const Int *n);
    
        ///
        /// TAGS: Int, Math, Jacobi, NumberTheory
        ///
        int IntJacobiWithError(const Int *a, const Int *n, bool *error);
        ///
        /// Compute `(value^2) mod modulus`.
        /// TAGS: Int, Math, Modular, Square
        ///
        bool IntSquareMod(Int *result, const Int *value, const Int *modulus);
        ///
        /// Compute `(a + b) mod modulus`.
        /// TAGS: Int, Math, Modular, Add
        ///
        bool IntModAdd(Int *result, const Int *a, const Int *b, const Int *modulus);
        ///
        /// Compute `(a - b) mod modulus`.
        /// TAGS: Int, Math, Modular, Subtract
        ///
        bool IntModSub(Int *result, const Int *a, const Int *b, const Int *modulus);
        ///
        /// Compute `(a * b) mod modulus`.
        /// TAGS: Int, Math, Modular, Multiply
        ///
        bool IntModMul(Int *result, const Int *a, const Int *b, const Int *modulus);
        ///
        /// Compute modular division `a / b (mod modulus)`.
        /// TAGS: Int, Math, Modular, Divide
        ///
        bool IntModDiv(Int *result, const Int *a, const Int *b, const Int *modulus);
        ///
        /// Compute `(base^exponent) mod modulus`.
        /// TAGS: Int, Math, Modular, Power
        ///
        bool int_pow_mod(Int *result, const Int *base, const Int *exponent, const Int *modulus);
        ///
        /// Compute the multiplicative inverse of a value modulo `modulus`.
        /// TAGS: Int, Math, Modular, Inverse
        ///
        bool IntModInv(Int *result, const Int *value, const Int *modulus);
        ///
        /// Compute a modular square root.
        /// TAGS: Int, Math, Modular, Sqrt
        ///
        bool IntModSqrt(Int *result, const Int *value, const Int *modulus);
        ///
        /// Perform a probabilistic primality test.
        /// TAGS: Int, Math, Prime, Predicate
        ///
        bool IntIsProbablePrimeWithError(const Int *value, bool *error);
        ///
        /// Find the next probable prime greater than or equal to a value.
        /// TAGS: Int, Math, Prime, Search
        ///
        bool IntNextPrime(Int *result, const Int *value);
    
        static inline bool int_is_probable_prime_no_error(const Int *value) {
        bool IntNextPrime(Int *result, const Int *value);
    
        static inline bool int_is_probable_prime_no_error(const Int *value) {
            return IntIsProbablePrimeWithError(value, NULL);
        }
            _Generic(                                                                                                      \
                (b),                                                                                                    \
                Int *: int_add,                                                                              \
                unsigned char: int_add_u64,                                                                              \
                unsigned short: int_add_u64,                                                                              \
            _Generic(                                                                                                      \
                (b),                                                                                                    \
                Int *: int_sub,                                                                              \
                unsigned char: int_sub_u64,                                                                              \
                unsigned short: int_sub_u64,                                                                              \
            _Generic(                                                                                                      \
                (b),                                                                                                    \
                Int *: int_mul,                                                                              \
                unsigned char: int_mul_u64,                                                                              \
                unsigned short: int_mul_u64,                                                                              \
            _Generic(                                                                                                      \
                (exponent),                                                                                                    \
                Int *: int_pow,                                                                              \
                unsigned char: int_pow_u64,                                                                              \
                unsigned short: int_pow_u64,                                                                              \
            _Generic(                                                                                                      \
                (divisor),                                                                                                    \
                Int *: int_div,                                                                              \
                unsigned char: int_div_u64,                                                                              \
                unsigned short: int_div_u64,                                                                              \
            _Generic(                                                                                                      \
                (divisor),                                                                                                    \
                Int *: int_div_exact,                                                                              \
                unsigned char: int_div_exact_u64,                                                                              \
                unsigned short: int_div_exact_u64,                                                                              \
            _Generic(                                                                                                      \
                (divisor),                                                                                                    \
                Int *: int_mod,                                                                              \
                unsigned char: int_mod_u64_into,                                                                              \
                unsigned short: int_mod_u64_into,                                                                              \
            _Generic(                                                                                                      \
                (divisor),                                                                                                 \
                Int *: int_div_mod,                                                                                        \
                unsigned char: int_div_mod_u64,                                                                            \
                unsigned short: int_div_mod_u64,                                                                           \
            _Generic(                                                                                                      \
                (exponent),                                                                                                \
                Int *: int_pow_mod,                                                                                        \
                unsigned char: int_pow_u64_mod,                                                                            \
                unsigned short: int_pow_u64_mod,                                                                           \
    #endif
    
        static inline int int_jacobi_no_error(const Int *a, const Int *n) {
            return IntJacobiWithError(a, n, NULL);
        }
    #endif
    #if FEATURE_INT
    #    include <Misra/Std/Container/Int.h>
    #endif
    #if FEATURE_FLOAT
    
    #if FEATURE_INT
    bool _write_Int(Str *o, FmtInfo *fmt_info, Int *value) {
        if (!o || !fmt_info || !value) {
            LOG_FATAL("Invalid arguments");
    
            if (!buffer) {
                LOG_ERROR("Failed to allocate buffer for Int character formatting");
                return false;
            }
    
    #if FEATURE_INT
    Zstr _read_Int(Zstr i, FmtInfo *fmt_info, Int *value) {
        if (!i || !value) {
            LOG_FATAL("Invalid arguments");
    
        if (fmt_info && (fmt_info->flags & FMT_FLAG_CHAR)) {
            LOG_ERROR("Character-format reads are not supported for Int");
            return i;
        }
    
        if (!StrIterRemainingLength(&si)) {
            LOG_ERROR("Failed to parse Int: empty input");
            return StrIterDataAt(&si, StrIterIndex(&si));
        }
    
        if (radix == 16 && p0 == '0' && (p1 == 'x' || p1 == 'X')) {
            LOG_ERROR("Int hex reads expect plain hex digits without a 0x prefix");
            return start;
        }
        }
        if (radix == 2 && p0 == '0' && (p1 == 'b' || p1 == 'B')) {
            LOG_ERROR("Int binary reads expect plain binary digits without a 0b prefix");
            return start;
        }
        }
        if (radix == 8 && p0 == '0' && (p1 == 'o' || p1 == 'O')) {
            LOG_ERROR("Int octal reads expect plain octal digits without a 0o prefix");
            return start;
        }
    
        if (StrIterIndex(&si) == StrIterIndex(&digits_saved)) {
            LOG_ERROR("Failed to parse Int");
            return start;
        }
        char trailing = 0;
        if (StrIterPeek(&si, &trailing) && trailing == '_') {
            LOG_ERROR("Int reads do not accept digit separators");
            return start;
        }
    
        Str  temp   = StrInitFromCstr(start, StrIterIndex(&si) - StrIterIndex(&saved), IntAllocator(value));
        Int  parsed = IntInit(IntAllocator(value));
        bool ok     = IntTryFromStrRadix(&parsed, StrBegin(&temp), radix);
    /// Arbitrary-precision unsigned integer implementation built on top of BitVec.
    
    #include <Misra/Std/Container/Int.h>
    #include <Misra/Std/Zstr.h>
    #include <Misra/Std/Container/Int/Private.h>
    #include <Misra/Std/Container/Int.h>
    #include <Misra/Std/Zstr.h>
    #include <Misra/Std/Container/Int/Private.h>
    #include <Misra/Std/Container/BitVec.h>
    #include <Misra/Std/Log.h>
    typedef struct {
        bool negative;
        Int  magnitude;
    } SignedInt;
    #define INT_BITS(value) (&(value)->bits)
    
    static void        int_normalize(Int *value);
    static inline u64  int_load_le8(const u8 *data, u64 bit_len, u64 off);
    static inline void int_store_le8(u8 *data, u64 byte_len, u64 off, u64 value);
    static inline void int_store_le8(u8 *data, u64 byte_len, u64 off, u64 value);
    static bool        int_validate_radix(u8 radix);
    static bool int_try_from_str_radix_impl(Int *out, Zstr digits, u64 length, u64 start, u8 radix, bool allow_underscores);
    static bool int_try_from_i64_with_allocator(Int *out, i64 value, Allocator *alloc);
    static bool int_try_clone_value(Int *out, const Int *value);
    static bool        int_validate_radix(u8 radix);
    static bool int_try_from_str_radix_impl(Int *out, Zstr digits, u64 length, u64 start, u8 radix, bool allow_underscores);
    static bool int_try_from_i64_with_allocator(Int *out, i64 value, Allocator *alloc);
    static bool int_try_clone_value(Int *out, const Int *value);
    static u64  int_u64_bits(u64 value);
    static bool int_try_from_str_radix_impl(Int *out, Zstr digits, u64 length, u64 start, u8 radix, bool allow_underscores);
    static bool int_try_from_i64_with_allocator(Int *out, i64 value, Allocator *alloc);
    static bool int_try_clone_value(Int *out, const Int *value);
    static u64  int_u64_bits(u64 value);
    static u64  int_u64_bits(u64 value);
    
    bool int_try_from_u64(Int *out, u64 value, Allocator *alloc) {
        u64 bits = int_u64_bits(value);
    }
    
    static bool int_try_from_i64_with_allocator(Int *out, i64 value, Allocator *alloc) {
        if (value < 0) {
            LOG_ERROR("Int cannot represent negative values");
    static bool int_try_from_i64_with_allocator(Int *out, i64 value, Allocator *alloc) {
        if (value < 0) {
            LOG_ERROR("Int cannot represent negative values");
            return false;
        }
    }
    
    static u64 int_significant_bits(const Int *value) {
        ValidateInt(value);
    }
    
    static void int_replace(Int *dst, Int *src) {
        IntDeinit(dst);
        *dst = *src;
    }
    
    static void int_swap(Int *a, Int *b) {
        Int tmp = *a;
        *a      = *b;
    
    static void int_swap(Int *a, Int *b) {
        Int tmp = *a;
        *a      = *b;
        *b      = tmp;
    }
    
    static bool sint_mul_unsigned(SignedInt *result, SignedInt *a, Int *b) {
        SignedInt temp = sint_init(IntAllocator(&result->magnitude));
    }
    
    static void int_normalize(Int *value) {
        ValidateInt(value);
        BitVecResize(INT_BITS(value), int_significant_bits(value));
    }
    
    static bool int_is_odd(const Int *value) {
        ValidateInt(value);
        return BitVecLen(INT_BITS(value)) > 0 && BitVecGet(INT_BITS(value), 0);
    }
    
    static bool int_is_one(const Int *value) {
        ValidateInt(value);
        return IntBitLength(value) == 1 && BitVecGet(INT_BITS(value), 0);
    }
    
    static bool int_mul_u64_in_place(Int *value, u64 factor) {
        Int lhs;
        Int rhs;
    
    static bool int_mul_u64_in_place(Int *value, u64 factor) {
        Int lhs;
        Int rhs;
        Int result = IntInit(IntAllocator(value));
    static bool int_mul_u64_in_place(Int *value, u64 factor) {
        Int lhs;
        Int rhs;
        Int result = IntInit(IntAllocator(value));
        Int lhs;
        Int rhs;
        Int result = IntInit(IntAllocator(value));
    
        if (!int_try_clone_value(&lhs, value)) {
    }
    
    static bool int_add_u64_in_place(Int *value, u64 addend) {
        Int lhs;
        Int rhs;
    
    static bool int_add_u64_in_place(Int *value, u64 addend) {
        Int lhs;
        Int rhs;
        Int result = IntInit(IntAllocator(value));
    static bool int_add_u64_in_place(Int *value, u64 addend) {
        Int lhs;
        Int rhs;
        Int result = IntInit(IntAllocator(value));
        Int lhs;
        Int rhs;
        Int result = IntInit(IntAllocator(value));
    
        if (!int_try_clone_value(&lhs, value)) {
    
    static bool
        int_try_from_str_radix_impl(Int *out, Zstr digits, u64 length, u64 start, u8 radix, bool allow_underscores) {
        Int  result;
        bool saw_digit = false;
    static bool
        int_try_from_str_radix_impl(Int *out, Zstr digits, u64 length, u64 start, u8 radix, bool allow_underscores) {
        Int  result;
        bool saw_digit = false;
            digit = int_radix_digit(digits[i]);
            if (digit < 0 || digit >= radix) {
                LOG_ERROR("Invalid digit for radix in Int conversion");
                IntDeinit(&result);
                return false;
    }
    
    u64 IntBitLength(const Int *value) {
        return int_significant_bits(value);
    }
    }
    
    u64 IntByteLength(const Int *value) {
        u64 bits = IntBitLength(value);
        return bits == 0 ? 0 : CEIL_DIV(bits, 8u);
    }
    
    bool IntTryLog2(const Int *value, u64 *out) {
        if (!value || !out) {
            LOG_FATAL("Invalid arguments");
    }
    
    u64 IntLog2WithError(const Int *value, bool *error) {
        u64  out = 0;
        bool ok  = IntTryLog2(value, &out);
    }
    
    u64 IntTrailingZeroCount(const Int *value) {
        ValidateInt(value);
    }
    
    bool IntIsZero(const Int *value) {
        return IntBitLength(value) == 0;
    }
    }
    
    bool IntIsOne(const Int *value) {
        return int_is_one(value);
    }
    }
    
    bool IntIsEven(const Int *value) {
        ValidateInt(value);
        return !int_is_odd(value);
    }
    
    bool IntIsOdd(const Int *value) {
        return int_is_odd(value);
    }
    }
    
    bool IntFitsU64(const Int *value) {
        ValidateInt(value);
        return IntBitLength(value) <= 64;
    }
    
    bool IntIsPowerOfTwo(const Int *value) {
        ValidateInt(value);
    }
    
    static bool int_try_clone_value(Int *out, const Int *value) {
        if (!out || !value) {
            LOG_FATAL("Invalid arguments");
    }
    
    bool IntTryClone(Int *out, const Int *value) {
        return int_try_clone_value(out, value);
    }
    }
    
    Int IntClone(const Int *value) {
        Int clone;
    
    Int IntClone(const Int *value) {
        Int clone;
    
        ValidateInt(value);
    }
    
    Int int_from_u64(u64 value, Allocator *alloc) {
        Int result = IntInit(alloc);
    
    Int int_from_u64(u64 value, Allocator *alloc) {
        Int result = IntInit(alloc);
    
        (void)int_try_from_u64(&result, value, alloc);
    }
    
    Int int_from_i64(i64 value, Allocator *alloc) {
        if (value < 0) {
            LOG_FATAL("Int cannot represent negative values");
    Int int_from_i64(i64 value, Allocator *alloc) {
        if (value < 0) {
            LOG_FATAL("Int cannot represent negative values");
        }
    }
    
    bool IntTryToU64(const Int *value, u64 *out) {
        if (!value || !out) {
            LOG_FATAL("Invalid arguments");
    
        if (!IntFitsU64(value)) {
            LOG_ERROR("Int value exceeds u64 range");
            return false;
        }
    }
    
    u64 IntToU64WithError(const Int *value, bool *error) {
        u64  out = 0;
        bool ok  = IntTryToU64(value, &out);
    }
    
    Int int_from_bytes_le(const u8 *bytes, u64 len, Allocator *alloc) {
        if (!bytes && len != 0) {
            LOG_FATAL("bytes is NULL");
        }
    
        Int result = IntInit(alloc);
    
        if (len == 0) {
    }
    
    u64 IntToBytesLE(const Int *value, u8 *bytes, u64 max_len) {
        ValidateInt(value);
    }
    
    Int int_from_bytes_be(const u8 *bytes, u64 len, Allocator *alloc) {
        if (!bytes && len != 0) {
            LOG_FATAL("bytes is NULL");
        }
    
        Int result = IntInit(alloc);
    
        for (u64 i = 0; i < len; i++) {
    }
    
    u64 IntToBytesBE(const Int *value, u8 *bytes, u64 max_len) {
        ValidateInt(value);
    }
    
    bool int_try_from_str_zstr(Int *out, Zstr decimal) {
        u64 start = 0;
        u64 len   = 0;
    }
    
    bool int_try_from_str_str(Int *out, const Str *decimal) {
        u64 start = 0;
    }
    
    Int int_from_str_zstr(Zstr decimal, Allocator *alloc) {
        Int out = IntInit(alloc);
    
    Int int_from_str_zstr(Zstr decimal, Allocator *alloc) {
        Int out = IntInit(alloc);
    
        (void)int_try_from_str_zstr(&out, decimal);
    }
    
    Int int_from_str_str(const Str *decimal, Allocator *alloc) {
        Int out = IntInit(alloc);
    
    Int int_from_str_str(const Str *decimal, Allocator *alloc) {
        Int out = IntInit(alloc);
    
        (void)int_try_from_str_str(&out, decimal);
    }
    
    bool int_try_to_str(Str *out, const Int *value, Allocator *alloc) {
        return int_try_to_str_radix(out, value, 10, false, alloc);
    }
    }
    
    Str int_to_str(const Int *value, Allocator *alloc) {
        Str result;
    }
    
    bool int_try_from_str_radix_zstr(Int *out, Zstr digits, u8 radix) {
        u64 start = 0;
        u64 len   = 0;
    }
    
    bool int_try_from_str_radix_str(Int *out, const Str *digits, u8 radix) {
        u64 start = 0;
    }
    
    Int int_from_str_radix_zstr(Zstr digits, u8 radix, Allocator *alloc) {
        Int out = IntInit(alloc);
    
    Int int_from_str_radix_zstr(Zstr digits, u8 radix, Allocator *alloc) {
        Int out = IntInit(alloc);
    
        (void)int_try_from_str_radix_zstr(&out, digits, radix);
    }
    
    Int int_from_str_radix_str(const Str *digits, u8 radix, Allocator *alloc) {
        Int out = IntInit(alloc);
    
    Int int_from_str_radix_str(const Str *digits, u8 radix, Allocator *alloc) {
        Int out = IntInit(alloc);
    
        (void)int_try_from_str_radix_str(&out, digits, radix);
    }
    
    bool int_try_to_str_radix(Str *out, const Int *value, u8 radix, bool uppercase, Allocator *alloc) {
        Int current;
        Str result;
    
    bool int_try_to_str_radix(Str *out, const Int *value, u8 radix, bool uppercase, Allocator *alloc) {
        Int current;
        Str result;
        // once and reuse the quotient/remainder buffers (the quotient reserved once
        // to the value's width) instead of allocating a fresh Int per digit-chunk.
        Int chunk_divisor = IntInit(alloc);
        Int quotient      = IntInit(alloc);
        Int remainder     = IntInit(alloc);
        // to the value's width) instead of allocating a fresh Int per digit-chunk.
        Int chunk_divisor = IntInit(alloc);
        Int quotient      = IntInit(alloc);
        Int remainder     = IntInit(alloc);
        Int chunk_divisor = IntInit(alloc);
        Int quotient      = IntInit(alloc);
        Int remainder     = IntInit(alloc);
    
        if (!int_try_from_u64(&chunk_divisor, chunk, alloc) || !IntReserve(&quotient, IntBitLength(value))) {
            // overwritten by the next division).
            {
                Int tmp  = current;
                current  = quotient;
                quotient = tmp;
    }
    
    Str int_to_str_radix(const Int *value, u8 radix, bool uppercase, Allocator *alloc) {
        Str result;
    }
    
    bool int_try_from_binary_zstr(Int *out, Zstr binary) {
        u64 start = 0;
        u64 len   = 0;
    }
    
    bool int_try_from_binary_str(Int *out, const Str *binary) {
        u64 start = 0;
    }
    
    Int int_from_binary_zstr(Zstr binary, Allocator *alloc) {
        Int out = IntInit(alloc);
    
    Int int_from_binary_zstr(Zstr binary, Allocator *alloc) {
        Int out = IntInit(alloc);
    
        (void)int_try_from_binary_zstr(&out, binary);
    }
    
    Int int_from_binary_str(const Str *binary, Allocator *alloc) {
        Int out = IntInit(alloc);
    
    Int int_from_binary_str(const Str *binary, Allocator *alloc) {
        Int out = IntInit(alloc);
    
        (void)int_try_from_binary_str(&out, binary);
    }
    
    Str IntToBinary(const Int *value) {
        return IntToStrRadix(value, 2, false);
    }
    }
    
    bool int_try_from_oct_str_zstr(Int *out, Zstr octal) {
        u64 start = 0;
        u64 len   = 0;
    }
    
    bool int_try_from_oct_str_str(Int *out, const Str *octal) {
        u64 start = 0;
    }
    
    Int int_from_oct_str_zstr(Zstr octal, Allocator *alloc) {
        Int out = IntInit(alloc);
    
    Int int_from_oct_str_zstr(Zstr octal, Allocator *alloc) {
        Int out = IntInit(alloc);
    
        (void)int_try_from_oct_str_zstr(&out, octal);
    }
    
    Int int_from_oct_str_str(const Str *octal, Allocator *alloc) {
        Int out = IntInit(alloc);
    
    Int int_from_oct_str_str(const Str *octal, Allocator *alloc) {
        Int out = IntInit(alloc);
    
        (void)int_try_from_oct_str_str(&out, octal);
    }
    
    Str IntToOctStr(const Int *value) {
        return IntToStrRadix(value, 8, false);
    }
    }
    
    bool int_try_from_hex_str_zstr(Int *out, Zstr hex) {
        u64 len = 0;
    }
    
    bool int_try_from_hex_str_str(Int *out, const Str *hex) {
        if (!out || !hex) {
            LOG_FATAL("Invalid arguments");
    }
    
    Int int_from_hex_str_zstr(Zstr hex, Allocator *alloc) {
        Int out = IntInit(alloc);
    
    Int int_from_hex_str_zstr(Zstr hex, Allocator *alloc) {
        Int out = IntInit(alloc);
    
        (void)int_try_from_hex_str_zstr(&out, hex);
    }
    
    Int int_from_hex_str_str(const Str *hex, Allocator *alloc) {
        Int out = IntInit(alloc);
    
    Int int_from_hex_str_str(const Str *hex, Allocator *alloc) {
        Int out = IntInit(alloc);
    
        (void)int_try_from_hex_str_str(&out, hex);
    }
    
    Str IntToHexStr(const Int *value) {
        return IntToStrRadix(value, 16, false);
    }
    // design, so there's no sign byte to mix in.
    u64 int_hash(const void *data, u32 size) {
        const Int *value = (const Int *)data;
        u64        hash  = 1469598103934665603ULL;
    
    i32 int_compare(const void *lhs, const void *rhs) {
        const Int *a = (const Int *)lhs;
        const Int *b = (const Int *)rhs;
    i32 int_compare(const void *lhs, const void *rhs) {
        const Int *a = (const Int *)lhs;
        const Int *b = (const Int *)rhs;
    
        ValidateInt(a);
    }
    
    int int_compare_u64(const Int *lhs, u64 rhs) {
        ValidateInt(lhs);
    }
    
    int int_compare_i64(const Int *lhs, i64 rhs) {
        ValidateInt(lhs);
    }
    
    bool IntShiftLeft(Int *value, u64 positions) {
        ValidateInt(value);
    }
    
    bool IntShiftRight(Int *value, u64 positions) {
        ValidateInt(value);
    }
    
    bool int_add(Int *result, const Int *a, const Int *b) {
        ValidateInt(result);
        ValidateInt(a);
    }
    
    bool int_add_u64(Int *result, const Int *value, u64 addend) {
        ValidateInt(result);
        ValidateInt(value);
        ValidateInt(value);
    
        Int temp;
    
        if (!int_try_clone_value(&temp, value)) {
    }
    
    bool int_add_i64(Int *result, const Int *value, i64 addend) {
        u64 magnitude = int_i64_magnitude(addend);
    }
    
    bool int_sub(Int *result, const Int *a, const Int *b) {
        ValidateInt(result);
        ValidateInt(a);
    }
    
    bool int_sub_u64(Int *result, const Int *value, u64 subtrahend) {
        ValidateInt(result);
        ValidateInt(value);
        ValidateInt(value);
    
        Int  rhs;
        bool ok = false;
    }
    
    bool int_sub_i64(Int *result, const Int *value, i64 subtrahend) {
        u64 magnitude = int_i64_magnitude(subtrahend);
    }
    
    bool int_mul(Int *result, const Int *a, const Int *b) {
        ValidateInt(result);
        ValidateInt(a);
        // read back limb-by-limb during accumulation, so it must stay independent of
        // the operands: clone a/b only if they alias result.
        Int  a_copy = IntInit(IntAllocator(result));
        Int  b_copy = IntInit(IntAllocator(result));
        bool ok     = false;
        // the operands: clone a/b only if they alias result.
        Int  a_copy = IntInit(IntAllocator(result));
        Int  b_copy = IntInit(IntAllocator(result));
        bool ok     = false;
    }
    
    bool int_mul_u64(Int *result, const Int *value, u64 factor) {
        ValidateInt(result);
        ValidateInt(value);
        ValidateInt(value);
    
        Int temp;
    
        if (!int_try_clone_value(&temp, value)) {
    }
    
    bool int_mul_i64(Int *result, const Int *value, i64 factor) {
        if (factor < 0) {
            LOG_FATAL("Int cannot be multiplied by a negative scalar");
    bool int_mul_i64(Int *result, const Int *value, i64 factor) {
        if (factor < 0) {
            LOG_FATAL("Int cannot be multiplied by a negative scalar");
        }
    }
    
    bool IntSquare(Int *result, const Int *value) {
        return int_mul(result, value, value);
    }
    }
    
    bool int_pow(Int *result, const Int *base, const Int *exponent) {
        ValidateInt(result);
        ValidateInt(base);
    
        if (!IntFitsU64(exponent)) {
            LOG_ERROR("Int exponent exceeds u64 range");
            return false;
        }
    }
    
    bool int_pow_u64(Int *result, const Int *base, u64 exponent) {
        ValidateInt(result);
        ValidateInt(base);
        ValidateInt(base);
    
        Int acc;
        Int current;
    
        Int acc;
        Int current;
    
        if (!int_try_from_u64(&acc, 1, IntAllocator(result))) {
        // int_mul writing in place, scratch keeps its capacity across iterations
        // instead of a fresh Init per multiply.
        Int scratch = IntInit(IntAllocator(result));
    
        while (exponent > 0) {
    }
    
    bool int_pow_i64(Int *result, const Int *base, i64 exponent) {
        if (exponent < 0) {
            LOG_FATAL("Int exponent cannot be negative");
    bool int_pow_i64(Int *result, const Int *base, i64 exponent) {
        if (exponent < 0) {
            LOG_FATAL("Int exponent cannot be negative");
        }
    }
    
    bool int_div_mod(Int *quotient, Int *remainder, const Int *dividend, const Int *divisor) {
        ValidateInt(quotient);
        ValidateInt(remainder);
        // dividend < divisor: quotient = 0, remainder = dividend.
        if (int_compare(dividend, divisor) < 0) {
            Int r0 = IntInit(IntAllocator(remainder));
    
            if (!int_try_clone_value(&r0, dividend)) {
        // place and set the quotient bit. The loop reads dividend and divisor while
        // mutating the outputs, so any input that aliases an output is cloned first.
        Int  dividend_copy = IntInit(IntAllocator(quotient));
        Int  divisor_copy  = IntInit(IntAllocator(quotient));
        bool ok            = false;
        // mutating the outputs, so any input that aliases an output is cloned first.
        Int  dividend_copy = IntInit(IntAllocator(quotient));
        Int  divisor_copy  = IntInit(IntAllocator(quotient));
        bool ok            = false;
    }
    
    bool int_div(Int *result, const Int *dividend, const Int *divisor) {
        Int remainder = IntInit(IntAllocator(result));
    
    bool int_div(Int *result, const Int *dividend, const Int *divisor) {
        Int remainder = IntInit(IntAllocator(result));
    
        // Quotient written straight into result (int_div_mod is in-place and clones
    }
    
    bool int_div_exact(Int *result, const Int *dividend, const Int *divisor) {
        ValidateInt(result);
        ValidateInt(dividend);
        }
    
        Int quotient  = IntInit(IntAllocator(result));
        Int remainder = IntInit(IntAllocator(result));
    
        Int quotient  = IntInit(IntAllocator(result));
        Int remainder = IntInit(IntAllocator(result));
    
        if (!int_div_mod(&quotient, &remainder, dividend, divisor)) {
    }
    
    bool int_div_u64(Int *result, const Int *dividend, u64 divisor) {
        Int divisor_value = IntInit(IntAllocator(dividend));
    
    bool int_div_u64(Int *result, const Int *dividend, u64 divisor) {
        Int divisor_value = IntInit(IntAllocator(dividend));
    
        if (!int_try_from_u64(&divisor_value, divisor, IntAllocator(dividend))) {
    }
    
    bool int_div_i64(Int *result, const Int *dividend, i64 divisor) {
        Int divisor_value = IntInit(IntAllocator(dividend));
    
    bool int_div_i64(Int *result, const Int *dividend, i64 divisor) {
        Int divisor_value = IntInit(IntAllocator(dividend));
    
        if (!int_try_from_i64_with_allocator(&divisor_value, divisor, IntAllocator(dividend))) {
    }
    
    bool int_div_exact_u64(Int *result, const Int *dividend, u64 divisor) {
        Int divisor_value = IntInit(IntAllocator(dividend));
    
    bool int_div_exact_u64(Int *result, const Int *dividend, u64 divisor) {
        Int divisor_value = IntInit(IntAllocator(dividend));
    
        if (!int_try_from_u64(&divisor_value, divisor, IntAllocator(dividend))) {
    }
    
    bool int_div_exact_i64(Int *result, const Int *dividend, i64 divisor) {
        Int divisor_value = IntInit(IntAllocator(dividend));
    
    bool int_div_exact_i64(Int *result, const Int *dividend, i64 divisor) {
        Int divisor_value = IntInit(IntAllocator(dividend));
    
        if (!int_try_from_i64_with_allocator(&divisor_value, divisor, IntAllocator(dividend))) {
    }
    
    bool int_div_mod_u64(Int *quotient, Int *remainder, const Int *dividend, u64 divisor) {
        Int divisor_value = IntInit(IntAllocator(dividend));
    
    bool int_div_mod_u64(Int *quotient, Int *remainder, const Int *dividend, u64 divisor) {
        Int divisor_value = IntInit(IntAllocator(dividend));
    
        if (!int_try_from_u64(&divisor_value, divisor, IntAllocator(dividend))) {
    }
    
    bool int_div_mod_i64(Int *quotient, Int *remainder, const Int *dividend, i64 divisor) {
        Int divisor_value = IntInit(IntAllocator(dividend));
    
    bool int_div_mod_i64(Int *quotient, Int *remainder, const Int *dividend, i64 divisor) {
        Int divisor_value = IntInit(IntAllocator(dividend));
    
        if (!int_try_from_i64_with_allocator(&divisor_value, divisor, IntAllocator(dividend))) {
    }
    
    u64 int_div_u64_rem(Int *quotient, const Int *dividend, u64 divisor) {
        ValidateInt(quotient);
        ValidateInt(dividend);
        }
    
        Int divisor_value = IntInit(IntAllocator(dividend));
        Int remainder     = IntInit(IntAllocator(quotient));
        u64 rem           = 0;
    
        Int divisor_value = IntInit(IntAllocator(dividend));
        Int remainder     = IntInit(IntAllocator(quotient));
        u64 rem           = 0;
    }
    
    bool int_mod(Int *result, const Int *dividend, const Int *divisor) {
        Int quotient = IntInit(IntAllocator(result));
    
    bool int_mod(Int *result, const Int *dividend, const Int *divisor) {
        Int quotient = IntInit(IntAllocator(result));
    
        // Remainder written straight into result (int_div_mod is in-place and clones
    }
    
    bool int_mod_u64_into(Int *result, const Int *dividend, u64 divisor) {
        Int quotient = IntInit(IntAllocator(result));
    
    bool int_mod_u64_into(Int *result, const Int *dividend, u64 divisor) {
        Int quotient = IntInit(IntAllocator(result));
    
        bool ok = int_div_mod_u64(&quotient, result, dividend, divisor);
    }
    
    bool int_mod_i64_into(Int *result, const Int *dividend, i64 divisor) {
        Int quotient = IntInit(IntAllocator(result));
    
    bool int_mod_i64_into(Int *result, const Int *dividend, i64 divisor) {
        Int quotient = IntInit(IntAllocator(result));
    
        bool ok = int_div_mod_i64(&quotient, result, dividend, divisor);
    }
    
    u64 int_mod_u64(const Int *value, u64 modulus) {
        ValidateInt(value);
        }
    
        Int quotient = IntInit(IntAllocator(value));
        u64 rem      = int_div_u64_rem(&quotient, value, modulus);
    }
    
    bool IntGCD(Int *result, const Int *a, const Int *b) {
        ValidateInt(result);
        ValidateInt(a);
        ValidateInt(b);
    
        Int x = IntInit(IntAllocator(a));
        Int y = IntInit(IntAllocator(b));
    
        Int x = IntInit(IntAllocator(a));
        Int y = IntInit(IntAllocator(b));
    
        if (!int_try_clone_value(&x, a) || !int_try_clone_value(&y, b)) {
    
        while (!IntIsZero(&y)) {
            Int r = IntInit(IntAllocator(result));
    
            if (!int_mod(&r, &x, &y)) {
    }
    
    bool IntLCM(Int *result, const Int *a, const Int *b) {
        ValidateInt(result);
        ValidateInt(a);
    
        if (IntIsZero(a) || IntIsZero(b)) {
            Int zero = IntInit(IntAllocator(result));
            int_replace(result, &zero);
            return true;
        }
    
        Int gcd      = IntInit(IntAllocator(result));
        Int quotient = IntInit(IntAllocator(result));
        Int lcm      = IntInit(IntAllocator(result));
    
        Int gcd      = IntInit(IntAllocator(result));
        Int quotient = IntInit(IntAllocator(result));
        Int lcm      = IntInit(IntAllocator(result));
        Int gcd      = IntInit(IntAllocator(result));
        Int quotient = IntInit(IntAllocator(result));
        Int lcm      = IntInit(IntAllocator(result));
    
        if (!IntGCD(&gcd, a, b) || !int_div(&quotient, a, &gcd) || !int_mul(&lcm, &quotient, b)) {
    }
    
    bool IntRootRem(Int *root, Int *remainder, const Int *value, u64 degree) {
        ValidateInt(root);
        ValidateInt(remainder);
    
        if (IntIsZero(value)) {
            Int zero_root = IntInit(IntAllocator(root));
            Int zero_rem  = IntInit(IntAllocator(remainder));
        if (IntIsZero(value)) {
            Int zero_root = IntInit(IntAllocator(root));
            Int zero_rem  = IntInit(IntAllocator(remainder));
    
            int_replace(root, &zero_root);
        }
        if (degree == 1) {
            Int exact_root = IntInit(IntAllocator(root));
            Int zero_rem   = IntInit(IntAllocator(remainder));
        if (degree == 1) {
            Int exact_root = IntInit(IntAllocator(root));
            Int zero_rem   = IntInit(IntAllocator(remainder));
    
            if (!IntTryClone(&exact_root, value)) {
        u64 bits       = IntBitLength(value);
        u64 high_shift = bits / degree;
        Int low        = IntInit(IntAllocator(root));
        Int high       = IntInit(IntAllocator(root));
        Int best       = IntInit(IntAllocator(root));
        u64 high_shift = bits / degree;
        Int low        = IntInit(IntAllocator(root));
        Int high       = IntInit(IntAllocator(root));
        Int best       = IntInit(IntAllocator(root));
        Int one        = IntInit(IntAllocator(root));
        Int low        = IntInit(IntAllocator(root));
        Int high       = IntInit(IntAllocator(root));
        Int best       = IntInit(IntAllocator(root));
        Int one        = IntInit(IntAllocator(root));
        Int high       = IntInit(IntAllocator(root));
        Int best       = IntInit(IntAllocator(root));
        Int one        = IntInit(IntAllocator(root));
    
        if ((bits % degree) != 0) {
    
        while (IntLE(&low, &high)) {
            Int sum     = IntInit(IntAllocator(root));
            Int mid     = IntInit(IntAllocator(root));
            Int mid_pow = IntInit(IntAllocator(root));
        while (IntLE(&low, &high)) {
            Int sum     = IntInit(IntAllocator(root));
            Int mid     = IntInit(IntAllocator(root));
            Int mid_pow = IntInit(IntAllocator(root));
            int cmp     = 0;
            Int sum     = IntInit(IntAllocator(root));
            Int mid     = IntInit(IntAllocator(root));
            Int mid_pow = IntInit(IntAllocator(root));
            int cmp     = 0;
    
            if (cmp <= 0) {
                Int next = IntInit(IntAllocator(root));
    
                IntDeinit(&best);
                low = next;
            } else {
                Int next = IntInit(IntAllocator(root));
    
                if (IntEQ(&mid, &one) || IntIsZero(&mid)) {
    
        {
            Int power = IntInit(IntAllocator(root));
            Int rem   = IntInit(IntAllocator(remainder));
        {
            Int power = IntInit(IntAllocator(root));
            Int rem   = IntInit(IntAllocator(remainder));
    
            if (!int_pow_u64(&power, &best, degree) || !int_sub(&rem, value, &power)) {
    }
    
    bool IntRoot(Int *result, const Int *value, u64 degree) {
        Int root      = IntInit(IntAllocator(result));
        Int remainder = IntInit(IntAllocator(result));
    
    bool IntRoot(Int *result, const Int *value, u64 degree) {
        Int root      = IntInit(IntAllocator(result));
        Int remainder = IntInit(IntAllocator(result));
    bool IntRoot(Int *result, const Int *value, u64 degree) {
        Int root      = IntInit(IntAllocator(result));
        Int remainder = IntInit(IntAllocator(result));
    
        if (!IntRootRem(&root, &remainder, value, degree)) {
    }
    
    bool IntSqrtRem(Int *root, Int *remainder, const Int *value) {
        return IntRootRem(root, remainder, value, 2);
    }
    }
    
    bool IntSqrt(Int *result, const Int *value) {
        return IntRoot(result, value, 2);
    }
    }
    
    bool IntIsPerfectSquare(const Int *value) {
        ValidateInt(value);
        ValidateInt(value);
    
        Int  root      = IntInit(IntAllocator(value));
        Int  remainder = IntInit(IntAllocator(value));
        bool result    = false;
    
        Int  root      = IntInit(IntAllocator(value));
        Int  remainder = IntInit(IntAllocator(value));
        bool result    = false;
    }
    
    bool IntIsPerfectPower(const Int *value) {
        ValidateInt(value);
    
        for (u64 degree = 2; degree <= max_degree; degree++) {
            Int  root      = IntInit(IntAllocator(value));
            Int  remainder = IntInit(IntAllocator(value));
            bool exact     = false;
        for (u64 degree = 2; degree <= max_degree; degree++) {
            Int  root      = IntInit(IntAllocator(value));
            Int  remainder = IntInit(IntAllocator(value));
            bool exact     = false;
    }
    
    bool IntTryJacobi(int *out, const Int *a, const Int *n) {
        ValidateInt(a);
        ValidateInt(n);
        }
    
        Int aa     = IntInit(IntAllocator(a));
        Int nn     = IntInit(IntAllocator(n));
        int result = 1;
    
        Int aa     = IntInit(IntAllocator(a));
        Int nn     = IntInit(IntAllocator(n));
        int result = 1;
    }
    
    int IntJacobiWithError(const Int *a, const Int *n, bool *error) {
        int  out = 0;
        bool ok  = IntTryJacobi(&out, a, n);
    }
    
    bool IntModAdd(Int *result, const Int *a, const Int *b, const Int *modulus) {
        ValidateInt(result);
        ValidateInt(a);
        // instead of a full division: once both inputs are < modulus, sum < 2*modulus,
        // so at most one subtraction reduces it (mirrors IntModSub).
        Int        ar   = IntInit(IntAllocator(result));
        Int        br   = IntInit(IntAllocator(result));
        Int        sum  = IntInit(IntAllocator(result));
        // so at most one subtraction reduces it (mirrors IntModSub).
        Int        ar   = IntInit(IntAllocator(result));
        Int        br   = IntInit(IntAllocator(result));
        Int        sum  = IntInit(IntAllocator(result));
        const Int *ared = a;
        Int        ar   = IntInit(IntAllocator(result));
        Int        br   = IntInit(IntAllocator(result));
        Int        sum  = IntInit(IntAllocator(result));
        const Int *ared = a;
        const Int *bred = b;
        Int        br   = IntInit(IntAllocator(result));
        Int        sum  = IntInit(IntAllocator(result));
        const Int *ared = a;
        const Int *bred = b;
        bool       ok   = false;
        Int        sum  = IntInit(IntAllocator(result));
        const Int *ared = a;
        const Int *bred = b;
        bool       ok   = false;
    }
    
    bool IntModSub(Int *result, const Int *a, const Int *b, const Int *modulus) {
        ValidateInt(result);
        ValidateInt(a);
        }
    
        Int ar = IntInit(IntAllocator(result));
        Int br = IntInit(IntAllocator(result));
    
        Int ar = IntInit(IntAllocator(result));
        Int br = IntInit(IntAllocator(result));
    
        if (!int_mod(&ar, a, modulus) || !int_mod(&br, b, modulus)) {
            }
        } else {
            Int diff = IntInit(IntAllocator(result));
    
            if (!int_sub(&diff, &br, &ar)) {
            }
            if (IntIsZero(&diff)) {
                Int zero = IntInit(IntAllocator(result));
                int_replace(result, &zero);
            } else {
    }
    
    bool IntModMul(Int *result, const Int *a, const Int *b, const Int *modulus) {
        ValidateInt(result);
        ValidateInt(a);
        // not already < modulus (the common case in modpow/Miller-Rabin/Tonelli loops,
        // where operands are already reduced - so both input divisions are skipped).
        Int        ar   = IntInit(IntAllocator(result));
        Int        br   = IntInit(IntAllocator(result));
        Int        prod = IntInit(IntAllocator(result));
        // where operands are already reduced - so both input divisions are skipped).
        Int        ar   = IntInit(IntAllocator(result));
        Int        br   = IntInit(IntAllocator(result));
        Int        prod = IntInit(IntAllocator(result));
        const Int *ared = a;
        Int        ar   = IntInit(IntAllocator(result));
        Int        br   = IntInit(IntAllocator(result));
        Int        prod = IntInit(IntAllocator(result));
        const Int *ared = a;
        const Int *bred = b;
        Int        br   = IntInit(IntAllocator(result));
        Int        prod = IntInit(IntAllocator(result));
        const Int *ared = a;
        const Int *bred = b;
        bool       ok   = false;
        Int        prod = IntInit(IntAllocator(result));
        const Int *ared = a;
        const Int *bred = b;
        bool       ok   = false;
    }
    
    bool IntModDiv(Int *result, const Int *a, const Int *b, const Int *modulus) {
        ValidateInt(result);
        ValidateInt(a);
        }
    
        Int  inverse = IntInit(IntAllocator(result));
        Int  value   = IntInit(IntAllocator(result));
        bool ok      = false;
    
        Int  inverse = IntInit(IntAllocator(result));
        Int  value   = IntInit(IntAllocator(result));
        bool ok      = false;
    }
    
    bool IntSquareMod(Int *result, const Int *value, const Int *modulus) {
        return IntModMul(result, value, value, modulus);
    }
    }
    
    bool int_pow_u64_mod(Int *result, const Int *base, u64 exponent, const Int *modulus) {
        ValidateInt(result);
        ValidateInt(base);
        }
    
        Int acc      = IntInit(IntAllocator(result));
        Int base_mod = IntInit(IntAllocator(result));
    
        Int acc      = IntInit(IntAllocator(result));
        Int base_mod = IntInit(IntAllocator(result));
    
        if (!int_try_from_u64(&acc, 1, IntAllocator(result))) {
        }
    
        Int scratch = IntInit(IntAllocator(result));
    
        while (exponent > 0) {
    }
    
    bool int_pow_mod(Int *result, const Int *base, const Int *exponent, const Int *modulus) {
        ValidateInt(result);
        ValidateInt(base);
        }
    
        Int acc      = IntInit(IntAllocator(result));
        Int base_mod = IntInit(IntAllocator(result));
        Int exp      = IntInit(IntAllocator(exponent));
    
        Int acc      = IntInit(IntAllocator(result));
        Int base_mod = IntInit(IntAllocator(result));
        Int exp      = IntInit(IntAllocator(exponent));
        Int acc      = IntInit(IntAllocator(result));
        Int base_mod = IntInit(IntAllocator(result));
        Int exp      = IntInit(IntAllocator(exponent));
    
        if (!int_try_from_u64(&acc, 1, IntAllocator(result)) || !IntTryClone(&exp, exponent) ||
        }
    
        Int scratch = IntInit(IntAllocator(result));
    
        while (!IntIsZero(&exp)) {
    }
    
    bool int_pow_i64_mod(Int *result, const Int *base, i64 exponent, const Int *modulus) {
        if (exponent < 0) {
            LOG_FATAL("Int exponent cannot be negative");
    bool int_pow_i64_mod(Int *result, const Int *base, i64 exponent, const Int *modulus) {
        if (exponent < 0) {
            LOG_FATAL("Int exponent cannot be negative");
        }
    }
    
    bool IntModInv(Int *result, const Int *value, const Int *modulus) {
        ValidateInt(result);
        ValidateInt(value);
        }
    
        Int       reduced = IntInit(IntAllocator(result));
        SignedInt t       = sint_init(IntAllocator(result));
        SignedInt new_t   = sint_from_u64(1, IntAllocator(result));
        SignedInt t       = sint_init(IntAllocator(result));
        SignedInt new_t   = sint_from_u64(1, IntAllocator(result));
        Int       r       = IntInit(IntAllocator(modulus));
        Int       new_r   = IntInit(IntAllocator(result));
        Int       one     = int_from_u64(1, IntAllocator(result));
        SignedInt new_t   = sint_from_u64(1, IntAllocator(result));
        Int       r       = IntInit(IntAllocator(modulus));
        Int       new_r   = IntInit(IntAllocator(result));
        Int       one     = int_from_u64(1, IntAllocator(result));
        bool      ok      = false;
        Int       r       = IntInit(IntAllocator(modulus));
        Int       new_r   = IntInit(IntAllocator(result));
        Int       one     = int_from_u64(1, IntAllocator(result));
        bool      ok      = false;
    
        while (!IntIsZero(&new_r)) {
            Int       q       = IntInit(IntAllocator(result));
            Int       rem     = IntInit(IntAllocator(result));
            SignedInt q_new_t = sint_init(IntAllocator(result));
        while (!IntIsZero(&new_r)) {
            Int       q       = IntInit(IntAllocator(result));
            Int       rem     = IntInit(IntAllocator(result));
            SignedInt q_new_t = sint_init(IntAllocator(result));
            SignedInt next_t  = sint_init(IntAllocator(result));
            SignedInt q_new_t = sint_init(IntAllocator(result));
            SignedInt next_t  = sint_init(IntAllocator(result));
            Int       next_r  = IntInit(IntAllocator(result));
    
            if (!int_div_mod(&q, &rem, &r, &new_r) || !sint_mul_unsigned(&q_new_t, &new_t, &q) ||
    
        if (IntEQ(&r, &one)) {
            Int positive = IntInit(IntAllocator(result));
            Int mag_mod  = IntInit(IntAllocator(result));
        if (IntEQ(&r, &one)) {
            Int positive = IntInit(IntAllocator(result));
            Int mag_mod  = IntInit(IntAllocator(result));
    
            if (!int_mod(&mag_mod, &t.magnitude, modulus)) {
    }
    
    bool IntModSqrt(Int *result, const Int *value, const Int *modulus) {
        ValidateInt(result);
        ValidateInt(value);
        }
    
        Int  a  = IntInit(IntAllocator(result));
        bool ok = false;
    
        if (IntIsZero(&a)) {
            Int zero = IntInit(IntAllocator(result));
            int_replace(result, &zero);
            IntDeinit(&a);
        }
        if (int_mod_u64(modulus, 4) == 3) {
            Int exponent = IntInit(IntAllocator(modulus));
            Int root     = IntInit(IntAllocator(result));
        if (int_mod_u64(modulus, 4) == 3) {
            Int exponent = IntInit(IntAllocator(modulus));
            Int root     = IntInit(IntAllocator(result));
    
            if (!IntTryClone(&exponent, modulus) || !int_add_u64(&exponent, &exponent, 1) || !IntShiftRight(&exponent, 2) ||
    
        {
            Int q        = IntInit(IntAllocator(modulus));
            Int z        = IntInit(IntAllocator(modulus));
            Int c        = IntInit(IntAllocator(result));
        {
            Int q        = IntInit(IntAllocator(modulus));
            Int z        = IntInit(IntAllocator(modulus));
            Int c        = IntInit(IntAllocator(result));
            Int t        = IntInit(IntAllocator(result));
            Int q        = IntInit(IntAllocator(modulus));
            Int z        = IntInit(IntAllocator(modulus));
            Int c        = IntInit(IntAllocator(result));
            Int t        = IntInit(IntAllocator(result));
            Int r        = IntInit(IntAllocator(result));
            Int z        = IntInit(IntAllocator(modulus));
            Int c        = IntInit(IntAllocator(result));
            Int t        = IntInit(IntAllocator(result));
            Int r        = IntInit(IntAllocator(result));
            Int exponent = IntInit(IntAllocator(result));
            Int c        = IntInit(IntAllocator(result));
            Int t        = IntInit(IntAllocator(result));
            Int r        = IntInit(IntAllocator(result));
            Int exponent = IntInit(IntAllocator(result));
            u64 m        = 0;
            Int t        = IntInit(IntAllocator(result));
            Int r        = IntInit(IntAllocator(result));
            Int exponent = IntInit(IntAllocator(result));
            u64 m        = 0;
    
            while (int_compare_u64(&t, 1) != 0) {
                Int t_power = IntInit(IntAllocator(&t));
                u64 i       = 0;
                }
    
                Int scratch = IntInit(IntAllocator(result));
    
                for (i = 1; i < m; i++) {
    
                {
                    Int b    = IntInit(IntAllocator(&c));
                    Int b_sq = IntInit(IntAllocator(result));
                    Int next = IntInit(IntAllocator(result));
                {
                    Int b    = IntInit(IntAllocator(&c));
                    Int b_sq = IntInit(IntAllocator(result));
                    Int next = IntInit(IntAllocator(result));
                    Int b    = IntInit(IntAllocator(&c));
                    Int b_sq = IntInit(IntAllocator(result));
                    Int next = IntInit(IntAllocator(result));
    
                    if (!IntTryClone(&b, &c)) {
    
                    for (u64 j = 0; j + i + 1 < m; j++) {
                        Int square = IntInit(IntAllocator(result));
    
                        if (!IntSquareMod(&square, &b, modulus)) {
    }
    
    bool IntIsProbablePrimeWithError(const Int *value, bool *error) {
        static const u64 bases[] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37};
    
        {
            Int  d           = IntInit(IntAllocator(value));
            Int  n_minus_one = IntInit(IntAllocator(value));
            u64  s           = 0;
        {
            Int  d           = IntInit(IntAllocator(value));
            Int  n_minus_one = IntInit(IntAllocator(value));
            u64  s           = 0;
            bool probable    = true;
    
            for (u64 i = 0; i < (u64)(sizeof(bases) / sizeof(bases[0])); i++) {
                Int base = IntInit(IntAllocator(value));
                Int x    = IntInit(IntAllocator(value));
            for (u64 i = 0; i < (u64)(sizeof(bases) / sizeof(bases[0])); i++) {
                Int base = IntInit(IntAllocator(value));
                Int x    = IntInit(IntAllocator(value));
    
                if (!int_try_from_u64(&base, bases[i], IntAllocator(value))) {
    
                    for (u64 r = 1; r < s; r++) {
                        Int next = IntInit(IntAllocator(value));
    
                        if (!IntSquareMod(&next, &x, value)) {
    }
    
    bool IntNextPrime(Int *result, const Int *value) {
        bool error = false;
    
        if (int_compare_u64(value, 1) <= 0) {
            Int two = IntInit(IntAllocator(result));
    
            if (!int_try_from_u64(&two, 2, IntAllocator(result))) {
        }
    
        Int candidate = IntInit(IntAllocator(result));
    
        if (!IntTryClone(&candidate, value)) {
        }
        if (int_compare_u64(&candidate, 2) <= 0) {
            Int two = IntInit(IntAllocator(result));
    
            if (!int_try_from_u64(&two, 2, IntAllocator(result))) {
    #include <Misra/Std/Zstr.h>
    #include <Misra/Std/Container/Float/Private.h>
    #include <Misra/Std/Container/Int.h>
    #include <Misra/Std/Log.h>
    static bool float_try_from_u64_value(Float *out, u64 value, Allocator *alloc);
    static bool float_try_from_i64_value(Float *out, i64 value, Allocator *alloc);
    static bool float_try_from_int_value(Float *out, const Int *value);
    static bool float_try_from_f32_value(Float *out, float value, Allocator *alloc);
    static bool float_try_from_f64_value(Float *out, double value, Allocator *alloc);
    static bool float_try_from_f32_value(Float *out, float value, Allocator *alloc);
    static bool float_try_from_f64_value(Float *out, double value, Allocator *alloc);
    static bool float_pow10(Int *out, u64 power, Allocator *alloc);
    static bool float_scale_to_exponent(Float *value, i64 target_exponent);
    static bool float_try_abs_compare(int *out, const Float *lhs, const Float *rhs);
        } else if (binexp < 0) {
            u64 n    = (u64)(-(i64)binexp);
            Int five = IntInit(alloc);
            Int pow5 = IntInit(alloc);
            Int sig  = IntInit(alloc);
            u64 n    = (u64)(-(i64)binexp);
            Int five = IntInit(alloc);
            Int pow5 = IntInit(alloc);
            Int sig  = IntInit(alloc);
            if (!int_try_from_u64(&five, 5u, alloc) || !IntPow(&pow5, &five, n) ||
            Int five = IntInit(alloc);
            Int pow5 = IntInit(alloc);
            Int sig  = IntInit(alloc);
            if (!int_try_from_u64(&five, 5u, alloc) || !IntPow(&pow5, &five, n) ||
                !int_mul(&sig, &out->significand, &pow5)) {
    }
    
    static bool float_pow10(Int *out, u64 power, Allocator *alloc) {
        Int base;
        Int result;
    
    static bool float_pow10(Int *out, u64 power, Allocator *alloc) {
        Int base;
        Int result;
    static bool float_pow10(Int *out, u64 power, Allocator *alloc) {
        Int base;
        Int result;
    
        if (!out) {
        {
            u64 places = (u64)(value->exponent - target_exponent);
            Int factor = IntInit(FloatAllocator(value));
            Int scaled = IntInit(FloatAllocator(value));
            u64 places = (u64)(value->exponent - target_exponent);
            Int factor = IntInit(FloatAllocator(value));
            Int scaled = IntInit(FloatAllocator(value));
    
            if (!float_pow10(&factor, places, FloatAllocator(value)) || !int_mul(&scaled, &value->significand, &factor)) {
        {
            Allocator *alloc = FloatAllocator(value);
            Int        ten   = IntInit(alloc);
            Int        q     = IntInit(alloc);
            Int        r     = IntInit(alloc);
            Allocator *alloc = FloatAllocator(value);
            Int        ten   = IntInit(alloc);
            Int        q     = IntInit(alloc);
            Int        r     = IntInit(alloc);
            Int        ten   = IntInit(alloc);
            Int        q     = IntInit(alloc);
            Int        r     = IntInit(alloc);
    
            if (int_try_from_u64(&ten, 10, alloc)) {
            if (int_try_from_u64(&ten, 10, alloc)) {
                while (int_div_mod(&q, &r, &value->significand, &ten) && IntIsZero(&r)) {
                    Int tmp            = value->significand;
                    value->significand = q;
                    q                  = tmp;
    }
    
    static bool float_try_from_int_value(Float *out, const Int *value) {
        if (!out || !value) {
            LOG_FATAL("Invalid arguments");
    }
    
    Float float_from_int(const Int *value, Allocator *alloc) {
        Float result;
    }
    
    bool FloatToInt(Int *result, const Float *value) {
        ValidateInt(result);
        ValidateFloat(value);
        ValidateFloat(value);
    
        Int temp = IntInit(IntAllocator(result));
    
        if (FloatIsNegative(value)) {
    
        if (value->exponent >= 0) {
            Int factor = IntInit(FloatAllocator(value));
    
            if (!IntTryClone(&temp, &value->significand) ||
        {
            u64  places = (u64)(-value->exponent);
            Int  factor = IntInit(FloatAllocator(value));
            bool ok     = false;
    }
    
    int float_compare_int_with_error(const Float *lhs, const Int *rhs, bool *error) {
        Float rhs_value = FloatInit(FloatAllocator(lhs));
        int   cmp       = 0;
    }
    
    int float_compare_int(const Float *lhs, const Int *rhs) {
        return float_compare_int_with_error(lhs, rhs, NULL);
    }
    }
    
    bool float_add_int(Float *result, const Float *a, const Int *b) {
        Float rhs = FloatInit(FloatAllocator(result));
    }
    
    bool float_sub_int(Float *result, const Float *a, const Int *b) {
        Float rhs = FloatInit(FloatAllocator(result));
    }
    
    bool float_mul_int(Float *result, const Float *a, const Int *b) {
        Float rhs = FloatInit(FloatAllocator(result));
    bool float_div(Float *result, const Float *a, const Float *b, u64 precision) {
        Float temp   = FloatInit(FloatAllocator(result));
        Int   scale  = IntInit(FloatAllocator(result));
        Int   scaled = IntInit(FloatAllocator(result));
        Float temp   = FloatInit(FloatAllocator(result));
        Int   scale  = IntInit(FloatAllocator(result));
        Int   scaled = IntInit(FloatAllocator(result));
    
        ValidateFloat(result);
    }
    
    bool float_div_int(Float *result, const Float *a, const Int *b, u64 precision) {
        Float rhs = FloatInit(FloatAllocator(result));
        bool  ok  = false;
    #include <Misra/Std/Allocator/Default.h>
    #include <Misra/Std/Container/Float.h>
    #include <Misra/Std/Container/Int.h>
    #include <Misra/Std/Container/Map.h>
    #include <Misra/Std/Log.h>
        Float value = FloatFromStr("12.5", &alloc.base);
        Float same  = FloatFromStr("12.5", &alloc.base);
        Int   whole = IntFrom(12, &alloc.base);
        Int   next  = IntFrom(13, &alloc.base);
        Float same  = FloatFromStr("12.5", &alloc.base);
        Int   whole = IntFrom(12, &alloc.base);
        Int   next  = IntFrom(13, &alloc.base);
    
        bool result = (FloatCompare(&value, &same) == 0);
    
        Float v   = FloatFromStr("3", &alloc.base);
        Int   i3  = IntFrom(3, &alloc.base);
        bool  err = true;
        bool  ok  = true;
    
        Float lhs  = FloatFromStr("7", &alloc.base);
        Int   less = IntFrom(3, &alloc.base);
        Int   same = IntFrom(7, &alloc.base);
        Int   more = IntFrom(9, &alloc.base);
        Float lhs  = FloatFromStr("7", &alloc.base);
        Int   less = IntFrom(3, &alloc.base);
        Int   same = IntFrom(7, &alloc.base);
        Int   more = IntFrom(9, &alloc.base);
        Int   less = IntFrom(3, &alloc.base);
        Int   same = IntFrom(7, &alloc.base);
        Int   more = IntFrom(9, &alloc.base);
    
        bool error = true;
        DebugAllocator dbg = DebugAllocatorInitWith(LEAK_CFG);
        Float          a   = FloatFromStr("3.5", &dbg.base);
        Int            b   = IntFrom(3, &dbg.base);
    
        int  cmp = FloatCompare(&a, &b);
    #include <Misra/Std/Zstr.h>
    #include <Misra/Std/Container/Float.h>
    #include <Misra/Std/Container/Int.h>
    #include <Misra/Std/Log.h>
    
        Float neg = FloatFromStr("-5", &alloc.base);
        Int   out = IntInit(&alloc.base);
    
        bool ok = (FloatToInt(&out, &neg) == false);
            .exponent    = -1,
        };
        Int result = IntInit(&alloc.base);
    
        bool ok = FloatToInt(&result, &value);
    
        Float value  = FloatFromStr("120", &alloc.base);
        Int   result = IntInit(&alloc.base);
    
        bool ok = FloatToInt(&result, &value);
    
        Float value  = FloatFromStr("0", &alloc.base);
        Int   result = IntFromStr("999", &alloc.base);
    
        bool ok    = FloatToInt(&result, &value);
    
        Float value  = FloatFromStr("-7", &alloc.base);
        Int   result = IntInit(&alloc.base);
    
        bool ok    = FloatToInt(&result, &value);
    #include <Misra/Std/Zstr.h>
    #include <Misra/Std/Container/Float.h>
    #include <Misra/Std/Container/Int.h>
    #include <Misra/Std/Log.h>
        Float a            = FloatFromStr("1.25", &alloc.base);
        Float b            = FloatFromStr("0.75", &alloc.base);
        Int   whole        = IntFrom(2, &alloc.base);
        Float result_value = FloatInit(&alloc.base);
        Str   text         = StrInit(&alloc.base);
        Float a            = FloatFromStr("5.5", &alloc.base);
        Float b            = FloatFromStr("0.5", &alloc.base);
        Int   whole        = IntFrom(2, &alloc.base);
        Float result_value = FloatInit(&alloc.base);
        Str   text         = StrInit(&alloc.base);
        Float a            = FloatFromStr("1.5", &alloc.base);
        Float b            = FloatFromStr("2", &alloc.base);
        Int   whole        = IntFrom(2, &alloc.base);
        Float result_value = FloatInit(&alloc.base);
        Str   text         = StrInit(&alloc.base);
        Float a            = FloatFromStr("7.5", &alloc.base);
        Float b            = FloatFromStr("2.5", &alloc.base);
        Int   whole        = IntFrom(3, &alloc.base);
        Float result_value = FloatInit(&alloc.base);
        Str   text         = StrInit(&alloc.base);
    
    bool test_m12_div_int_by_zero_returns_false(void) {
        WriteFmt("Testing FloatDiv(Int 0) returns false\n");
    
        DefaultAllocator alloc = DefaultAllocatorInit();
        Float a      = FloatFromStr("6", &alloc.base);
        Float result = FloatInit(&alloc.base);
        Int   zero   = IntFrom(0u, &alloc.base);
    
        // Real float_div rejects division by zero -> false.
        Float          a   = FloatFromStr("1.5", &dbg.base);
        Float          r   = FloatInit(&dbg.base);
        Int            b   = IntFrom(2, &dbg.base);
    
        bool ok = FloatAdd(&r, &a, &b);
        Float          a   = FloatFromStr("5.5", &dbg.base);
        Float          r   = FloatInit(&dbg.base);
        Int            b   = IntFrom(2, &dbg.base);
    
        bool ok = FloatSub(&r, &a, &b);
        Float          a   = FloatFromStr("1.5", &dbg.base);
        Float          r   = FloatInit(&dbg.base);
        Int            b   = IntFrom(4, &dbg.base);
    
        bool ok = FloatMul(&r, &a, &b);
        Float          a   = FloatFromStr("1", &dbg.base);
        Float          r   = FloatInit(&dbg.base);
        Int            b   = IntFrom(4, &dbg.base);
    
        bool ok = FloatDiv(&r, &a, &b, 6u);
    #include <Misra/Std/Zstr.h>
    #include <Misra/Std/Container/Float.h>
    #include <Misra/Std/Container/Int.h>
    #include <Misra/Std/Log.h>
    
    bool test_float_from_int_container(void) {
        WriteFmt("Testing FloatFrom with Int container\n");
    
        DefaultAllocator alloc = DefaultAllocatorInit();
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int   integer = IntFromStr("12345678901234567890", ALLOCATOR_OF(&alloc));
        Float value   = float_from_int(&integer, ALLOCATOR_OF(&alloc));
        Str   text    = FloatToStr(&value);
    
        Float value        = FloatFromStr("1234500e-2", ALLOCATOR_OF(&alloc));
        Int   result_value = IntInit(ALLOCATOR_OF(&alloc));
        Str   text         = StrInit(ALLOCATOR_OF(&alloc));
    
        Float value        = FloatFromStr("123.45", ALLOCATOR_OF(&alloc));
        Int   result_value = IntFrom(99, ALLOCATOR_OF(&alloc));
    
        bool result = !FloatToInt(&result_value, &value);
    
        Float value        = FloatFromStr("-42", ALLOCATOR_OF(&alloc));
        Int   result_value = IntFrom(99, ALLOCATOR_OF(&alloc));
    
        bool result = !FloatToInt(&result_value, &value);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int   whole = IntFrom(100, &alloc.base);
        Float value = FloatFrom(&whole, &alloc.base);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int   whole = IntFrom(100, &alloc.base);
        Float value = FloatFrom(&whole, &alloc.base);
        Str   text  = FloatToStr(&value);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int   whole = IntFrom(2000, &alloc.base);
        Float value = FloatFrom(&whole, &alloc.base);
    
        Float value = FloatFrom(4503599627370496.0, &alloc.base); // 2^52, binexp == 0
        Int   whole = IntFromStr("4503599627370496", &alloc.base);
    
        bool result = (FloatExponent(&value) == 0);
    
        Float v = FloatFromStr("1e3", &dbg.base); // exponent 3 > 0 -> pow10
        Int   r = IntInit(&dbg.base);
    
        bool ok = FloatToInt(&r, &v);             // drives float_pow10 + success path
    
        Float v = FloatFromStr("12e4", &dbg.base); // significand 12, exp 4
        Int   r = IntFrom(999999999u, &dbg.base);  // pre-populated dest
    
        bool ok = FloatToInt(&r, &v);
    
        Float v = FloatFromStr("150e-1", &dbg.base); // 15.0, exact integer 15
        Int   r = IntFrom(777u, &dbg.base);          // pre-populated dest
    
        bool ok = FloatToInt(&r, &v);
    
        Float v = FloatFromStr("1.5", &dbg.base); // significand 15, exponent -1
        Int   r = IntFrom(777u, &dbg.base);       // pre-populated dest
    
        // Non-integer -> FloatToInt returns false, but the negative-exponent block
    
        Float v = FloatFrom(0u, &dbg.base);
        Int   r = IntFrom(424242u, &dbg.base); // pre-populated dest
    
        bool ok = FloatToInt(&r, &v);
    #include <Misra/Std/Allocator/Default.h>
    #include <Misra/Std/Container/Int.h>
    #include <Misra/Std/Container/Map.h>
    #include <Misra/Std/Log.h>
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int a = IntFrom(41, &alloc.base);
        Int b = IntFrom(42, &alloc.base);
        Int c = IntFromBinary("000101010", &alloc.base);
    
        Int a = IntFrom(41, &alloc.base);
        Int b = IntFrom(42, &alloc.base);
        Int c = IntFromBinary("000101010", &alloc.base);
        Int a = IntFrom(41, &alloc.base);
        Int b = IntFrom(42, &alloc.base);
        Int c = IntFromBinary("000101010", &alloc.base);
    
        bool result = IntCompare(&a, &b) < 0;
    
    bool test_int_compare_wrappers(void) {
        WriteFmt("Testing Int compare wrappers\n");
    
        DefaultAllocator alloc = DefaultAllocatorInit();
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int a = IntFrom(41, &alloc.base);
        Int b = IntFrom(42, &alloc.base);
        Int c = IntFromBinary("000101010", &alloc.base);
    
        Int a = IntFrom(41, &alloc.base);
        Int b = IntFrom(42, &alloc.base);
        Int c = IntFromBinary("000101010", &alloc.base);
        Int a = IntFrom(41, &alloc.base);
        Int b = IntFrom(42, &alloc.base);
        Int c = IntFromBinary("000101010", &alloc.base);
    
        bool result = IntLT(&a, &b);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value = IntFrom(42, &alloc.base);
        Int same  = IntFromBinary("00101010", &alloc.base);
        Int big   = IntFrom(1, &alloc.base);
    
        Int value = IntFrom(42, &alloc.base);
        Int same  = IntFromBinary("00101010", &alloc.base);
        Int big   = IntFrom(1, &alloc.base);
        Int value = IntFrom(42, &alloc.base);
        Int same  = IntFromBinary("00101010", &alloc.base);
        Int big   = IntFrom(1, &alloc.base);
    
        IntShiftLeft(&big, 80);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int a = IntFrom(42u, &alloc.base);
        Int b = IntFromBinary("101010", &alloc.base);
        Int c = IntFrom(0u, &alloc.base);
    
        Int a = IntFrom(42u, &alloc.base);
        Int b = IntFromBinary("101010", &alloc.base);
        Int c = IntFrom(0u, &alloc.base);
        Int d = IntFrom(0u, &alloc.base);
        Int a = IntFrom(42u, &alloc.base);
        Int b = IntFromBinary("101010", &alloc.base);
        Int c = IntFrom(0u, &alloc.base);
        Int d = IntFrom(0u, &alloc.base);
        Int b = IntFromBinary("101010", &alloc.base);
        Int c = IntFrom(0u, &alloc.base);
        Int d = IntFrom(0u, &alloc.base);
    
        bool result = (int_hash(&a, 0) == int_hash(&b, 0));
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int zero  = IntFrom(0u, &alloc.base);
        Int one   = IntFrom(1u, &alloc.base);
        Int small = IntFrom(42u, &alloc.base);
    
        Int zero  = IntFrom(0u, &alloc.base);
        Int one   = IntFrom(1u, &alloc.base);
        Int small = IntFrom(42u, &alloc.base);
        Int large = IntFrom(1u, &alloc.base);
        Int zero  = IntFrom(0u, &alloc.base);
        Int one   = IntFrom(1u, &alloc.base);
        Int small = IntFrom(42u, &alloc.base);
        Int large = IntFrom(1u, &alloc.base);
        IntShiftLeft(&large, 80);
        Int one   = IntFrom(1u, &alloc.base);
        Int small = IntFrom(42u, &alloc.base);
        Int large = IntFrom(1u, &alloc.base);
        IntShiftLeft(&large, 80);
        Int decimal = IntFromStr("12345678901234567890", &alloc.base);
        Int large = IntFrom(1u, &alloc.base);
        IntShiftLeft(&large, 80);
        Int decimal = IntFromStr("12345678901234567890", &alloc.base);
    
        u64 h_zero    = int_hash(&zero, 0);
    // GenericHash / GenericCompare-shaped helpers wire in directly.
    bool test_int_hash_as_map_key(void) {
        WriteFmt("Testing int_hash as Map<Int,u64> key\n");
    
        DefaultAllocator alloc = DefaultAllocatorInit();
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Map(Int, u64) counts = MapInit(int_hash, int_compare, &alloc);
    
        Int k1 = IntFrom(100u, &alloc.base);
        Map(Int, u64) counts = MapInit(int_hash, int_compare, &alloc);
    
        Int k1 = IntFrom(100u, &alloc.base);
        Int k2 = IntFrom(200u, &alloc.base);
        Int k3 = IntFrom(100u, &alloc.base); // duplicate of k1 by value
    
        Int k1 = IntFrom(100u, &alloc.base);
        Int k2 = IntFrom(200u, &alloc.base);
        Int k3 = IntFrom(100u, &alloc.base); // duplicate of k1 by value
        Int k1 = IntFrom(100u, &alloc.base);
        Int k2 = IntFrom(200u, &alloc.base);
        Int k3 = IntFrom(100u, &alloc.base); // duplicate of k1 by value
    
        MapInsertR(&counts, k1, 1u);
        MapInsertR(&counts, k2, 2u);
    
        Int  probe   = IntFrom(100u, &alloc.base);
        u64 *got     = MapGetFirstPtr(&counts, probe);
        Int  missing = IntFrom(999u, &alloc.base);
        Int  probe   = IntFrom(100u, &alloc.base);
        u64 *got     = MapGetFirstPtr(&counts, probe);
        Int  missing = IntFrom(999u, &alloc.base);
        u64 *gone    = MapGetFirstPtr(&counts, missing);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int lhs = IntFrom(0x8000000000000000u, &alloc.base);
    
        bool fail = (IntBitLength(&lhs) != 64); // sanity: exactly 64 bits.
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int lhs = IntFrom(7u, &alloc.base);
    
        bool fail = (IntCompare(&lhs, 9u) != -1);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int one = IntFrom(1, &alloc.base);
    
        bool result = (IntIsOne(&one) == true);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int zero = IntInit(&alloc.base);
    
        int  cmp    = int_compare_i64(&zero, (i64)0);
    
        /* A non-zero lhs vs rhs 0 must still report greater (positive). */
        Int five = IntFrom((u64)5u, &alloc.base);
        result   = result && (int_compare_i64(&five, (i64)0) > 0);
    
    int main(void) {
        WriteFmt("[INFO] Starting Int.Compare tests\n\n");
    
        TestFunction tests[] = {
        int total_tests         = sizeof(tests) / sizeof(tests[0]);
        int total_deadend_tests = sizeof(deadend_tests) / sizeof(deadend_tests[0]);
        return run_test_suite(tests, total_tests, deadend_tests, total_deadend_tests, "Int.Compare");
    }
    #include <Misra/Std/Allocator/Default.h>
    #include <Misra/Std/Container/Int.h>
    #include <Misra/Std/Container/BitVec.h>
    #include <Misra/Std/Log.h>
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value = IntInit(&alloc.base);
    
        bool result = IntIsZero(&value);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value = IntFromBinary("101101", &alloc.base);
    
        IntClear(&value);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int original = IntFromBinary("1011", &alloc.base);
        Int clone    = IntClone(&original);
    
        Int original = IntFromBinary("1011", &alloc.base);
        Int clone    = IntClone(&original);
    
        bool result = IntEQ(&clone, &original);
        alloc.base.retry_limit = 5;
    
        Int original = IntInit(&alloc);
    
        BitVecPush(&original.bits, true);
        BitVecPush(&original.bits, true);
    
        Int clone = IntClone(&original);
    
        bool result =
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int a   = IntFrom(255, &alloc.base);
        Int b   = IntFrom(1, &alloc.base);
        Int sum = IntInit(&alloc.base);
    
        Int a   = IntFrom(255, &alloc.base);
        Int b   = IntFrom(1, &alloc.base);
        Int sum = IntInit(&alloc.base);
        Int a   = IntFrom(255, &alloc.base);
        Int b   = IntFrom(1, &alloc.base);
        Int sum = IntInit(&alloc.base);
    
        IntAdd(&sum, &a, &b);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int v255 = IntFrom(255, &alloc.base);
    
        bool result = IntBitLength(&v255) == 8;
    
    int main(void) {
        WriteFmt("[INFO] Starting Int.Type tests\n\n");
    
        TestFunction tests[] = {
    
        int total_tests = sizeof(tests) / sizeof(tests[0]);
        return run_test_suite(tests, total_tests, NULL, 0, "Int.Type");
    }
    #include <Misra/Std/Allocator/Debug.h>
    #include <Misra/Std/Zstr.h>
    #include <Misra/Std/Container/Int.h>
    #include <Misra/Std/Log.h>
    #include <Misra/Types.h>
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value = IntFrom(3, &alloc.base);
    
        IntShiftLeft(&value, 4);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value = IntFromBinary("110000", &alloc.base);
    
        IntShiftRight(&value, 4);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int a            = IntFrom(255, &alloc.base);
        Int b            = IntFrom(1, &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        Int a            = IntFrom(255, &alloc.base);
        Int b            = IntFrom(1, &alloc.base);
        Int result_value = IntInit(&alloc.base);
        Str text         = StrInit(&alloc.base);
        Int a            = IntFrom(255, &alloc.base);
        Int b            = IntFrom(1, &alloc.base);
        Int result_value = IntInit(&alloc.base);
        Str text         = StrInit(&alloc.base);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int base         = IntFrom(40, &alloc.base);
        Int rhs          = IntFrom(2, &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        Int base         = IntFrom(40, &alloc.base);
        Int rhs          = IntFrom(2, &alloc.base);
        Int result_value = IntInit(&alloc.base);
        Int huge         = IntFromStr("123456789012345678901234567890", &alloc.base);
        Int base         = IntFrom(40, &alloc.base);
        Int rhs          = IntFrom(2, &alloc.base);
        Int result_value = IntInit(&alloc.base);
        Int huge         = IntFromStr("123456789012345678901234567890", &alloc.base);
        Str text         = StrInit(&alloc.base);
        Int rhs          = IntFrom(2, &alloc.base);
        Int result_value = IntInit(&alloc.base);
        Int huge         = IntFromStr("123456789012345678901234567890", &alloc.base);
        Str text         = StrInit(&alloc.base);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int a            = IntFrom(256, &alloc.base);
        Int b            = IntFrom(1, &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        Int a            = IntFrom(256, &alloc.base);
        Int b            = IntFrom(1, &alloc.base);
        Int result_value = IntInit(&alloc.base);
        Int a            = IntFrom(256, &alloc.base);
        Int b            = IntFrom(1, &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        bool result = IntSub(&result_value, &a, &b);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int base         = IntFrom(40, &alloc.base);
        Int rhs          = IntFrom(2, &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        Int base         = IntFrom(40, &alloc.base);
        Int rhs          = IntFrom(2, &alloc.base);
        Int result_value = IntInit(&alloc.base);
        Int preserved    = IntFrom(99, &alloc.base);
        Int base         = IntFrom(40, &alloc.base);
        Int rhs          = IntFrom(2, &alloc.base);
        Int result_value = IntInit(&alloc.base);
        Int preserved    = IntFrom(99, &alloc.base);
        Int huge         = IntFromStr("12345678901234567890", &alloc.base);
        Int rhs          = IntFrom(2, &alloc.base);
        Int result_value = IntInit(&alloc.base);
        Int preserved    = IntFrom(99, &alloc.base);
        Int huge         = IntFromStr("12345678901234567890", &alloc.base);
        Str text         = StrInit(&alloc.base);
        Int result_value = IntInit(&alloc.base);
        Int preserved    = IntFrom(99, &alloc.base);
        Int huge         = IntFromStr("12345678901234567890", &alloc.base);
        Str text         = StrInit(&alloc.base);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int a            = IntFrom(3, &alloc.base);
        Int b            = IntFrom(5, &alloc.base);
        Int result_value = IntFrom(99, &alloc.base);
    
        Int a            = IntFrom(3, &alloc.base);
        Int b            = IntFrom(5, &alloc.base);
        Int result_value = IntFrom(99, &alloc.base);
        Int a            = IntFrom(3, &alloc.base);
        Int b            = IntFrom(5, &alloc.base);
        Int result_value = IntFrom(99, &alloc.base);
    
        bool result = !IntSub(&result_value, &a, &b);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int a            = IntFrom(21, &alloc.base);
        Int b            = IntFrom(6, &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        Int a            = IntFrom(21, &alloc.base);
        Int b            = IntFrom(6, &alloc.base);
        Int result_value = IntInit(&alloc.base);
        Int a            = IntFrom(21, &alloc.base);
        Int b            = IntFrom(6, &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        IntMul(&result_value, &a, &b);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value        = IntFromStr("12345678901234567890", &alloc.base);
        Int result_value = IntInit(&alloc.base);
        Str text         = StrInit(&alloc.base);
    
        Int value        = IntFromStr("12345678901234567890", &alloc.base);
        Int result_value = IntInit(&alloc.base);
        Str text         = StrInit(&alloc.base);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int a            = IntFrom(0, &alloc.base);
        Int b            = IntFrom(12345, &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        Int a            = IntFrom(0, &alloc.base);
        Int b            = IntFrom(12345, &alloc.base);
        Int result_value = IntInit(&alloc.base);
        Int a            = IntFrom(0, &alloc.base);
        Int b            = IntFrom(12345, &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        IntMul(&result_value, &a, &b);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value        = IntFrom(12345, &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        Int value        = IntFrom(12345, &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        IntSquare(&result_value, &value);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int base         = IntFrom(7, &alloc.base);
        Int exponent     = IntFrom(20, &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        Int base         = IntFrom(7, &alloc.base);
        Int exponent     = IntFrom(20, &alloc.base);
        Int result_value = IntInit(&alloc.base);
        Str text         = StrInit(&alloc.base);
        Int base         = IntFrom(7, &alloc.base);
        Int exponent     = IntFrom(20, &alloc.base);
        Int result_value = IntInit(&alloc.base);
        Str text         = StrInit(&alloc.base);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int dividend  = IntFromStr("12345678901234567890", &alloc.base);
        Int quotient  = IntInit(&alloc.base);
        Int remainder = IntInit(&alloc.base);
    
        Int dividend  = IntFromStr("12345678901234567890", &alloc.base);
        Int quotient  = IntInit(&alloc.base);
        Int remainder = IntInit(&alloc.base);
        Str qtext     = StrInit(&alloc.base);
        Int dividend  = IntFromStr("12345678901234567890", &alloc.base);
        Int quotient  = IntInit(&alloc.base);
        Int remainder = IntInit(&alloc.base);
        Str qtext     = StrInit(&alloc.base);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int dividend     = IntFrom(126, &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        Int dividend     = IntFrom(126, &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        IntDiv(&result_value, &dividend, 10u);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int dividend     = IntFromStr("12345678901234567890", &alloc.base);
        Int result_value = IntInit(&alloc.base);
        Str text         = StrInit(&alloc.base);
    
        Int dividend     = IntFromStr("12345678901234567890", &alloc.base);
        Int result_value = IntInit(&alloc.base);
        Str text         = StrInit(&alloc.base);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int dividend     = IntFrom(10, &alloc.base);
        Int divisor      = IntFrom(3, &alloc.base);
        Int result_value = IntFrom(99, &alloc.base);
    
        Int dividend     = IntFrom(10, &alloc.base);
        Int divisor      = IntFrom(3, &alloc.base);
        Int result_value = IntFrom(99, &alloc.base);
        Int dividend     = IntFrom(10, &alloc.base);
        Int divisor      = IntFrom(3, &alloc.base);
        Int result_value = IntFrom(99, &alloc.base);
    
        bool result = !IntDivExact(&result_value, &dividend, &divisor);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int dividend  = IntFromStr("12345678901234567890", &alloc.base);
        Int quotient  = IntInit(&alloc.base);
        Int remainder = IntInit(&alloc.base);
    
        Int dividend  = IntFromStr("12345678901234567890", &alloc.base);
        Int quotient  = IntInit(&alloc.base);
        Int remainder = IntInit(&alloc.base);
        Str text      = StrInit(&alloc.base);
        Int dividend  = IntFromStr("12345678901234567890", &alloc.base);
        Int quotient  = IntInit(&alloc.base);
        Int remainder = IntInit(&alloc.base);
        Str text      = StrInit(&alloc.base);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int dividend     = IntFrom(126, &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        Int dividend     = IntFrom(126, &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        IntMod(&result_value, &dividend, 10u);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value     = IntFromStr("12345678901234567890", &alloc.base);
        Int remainder = IntInit(&alloc.base);
    
        Int value     = IntFromStr("12345678901234567890", &alloc.base);
        Int remainder = IntInit(&alloc.base);
    
        IntMod(&remainder, &value, 97u);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int a            = IntFrom(48, &alloc.base);
        Int b            = IntFrom(18, &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        Int a            = IntFrom(48, &alloc.base);
        Int b            = IntFrom(18, &alloc.base);
        Int result_value = IntInit(&alloc.base);
        Int a            = IntFrom(48, &alloc.base);
        Int b            = IntFrom(18, &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        IntGCD(&result_value, &a, &b);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int a            = IntFrom(21, &alloc.base);
        Int b            = IntFrom(6, &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        Int a            = IntFrom(21, &alloc.base);
        Int b            = IntFrom(6, &alloc.base);
        Int result_value = IntInit(&alloc.base);
        Int a            = IntFrom(21, &alloc.base);
        Int b            = IntFrom(6, &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        IntLCM(&result_value, &a, &b);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value        = IntFrom(4096, &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        Int value        = IntFrom(4096, &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        IntRoot(&result_value, &value, 4);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value     = IntFrom(200, &alloc.base);
        Int root      = IntInit(&alloc.base);
        Int remainder = IntInit(&alloc.base);
    
        Int value     = IntFrom(200, &alloc.base);
        Int root      = IntInit(&alloc.base);
        Int remainder = IntInit(&alloc.base);
        Int value     = IntFrom(200, &alloc.base);
        Int root      = IntInit(&alloc.base);
        Int remainder = IntInit(&alloc.base);
    
        IntRootRem(&root, &remainder, &value, 3);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value        = IntFrom(200, &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        Int value        = IntFrom(200, &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        IntSqrt(&result_value, &value);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value     = IntFrom(200, &alloc.base);
        Int root      = IntInit(&alloc.base);
        Int remainder = IntInit(&alloc.base);
    
        Int value     = IntFrom(200, &alloc.base);
        Int root      = IntInit(&alloc.base);
        Int remainder = IntInit(&alloc.base);
        Int value     = IntFrom(200, &alloc.base);
        Int root      = IntInit(&alloc.base);
        Int remainder = IntInit(&alloc.base);
    
        IntSqrtRem(&root, &remainder, &value);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int square     = IntFrom(144, &alloc.base);
        Int non_square = IntFrom(145, &alloc.base);
    
        Int square     = IntFrom(144, &alloc.base);
        Int non_square = IntFrom(145, &alloc.base);
    
        bool result = IntIsPerfectSquare(&square);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int power     = IntFrom(81, &alloc.base);
        Int non_power = IntFrom(82, &alloc.base);
        Int one       = IntFrom(1, &alloc.base);
    
        Int power     = IntFrom(81, &alloc.base);
        Int non_power = IntFrom(82, &alloc.base);
        Int one       = IntFrom(1, &alloc.base);
        Int power     = IntFrom(81, &alloc.base);
        Int non_power = IntFrom(82, &alloc.base);
        Int one       = IntFrom(1, &alloc.base);
    
        bool result = IntIsPerfectPower(&power);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int a = IntFrom(5, &alloc.base);
        Int p = IntFrom(7, &alloc.base);
        Int b = IntFrom(9, &alloc.base);
    
        Int a = IntFrom(5, &alloc.base);
        Int p = IntFrom(7, &alloc.base);
        Int b = IntFrom(9, &alloc.base);
        Int n = IntFrom(21, &alloc.base);
        Int a = IntFrom(5, &alloc.base);
        Int p = IntFrom(7, &alloc.base);
        Int b = IntFrom(9, &alloc.base);
        Int n = IntFrom(21, &alloc.base);
        Int p = IntFrom(7, &alloc.base);
        Int b = IntFrom(9, &alloc.base);
        Int n = IntFrom(21, &alloc.base);
    
        bool result = IntJacobi(&a, &p) == -1;
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value        = IntFrom(12345, &alloc.base);
        Int mod          = IntFrom(97, &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        Int value        = IntFrom(12345, &alloc.base);
        Int mod          = IntFrom(97, &alloc.base);
        Int result_value = IntInit(&alloc.base);
        Int value        = IntFrom(12345, &alloc.base);
        Int mod          = IntFrom(97, &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        IntSquareMod(&result_value, &value, &mod);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int a            = IntFrom(100, &alloc.base);
        Int b            = IntFrom(250, &alloc.base);
        Int m            = IntFrom(13, &alloc.base);
    
        Int a            = IntFrom(100, &alloc.base);
        Int b            = IntFrom(250, &alloc.base);
        Int m            = IntFrom(13, &alloc.base);
        Int result_value = IntInit(&alloc.base);
        Int a            = IntFrom(100, &alloc.base);
        Int b            = IntFrom(250, &alloc.base);
        Int m            = IntFrom(13, &alloc.base);
        Int result_value = IntInit(&alloc.base);
        Int b            = IntFrom(250, &alloc.base);
        Int m            = IntFrom(13, &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        IntModAdd(&result_value, &a, &b, &m);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int a            = IntFrom(5, &alloc.base);
        Int b            = IntFrom(9, &alloc.base);
        Int m            = IntFrom(13, &alloc.base);
    
        Int a            = IntFrom(5, &alloc.base);
        Int b            = IntFrom(9, &alloc.base);
        Int m            = IntFrom(13, &alloc.base);
        Int result_value = IntInit(&alloc.base);
        Int a            = IntFrom(5, &alloc.base);
        Int b            = IntFrom(9, &alloc.base);
        Int m            = IntFrom(13, &alloc.base);
        Int result_value = IntInit(&alloc.base);
        Int b            = IntFrom(9, &alloc.base);
        Int m            = IntFrom(13, &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        IntModSub(&result_value, &a, &b, &m);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int a            = IntFrom(123, &alloc.base);
        Int b            = IntFrom(456, &alloc.base);
        Int m            = IntFrom(97, &alloc.base);
    
        Int a            = IntFrom(123, &alloc.base);
        Int b            = IntFrom(456, &alloc.base);
        Int m            = IntFrom(97, &alloc.base);
        Int result_value = IntInit(&alloc.base);
        Int a            = IntFrom(123, &alloc.base);
        Int b            = IntFrom(456, &alloc.base);
        Int m            = IntFrom(97, &alloc.base);
        Int result_value = IntInit(&alloc.base);
        Int b            = IntFrom(456, &alloc.base);
        Int m            = IntFrom(97, &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        IntModMul(&result_value, &a, &b, &m);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int a            = IntFrom(10, &alloc.base);
        Int b            = IntFrom(3, &alloc.base);
        Int m            = IntFrom(13, &alloc.base);
    
        Int a            = IntFrom(10, &alloc.base);
        Int b            = IntFrom(3, &alloc.base);
        Int m            = IntFrom(13, &alloc.base);
        Int result_value = IntInit(&alloc.base);
        Int a            = IntFrom(10, &alloc.base);
        Int b            = IntFrom(3, &alloc.base);
        Int m            = IntFrom(13, &alloc.base);
        Int result_value = IntInit(&alloc.base);
        Int check        = IntInit(&alloc.base);
        Int b            = IntFrom(3, &alloc.base);
        Int m            = IntFrom(13, &alloc.base);
        Int result_value = IntInit(&alloc.base);
        Int check        = IntInit(&alloc.base);
        Int m            = IntFrom(13, &alloc.base);
        Int result_value = IntInit(&alloc.base);
        Int check        = IntInit(&alloc.base);
    
        bool result = IntModDiv(&result_value, &a, &b, &m);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int base         = IntFrom(7, &alloc.base);
        Int mod          = IntFrom(13, &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        Int base         = IntFrom(7, &alloc.base);
        Int mod          = IntFrom(13, &alloc.base);
        Int result_value = IntInit(&alloc.base);
        Int base         = IntFrom(7, &alloc.base);
        Int mod          = IntFrom(13, &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        IntPowMod(&result_value, &base, 20u, &mod);
    
    bool test_int_pow_mod_integer_exponent(void) {
        WriteFmt("Testing IntPowMod Int-exponent dispatch\n");
    
        DefaultAllocator alloc = DefaultAllocatorInit();
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int base         = IntFrom(4, &alloc.base);
        Int exp          = IntFrom(13, &alloc.base);
        Int mod          = IntFrom(497, &alloc.base);
    
        Int base         = IntFrom(4, &alloc.base);
        Int exp          = IntFrom(13, &alloc.base);
        Int mod          = IntFrom(497, &alloc.base);
        Int result_value = IntInit(&alloc.base);
        Int base         = IntFrom(4, &alloc.base);
        Int exp          = IntFrom(13, &alloc.base);
        Int mod          = IntFrom(497, &alloc.base);
        Int result_value = IntInit(&alloc.base);
        Int exp          = IntFrom(13, &alloc.base);
        Int mod          = IntFrom(497, &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        IntPowMod(&result_value, &base, &exp, &mod);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value        = IntFrom(3, &alloc.base);
        Int mod          = IntFrom(11, &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        Int value        = IntFrom(3, &alloc.base);
        Int mod          = IntFrom(11, &alloc.base);
        Int result_value = IntInit(&alloc.base);
        Int check        = IntInit(&alloc.base);
        Int value        = IntFrom(3, &alloc.base);
        Int mod          = IntFrom(11, &alloc.base);
        Int result_value = IntInit(&alloc.base);
        Int check        = IntInit(&alloc.base);
        Int mod          = IntFrom(11, &alloc.base);
        Int result_value = IntInit(&alloc.base);
        Int check        = IntInit(&alloc.base);
    
        bool result = IntModInv(&result_value, &value, &mod);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value = IntFrom(10, &alloc.base);
        Int mod   = IntFrom(13, &alloc.base);
        Int root  = IntInit(&alloc.base);
    
        Int value = IntFrom(10, &alloc.base);
        Int mod   = IntFrom(13, &alloc.base);
        Int root  = IntInit(&alloc.base);
        Int check = IntInit(&alloc.base);
        Int value = IntFrom(10, &alloc.base);
        Int mod   = IntFrom(13, &alloc.base);
        Int root  = IntInit(&alloc.base);
        Int check = IntInit(&alloc.base);
        Int mod   = IntFrom(13, &alloc.base);
        Int root  = IntInit(&alloc.base);
        Int check = IntInit(&alloc.base);
    
        bool result = IntModSqrt(&root, &value, &mod);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value = IntFrom(3, &alloc.base);
        Int mod   = IntFrom(7, &alloc.base);
        Int root  = IntFrom(99, &alloc.base);
    
        Int value = IntFrom(3, &alloc.base);
        Int mod   = IntFrom(7, &alloc.base);
        Int root  = IntFrom(99, &alloc.base);
        Int value = IntFrom(3, &alloc.base);
        Int mod   = IntFrom(7, &alloc.base);
        Int root  = IntFrom(99, &alloc.base);
    
        bool result = !IntModSqrt(&root, &value, &mod);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int prime     = IntFromStr("1000000007", &alloc.base);
        Int composite = IntFrom(561, &alloc.base);
    
        Int prime     = IntFromStr("1000000007", &alloc.base);
        Int composite = IntFrom(561, &alloc.base);
    
        bool result = IntIsProbablePrime(&prime);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value = IntFromStr("1000000000", &alloc.base);
        Int next  = IntInit(&alloc.base);
        Str text  = StrInit(&alloc.base);
    
        Int value = IntFromStr("1000000000", &alloc.base);
        Int next  = IntInit(&alloc.base);
        Str text  = StrInit(&alloc.base);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value        = IntFrom(6, &alloc.base);
        Int mod          = IntFrom(15, &alloc.base);
        Int result_value = IntFrom(99, &alloc.base);
    
        Int value        = IntFrom(6, &alloc.base);
        Int mod          = IntFrom(15, &alloc.base);
        Int result_value = IntFrom(99, &alloc.base);
        Int value        = IntFrom(6, &alloc.base);
        Int mod          = IntFrom(15, &alloc.base);
        Int result_value = IntFrom(99, &alloc.base);
    
        bool result = !IntModInv(&result_value, &value, &mod);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int a            = IntFrom(1, &alloc.base);
        Int b            = IntFrom(6, &alloc.base);
        Int m            = IntFrom(15, &alloc.base);
    
        Int a            = IntFrom(1, &alloc.base);
        Int b            = IntFrom(6, &alloc.base);
        Int m            = IntFrom(15, &alloc.base);
        Int result_value = IntFrom(99, &alloc.base);
        Int a            = IntFrom(1, &alloc.base);
        Int b            = IntFrom(6, &alloc.base);
        Int m            = IntFrom(15, &alloc.base);
        Int result_value = IntFrom(99, &alloc.base);
        Int b            = IntFrom(6, &alloc.base);
        Int m            = IntFrom(15, &alloc.base);
        Int result_value = IntFrom(99, &alloc.base);
    
        bool result = !IntModDiv(&result_value, &a, &b, &m);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int a = IntFrom(1, &alloc.base);
        Int b = IntFrom(2, &alloc.base);
    
        Int a = IntFrom(1, &alloc.base);
        Int b = IntFrom(2, &alloc.base);
    
        IntAdd(NULL, &a, &b);
    
    bool test_int_div_by_zero(void) {
        WriteFmt("Testing Int division by zero handling\n");
    
        DefaultAllocator alloc = DefaultAllocatorInit();
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int dividend  = IntFrom(1, &alloc.base);
        Int divisor   = IntInit(&alloc.base);
        Int quotient  = IntFrom(99, &alloc.base);
    
        Int dividend  = IntFrom(1, &alloc.base);
        Int divisor   = IntInit(&alloc.base);
        Int quotient  = IntFrom(99, &alloc.base);
        Int remainder = IntFrom(77, &alloc.base);
        Int dividend  = IntFrom(1, &alloc.base);
        Int divisor   = IntInit(&alloc.base);
        Int quotient  = IntFrom(99, &alloc.base);
        Int remainder = IntFrom(77, &alloc.base);
        Int divisor   = IntInit(&alloc.base);
        Int quotient  = IntFrom(99, &alloc.base);
        Int remainder = IntFrom(77, &alloc.base);
    
        bool result = !IntDivMod(&quotient, &remainder, &dividend, &divisor);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int  value     = IntFrom(16, &alloc.base);
        Int  root      = IntFrom(99, &alloc.base);
        Int  remainder = IntFrom(77, &alloc.base);
    
        Int  value     = IntFrom(16, &alloc.base);
        Int  root      = IntFrom(99, &alloc.base);
        Int  remainder = IntFrom(77, &alloc.base);
        bool result    = !IntRootRem(&root, &remainder, &value, 0);
        Int  value     = IntFrom(16, &alloc.base);
        Int  root      = IntFrom(99, &alloc.base);
        Int  remainder = IntFrom(77, &alloc.base);
        bool result    = !IntRootRem(&root, &remainder, &value, 0);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int dividend = IntFrom(10, &alloc.base);
        Int quotient = IntFrom(99, &alloc.base);
    
        Int dividend = IntFrom(10, &alloc.base);
        Int quotient = IntFrom(99, &alloc.base);
    
        IntDiv(&quotient, &dividend, 0u);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value        = IntFrom(10, &alloc.base);
        Int result_value = IntFrom(99, &alloc.base);
    
        Int value        = IntFrom(10, &alloc.base);
        Int result_value = IntFrom(99, &alloc.base);
    
        IntMod(&result_value, &value, 0u);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int a            = IntFrom(10, &alloc.base);
        Int b            = IntFrom(3, &alloc.base);
        Int m            = IntInit(&alloc.base);
    
        Int a            = IntFrom(10, &alloc.base);
        Int b            = IntFrom(3, &alloc.base);
        Int m            = IntInit(&alloc.base);
        Int result_value = IntFrom(99, &alloc.base);
        Int a            = IntFrom(10, &alloc.base);
        Int b            = IntFrom(3, &alloc.base);
        Int m            = IntInit(&alloc.base);
        Int result_value = IntFrom(99, &alloc.base);
        Int b            = IntFrom(3, &alloc.base);
        Int m            = IntInit(&alloc.base);
        Int result_value = IntFrom(99, &alloc.base);
    
        bool result = !IntModDiv(&result_value, &a, &b, &m);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int  a      = IntFrom(3, &alloc.base);
        Int  n      = IntFrom(8, &alloc.base);
        int  symbol = 99;
    
        Int  a      = IntFrom(3, &alloc.base);
        Int  n      = IntFrom(8, &alloc.base);
        int  symbol = 99;
        bool error  = false;
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int base         = IntFrom(2, &alloc.base);
        Int mod          = IntInit(&alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        Int base         = IntFrom(2, &alloc.base);
        Int mod          = IntInit(&alloc.base);
        Int result_value = IntInit(&alloc.base);
        Int base         = IntFrom(2, &alloc.base);
        Int mod          = IntInit(&alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        IntPowMod(&result_value, &base, 8u, &mod);
    
    bool test_int_pow_mod_integer_zero_modulus(void) {
        WriteFmt("Testing IntPowMod Int-exponent zero modulus handling\n");
    
        DefaultAllocator alloc = DefaultAllocatorInit();
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int base         = IntFrom(2, &alloc.base);
        Int exp          = IntFrom(8, &alloc.base);
        Int mod          = IntInit(&alloc.base);
    
        Int base         = IntFrom(2, &alloc.base);
        Int exp          = IntFrom(8, &alloc.base);
        Int mod          = IntInit(&alloc.base);
        Int result_value = IntFrom(99, &alloc.base);
        Int base         = IntFrom(2, &alloc.base);
        Int exp          = IntFrom(8, &alloc.base);
        Int mod          = IntInit(&alloc.base);
        Int result_value = IntFrom(99, &alloc.base);
        Int exp          = IntFrom(8, &alloc.base);
        Int mod          = IntInit(&alloc.base);
        Int result_value = IntFrom(99, &alloc.base);
    
        bool result = !IntPowMod(&result_value, &base, &exp, &mod);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value = IntFrom(2, &alloc.base);
        Int mod   = IntFrom(7, &alloc.base);
        Int root  = IntFrom(99, &alloc.base);
    
        Int value = IntFrom(2, &alloc.base);
        Int mod   = IntFrom(7, &alloc.base);
        Int root  = IntFrom(99, &alloc.base);
        Int check = IntInit(&alloc.base);
        Int value = IntFrom(2, &alloc.base);
        Int mod   = IntFrom(7, &alloc.base);
        Int root  = IntFrom(99, &alloc.base);
        Int check = IntInit(&alloc.base);
        Int mod   = IntFrom(7, &alloc.base);
        Int root  = IntFrom(99, &alloc.base);
        Int check = IntInit(&alloc.base);
    
        bool result = IntModSqrt(&root, &value, &mod);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value = IntFrom(3, &alloc.base);
        Int mod   = IntFrom(7, &alloc.base);
        Int root  = IntFrom(99, &alloc.base);
    
        Int value = IntFrom(3, &alloc.base);
        Int mod   = IntFrom(7, &alloc.base);
        Int root  = IntFrom(99, &alloc.base);
        Int value = IntFrom(3, &alloc.base);
        Int mod   = IntFrom(7, &alloc.base);
        Int root  = IntFrom(99, &alloc.base);
    
        bool result = !IntModSqrt(&root, &value, &mod);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value = IntFrom(2, &alloc.base);
        Int mod   = IntFrom(17, &alloc.base);
        Int root  = IntFrom(99, &alloc.base);
    
        Int value = IntFrom(2, &alloc.base);
        Int mod   = IntFrom(17, &alloc.base);
        Int root  = IntFrom(99, &alloc.base);
        Int check = IntInit(&alloc.base);
        Int value = IntFrom(2, &alloc.base);
        Int mod   = IntFrom(17, &alloc.base);
        Int root  = IntFrom(99, &alloc.base);
        Int check = IntInit(&alloc.base);
        Int mod   = IntFrom(17, &alloc.base);
        Int root  = IntFrom(99, &alloc.base);
        Int check = IntInit(&alloc.base);
    
        bool result = IntModSqrt(&root, &value, &mod);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value = IntFrom(4, &alloc.base);
        Int mod   = IntFrom(17, &alloc.base);
        Int root  = IntFrom(99, &alloc.base);
    
        Int value = IntFrom(4, &alloc.base);
        Int mod   = IntFrom(17, &alloc.base);
        Int root  = IntFrom(99, &alloc.base);
        Int check = IntInit(&alloc.base);
        Int value = IntFrom(4, &alloc.base);
        Int mod   = IntFrom(17, &alloc.base);
        Int root  = IntFrom(99, &alloc.base);
        Int check = IntInit(&alloc.base);
        Int mod   = IntFrom(17, &alloc.base);
        Int root  = IntFrom(99, &alloc.base);
        Int check = IntInit(&alloc.base);
    
        bool result = IntModSqrt(&root, &value, &mod);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value = IntFrom(3, &alloc.base);
        Int mod   = IntFrom(97, &alloc.base);
        Int root  = IntFrom(99, &alloc.base);
    
        Int value = IntFrom(3, &alloc.base);
        Int mod   = IntFrom(97, &alloc.base);
        Int root  = IntFrom(99, &alloc.base);
        Int check = IntInit(&alloc.base);
        Int value = IntFrom(3, &alloc.base);
        Int mod   = IntFrom(97, &alloc.base);
        Int root  = IntFrom(99, &alloc.base);
        Int check = IntInit(&alloc.base);
        Int mod   = IntFrom(97, &alloc.base);
        Int root  = IntFrom(99, &alloc.base);
        Int check = IntInit(&alloc.base);
    
        bool result = IntModSqrt(&root, &value, &mod);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value = IntFrom(2, &alloc.base);
        Int mod   = IntFrom(257, &alloc.base);
        Int root  = IntFrom(99, &alloc.base);
    
        Int value = IntFrom(2, &alloc.base);
        Int mod   = IntFrom(257, &alloc.base);
        Int root  = IntFrom(99, &alloc.base);
        Int check = IntInit(&alloc.base);
        Int value = IntFrom(2, &alloc.base);
        Int mod   = IntFrom(257, &alloc.base);
        Int root  = IntFrom(99, &alloc.base);
        Int check = IntInit(&alloc.base);
        Int mod   = IntFrom(257, &alloc.base);
        Int root  = IntFrom(99, &alloc.base);
        Int check = IntInit(&alloc.base);
    
        bool result = IntModSqrt(&root, &value, &mod);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value = IntFrom(10, &alloc.base);
        Int mod   = IntFrom(13, &alloc.base);
        Int root  = IntFrom(99, &alloc.base);
    
        Int value = IntFrom(10, &alloc.base);
        Int mod   = IntFrom(13, &alloc.base);
        Int root  = IntFrom(99, &alloc.base);
        Int check = IntInit(&alloc.base);
        Int value = IntFrom(10, &alloc.base);
        Int mod   = IntFrom(13, &alloc.base);
        Int root  = IntFrom(99, &alloc.base);
        Int check = IntInit(&alloc.base);
        Int mod   = IntFrom(13, &alloc.base);
        Int root  = IntFrom(99, &alloc.base);
        Int check = IntInit(&alloc.base);
    
        bool result = IntModSqrt(&root, &value, &mod);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value = IntFrom(2, &alloc.base);
        Int mod   = IntFrom(13, &alloc.base);
        Int root  = IntFrom(99, &alloc.base);
    
        Int value = IntFrom(2, &alloc.base);
        Int mod   = IntFrom(13, &alloc.base);
        Int root  = IntFrom(99, &alloc.base);
        Int value = IntFrom(2, &alloc.base);
        Int mod   = IntFrom(13, &alloc.base);
        Int root  = IntFrom(99, &alloc.base);
    
        bool result = !IntModSqrt(&root, &value, &mod);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value = IntFrom(0, &alloc.base);
        Int mod   = IntFrom(7, &alloc.base);
        Int root  = IntFrom(99, &alloc.base);
    
        Int value = IntFrom(0, &alloc.base);
        Int mod   = IntFrom(7, &alloc.base);
        Int root  = IntFrom(99, &alloc.base);
        Int value = IntFrom(0, &alloc.base);
        Int mod   = IntFrom(7, &alloc.base);
        Int root  = IntFrom(99, &alloc.base);
    
        bool result = IntModSqrt(&root, &value, &mod);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value = IntFrom(21, &alloc.base);
        Int mod   = IntFrom(7, &alloc.base);
        Int root  = IntFrom(99, &alloc.base);
    
        Int value = IntFrom(21, &alloc.base);
        Int mod   = IntFrom(7, &alloc.base);
        Int root  = IntFrom(99, &alloc.base);
        Int value = IntFrom(21, &alloc.base);
        Int mod   = IntFrom(7, &alloc.base);
        Int root  = IntFrom(99, &alloc.base);
    
        bool result = IntModSqrt(&root, &value, &mod);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value = IntFrom(5, &alloc.base);
        Int mod   = IntFrom(2, &alloc.base);
        Int root  = IntFrom(99, &alloc.base);
    
        Int value = IntFrom(5, &alloc.base);
        Int mod   = IntFrom(2, &alloc.base);
        Int root  = IntFrom(99, &alloc.base);
        Int value = IntFrom(5, &alloc.base);
        Int mod   = IntFrom(2, &alloc.base);
        Int root  = IntFrom(99, &alloc.base);
    
        bool result = IntModSqrt(&root, &value, &mod);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value = IntFrom(1, &alloc.base);
        Int mod   = IntFrom(8, &alloc.base);
        Int root  = IntFrom(99, &alloc.base);
    
        Int value = IntFrom(1, &alloc.base);
        Int mod   = IntFrom(8, &alloc.base);
        Int root  = IntFrom(99, &alloc.base);
        Int value = IntFrom(1, &alloc.base);
        Int mod   = IntFrom(8, &alloc.base);
        Int root  = IntFrom(99, &alloc.base);
    
        bool result = !IntModSqrt(&root, &value, &mod);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value = IntFrom(4, &alloc.base);
        Int mod   = IntFrom(9, &alloc.base);
        Int root  = IntFrom(99, &alloc.base);
    
        Int value = IntFrom(4, &alloc.base);
        Int mod   = IntFrom(9, &alloc.base);
        Int root  = IntFrom(99, &alloc.base);
        Int value = IntFrom(4, &alloc.base);
        Int mod   = IntFrom(9, &alloc.base);
        Int root  = IntFrom(99, &alloc.base);
    
        bool result = !IntModSqrt(&root, &value, &mod);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value = IntFrom(4, &alloc.base);
        Int mod   = IntInit(&alloc.base);
        Int root  = IntFrom(99, &alloc.base);
    
        Int value = IntFrom(4, &alloc.base);
        Int mod   = IntInit(&alloc.base);
        Int root  = IntFrom(99, &alloc.base);
        Int value = IntFrom(4, &alloc.base);
        Int mod   = IntInit(&alloc.base);
        Int root  = IntFrom(99, &alloc.base);
    
        bool result = !IntModSqrt(&root, &value, &mod);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value = IntFrom(23, &alloc.base);
        Int mod   = IntFrom(7, &alloc.base);
        Int root  = IntFrom(99, &alloc.base);
    
        Int value = IntFrom(23, &alloc.base);
        Int mod   = IntFrom(7, &alloc.base);
        Int root  = IntFrom(99, &alloc.base);
        Int check = IntInit(&alloc.base);
        Int value = IntFrom(23, &alloc.base);
        Int mod   = IntFrom(7, &alloc.base);
        Int root  = IntFrom(99, &alloc.base);
        Int check = IntInit(&alloc.base);
        Int mod   = IntFrom(7, &alloc.base);
        Int root  = IntFrom(99, &alloc.base);
        Int check = IntInit(&alloc.base);
    
        bool result = IntModSqrt(&root, &value, &mod);
    
        /* 123456789 * 987654321 = 121932631112635269 */
        Int a       = IntFrom((u64)123456789u, &alloc.base);
        Int b       = IntFrom((u64)987654321u, &alloc.base);
        Int product = IntInit(&alloc.base);
        /* 123456789 * 987654321 = 121932631112635269 */
        Int a       = IntFrom((u64)123456789u, &alloc.base);
        Int b       = IntFrom((u64)987654321u, &alloc.base);
        Int product = IntInit(&alloc.base);
        Int a       = IntFrom((u64)123456789u, &alloc.base);
        Int b       = IntFrom((u64)987654321u, &alloc.base);
        Int product = IntInit(&alloc.base);
    
        bool ok = IntMul(&product, &a, &b);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int a       = IntFrom((u64)999u, &alloc.base);
        Int zero    = IntInit(&alloc.base);
        Int product = IntInit(&alloc.base);
    
        Int a       = IntFrom((u64)999u, &alloc.base);
        Int zero    = IntInit(&alloc.base);
        Int product = IntInit(&alloc.base);
        Int a       = IntFrom((u64)999u, &alloc.base);
        Int zero    = IntInit(&alloc.base);
        Int product = IntInit(&alloc.base);
    
        bool ok = IntMul(&product, &a, &zero);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int a = IntFrom((u64)2u, &alloc.base);
        Int b = IntFrom((u64)3u, &alloc.base);
    
        Int a = IntFrom((u64)2u, &alloc.base);
        Int b = IntFrom((u64)3u, &alloc.base);
    
        IntMul(NULL, &a, &b);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int base   = IntFrom(7, &alloc.base);
        Int result = IntInit(&alloc.base);
    
        Int base   = IntFrom(7, &alloc.base);
        Int result = IntInit(&alloc.base);
    
        // exponent 0 -> 1 (loop body never runs)
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int a = IntFrom(12, &alloc.base);
        Int b = IntFrom(8, &alloc.base);
    
        Int a = IntFrom(12, &alloc.base);
        Int b = IntFrom(8, &alloc.base);
    
        IntGCD(NULL, &a, &b);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int b      = IntFrom(8, &alloc.base);
        Int result = IntInit(&alloc.base);
    
        Int b      = IntFrom(8, &alloc.base);
        Int result = IntInit(&alloc.base);
    
        IntGCD(&result, NULL, &b);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int a      = IntFrom(12, &alloc.base);
        Int result = IntInit(&alloc.base);
    
        Int a      = IntFrom(12, &alloc.base);
        Int result = IntInit(&alloc.base);
    
        IntGCD(&result, &a, NULL);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int a = IntFrom(7, &alloc.base);
        Int b = IntFrom(3, &alloc.base);
        Int m = IntFrom(11, &alloc.base);
    
        Int a = IntFrom(7, &alloc.base);
        Int b = IntFrom(3, &alloc.base);
        Int m = IntFrom(11, &alloc.base);
        Int a = IntFrom(7, &alloc.base);
        Int b = IntFrom(3, &alloc.base);
        Int m = IntFrom(11, &alloc.base);
    
        IntModAdd(NULL, &a, &b, &m);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int a   = IntFrom(3, &alloc.base);
        Int b   = IntFrom(5, &alloc.base);
        Int mod = IntFrom(7, &alloc.base);
    
        Int a   = IntFrom(3, &alloc.base);
        Int b   = IntFrom(5, &alloc.base);
        Int mod = IntFrom(7, &alloc.base);
        Int a   = IntFrom(3, &alloc.base);
        Int b   = IntFrom(5, &alloc.base);
        Int mod = IntFrom(7, &alloc.base);
    
        IntModMul(NULL, &a, &b, &mod);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int a            = IntFrom(4, &alloc.base);
        Int b            = IntFrom(1, &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        Int a            = IntFrom(4, &alloc.base);
        Int b            = IntFrom(1, &alloc.base);
        Int result_value = IntInit(&alloc.base);
        Int a            = IntFrom(4, &alloc.base);
        Int b            = IntFrom(1, &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        bool ok = IntSub(&result_value, &a, &b);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int a = IntFrom(9, &alloc.base);
        Int b = IntFrom(2, &alloc.base);
    
        Int a = IntFrom(9, &alloc.base);
        Int b = IntFrom(2, &alloc.base);
    
        int_sub(NULL, &a, &b);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int dividend = IntFrom(100, &alloc.base);
    
        int_div_u64_rem(NULL, &dividend, 7);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int quotient = IntInit(&alloc.base);
    
        int_div_u64_rem(&quotient, NULL, 7);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int a            = IntFrom(0, &alloc.base);
        Int b            = IntFrom(5, &alloc.base);
        Int result_value = IntFrom(99, &alloc.base);
    
        Int a            = IntFrom(0, &alloc.base);
        Int b            = IntFrom(5, &alloc.base);
        Int result_value = IntFrom(99, &alloc.base);
        Int a            = IntFrom(0, &alloc.base);
        Int b            = IntFrom(5, &alloc.base);
        Int result_value = IntFrom(99, &alloc.base);
    
        bool result = IntLCM(&result_value, &a, &b);
        // 32 = 2^5: only perfect-power exponent in [2, max_degree] is the boundary
        // value max_degree itself, so it distinguishes `<=` from `<`.
        Int boundary = IntFrom(32, &alloc.base);
        // 64 = 2^6 = 8^2 = 4^3 = 2^6: a perfect square found at degree 2, used as a
        // sanity anchor so the test also exercises the common early-hit path.
        // 64 = 2^6 = 8^2 = 4^3 = 2^6: a perfect square found at degree 2, used as a
        // sanity anchor so the test also exercises the common early-hit path.
        Int square_anchor = IntFrom(64, &alloc.base);
    
        bool result = IntIsPerfectPower(&boundary);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int dividend = IntFrom(12, &alloc.base);
        Int divisor  = IntFrom(4, &alloc.base);
    
        Int dividend = IntFrom(12, &alloc.base);
        Int divisor  = IntFrom(4, &alloc.base);
    
        IntDivExact(NULL, &dividend, &divisor);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int ones = IntFromBinary("1111111", &alloc.base); // 127
        Int one  = IntFrom(1u, &alloc.base);
        Int sum  = IntInit(&alloc.base);
    
        Int ones = IntFromBinary("1111111", &alloc.base); // 127
        Int one  = IntFrom(1u, &alloc.base);
        Int sum  = IntInit(&alloc.base);
        Int ones = IntFromBinary("1111111", &alloc.base); // 127
        Int one  = IntFrom(1u, &alloc.base);
        Int sum  = IntInit(&alloc.base);
    
        IntAdd(&sum, &ones, &one);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value     = IntFrom(0, &alloc.base);
        Int root      = IntFrom(99, &alloc.base);
        Int remainder = IntFrom(77, &alloc.base);
    
        Int value     = IntFrom(0, &alloc.base);
        Int root      = IntFrom(99, &alloc.base);
        Int remainder = IntFrom(77, &alloc.base);
        Int value     = IntFrom(0, &alloc.base);
        Int root      = IntFrom(99, &alloc.base);
        Int remainder = IntFrom(77, &alloc.base);
    
        bool ok     = IntRootRem(&root, &remainder, &value, 3);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value     = IntFrom(10000, &alloc.base);
        Int root      = IntInit(&alloc.base);
        Int remainder = IntInit(&alloc.base);
    
        Int value     = IntFrom(10000, &alloc.base);
        Int root      = IntInit(&alloc.base);
        Int remainder = IntInit(&alloc.base);
        Int value     = IntFrom(10000, &alloc.base);
        Int root      = IntInit(&alloc.base);
        Int remainder = IntInit(&alloc.base);
    
        bool ok     = IntRootRem(&root, &remainder, &value, 2);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value     = IntFrom(1000, &alloc.base);
        Int root      = IntInit(&alloc.base);
        Int remainder = IntInit(&alloc.base);
    
        Int value     = IntFrom(1000, &alloc.base);
        Int root      = IntInit(&alloc.base);
        Int remainder = IntInit(&alloc.base);
        Int value     = IntFrom(1000, &alloc.base);
        Int root      = IntInit(&alloc.base);
        Int remainder = IntInit(&alloc.base);
    
        bool ok     = IntRootRem(&root, &remainder, &value, 3);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value     = IntFrom(1001, &alloc.base);
        Int root      = IntInit(&alloc.base);
        Int remainder = IntInit(&alloc.base);
    
        Int value     = IntFrom(1001, &alloc.base);
        Int root      = IntInit(&alloc.base);
        Int remainder = IntInit(&alloc.base);
        Int value     = IntFrom(1001, &alloc.base);
        Int root      = IntInit(&alloc.base);
        Int remainder = IntInit(&alloc.base);
    
        bool ok     = IntRootRem(&root, &remainder, &value, 3);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value     = IntFrom(999, &alloc.base);
        Int root      = IntInit(&alloc.base);
        Int remainder = IntInit(&alloc.base);
    
        Int value     = IntFrom(999, &alloc.base);
        Int root      = IntInit(&alloc.base);
        Int remainder = IntInit(&alloc.base);
        Int value     = IntFrom(999, &alloc.base);
        Int root      = IntInit(&alloc.base);
        Int remainder = IntInit(&alloc.base);
    
        bool ok     = IntRootRem(&root, &remainder, &value, 3);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value     = IntFrom(1000000, &alloc.base);
        Int root      = IntInit(&alloc.base);
        Int remainder = IntInit(&alloc.base);
    
        Int value     = IntFrom(1000000, &alloc.base);
        Int root      = IntInit(&alloc.base);
        Int remainder = IntInit(&alloc.base);
        Int value     = IntFrom(1000000, &alloc.base);
        Int root      = IntInit(&alloc.base);
        Int remainder = IntInit(&alloc.base);
    
        bool ok     = IntRootRem(&root, &remainder, &value, 4);
    //    exponent the real code must take the int_pow_u64 path and return true.
    bool test_m22_pow_int_exponent_value(void) {
        WriteFmt("Testing IntPow with an Int exponent (small, exact value)\n");
    
        DefaultAllocator alloc = DefaultAllocatorInit();
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int base  = IntFrom(7, &alloc.base);
        Int exp   = IntFrom(5, &alloc.base);
        Int power = IntInit(&alloc.base);
    
        Int base  = IntFrom(7, &alloc.base);
        Int exp   = IntFrom(5, &alloc.base);
        Int power = IntInit(&alloc.base);
        Int base  = IntFrom(7, &alloc.base);
        Int exp   = IntFrom(5, &alloc.base);
        Int power = IntInit(&alloc.base);
    
        // 7**5 == 16807.
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int base = IntFrom(2, &alloc.base);
        // 2**64 == 18446744073709551616 -> bit length 65, does not fit u64.
        Int exp      = IntFromStr("18446744073709551616", &alloc.base);
        Int base = IntFrom(2, &alloc.base);
        // 2**64 == 18446744073709551616 -> bit length 65, does not fit u64.
        Int exp      = IntFromStr("18446744073709551616", &alloc.base);
        Int power    = IntFrom(123, &alloc.base);
        Int sentinel = IntFrom(123, &alloc.base);
        // 2**64 == 18446744073709551616 -> bit length 65, does not fit u64.
        Int exp      = IntFromStr("18446744073709551616", &alloc.base);
        Int power    = IntFrom(123, &alloc.base);
        Int sentinel = IntFrom(123, &alloc.base);
        Int exp      = IntFromStr("18446744073709551616", &alloc.base);
        Int power    = IntFrom(123, &alloc.base);
        Int sentinel = IntFrom(123, &alloc.base);
    
        bool rejected = !IntPow(&power, &base, &exp);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int dividend = IntFrom(1000, &alloc.base);
        Int quotient = IntInit(&alloc.base);
    
        Int dividend = IntFrom(1000, &alloc.base);
        Int quotient = IntInit(&alloc.base);
    
        // 1000 / 7 == 142 (floor).
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int dividend = IntFrom(1000, &alloc.base);
        Int quotient = IntFrom(55, &alloc.base);
    
        Int dividend = IntFrom(1000, &alloc.base);
        Int quotient = IntFrom(55, &alloc.base);
    
        bool failed = !IntDiv(&quotient, &dividend, (i64)-7);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int dividend = IntFrom(1001, &alloc.base);
        Int quotient = IntInit(&alloc.base);
    
        Int dividend = IntFrom(1001, &alloc.base);
        Int quotient = IntInit(&alloc.base);
    
        // 1001 / 7 == 143 exactly.
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int dividend = IntFrom(1001, &alloc.base);
        Int quotient = IntFrom(55, &alloc.base);
    
        Int dividend = IntFrom(1001, &alloc.base);
        Int quotient = IntFrom(55, &alloc.base);
    
        bool failed = !IntDivExact(&quotient, &dividend, (i64)-7);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value = IntFrom(5u, &alloc.base);
    
        bool fail = (IntCompare(&value, 5u) != 0);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value = IntFrom(1u, &alloc.base);
    
        bool fail = (IntCompare(&value, 1u) != 0);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value        = IntFrom(7, &alloc.base);
        Int result_value = IntFrom(99, &alloc.base);
    
        Int value        = IntFrom(7, &alloc.base);
        Int result_value = IntFrom(99, &alloc.base);
    
        /* Signed literal forces int_mul_i64 dispatch. */
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value        = IntFrom(123, &alloc.base);
        Int result_value = IntFrom(99, &alloc.base);
    
        Int value        = IntFrom(123, &alloc.base);
        Int result_value = IntFrom(99, &alloc.base);
    
        bool ok     = IntMul(&result_value, &value, (i64)0);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int base         = IntFrom(3, &alloc.base);
        Int result_value = IntFrom(99, &alloc.base);
    
        Int base         = IntFrom(3, &alloc.base);
        Int result_value = IntFrom(99, &alloc.base);
    
        bool ok     = IntPow(&result_value, &base, (i64)4);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int base         = IntFrom(7, &alloc.base);
        Int result_value = IntFrom(99, &alloc.base);
    
        Int base         = IntFrom(7, &alloc.base);
        Int result_value = IntFrom(99, &alloc.base);
    
        bool ok     = IntPow(&result_value, &base, (i64)0);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int dividend     = IntFrom(100, &alloc.base);
        Int result_value = IntFrom(99, &alloc.base);
    
        Int dividend     = IntFrom(100, &alloc.base);
        Int result_value = IntFrom(99, &alloc.base);
    
        /* Unsigned literal forces int_div_u64 dispatch. */
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int dividend     = IntFrom(123456789, &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        Int dividend     = IntFrom(123456789, &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        bool ok = int_div_exact_u64(&result_value, &dividend, 3u);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int dividend  = IntFromStr("12345678901234567890", &alloc.base);
        Int quotient  = IntInit(&alloc.base);
        Int remainder = IntInit(&alloc.base);
    
        Int dividend  = IntFromStr("12345678901234567890", &alloc.base);
        Int quotient  = IntInit(&alloc.base);
        Int remainder = IntInit(&alloc.base);
        Str qtext     = StrInit(&alloc.base);
        Int dividend  = IntFromStr("12345678901234567890", &alloc.base);
        Int quotient  = IntInit(&alloc.base);
        Int remainder = IntInit(&alloc.base);
        Str qtext     = StrInit(&alloc.base);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int dividend  = IntFromStr("12345678901234567890", &alloc.base);
        Int quotient  = IntInit(&alloc.base);
        Int remainder = IntInit(&alloc.base);
    
        Int dividend  = IntFromStr("12345678901234567890", &alloc.base);
        Int quotient  = IntInit(&alloc.base);
        Int remainder = IntInit(&alloc.base);
        Str qtext     = StrInit(&alloc.base);
        Int dividend  = IntFromStr("12345678901234567890", &alloc.base);
        Int quotient  = IntInit(&alloc.base);
        Int remainder = IntInit(&alloc.base);
        Str qtext     = StrInit(&alloc.base);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int dividend     = IntFromStr("12345678901234567890", &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        Int dividend     = IntFromStr("12345678901234567890", &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        bool ok = int_mod_i64_into(&result_value, &dividend, (i64)13);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int base         = IntFrom(7, &alloc.base);
        Int modulus      = IntFrom(1000000007, &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        Int base         = IntFrom(7, &alloc.base);
        Int modulus      = IntFrom(1000000007, &alloc.base);
        Int result_value = IntInit(&alloc.base);
        Int base         = IntFrom(7, &alloc.base);
        Int modulus      = IntFrom(1000000007, &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        bool ok = int_pow_i64_mod(&result_value, &base, (i64)13, &modulus);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int base         = IntFrom(7, &alloc.base);
        Int modulus      = IntFrom(1000000007, &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        Int base         = IntFrom(7, &alloc.base);
        Int modulus      = IntFrom(1000000007, &alloc.base);
        Int result_value = IntInit(&alloc.base);
        Int base         = IntFrom(7, &alloc.base);
        Int modulus      = IntFrom(1000000007, &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        bool ok = int_pow_i64_mod(&result_value, &base, (i64)0, &modulus);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value        = IntFrom(4096, &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        Int value        = IntFrom(4096, &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        bool ok = IntRoot(&result_value, &value, 4);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int zero = IntInit(&alloc.base);
    
        bool result = (IntIsOdd(&zero) == false);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int dividend = IntFrom((u64)100u, &alloc.base);
        Int result   = IntInit(&alloc.base);
    
        Int dividend = IntFrom((u64)100u, &alloc.base);
        Int result   = IntInit(&alloc.base);
    
        bool ok      = IntMod(&result, &dividend, (unsigned long)7u);
    ///
    static bool test_m28_trailing_zero_invalid_deadend(void) {
        WriteFmt("Testing IntTrailingZeroCount validation on invalid Int\n");
    
        Int invalid = {0};
        WriteFmt("Testing IntTrailingZeroCount validation on invalid Int\n");
    
        Int invalid = {0};
    
        (void)IntTrailingZeroCount(&invalid);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int a      = IntFrom(2, &alloc.base);
        Int n_odd  = IntFrom(7, &alloc.base);
        Int n_even = IntFrom(8, &alloc.base);
    
        Int a      = IntFrom(2, &alloc.base);
        Int n_odd  = IntFrom(7, &alloc.base);
        Int n_even = IntFrom(8, &alloc.base);
        Int a      = IntFrom(2, &alloc.base);
        Int n_odd  = IntFrom(7, &alloc.base);
        Int n_even = IntFrom(8, &alloc.base);
    
        bool err_ok  = true;
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value  = IntFrom(3, &alloc.base);
        Int mod    = IntFrom(11, &alloc.base);
        Int result = IntInit(&alloc.base);
    
        Int value  = IntFrom(3, &alloc.base);
        Int mod    = IntFrom(11, &alloc.base);
        Int result = IntInit(&alloc.base);
        Int check  = IntInit(&alloc.base);
        Int value  = IntFrom(3, &alloc.base);
        Int mod    = IntFrom(11, &alloc.base);
        Int result = IntInit(&alloc.base);
        Int check  = IntInit(&alloc.base);
        Int mod    = IntFrom(11, &alloc.base);
        Int result = IntInit(&alloc.base);
        Int check  = IntInit(&alloc.base);
    
        bool ok = IntModInv(&result, &value, &mod);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value  = IntFrom(5, &alloc.base);
        Int mod    = IntFrom(11, &alloc.base);
        Int result = IntInit(&alloc.base);
    
        Int value  = IntFrom(5, &alloc.base);
        Int mod    = IntFrom(11, &alloc.base);
        Int result = IntInit(&alloc.base);
        Int check  = IntInit(&alloc.base);
        Int value  = IntFrom(5, &alloc.base);
        Int mod    = IntFrom(11, &alloc.base);
        Int result = IntInit(&alloc.base);
        Int check  = IntInit(&alloc.base);
        Int mod    = IntFrom(11, &alloc.base);
        Int result = IntInit(&alloc.base);
        Int check  = IntInit(&alloc.base);
    
        bool ok = IntModInv(&result, &value, &mod);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int dividend = IntFrom(10, &alloc.base);
        Int quotient = IntFrom(99, &alloc.base);
    
        Int dividend = IntFrom(10, &alloc.base);
        Int quotient = IntFrom(99, &alloc.base);
    
        bool ok     = IntDiv(&quotient, &dividend, 0u);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int dividend = IntFrom(10, &alloc.base);
        Int quotient = IntFrom(99, &alloc.base);
    
        Int dividend = IntFrom(10, &alloc.base);
        Int quotient = IntFrom(99, &alloc.base);
    
        bool ok     = IntDiv(&quotient, &dividend, (i64)0);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int dividend = IntFrom(127, &alloc.base);
        Int quotient = IntInit(&alloc.base);
    
        Int dividend = IntFrom(127, &alloc.base);
        Int quotient = IntInit(&alloc.base);
    
        bool ok     = IntDivExact(&quotient, &dividend, 10u);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int dividend = IntFrom(127, &alloc.base);
        Int quotient = IntInit(&alloc.base);
    
        Int dividend = IntFrom(127, &alloc.base);
        Int quotient = IntInit(&alloc.base);
    
        bool ok     = IntDivExact(&quotient, &dividend, (i64)10);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int dividend  = IntFrom(127, &alloc.base);
        Int quotient  = IntInit(&alloc.base);
        Int remainder = IntInit(&alloc.base);
    
        Int dividend  = IntFrom(127, &alloc.base);
        Int quotient  = IntInit(&alloc.base);
        Int remainder = IntInit(&alloc.base);
        Int dividend  = IntFrom(127, &alloc.base);
        Int quotient  = IntInit(&alloc.base);
        Int remainder = IntInit(&alloc.base);
    
        bool ok     = IntDivMod(&quotient, &remainder, &dividend, 0u);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int dividend  = IntFrom(127, &alloc.base);
        Int quotient  = IntInit(&alloc.base);
        Int remainder = IntInit(&alloc.base);
    
        Int dividend  = IntFrom(127, &alloc.base);
        Int quotient  = IntInit(&alloc.base);
        Int remainder = IntInit(&alloc.base);
        Int dividend  = IntFrom(127, &alloc.base);
        Int quotient  = IntInit(&alloc.base);
        Int remainder = IntInit(&alloc.base);
    
        bool ok     = IntDivMod(&quotient, &remainder, &dividend, (i64)0);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int dividend     = IntFrom(127, &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        Int dividend     = IntFrom(127, &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        bool ok     = IntMod(&result_value, &dividend, 0u);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int dividend     = IntFrom(127, &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        Int dividend     = IntFrom(127, &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        bool ok     = IntMod(&result_value, &dividend, (i64)0);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value = IntFrom(1, &alloc.base);
        IntShiftLeft(&value, 50); // 2^50
        IntShiftLeft(&value, 50); // 2^50
    
        Int root      = IntInit(&alloc.base);
        Int remainder = IntInit(&alloc.base);
    
        Int root      = IntInit(&alloc.base);
        Int remainder = IntInit(&alloc.base);
    
        bool ok     = IntSqrtRem(&root, &remainder, &value);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int a = IntFrom(3, &alloc.base);
        Int n = IntFrom(7, &alloc.base);
    
        Int a = IntFrom(3, &alloc.base);
        Int n = IntFrom(7, &alloc.base);
    
        int  symbol = 99;
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value = IntFrom(2, &alloc.base);
        Int mod   = IntFrom(17, &alloc.base);
        Int root  = IntInit(&alloc.base);
    
        Int value = IntFrom(2, &alloc.base);
        Int mod   = IntFrom(17, &alloc.base);
        Int root  = IntInit(&alloc.base);
        Int check = IntInit(&alloc.base);
        Int value = IntFrom(2, &alloc.base);
        Int mod   = IntFrom(17, &alloc.base);
        Int root  = IntInit(&alloc.base);
        Int check = IntInit(&alloc.base);
        Int mod   = IntFrom(17, &alloc.base);
        Int root  = IntInit(&alloc.base);
        Int check = IntInit(&alloc.base);
    
        bool ok = IntModSqrt(&root, &value, &mod);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value = IntFrom(1, &alloc.base);
    
        bool result = !IntIsProbablePrime(&value);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value = IntFrom(2, &alloc.base);
    
        bool result = IntIsProbablePrime(&value);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value = IntFrom(4, &alloc.base);
    
        bool result = !IntIsProbablePrime(&value);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value = IntFrom(3, &alloc.base);
    
        bool result = IntIsProbablePrime(&value);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value = IntFrom(97, &alloc.base);
    
        bool result = IntIsProbablePrime(&value);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value = IntFrom(561, &alloc.base);
    
        bool result = !IntIsProbablePrime(&value);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value = IntFrom(1763, &alloc.base);
    
        bool result = !IntIsProbablePrime(&value);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value = IntFromStr("1373653", &alloc.base);
    
        bool result = !IntIsProbablePrime(&value);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value = IntFromStr("1000000007", &alloc.base);
    
        bool result = IntIsProbablePrime(&value);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int  value = IntFrom(97, &alloc.base);
        bool error = true;
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int dividend  = IntFromStr("12345678901234567890123456789", &alloc.base);
        Int divisor   = IntFromStr("987654321987654321", &alloc.base);
        Int quotient  = IntInit(&alloc.base);
    
        Int dividend  = IntFromStr("12345678901234567890123456789", &alloc.base);
        Int divisor   = IntFromStr("987654321987654321", &alloc.base);
        Int quotient  = IntInit(&alloc.base);
        Int remainder = IntInit(&alloc.base);
        Int dividend  = IntFromStr("12345678901234567890123456789", &alloc.base);
        Int divisor   = IntFromStr("987654321987654321", &alloc.base);
        Int quotient  = IntInit(&alloc.base);
        Int remainder = IntInit(&alloc.base);
        Int divisor   = IntFromStr("987654321987654321", &alloc.base);
        Int quotient  = IntInit(&alloc.base);
        Int remainder = IntInit(&alloc.base);
    
        bool ok = int_div_mod(&quotient, &remainder, &dividend, &divisor);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int dividend  = IntFromStr("1000000007", &alloc.base);
        Int divisor   = IntFromStr("97", &alloc.base);
        Int quotient  = IntInit(&alloc.base);
    
        Int dividend  = IntFromStr("1000000007", &alloc.base);
        Int divisor   = IntFromStr("97", &alloc.base);
        Int quotient  = IntInit(&alloc.base);
        Int remainder = IntInit(&alloc.base);
        Int dividend  = IntFromStr("1000000007", &alloc.base);
        Int divisor   = IntFromStr("97", &alloc.base);
        Int quotient  = IntInit(&alloc.base);
        Int remainder = IntInit(&alloc.base);
        Int divisor   = IntFromStr("97", &alloc.base);
        Int quotient  = IntInit(&alloc.base);
        Int remainder = IntInit(&alloc.base);
    
        bool ok = int_div_mod(&quotient, &remainder, &dividend, &divisor);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int dividend  = IntFromStr("11975308533", &alloc.base);
        Int divisor   = IntFromStr("97", &alloc.base);
        Int quotient  = IntInit(&alloc.base);
    
        Int dividend  = IntFromStr("11975308533", &alloc.base);
        Int divisor   = IntFromStr("97", &alloc.base);
        Int quotient  = IntInit(&alloc.base);
        Int remainder = IntInit(&alloc.base);
        Int dividend  = IntFromStr("11975308533", &alloc.base);
        Int divisor   = IntFromStr("97", &alloc.base);
        Int quotient  = IntInit(&alloc.base);
        Int remainder = IntInit(&alloc.base);
        Int divisor   = IntFromStr("97", &alloc.base);
        Int quotient  = IntInit(&alloc.base);
        Int remainder = IntInit(&alloc.base);
    
        bool ok = int_div_mod(&quotient, &remainder, &dividend, &divisor);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int dividend  = IntFromStr("42", &alloc.base);
        Int divisor   = IntFromStr("1000", &alloc.base);
        Int quotient  = IntInit(&alloc.base);
    
        Int dividend  = IntFromStr("42", &alloc.base);
        Int divisor   = IntFromStr("1000", &alloc.base);
        Int quotient  = IntInit(&alloc.base);
        Int remainder = IntInit(&alloc.base);
        Int dividend  = IntFromStr("42", &alloc.base);
        Int divisor   = IntFromStr("1000", &alloc.base);
        Int quotient  = IntInit(&alloc.base);
        Int remainder = IntInit(&alloc.base);
        Int divisor   = IntFromStr("1000", &alloc.base);
        Int quotient  = IntInit(&alloc.base);
        Int remainder = IntInit(&alloc.base);
    
        bool ok = int_div_mod(&quotient, &remainder, &dividend, &divisor);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int dividend  = IntFromStr("12345", &alloc.base);
        Int divisor   = IntInit(&alloc.base); /* zero */
        Int quotient  = IntInit(&alloc.base);
        Int dividend  = IntFromStr("12345", &alloc.base);
        Int divisor   = IntInit(&alloc.base); /* zero */
        Int quotient  = IntInit(&alloc.base);
        Int remainder = IntInit(&alloc.base);
        Int divisor   = IntInit(&alloc.base); /* zero */
        Int quotient  = IntInit(&alloc.base);
        Int remainder = IntInit(&alloc.base);
    
        bool ok = int_div_mod(&quotient, &remainder, &dividend, &divisor);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int dividend  = IntFromStr("100", &alloc.base);
        Int divisor   = IntFromStr("7", &alloc.base);
        Int remainder = IntInit(&alloc.base);
    
        Int dividend  = IntFromStr("100", &alloc.base);
        Int divisor   = IntFromStr("7", &alloc.base);
        Int remainder = IntInit(&alloc.base);
        Int dividend  = IntFromStr("100", &alloc.base);
        Int divisor   = IntFromStr("7", &alloc.base);
        Int remainder = IntInit(&alloc.base);
    
        /* Must abort inside int_div_mod via ValidateInt(quotient). */
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int dividend = IntFromStr("100", &alloc.base);
        Int divisor  = IntFromStr("7", &alloc.base);
        Int quotient = IntInit(&alloc.base);
    
        Int dividend = IntFromStr("100", &alloc.base);
        Int divisor  = IntFromStr("7", &alloc.base);
        Int quotient = IntInit(&alloc.base);
        Int dividend = IntFromStr("100", &alloc.base);
        Int divisor  = IntFromStr("7", &alloc.base);
        Int quotient = IntInit(&alloc.base);
    
        /* Must abort inside int_div_mod via ValidateInt(remainder). */
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int base         = IntFrom(7, &alloc.base);
        Int exp          = IntFrom(0, &alloc.base);
        Int mod          = IntFrom(1, &alloc.base);
    
        Int base         = IntFrom(7, &alloc.base);
        Int exp          = IntFrom(0, &alloc.base);
        Int mod          = IntFrom(1, &alloc.base);
        Int result_value = IntFrom(99, &alloc.base);
        Int base         = IntFrom(7, &alloc.base);
        Int exp          = IntFrom(0, &alloc.base);
        Int mod          = IntFrom(1, &alloc.base);
        Int result_value = IntFrom(99, &alloc.base);
        Int exp          = IntFrom(0, &alloc.base);
        Int mod          = IntFrom(1, &alloc.base);
        Int result_value = IntFrom(99, &alloc.base);
    
        bool ok = int_pow_mod(&result_value, &base, &exp, &mod);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int base         = IntFrom(123456, &alloc.base);
        Int exp          = IntFrom(11, &alloc.base);
        Int mod          = IntFrom(1, &alloc.base);
    
        Int base         = IntFrom(123456, &alloc.base);
        Int exp          = IntFrom(11, &alloc.base);
        Int mod          = IntFrom(1, &alloc.base);
        Int result_value = IntFrom(42, &alloc.base);
        Int base         = IntFrom(123456, &alloc.base);
        Int exp          = IntFrom(11, &alloc.base);
        Int mod          = IntFrom(1, &alloc.base);
        Int result_value = IntFrom(42, &alloc.base);
        Int exp          = IntFrom(11, &alloc.base);
        Int mod          = IntFrom(1, &alloc.base);
        Int result_value = IntFrom(42, &alloc.base);
    
        bool ok = int_pow_mod(&result_value, &base, &exp, &mod);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int base         = IntFrom(3, &alloc.base);
        Int exp          = IntFrom(13, &alloc.base);
        Int mod          = IntFrom(497, &alloc.base);
    
        Int base         = IntFrom(3, &alloc.base);
        Int exp          = IntFrom(13, &alloc.base);
        Int mod          = IntFrom(497, &alloc.base);
        Int result_value = IntInit(&alloc.base);
        Int base         = IntFrom(3, &alloc.base);
        Int exp          = IntFrom(13, &alloc.base);
        Int mod          = IntFrom(497, &alloc.base);
        Int result_value = IntInit(&alloc.base);
        Int exp          = IntFrom(13, &alloc.base);
        Int mod          = IntFrom(497, &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        bool ok = int_pow_mod(&result_value, &base, &exp, &mod);
        DebugAllocator dbg = DebugAllocatorInit();
    
        Int base         = IntFrom(123456789u, &dbg.base);
        Int exp          = IntFrom(987654321u, &dbg.base); // many set bits + bits
        Int mod          = IntFrom(1000000007u, &dbg.base);
    
        Int base         = IntFrom(123456789u, &dbg.base);
        Int exp          = IntFrom(987654321u, &dbg.base); // many set bits + bits
        Int mod          = IntFrom(1000000007u, &dbg.base);
        Int result_value = IntInit(&dbg.base);
        Int base         = IntFrom(123456789u, &dbg.base);
        Int exp          = IntFrom(987654321u, &dbg.base); // many set bits + bits
        Int mod          = IntFrom(1000000007u, &dbg.base);
        Int result_value = IntInit(&dbg.base);
        Int exp          = IntFrom(987654321u, &dbg.base); // many set bits + bits
        Int mod          = IntFrom(1000000007u, &dbg.base);
        Int result_value = IntInit(&dbg.base);
    
        bool ok = int_pow_mod(&result_value, &base, &exp, &mod);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value = IntFrom(0, &alloc.base);
        Int next  = IntInit(&alloc.base);
    
        Int value = IntFrom(0, &alloc.base);
        Int next  = IntInit(&alloc.base);
    
        bool ok = IntNextPrime(&next, &value);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value = IntFrom(10, &alloc.base);
        Int next  = IntInit(&alloc.base);
    
        Int value = IntFrom(10, &alloc.base);
        Int next  = IntInit(&alloc.base);
    
        bool ok = IntNextPrime(&next, &value);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value = IntFrom(9, &alloc.base);
        Int next  = IntInit(&alloc.base);
    
        Int value = IntFrom(9, &alloc.base);
        Int next  = IntInit(&alloc.base);
    
        bool ok = IntNextPrime(&next, &value);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value = IntFrom(10, &alloc.base);
    
        (void)IntNextPrime(NULL, &value);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int a            = IntFrom(9, &alloc.base);
        Int b            = IntFrom(5, &alloc.base);
        Int m            = IntFrom(13, &alloc.base);
    
        Int a            = IntFrom(9, &alloc.base);
        Int b            = IntFrom(5, &alloc.base);
        Int m            = IntFrom(13, &alloc.base);
        Int result_value = IntInit(&alloc.base);
        Int a            = IntFrom(9, &alloc.base);
        Int b            = IntFrom(5, &alloc.base);
        Int m            = IntFrom(13, &alloc.base);
        Int result_value = IntInit(&alloc.base);
        Int b            = IntFrom(5, &alloc.base);
        Int m            = IntFrom(13, &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        bool ok = IntModSub(&result_value, &a, &b, &m);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int a = IntFrom(7, &alloc.base);
        Int b = IntFrom(3, &alloc.base);
        Int m = IntFrom(11, &alloc.base);
    
        Int a = IntFrom(7, &alloc.base);
        Int b = IntFrom(3, &alloc.base);
        Int m = IntFrom(11, &alloc.base);
        Int a = IntFrom(7, &alloc.base);
        Int b = IntFrom(3, &alloc.base);
        Int m = IntFrom(11, &alloc.base);
    
        IntModSub(NULL, &a, &b, &m);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int base         = IntFrom(3, &alloc.base);
        Int mod          = IntFrom(17, &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        Int base         = IntFrom(3, &alloc.base);
        Int mod          = IntFrom(17, &alloc.base);
        Int result_value = IntInit(&alloc.base);
        Int base         = IntFrom(3, &alloc.base);
        Int mod          = IntFrom(17, &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        bool ok = IntPowMod(&result_value, &base, 13u, &mod);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int base         = IntFrom(123456789, &alloc.base);
        Int mod          = IntFrom(1000000007, &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        Int base         = IntFrom(123456789, &alloc.base);
        Int mod          = IntFrom(1000000007, &alloc.base);
        Int result_value = IntInit(&alloc.base);
        Int base         = IntFrom(123456789, &alloc.base);
        Int mod          = IntFrom(1000000007, &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        bool ok = IntPowMod(&result_value, &base, 0u, &mod);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int base         = IntFrom(2, &alloc.base);
        Int mod          = IntFrom(1000000007, &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        Int base         = IntFrom(2, &alloc.base);
        Int mod          = IntFrom(1000000007, &alloc.base);
        Int result_value = IntInit(&alloc.base);
        Int base         = IntFrom(2, &alloc.base);
        Int mod          = IntFrom(1000000007, &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        bool ok = IntPowMod(&result_value, &base, 64u, &mod);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int base = IntFrom(2, &alloc.base);
        Int mod  = IntFrom(7, &alloc.base);
    
        Int base = IntFrom(2, &alloc.base);
        Int mod  = IntFrom(7, &alloc.base);
    
        IntPowMod((Int *)NULL, &base, 5u, &mod);
        Int mod  = IntFrom(7, &alloc.base);
    
        IntPowMod((Int *)NULL, &base, 5u, &mod);
    
        DefaultAllocatorDeinit(&alloc);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int result_value = IntInit(&alloc.base);
        Int mod          = IntFrom(7, &alloc.base);
    
        Int result_value = IntInit(&alloc.base);
        Int mod          = IntFrom(7, &alloc.base);
    
        IntPowMod(&result_value, (Int *)NULL, 5u, &mod);
        Int mod          = IntFrom(7, &alloc.base);
    
        IntPowMod(&result_value, (Int *)NULL, 5u, &mod);
    
        DefaultAllocatorDeinit(&alloc);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int result_value = IntInit(&alloc.base);
        Int base         = IntFrom(2, &alloc.base);
    
        Int result_value = IntInit(&alloc.base);
        Int base         = IntFrom(2, &alloc.base);
    
        IntPowMod(&result_value, &base, 5u, (Int *)NULL);
        Int base         = IntFrom(2, &alloc.base);
    
        IntPowMod(&result_value, &base, 5u, (Int *)NULL);
    
        DefaultAllocatorDeinit(&alloc);
        Allocator     *a   = ALLOCATOR_OF(&dbg);
    
        Int x = IntFrom(123456u, a);
        Int y = IntFrom(7891011u, a);
        Int r = IntInit(a);
    
        Int x = IntFrom(123456u, a);
        Int y = IntFrom(7891011u, a);
        Int r = IntInit(a);
        Int x = IntFrom(123456u, a);
        Int y = IntFrom(7891011u, a);
        Int r = IntInit(a);
    
        bool ok = IntMul(&r, &x, &y);
        Allocator     *a   = ALLOCATOR_OF(&dbg);
    
        Int x = IntFrom(0u, a);
        Int y = IntFrom(7891011u, a);
        Int r = IntFrom(42u, a); // r starts non-empty so the internal deinit matters
    
        Int x = IntFrom(0u, a);
        Int y = IntFrom(7891011u, a);
        Int r = IntFrom(42u, a); // r starts non-empty so the internal deinit matters
        Int x = IntFrom(0u, a);
        Int y = IntFrom(7891011u, a);
        Int r = IntFrom(42u, a); // r starts non-empty so the internal deinit matters
    
        bool ok = IntMul(&r, &x, &y);
        Allocator     *a   = ALLOCATOR_OF(&dbg);
    
        Int x = IntFrom(0xFFFFFFFFull, a);
        Int y = IntFrom(0xFFFFFFFFull, a);
        Int r = IntFrom(7u, a);
    
        Int x = IntFrom(0xFFFFFFFFull, a);
        Int y = IntFrom(0xFFFFFFFFull, a);
        Int r = IntFrom(7u, a);
        Int x = IntFrom(0xFFFFFFFFull, a);
        Int y = IntFrom(0xFFFFFFFFull, a);
        Int r = IntFrom(7u, a);
    
        bool ok = IntAdd(&r, &x, &y);
        Allocator     *a   = ALLOCATOR_OF(&dbg);
    
        Int x = IntFrom(1000000u, a);
        Int y = IntFrom(999983u, a);
        Int r = IntFrom(7u, a);
    
        Int x = IntFrom(1000000u, a);
        Int y = IntFrom(999983u, a);
        Int r = IntFrom(7u, a);
        Int x = IntFrom(1000000u, a);
        Int y = IntFrom(999983u, a);
        Int r = IntFrom(7u, a);
    
        bool ok = IntSub(&r, &x, &y);
        // IntAdd with a u64 operand drives int_add_u64 -> int_add_u64_in_place,
        // which frees lhs/rhs temporaries on success (lines 276/277).
        Int x = IntFrom(500u, a);
        Int r = IntFrom(7u, a);
        // which frees lhs/rhs temporaries on success (lines 276/277).
        Int x = IntFrom(500u, a);
        Int r = IntFrom(7u, a);
    
        bool ok = IntAdd(&r, &x, 250u);
        // IntMul with a u64 operand drives int_mul_u64 -> int_mul_u64_in_place,
        // which frees lhs/rhs temporaries on success (lines 251/252).
        Int x = IntFrom(500u, a);
        Int r = IntFrom(7u, a);
        // which frees lhs/rhs temporaries on success (lines 251/252).
        Int x = IntFrom(500u, a);
        Int r = IntFrom(7u, a);
    
        bool ok = IntMul(&r, &x, 13u);
        Allocator     *a   = ALLOCATOR_OF(&dbg);
    
        Int x = IntFrom(1000u, a);
        Int r = IntFrom(7u, a);
    
        Int x = IntFrom(1000u, a);
        Int r = IntFrom(7u, a);
    
        bool ok = IntSub(&r, &x, 250u); // int_sub_u64 frees rhs on success (1187)
        // dividend >= divisor drives the long-division branch (lines 1378..1411,
        // 1420..1423 replace/deinit).
        Int dvd = IntFrom(1000003u, a);
        Int dvs = IntFrom(101u, a);
        Int q   = IntFrom(7u, a);
        // 1420..1423 replace/deinit).
        Int dvd = IntFrom(1000003u, a);
        Int dvs = IntFrom(101u, a);
        Int q   = IntFrom(7u, a);
        Int r   = IntFrom(9u, a);
        Int dvd = IntFrom(1000003u, a);
        Int dvs = IntFrom(101u, a);
        Int q   = IntFrom(7u, a);
        Int r   = IntFrom(9u, a);
        Int dvs = IntFrom(101u, a);
        Int q   = IntFrom(7u, a);
        Int r   = IntFrom(9u, a);
    
        bool ok = IntDivMod(&q, &r, &dvd, &dvs);
    
        // dividend < divisor drives the else branch (line 1413: deinit+reinit q).
        Int dvd = IntFrom(50u, a);
        Int dvs = IntFrom(101u, a);
        Int q   = IntFrom(7u, a);
        // dividend < divisor drives the else branch (line 1413: deinit+reinit q).
        Int dvd = IntFrom(50u, a);
        Int dvs = IntFrom(101u, a);
        Int q   = IntFrom(7u, a);
        Int r   = IntFrom(9u, a);
        Int dvd = IntFrom(50u, a);
        Int dvs = IntFrom(101u, a);
        Int q   = IntFrom(7u, a);
        Int r   = IntFrom(9u, a);
        Int dvs = IntFrom(101u, a);
        Int q   = IntFrom(7u, a);
        Int r   = IntFrom(9u, a);
    
        bool ok = IntDivMod(&q, &r, &dvd, &dvs);
        Allocator     *a   = ALLOCATOR_OF(&dbg);
    
        Int dvd = IntFrom(1000003u, a);
        Int dvs = IntFrom(101u, a);
        Int r   = IntFrom(7u, a);
    
        Int dvd = IntFrom(1000003u, a);
        Int dvs = IntFrom(101u, a);
        Int r   = IntFrom(7u, a);
        Int dvd = IntFrom(1000003u, a);
        Int dvs = IntFrom(101u, a);
        Int r   = IntFrom(7u, a);
    
        bool ok = IntDiv(&r, &dvd, &dvs); // int_div frees remainder on success (1445)
        Allocator     *a   = ALLOCATOR_OF(&dbg);
    
        Int dvd = IntFrom(1000u, a);
        Int dvs = IntFrom(8u, a);
        Int r   = IntFrom(7u, a);
    
        Int dvd = IntFrom(1000u, a);
        Int dvs = IntFrom(8u, a);
        Int r   = IntFrom(7u, a);
        Int dvd = IntFrom(1000u, a);
        Int dvs = IntFrom(8u, a);
        Int r   = IntFrom(7u, a);
    
        bool ok = IntDivExact(&r, &dvd, &dvs); // frees remainder on success (1474)
        // int_div_u64 / int_div_exact_u64 / int_div_i64 etc. free divisor_value
        // on success (1488, 1514, 1501, 1527).
        Int dvd = IntFrom(1000u, a);
        Int r1  = IntFrom(7u, a);
        Int r2  = IntFrom(7u, a);
        // on success (1488, 1514, 1501, 1527).
        Int dvd = IntFrom(1000u, a);
        Int r1  = IntFrom(7u, a);
        Int r2  = IntFrom(7u, a);
        Int r3  = IntFrom(7u, a);
        Int dvd = IntFrom(1000u, a);
        Int r1  = IntFrom(7u, a);
        Int r2  = IntFrom(7u, a);
        Int r3  = IntFrom(7u, a);
        Int r1  = IntFrom(7u, a);
        Int r2  = IntFrom(7u, a);
        Int r3  = IntFrom(7u, a);
    
        bool ok = IntDiv(&r1, &dvd, 8u);
        // int_div_mod_u64 / int_div_mod_i64 free divisor_value on success
        // (1540, 1553); int_mod_u64_into / int_mod_i64_into free quotient (1607/1615).
        Int dvd = IntFrom(1003u, a);
        Int q   = IntFrom(7u, a);
        Int r   = IntFrom(7u, a);
        // (1540, 1553); int_mod_u64_into / int_mod_i64_into free quotient (1607/1615).
        Int dvd = IntFrom(1003u, a);
        Int q   = IntFrom(7u, a);
        Int r   = IntFrom(7u, a);
        Int m1  = IntFrom(7u, a);
        Int dvd = IntFrom(1003u, a);
        Int q   = IntFrom(7u, a);
        Int r   = IntFrom(7u, a);
        Int m1  = IntFrom(7u, a);
        Int m2  = IntFrom(7u, a);
        Int q   = IntFrom(7u, a);
        Int r   = IntFrom(7u, a);
        Int m1  = IntFrom(7u, a);
        Int m2  = IntFrom(7u, a);
        Int r   = IntFrom(7u, a);
        Int m1  = IntFrom(7u, a);
        Int m2  = IntFrom(7u, a);
    
        bool ok = IntDivMod(&q, &r, &dvd, 100u);
        Allocator     *a   = ALLOCATOR_OF(&dbg);
    
        Int dvd = IntFrom(1003u, a);
        Int dvs = IntFrom(100u, a);
        Int r   = IntFrom(7u, a);
    
        Int dvd = IntFrom(1003u, a);
        Int dvs = IntFrom(100u, a);
        Int r   = IntFrom(7u, a);
        Int dvd = IntFrom(1003u, a);
        Int dvs = IntFrom(100u, a);
        Int r   = IntFrom(7u, a);
    
        bool ok = IntMod(&r, &dvd, &dvs); // int_mod frees quotient on success (1598)
        // exponent 13 = 0b1101 hits both the multiply-acc branch (1317) and the
        // square-current branch (1331), and final current/acc cleanup (1336).
        Int base = IntFrom(3u, a);
        Int r    = IntFrom(7u, a);
        // square-current branch (1331), and final current/acc cleanup (1336).
        Int base = IntFrom(3u, a);
        Int r    = IntFrom(7u, a);
    
        bool ok = IntPow(&r, &base, 13u);
    
        // Euclid loop frees x each iteration (1657), final y cleanup (1663).
        Int x = IntFrom(123456u, a);
        Int y = IntFrom(7890u, a);
        Int r = IntFrom(7u, a);
        // Euclid loop frees x each iteration (1657), final y cleanup (1663).
        Int x = IntFrom(123456u, a);
        Int y = IntFrom(7890u, a);
        Int r = IntFrom(7u, a);
        Int x = IntFrom(123456u, a);
        Int y = IntFrom(7890u, a);
        Int r = IntFrom(7u, a);
    
        bool ok = IntGCD(&r, &x, &y);
    
        // Success path frees gcd + quotient (1689/1690).
        Int x = IntFrom(21u, a);
        Int y = IntFrom(6u, a);
        Int r = IntFrom(7u, a);
        // Success path frees gcd + quotient (1689/1690).
        Int x = IntFrom(21u, a);
        Int y = IntFrom(6u, a);
        Int r = IntFrom(7u, a);
        Int x = IntFrom(21u, a);
        Int y = IntFrom(6u, a);
        Int r = IntFrom(7u, a);
    
        bool ok = IntLCM(&r, &x, &y);
        // Non-trivial cube root drives the bisection loop: low/high/mid/mid_pow
        // deinits (1813,1819,1832,1837,1838), the final block (1855..1858).
        Int v    = IntFrom(1000000u, a);
        Int root = IntFrom(7u, a);
        Int rem  = IntFrom(9u, a);
        // deinits (1813,1819,1832,1837,1838), the final block (1855..1858).
        Int v    = IntFrom(1000000u, a);
        Int root = IntFrom(7u, a);
        Int rem  = IntFrom(9u, a);
        Int v    = IntFrom(1000000u, a);
        Int root = IntFrom(7u, a);
        Int rem  = IntFrom(9u, a);
    
        bool ok = IntRootRem(&root, &rem, &v, 3); // 100^3 = 1e6
    
        // Inexact root exercises the cmp>0 branch (1819/1822/1832 high update).
        Int v    = IntFrom(1000u, a);
        Int root = IntFrom(7u, a);
        Int rem  = IntFrom(9u, a);
        // Inexact root exercises the cmp>0 branch (1819/1822/1832 high update).
        Int v    = IntFrom(1000u, a);
        Int root = IntFrom(7u, a);
        Int rem  = IntFrom(9u, a);
        Int v    = IntFrom(1000u, a);
        Int root = IntFrom(7u, a);
        Int rem  = IntFrom(9u, a);
    
        bool ok = IntRootRem(&root, &rem, &v, 3); // cbrt(1000)=10 exact actually
    
        // and a genuinely inexact one
        Int v2 = IntFrom(999u, a);
        ok     = ok && IntRootRem(&root, &rem, &v2, 3);
        ok     = ok && IntToU64(&root) == 9u && IntToU64(&rem) == 999u - 729u;
        Allocator     *a   = ALLOCATOR_OF(&dbg);
    
        Int v = IntFrom(1000000u, a);
        Int r = IntFrom(7u, a);
    
        Int v = IntFrom(1000000u, a);
        Int r = IntFrom(7u, a);
    
        bool ok = IntRoot(&r, &v, 3); // frees remainder on success (1877)
    
        // Frees root + remainder on success (1904/1905).
        Int sq  = IntFrom(123201u, a); // 351^2
        Int nsq = IntFrom(123202u, a);
        // Frees root + remainder on success (1904/1905).
        Int sq  = IntFrom(123201u, a); // 351^2
        Int nsq = IntFrom(123202u, a);
    
        bool ok = IntIsPerfectSquare(&sq) && !IntIsPerfectSquare(&nsq);
    
        // Loop frees root + remainder each degree (1934/1935).
        Int pw  = IntFrom(7776u, a); // 6^5
        Int npw = IntFrom(7777u, a);
        // Loop frees root + remainder each degree (1934/1935).
        Int pw  = IntFrom(7776u, a); // 6^5
        Int npw = IntFrom(7777u, a);
    
        bool ok = IntIsPerfectPower(&pw) && !IntIsPerfectPower(&npw);
        // Drives the main loop (swap, even-stripping 1972, inner deinits) and both
        // tail branches: result-1 path (1998) and nn!=1 -> 0 path requires gcd!=1.
        Int x  = IntFrom(1001u, a);
        Int n  = IntFrom(9907u, a); // prime
        int jr = 0;
        // tail branches: result-1 path (1998) and nn!=1 -> 0 path requires gcd!=1.
        Int x  = IntFrom(1001u, a);
        Int n  = IntFrom(9907u, a); // prime
        int jr = 0;
    
        // a case where gcd(a,n) != 1 -> the *out=0 branch (frees nn at 1998)
        Int x2  = IntFrom(15u, a);
        Int n2  = IntFrom(9u, a); // odd, gcd(15,9)=3
        int jr2 = 0;
        // a case where gcd(a,n) != 1 -> the *out=0 branch (frees nn at 1998)
        Int x2  = IntFrom(15u, a);
        Int n2  = IntFrom(9u, a); // odd, gcd(15,9)=3
        int jr2 = 0;
        ok      = ok && IntTryJacobi(&jr2, &x2, &n2) && jr2 == 0;
        Allocator     *a   = ALLOCATOR_OF(&dbg);
    
        Int x = IntFrom(12345u, a);
        Int y = IntFrom(67890u, a);
        Int m = IntFrom(1009u, a);
    
        Int x = IntFrom(12345u, a);
        Int y = IntFrom(67890u, a);
        Int m = IntFrom(1009u, a);
        Int r = IntFrom(7u, a);
        Int x = IntFrom(12345u, a);
        Int y = IntFrom(67890u, a);
        Int m = IntFrom(1009u, a);
        Int r = IntFrom(7u, a);
        Int y = IntFrom(67890u, a);
        Int m = IntFrom(1009u, a);
        Int r = IntFrom(7u, a);
    
        bool ok = IntModAdd(&r, &x, &y, &m); // frees ar/br/sum on success (2042-2044)
    
        // ar >= br branch (2098/2099 frees ar/br).
        Int x = IntFrom(900u, a);
        Int y = IntFrom(100u, a);
        Int m = IntFrom(1009u, a);
        // ar >= br branch (2098/2099 frees ar/br).
        Int x = IntFrom(900u, a);
        Int y = IntFrom(100u, a);
        Int m = IntFrom(1009u, a);
        Int r = IntFrom(7u, a);
        Int x = IntFrom(900u, a);
        Int y = IntFrom(100u, a);
        Int m = IntFrom(1009u, a);
        Int r = IntFrom(7u, a);
        Int y = IntFrom(100u, a);
        Int m = IntFrom(1009u, a);
        Int r = IntFrom(7u, a);
    
        bool ok = IntModSub(&r, &x, &y, &m);
    
        // ar < br branch: nonzero diff -> modulus-diff (2095 frees diff).
        Int x = IntFrom(100u, a);
        Int y = IntFrom(900u, a);
        Int m = IntFrom(1009u, a);
        // ar < br branch: nonzero diff -> modulus-diff (2095 frees diff).
        Int x = IntFrom(100u, a);
        Int y = IntFrom(900u, a);
        Int m = IntFrom(1009u, a);
        Int r = IntFrom(7u, a);
        Int x = IntFrom(100u, a);
        Int y = IntFrom(900u, a);
        Int m = IntFrom(1009u, a);
        Int r = IntFrom(7u, a);
        Int y = IntFrom(900u, a);
        Int m = IntFrom(1009u, a);
        Int r = IntFrom(7u, a);
    
        bool ok = IntModSub(&r, &x, &y, &m);
        // Instead exercise the ar<br with diff==0 by x=0 mod m, y=0 mod m won't.
        // Use the generic ar<br path already covered; here cover equal-after-mod.
        Int x = IntFrom(5u, a);
        Int y = IntFrom(5u, a);
        Int m = IntFrom(1009u, a);
        // Use the generic ar<br path already covered; here cover equal-after-mod.
        Int x = IntFrom(5u, a);
        Int y = IntFrom(5u, a);
        Int m = IntFrom(1009u, a);
        Int r = IntFrom(7u, a);
        Int x = IntFrom(5u, a);
        Int y = IntFrom(5u, a);
        Int m = IntFrom(1009u, a);
        Int r = IntFrom(7u, a);
        Int y = IntFrom(5u, a);
        Int m = IntFrom(1009u, a);
        Int r = IntFrom(7u, a);
    
        bool ok = IntModSub(&r, &x, &y, &m);
        Allocator     *a   = ALLOCATOR_OF(&dbg);
    
        Int x = IntFrom(12345u, a);
        Int y = IntFrom(67890u, a);
        Int m = IntFrom(1009u, a);
    
        Int x = IntFrom(12345u, a);
        Int y = IntFrom(67890u, a);
        Int m = IntFrom(1009u, a);
        Int r = IntFrom(7u, a);
        Int x = IntFrom(12345u, a);
        Int y = IntFrom(67890u, a);
        Int m = IntFrom(1009u, a);
        Int r = IntFrom(7u, a);
        Int y = IntFrom(67890u, a);
        Int m = IntFrom(1009u, a);
        Int r = IntFrom(7u, a);
    
        bool ok = IntModMul(&r, &x, &y, &m); // frees ar/br/prod (2126-2128)
        Allocator     *a   = ALLOCATOR_OF(&dbg);
    
        Int x = IntFrom(12345u, a);
        Int m = IntFrom(1009u, a);
        Int r = IntFrom(7u, a);
    
        Int x = IntFrom(12345u, a);
        Int m = IntFrom(1009u, a);
        Int r = IntFrom(7u, a);
        Int x = IntFrom(12345u, a);
        Int m = IntFrom(1009u, a);
        Int r = IntFrom(7u, a);
    
        bool ok = IntSquareMod(&r, &x, &m);
    
        // IntModDiv frees inverse on success (2160).
        Int x = IntFrom(42u, a);
        Int y = IntFrom(5u, a);
        Int m = IntFrom(1009u, a);
        // IntModDiv frees inverse on success (2160).
        Int x = IntFrom(42u, a);
        Int y = IntFrom(5u, a);
        Int m = IntFrom(1009u, a);
        Int r = IntFrom(7u, a);
        Int x = IntFrom(42u, a);
        Int y = IntFrom(5u, a);
        Int m = IntFrom(1009u, a);
        Int r = IntFrom(7u, a);
        Int y = IntFrom(5u, a);
        Int m = IntFrom(1009u, a);
        Int r = IntFrom(7u, a);
    
        bool ok = IntModDiv(&r, &x, &y, &m);
        // int_pow_u64_mod: multiply-acc (2201) and square (2215), final cleanup
        // (2220 frees base_mod).
        Int base = IntFrom(7u, a);
        Int m    = IntFrom(1000000007u, a);
        Int r    = IntFrom(9u, a);
        // (2220 frees base_mod).
        Int base = IntFrom(7u, a);
        Int m    = IntFrom(1000000007u, a);
        Int r    = IntFrom(9u, a);
        Int base = IntFrom(7u, a);
        Int m    = IntFrom(1000000007u, a);
        Int r    = IntFrom(9u, a);
    
        bool ok = IntPowMod(&r, &base, 13u, &m);
    
        // int_pow_mod (Int exponent) main loop + final base_mod/exp cleanup.
        Int base = IntFrom(7u, a);
        Int exp  = IntFrom(13u, a);
        Int m    = IntFrom(1000000007u, a);
        // int_pow_mod (Int exponent) main loop + final base_mod/exp cleanup.
        Int base = IntFrom(7u, a);
        Int exp  = IntFrom(13u, a);
        Int m    = IntFrom(1000000007u, a);
        Int r    = IntFrom(9u, a);
        Int base = IntFrom(7u, a);
        Int exp  = IntFrom(13u, a);
        Int m    = IntFrom(1000000007u, a);
        Int r    = IntFrom(9u, a);
        Int exp  = IntFrom(13u, a);
        Int m    = IntFrom(1000000007u, a);
        Int r    = IntFrom(9u, a);
    
        bool ok = IntPowMod(&r, &base, &exp, &m);
        Allocator     *a   = ALLOCATOR_OF(&dbg);
    
        Int v = IntFrom(17u, a);
        Int m = IntFrom(3120u, a); // gcd(17,3120)=1
        Int r = IntFrom(7u, a);
    
        Int v = IntFrom(17u, a);
        Int m = IntFrom(3120u, a); // gcd(17,3120)=1
        Int r = IntFrom(7u, a);
        Int v = IntFrom(17u, a);
        Int m = IntFrom(3120u, a); // gcd(17,3120)=1
        Int r = IntFrom(7u, a);
    
        bool ok = IntModInv(&r, &v, &m);
        // t.negative && !zero branch (modulus - mag_mod, frees positive/mag_mod
        // and mag_mod at 2414).
        Int v = IntFrom(3u, a);
        Int m = IntFrom(7u, a); // inverse of 3 mod 7 is 5
        Int r = IntFrom(9u, a);
        // and mag_mod at 2414).
        Int v = IntFrom(3u, a);
        Int m = IntFrom(7u, a); // inverse of 3 mod 7 is 5
        Int r = IntFrom(9u, a);
        Int v = IntFrom(3u, a);
        Int m = IntFrom(7u, a); // inverse of 3 mod 7 is 5
        Int r = IntFrom(9u, a);
    
        bool ok = IntModInv(&r, &v, &m);
        // false; the function still frees reduced/r/new_r/one/t/new_t at the tail
        // (2419-2424). All those carry allocations.
        Int v = IntFrom(6u, a);
        Int m = IntFrom(9u, a);           // gcd(6,9)=3, no inverse
        Int r = IntFrom(7u, a);
        // (2419-2424). All those carry allocations.
        Int v = IntFrom(6u, a);
        Int m = IntFrom(9u, a);           // gcd(6,9)=3, no inverse
        Int r = IntFrom(7u, a);
        Int v = IntFrom(6u, a);
        Int m = IntFrom(9u, a);           // gcd(6,9)=3, no inverse
        Int r = IntFrom(7u, a);
    
        bool ok = !IntModInv(&r, &v, &m); // returns false
    
        // modulus 7 (7 % 4 == 3) drives the fast path: frees exponent + a (2488/2489).
        Int v = IntFrom(2u, a); // 2 is QR mod 7 (3^2=2)
        Int m = IntFrom(7u, a);
        Int r = IntFrom(9u, a);
        // modulus 7 (7 % 4 == 3) drives the fast path: frees exponent + a (2488/2489).
        Int v = IntFrom(2u, a); // 2 is QR mod 7 (3^2=2)
        Int m = IntFrom(7u, a);
        Int r = IntFrom(9u, a);
        Int v = IntFrom(2u, a); // 2 is QR mod 7 (3^2=2)
        Int m = IntFrom(7u, a);
        Int r = IntFrom(9u, a);
    
        bool ok = IntModSqrt(&r, &v, &m);
        // the witness-search loop, the t-loop with t_power/b/b_sq, and the success
        // int_replace path (2724-2735). 2 is a QR mod 17 (6^2=36=2).
        Int v = IntFrom(2u, a);
        Int m = IntFrom(17u, a);
        Int r = IntFrom(9u, a);
        // int_replace path (2724-2735). 2 is a QR mod 17 (6^2=36=2).
        Int v = IntFrom(2u, a);
        Int m = IntFrom(17u, a);
        Int r = IntFrom(9u, a);
        Int v = IntFrom(2u, a);
        Int m = IntFrom(17u, a);
        Int r = IntFrom(9u, a);
    
        bool ok = IntModSqrt(&r, &v, &m);
        // modulus 41 (41 % 4 == 1, 41-1 = 40 = 8*5 so m=3 levels) drives the inner
        // b-squaring loop (2662) and the c/t/b reassignments more deeply.
        Int v = IntFrom(10u, a); // 10 is QR mod 41 (16^2=256=256-246=10)
        Int m = IntFrom(41u, a);
        Int r = IntFrom(9u, a);
        // b-squaring loop (2662) and the c/t/b reassignments more deeply.
        Int v = IntFrom(10u, a); // 10 is QR mod 41 (16^2=256=256-246=10)
        Int m = IntFrom(41u, a);
        Int r = IntFrom(9u, a);
        Int v = IntFrom(10u, a); // 10 is QR mod 41 (16^2=256=256-246=10)
        Int m = IntFrom(41u, a);
        Int r = IntFrom(9u, a);
    
        bool ok = IntModSqrt(&r, &v, &m);
    
        // value % modulus == 0 -> zero branch frees a (2449).
        Int v = IntFrom(0u, a);
        Int m = IntFrom(17u, a);
        Int r = IntFrom(9u, a);
        // value % modulus == 0 -> zero branch frees a (2449).
        Int v = IntFrom(0u, a);
        Int m = IntFrom(17u, a);
        Int r = IntFrom(9u, a);
        Int v = IntFrom(0u, a);
        Int m = IntFrom(17u, a);
        Int r = IntFrom(9u, a);
    
        bool ok = IntModSqrt(&r, &v, &m) && IntIsZero(&r);
        // modulus 2 path: int_replace(result, &a) (no extra deinit, but reaches
        // the compare-u64==2 branch); a is moved into result.
        Int v = IntFrom(1u, a);
        Int m = IntFrom(2u, a);
        Int r = IntFrom(9u, a);
        // the compare-u64==2 branch); a is moved into result.
        Int v = IntFrom(1u, a);
        Int m = IntFrom(2u, a);
        Int r = IntFrom(9u, a);
        Int v = IntFrom(1u, a);
        Int m = IntFrom(2u, a);
        Int r = IntFrom(9u, a);
    
        bool ok = IntModSqrt(&r, &v, &m) && IntToU64(&r) == 1u;
        // jacobi != 1 -> non-residue, frees a and returns false (2473's deinit at
        // the early non-residue return). 3 is a non-residue mod 7.
        Int v = IntFrom(3u, a);
        Int m = IntFrom(7u, a);
        Int r = IntFrom(9u, a);
        // the early non-residue return). 3 is a non-residue mod 7.
        Int v = IntFrom(3u, a);
        Int m = IntFrom(7u, a);
        Int r = IntFrom(9u, a);
        Int v = IntFrom(3u, a);
        Int m = IntFrom(7u, a);
        Int r = IntFrom(9u, a);
    
        bool ok = !IntModSqrt(&r, &v, &m);
    
        // composite (non-prime) odd modulus -> !prime branch frees a (2465).
        Int v = IntFrom(2u, a);
        Int m = IntFrom(9u, a); // odd composite
        Int r = IntFrom(9u, a);
        // composite (non-prime) odd modulus -> !prime branch frees a (2465).
        Int v = IntFrom(2u, a);
        Int m = IntFrom(9u, a); // odd composite
        Int r = IntFrom(9u, a);
        Int v = IntFrom(2u, a);
        Int m = IntFrom(9u, a); // odd composite
        Int r = IntFrom(9u, a);
    
        bool ok = !IntModSqrt(&r, &v, &m);
    
        // even modulus (>2) -> IntIsEven branch frees a (2465).
        Int v = IntFrom(3u, a);
        Int m = IntFrom(8u, a);
        Int r = IntFrom(9u, a);
        // even modulus (>2) -> IntIsEven branch frees a (2465).
        Int v = IntFrom(3u, a);
        Int m = IntFrom(8u, a);
        Int r = IntFrom(9u, a);
        Int v = IntFrom(3u, a);
        Int m = IntFrom(8u, a);
        Int r = IntFrom(9u, a);
    
        bool ok = !IntModSqrt(&r, &v, &m);
        // witness inner loop (2839), per-iteration base/x (2853/2854), and the d /
        // n_minus_one tail (2860/2861).
        Int prime     = IntFrom(1000003u, a); // prime
        Int composite = IntFrom(1000005u, a); // composite
        // n_minus_one tail (2860/2861).
        Int prime     = IntFrom(1000003u, a); // prime
        Int composite = IntFrom(1000005u, a); // composite
    
        bool ok = IntIsProbablePrime(&prime) && !IntIsProbablePrime(&composite);
        // (squaring x repeatedly) before failing. 2047 = 23*89 passes base 2 (it's
        // a 2-SPRP) but fails on another base -> exercises x squaring (2839).
        Int n = IntFrom(2047u, a);
    
        bool ok = !IntIsProbablePrime(&n);
        // Drives candidate-stepping loop (frees candidate on success at 2924, and
        // the +2 stepping at 2918). Starting from an even-ish composite.
        Int v = IntFrom(1000000u, a);
        Int r = IntFrom(7u, a);
        // the +2 stepping at 2918). Starting from an even-ish composite.
        Int v = IntFrom(1000000u, a);
        Int r = IntFrom(7u, a);
    
        bool ok = IntNextPrime(&r, &v);
        // value <= 1 -> two path (2879 int_replace) and the candidate<=2 path
        // (2902/2903 frees candidate then replaces with two).
        Int v0 = IntFrom(0u, a);
        Int r0 = IntFrom(7u, a);
        Int v1 = IntFrom(2u, a);
        // (2902/2903 frees candidate then replaces with two).
        Int v0 = IntFrom(0u, a);
        Int r0 = IntFrom(7u, a);
        Int v1 = IntFrom(2u, a);
        Int r1 = IntFrom(7u, a);
        Int v0 = IntFrom(0u, a);
        Int r0 = IntFrom(7u, a);
        Int v1 = IntFrom(2u, a);
        Int r1 = IntFrom(7u, a);
        Int r0 = IntFrom(7u, a);
        Int v1 = IntFrom(2u, a);
        Int r1 = IntFrom(7u, a);
    
        bool ok = IntNextPrime(&r0, &v0) && IntToU64(&r0) == 2u;
        Allocator     *a   = ALLOCATOR_OF(&dbg);
    
        Int x = IntFrom(123456u, a);
        Int y = IntFrom(7891011u, a);
        Int r = IntFrom(0xDEADBEEFu, a); // pre-populated: holds a live buffer
    
        Int x = IntFrom(123456u, a);
        Int y = IntFrom(7891011u, a);
        Int r = IntFrom(0xDEADBEEFu, a); // pre-populated: holds a live buffer
        Int x = IntFrom(123456u, a);
        Int y = IntFrom(7891011u, a);
        Int r = IntFrom(0xDEADBEEFu, a); // pre-populated: holds a live buffer
    
        bool ok = IntMul(&r, &x, &y);
        Allocator     *a   = ALLOCATOR_OF(&dbg);
    
        Int dvd = IntFrom(1000u, a);
        Int r   = IntFrom(7u, a);
    
        Int dvd = IntFrom(1000u, a);
        Int r   = IntFrom(7u, a);
    
        bool ok = IntDivExact(&r, &dvd, (i64)8);
            for (u64 si = 0; si < samples && ok; si++) {
                u64 vv = 1u + (si * (p - 2u)) / (samples - 1u);
                Int v  = IntFrom(vv, a);
                Int m  = IntFrom(p, a);
                Int r  = IntFrom(9u, a);
                u64 vv = 1u + (si * (p - 2u)) / (samples - 1u);
                Int v  = IntFrom(vv, a);
                Int m  = IntFrom(p, a);
                Int r  = IntFrom(9u, a);
                Int v  = IntFrom(vv, a);
                Int m  = IntFrom(p, a);
                Int r  = IntFrom(9u, a);
    
                bool found = IntModSqrt(&r, &v, &m);
        Allocator     *alloc = ALLOCATOR_OF(&dbg);
    
        Int value   = IntFrom(7u, alloc);
        Int modulus = IntFrom(40u, alloc); // 7 * 23 = 161 = 1 (mod 40)
        Int inverse = IntFrom(0u, alloc);
    
        Int value   = IntFrom(7u, alloc);
        Int modulus = IntFrom(40u, alloc); // 7 * 23 = 161 = 1 (mod 40)
        Int inverse = IntFrom(0u, alloc);
        Int value   = IntFrom(7u, alloc);
        Int modulus = IntFrom(40u, alloc); // 7 * 23 = 161 = 1 (mod 40)
        Int inverse = IntFrom(0u, alloc);
    
        bool ok = IntModInv(&inverse, &value, &modulus);
        Allocator     *alloc = ALLOCATOR_OF(&dbg);
    
        Int value   = IntFrom(9u, alloc);
        Int modulus = IntFrom(41u, alloc); // 41-1 = 8*5 -> several Tonelli rounds
        Int root    = IntFrom(0u, alloc);
    
        Int value   = IntFrom(9u, alloc);
        Int modulus = IntFrom(41u, alloc); // 41-1 = 8*5 -> several Tonelli rounds
        Int root    = IntFrom(0u, alloc);
        Int check   = IntFrom(0u, alloc);
        Int value   = IntFrom(9u, alloc);
        Int modulus = IntFrom(41u, alloc); // 41-1 = 8*5 -> several Tonelli rounds
        Int root    = IntFrom(0u, alloc);
        Int check   = IntFrom(0u, alloc);
        Int modulus = IntFrom(41u, alloc); // 41-1 = 8*5 -> several Tonelli rounds
        Int root    = IntFrom(0u, alloc);
        Int check   = IntFrom(0u, alloc);
    
        bool ok = IntModSqrt(&root, &value, &modulus);
        Allocator     *alloc = ALLOCATOR_OF(&dbg);
    
        Int value   = IntFrom(2u, alloc);
        Int modulus = IntFrom(7u, alloc); // 7 % 4 == 3
        Int root    = IntFrom(0u, alloc);
    
        Int value   = IntFrom(2u, alloc);
        Int modulus = IntFrom(7u, alloc); // 7 % 4 == 3
        Int root    = IntFrom(0u, alloc);
        Int check   = IntFrom(0u, alloc);
        Int value   = IntFrom(2u, alloc);
        Int modulus = IntFrom(7u, alloc); // 7 % 4 == 3
        Int root    = IntFrom(0u, alloc);
        Int check   = IntFrom(0u, alloc);
        Int modulus = IntFrom(7u, alloc); // 7 % 4 == 3
        Int root    = IntFrom(0u, alloc);
        Int check   = IntFrom(0u, alloc);
    
        bool ok = IntModSqrt(&root, &value, &modulus);
        Allocator     *alloc = ALLOCATOR_OF(&dbg);
    
        Int m = IntFrom(7u, alloc);
        Int r = IntFrom(0u, alloc);
    
        Int m = IntFrom(7u, alloc);
        Int r = IntFrom(0u, alloc);
    
        // ar >= br branch: 5 - 2 = 3 (mod 7)
    
        // ar >= br branch: 5 - 2 = 3 (mod 7)
        Int  a1 = IntFrom(5u, alloc), b1 = IntFrom(2u, alloc);
        bool ok = IntModSub(&r, &a1, &b1, &m) && IntCompare(&r, 3u) == 0;
        // ar < br branch: 2 - 5 = -3 = 4 (mod 7)
        bool ok = IntModSub(&r, &a1, &b1, &m) && IntCompare(&r, 3u) == 0;
        // ar < br branch: 2 - 5 = -3 = 4 (mod 7)
        Int a2 = IntFrom(2u, alloc), b2 = IntFrom(5u, alloc);
        ok = ok && IntModSub(&r, &a2, &b2, &m) && IntCompare(&r, 4u) == 0;
        // equal branch: 5 - 12 = 0 (mod 7)
        ok = ok && IntModSub(&r, &a2, &b2, &m) && IntCompare(&r, 4u) == 0;
        // equal branch: 5 - 12 = 0 (mod 7)
        Int a3 = IntFrom(5u, alloc), b3 = IntFrom(12u, alloc);
        ok = ok && IntModSub(&r, &a3, &b3, &m) && IntIsZero(&r);
        Allocator     *alloc = ALLOCATOR_OF(&dbg);
    
        Int value = IntFrom(100u, alloc);
        Int next  = IntFrom(0u, alloc);
    
        Int value = IntFrom(100u, alloc);
        Int next  = IntFrom(0u, alloc);
    
        bool ok = IntNextPrime(&next, &value);
        Allocator     *alloc = ALLOCATOR_OF(&dbg);
    
        Int  value = IntFrom(561u, alloc);
        bool error = false;
        bool prime = IntIsProbablePrime(&value, &error);
    
    int main(void) {
        WriteFmt("[INFO] Starting Int.Math tests\n\n");
    
        TestFunction tests[] = {
        int total_deadend_tests = sizeof(deadend_tests) / sizeof(deadend_tests[0]);
    
        return run_test_suite(tests, total_tests, deadend_tests, total_deadend_tests, "Int.Math");
    }
    #include <Misra/Std/Zstr.h>
    #include <Misra/Std/Allocator/Debug.h>
    #include <Misra/Std/Container/Int.h>
    #include <Misra/Std/Log.h>
    #include <Misra/Std/Memory.h>
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value = IntFrom(13, ALLOCATOR_OF(&alloc));
        Str text  = IntToBinary(&value);
    
    bool test_int_bytes_le_round_trip(void) {
        WriteFmt("Testing Int little-endian byte conversion\n");
    
        DefaultAllocator alloc = DefaultAllocatorInit();
        u8  bytes[] = {0x34, 0x12, 0xEF, 0xCD};
        u8  out[4]  = {0};
        Int value   = IntFromBytesLE(bytes, sizeof(bytes), ALLOCATOR_OF(&alloc));
        u64 written = IntToBytesLE(&value, out, sizeof(out));
        Str text    = IntToHexStr(&value);
    
    bool test_int_bytes_be_round_trip(void) {
        WriteFmt("Testing Int big-endian byte conversion\n");
    
        DefaultAllocator alloc = DefaultAllocatorInit();
        u8  bytes[] = {0x12, 0x34, 0x56, 0x78};
        u8  out[4]  = {0};
        Int value   = IntFromBytesBE(bytes, sizeof(bytes), ALLOCATOR_OF(&alloc));
        u64 written = IntToBytesBE(&value, out, sizeof(out));
        Str text    = IntToHexStr(&value);
    
    bool test_int_binary_round_trip(void) {
        WriteFmt("Testing Int binary round trip\n");
    
        DefaultAllocator alloc = DefaultAllocatorInit();
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value = IntFromBinary("001011", ALLOCATOR_OF(&alloc));
        Str text  = IntToBinary(&value);
    
    bool test_int_decimal_round_trip(void) {
        WriteFmt("Testing Int decimal round trip\n");
    
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Zstr digits = "123456789012345678901234567890";
        Int  value  = IntFromStr(digits, ALLOCATOR_OF(&alloc));
        Str  text   = IntToStr(&value);
    
    bool test_int_radix_round_trip(void) {
        WriteFmt("Testing Int radix conversion round trip\n");
    
        DefaultAllocator alloc = DefaultAllocatorInit();
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value = IntFromStrRadix("zz", 36, ALLOCATOR_OF(&alloc));
        Str text  = IntToStrRadix(&value, 36, false);
    
    bool test_int_upper_hex_radix(void) {
        WriteFmt("Testing Int uppercase radix conversion\n");
    
        DefaultAllocator alloc = DefaultAllocatorInit();
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value = IntFrom(0xBEEF, ALLOCATOR_OF(&alloc));
        Str text  = IntToStrRadix(&value, 16, true);
        alloc.base.retry_limit = 4;
    
        Int value = IntFrom(0xBEEF, ALLOCATOR_OF(&alloc));
    
        ok = int_try_to_str_radix(&text, &value, 16, true, ALLOCATOR_OF(&alloc));
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int lhs = IntFromBinary("0001011", ALLOCATOR_OF(&alloc));
        Int rhs = IntFrom(11, ALLOCATOR_OF(&alloc));
    
        Int lhs = IntFromBinary("0001011", ALLOCATOR_OF(&alloc));
        Int rhs = IntFrom(11, ALLOCATOR_OF(&alloc));
    
        bool result = IntCompare(&lhs, &rhs) == 0;
    
    bool test_int_zero_binary(void) {
        WriteFmt("Testing Int zero binary conversion\n");
    
        DefaultAllocator alloc = DefaultAllocatorInit();
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int  zero  = IntFromBinary("0", ALLOCATOR_OF(&alloc));
        Str  text  = IntToBinary(&zero);
        bool error = true;
    
    bool test_int_binary_prefix_and_separators(void) {
        WriteFmt("Testing Int binary prefix and separators\n");
    
        DefaultAllocator alloc = DefaultAllocatorInit();
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value = IntFromBinary("0b1010_0011", ALLOCATOR_OF(&alloc));
    
        bool result = IntToU64(&value) == 163;
    
    bool test_int_octal_round_trip(void) {
        WriteFmt("Testing Int octal round trip\n");
    
        DefaultAllocator alloc = DefaultAllocatorInit();
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value = IntFromOctStr("0o7_55", ALLOCATOR_OF(&alloc));
        Str text  = IntToOctStr(&value);
    
    bool test_int_hex_round_trip(void) {
        WriteFmt("Testing Int hex round trip\n");
    
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Zstr hex   = "deadbeefcafebabe1234";
        Int  value = IntFromHexStr(hex, ALLOCATOR_OF(&alloc));
        Str  text  = IntToHexStr(&value);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int  parsed = IntFromBinary("10a1", ALLOCATOR_OF(&alloc));
        Int  value  = IntInit(ALLOCATOR_OF(&alloc));
        bool result = !IntTryFromBinary(&value, "10a1");
    
        Int  parsed = IntFromBinary("10a1", ALLOCATOR_OF(&alloc));
        Int  value  = IntInit(ALLOCATOR_OF(&alloc));
        bool result = !IntTryFromBinary(&value, "10a1");
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int  parsed = IntFromStr("12x3", ALLOCATOR_OF(&alloc));
        Int  value  = IntInit(ALLOCATOR_OF(&alloc));
        bool result = !IntTryFromStr(&value, "12x3");
    
        Int  parsed = IntFromStr("12x3", ALLOCATOR_OF(&alloc));
        Int  value  = IntInit(ALLOCATOR_OF(&alloc));
        bool result = !IntTryFromStr(&value, "12x3");
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int  parsed = IntFromHexStr("12g3", ALLOCATOR_OF(&alloc));
        Int  value  = IntInit(ALLOCATOR_OF(&alloc));
        bool result = !IntTryFromHexStr(&value, "12g3");
    
        Int  parsed = IntFromHexStr("12g3", ALLOCATOR_OF(&alloc));
        Int  value  = IntInit(ALLOCATOR_OF(&alloc));
        bool result = !IntTryFromHexStr(&value, "12g3");
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int  parsed = IntFromStrRadix("102", 2, ALLOCATOR_OF(&alloc));
        Int  value  = IntInit(ALLOCATOR_OF(&alloc));
        bool result = !IntTryFromStrRadix(&value, "102", 2);
    
        Int  parsed = IntFromStrRadix("102", 2, ALLOCATOR_OF(&alloc));
        Int  value  = IntInit(ALLOCATOR_OF(&alloc));
        bool result = !IntTryFromStrRadix(&value, "102", 2);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int  parsed = IntFromStrRadix("10", 1, ALLOCATOR_OF(&alloc));
        Int  value  = IntInit(ALLOCATOR_OF(&alloc));
        bool result = !IntTryFromStrRadix(&value, "10", 1);
    
        Int  parsed = IntFromStrRadix("10", 1, ALLOCATOR_OF(&alloc));
        Int  value  = IntInit(ALLOCATOR_OF(&alloc));
        bool result = !IntTryFromStrRadix(&value, "10", 1);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int  value = IntFrom(1, ALLOCATOR_OF(&alloc));
        u64  out   = 0;
        bool error = false;
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value = IntFrom(255, ALLOCATOR_OF(&alloc));
        Str text  = IntToStrRadix(&value, 37, false);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value = IntInit(ALLOCATOR_OF(&alloc));
        IntTryFromBinary(&value, (Zstr)NULL);
        IntDeinit(&value);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value = IntInit(ALLOCATOR_OF(&alloc));
        IntTryFromStr(&value, (Zstr)NULL);
        IntDeinit(&value);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value = IntInit(ALLOCATOR_OF(&alloc));
        IntTryFromStrRadix(&value, (Zstr)NULL, 10);
        IntDeinit(&value);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value = IntInit(ALLOCATOR_OF(&alloc));
        IntTryFromOctStr(&value, (Zstr)NULL);
        IntDeinit(&value);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value = IntInit(ALLOCATOR_OF(&alloc));
        IntTryFromHexStr(&value, (Zstr)NULL);
        IntDeinit(&value);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value = IntFrom(1, ALLOCATOR_OF(&alloc));
        IntToBytesLE(&value, NULL, 1);
        DefaultAllocatorDeinit(&alloc);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value = IntFrom(1, ALLOCATOR_OF(&alloc));
        u8  byte  = 0;
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int a       = IntFrom((u64)13u, &alloc.base);
        Int b       = IntFrom((u64)21u, &alloc.base);
        Int product = IntInit(&alloc.base);
    
        Int a       = IntFrom((u64)13u, &alloc.base);
        Int b       = IntFrom((u64)21u, &alloc.base);
        Int product = IntInit(&alloc.base);
        Int a       = IntFrom((u64)13u, &alloc.base);
        Int b       = IntFrom((u64)21u, &alloc.base);
        Int product = IntInit(&alloc.base);
    
        bool ok = IntMul(&product, &a, &b);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int  value  = IntInit(ALLOCATOR_OF(&alloc));
        bool result = !IntTryFromStrRadix(&value, "_", 10);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int  value  = IntInit(ALLOCATOR_OF(&alloc));
        bool ok     = IntTryFromStrRadix(&value, "7", 10);
        bool result = ok && (IntToU64(&value) == 7);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int valid   = IntInit(ALLOCATOR_OF(&alloc));
        Int invalid = IntInit(ALLOCATOR_OF(&alloc));
    
        Int valid   = IntInit(ALLOCATOR_OF(&alloc));
        Int invalid = IntInit(ALLOCATOR_OF(&alloc));
    
        bool ok_valid       = IntTryFromStrRadix(&valid, "5", 10);
    
        Str  text   = StrInitFromZstr("0b101", &alloc);
        Int  out    = IntInit(&alloc.base);
        bool ok     = int_try_from_binary_str(&out, &text);
        bool result = ok && (IntToU64(&out) == 5u);
    
        Str  text   = StrInitFromZstr("0B101", &alloc);
        Int  out    = IntInit(&alloc.base);
        bool ok     = int_try_from_binary_str(&out, &text);
        bool result = ok && (IntToU64(&out) == 5u);
    
        Str  text   = StrInitFromZstr("1101", &alloc);
        Int  out    = IntInit(&alloc.base);
        bool ok     = int_try_from_binary_str(&out, &text);
        bool result = ok && (IntToU64(&out) == 13u);
    
        Str  text   = StrInitFromZstr("0o17", &alloc);
        Int  out    = IntInit(&alloc.base);
        bool ok     = int_try_from_oct_str_str(&out, &text);
        bool result = ok && (IntToU64(&out) == 15u);
    
        Str  text   = StrInitFromZstr("0O17", &alloc);
        Int  out    = IntInit(&alloc.base);
        bool ok     = int_try_from_oct_str_str(&out, &text);
        bool result = ok && (IntToU64(&out) == 15u);
    
        Str  text   = StrInitFromZstr("17", &alloc);
        Int  out    = IntInit(&alloc.base);
        bool ok     = int_try_from_oct_str_str(&out, &text);
        bool result = ok && (IntToU64(&out) == 15u);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int small = IntFrom(7u, &alloc.base);
        Int mid   = IntFrom(255u, &alloc.base);
        Int big   = IntFromStr("123456789012345678901234567890", &alloc.base);
    
        Int small = IntFrom(7u, &alloc.base);
        Int mid   = IntFrom(255u, &alloc.base);
        Int big   = IntFromStr("123456789012345678901234567890", &alloc.base);
        Int small = IntFrom(7u, &alloc.base);
        Int mid   = IntFrom(255u, &alloc.base);
        Int big   = IntFromStr("123456789012345678901234567890", &alloc.base);
    
        Str dec_small = IntToStrRadix(&small, 10, false, &alloc.base);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int parsed_dec = IntFromStrRadix("987654321987654321", 10, &alloc.base);
        Int parsed_hex = IntFromStrRadix("deadbeef", 16, &alloc.base);
    
        Int parsed_dec = IntFromStrRadix("987654321987654321", 10, &alloc.base);
        Int parsed_hex = IntFromStrRadix("deadbeef", 16, &alloc.base);
    
        Str back_dec = IntToStrRadix(&parsed_dec, 10, false, &alloc.base);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int  out    = IntInit(&alloc.base);
        bool parsed = IntTryFromStrRadix(&out, "AZ", 36);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int  out    = IntInit(&alloc.base);
        bool parsed = IntTryFromStrRadix(&out, "FF", 16);
    
        Str  text   = StrInitFromZstr("123", &alloc);
        Int  out    = IntInit(&alloc.base);
        bool parsed = IntTryFromStr(&out, &text);
    
        Str  text   = StrInitFromZstr("+5", &alloc);
        Int  out    = IntInit(&alloc.base);
        bool parsed = IntTryFromStr(&out, &text);
    
        Str  digits = StrInitFromZstr("123", ALLOCATOR_OF(&alloc));
        Int  value  = IntInit(ALLOCATOR_OF(&alloc));
        bool ok     = IntTryFromStrRadix(&value, &digits, 10);
    
        Str  digits = StrInitFromZstr("+5", ALLOCATOR_OF(&alloc));
        Int  value  = IntInit(ALLOCATOR_OF(&alloc));
        bool ok     = IntTryFromStrRadix(&value, &digits, 10);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value     = IntFrom(0x1234, ALLOCATOR_OF(&alloc));
        u8  out[8]    = {0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA};
        u64 written   = IntToBytesLE(&value, out, sizeof(out));
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value   = IntFrom(1, ALLOCATOR_OF(&alloc));
        u8  out[4]  = {0xAA, 0xAA, 0xAA, 0xAA};
        u64 written = IntToBytesLE(&value, out, sizeof(out));
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value     = IntFrom(0x1234, ALLOCATOR_OF(&alloc));
        u8  out[8]    = {0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA};
        u64 written   = IntToBytesBE(&value, out, sizeof(out));
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value   = IntFrom(1, ALLOCATOR_OF(&alloc));
        u8  out[4]  = {0xAA, 0xAA, 0xAA, 0xAA};
        u64 written = IntToBytesBE(&value, out, sizeof(out));
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int         out  = IntInit(&alloc.base);
        const char *text = "+5";
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int         out  = IntInit(&alloc.base);
        const char *text = "42";
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int  out = IntInit(&alloc.base);
        bool ok  = IntTryFromStrRadix(&out, "+5", (u8)10);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int  out = IntInit(&alloc.base);
        bool ok  = IntTryFromOctStr(&out, "17");
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int  out = IntInit(&alloc.base);
        bool ok  = IntTryFromOctStr(&out, "017");
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int a = IntFrom(1, &alloc.base);
        Int b = IntFrom(257, &alloc.base);
    
        Int a = IntFrom(1, &alloc.base);
        Int b = IntFrom(257, &alloc.base);
    
        u64  ha     = int_hash(&a, 0);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value = IntFromBytesBE((const u8 *)0, 0, &alloc.base);
    
        bool fail = (IntCompare(&value, 0u) != 0);
    
        u8  bytes[3] = {0x01, 0x02, 0x03};
        Int value    = IntFromBytesBE(bytes, sizeof(bytes), &alloc.base);
    
        bool fail = (IntCompare(&value, 0x010203u) != 0);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int  out    = IntInit(&alloc.base);
        bool parsed = IntTryFromBinary(&out, "0c1");
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int  out    = IntInit(&alloc.base);
        bool parsed = IntTryFromBinary(&out, "0b101");
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value = IntFromBytesLE(NULL, 0, ALLOCATOR_OF(&alloc));
    
        bool result = IntIsZero(&value);
    
        u8  bytes[] = {0x05, 0x00};
        Int value   = IntFromBytesLE(bytes, sizeof(bytes), ALLOCATOR_OF(&alloc));
    
        bool result = (IntToU64(&value) == 5);
    
        Str digits = StrInitFromZstr("12345", &alloc.base);
        Int value  = IntFromStr(&digits, &alloc.base);
    
        bool result = (IntToU64(&value) == (u64)12345u);
    
        Str digits = StrInitFromZstr("ff", &alloc.base);
        Int value  = IntFromStrRadix(&digits, (u8)16u, &alloc.base);
    
        bool result = (IntToU64(&value) == (u64)255u);
    
        Str hex   = StrInitFromZstr("ff", &alloc.base);
        Int value = IntInit(&alloc.base);
    
        bool ok = int_try_from_hex_str_str(&value, &hex);
    
        Str hex   = StrInitFromZstr("12g3", &alloc.base);
        Int value = IntInit(&alloc.base);
    
        bool ok = int_try_from_hex_str_str(&value, &hex);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value = IntFrom(0x0102, &alloc.base);
        u8  buf[4];
        MemSet(buf, 0xAA, sizeof(buf));
        // Drives int_try_to_str_radix loop (760, 772) and int_div_u64_rem
        // (1583/1584) and int_mod_u64 (1630).
        Int  v   = IntFrom(1234567u, a);
        Str  s   = IntToStrRadix(&v, 10, false, a);
        bool ok  = StrLen(&s) == 7;
        u64  rem = 0;
        {
            Int q = IntInit(a);
            rem   = int_div_u64_rem(&q, &v, 1000u);
            IntDeinit(&q);
    
        u8  bytes[] = {0x01, 0x02, 0x03, 0x04};
        Int v       = IntFromBytesBE(bytes, sizeof(bytes), &dbg);
    
        bool ok = IntToU64(&v) == 0x01020304u;
        Allocator     *a   = ALLOCATOR_OF(&dbg);
    
        Int out = IntFrom(987654321u, a); // pre-populated: holds a live buffer
    
        bool ok = IntTryFromStr(&out, "123456789");
        Allocator     *alloc = ALLOCATOR_OF(&dbg);
    
        Int value  = IntFromStr("123456789012345678901234567890", alloc);
        Str hex    = IntToStrRadix(&value, 16, false, alloc);
        Int parsed = IntFromStrRadix(&hex, 16, alloc);
        Int value  = IntFromStr("123456789012345678901234567890", alloc);
        Str hex    = IntToStrRadix(&value, 16, false, alloc);
        Int parsed = IntFromStrRadix(&hex, 16, alloc);
    
        bool ok = IntCompare(&value, &parsed) == 0;
    
    int main(void) {
        WriteFmt("[INFO] Starting Int.Convert tests\n\n");
    
        TestFunction tests[] = {
        int total_deadend_tests = sizeof(deadend_tests) / sizeof(deadend_tests[0]);
    
        return run_test_suite(tests, total_tests, deadend_tests, total_deadend_tests, "Int.Convert");
    }
    #include <Misra/Std/Allocator/Default.h>
    #include <Misra/Std/Container/Int.h>
    #include <Misra/Std/Log.h>
    #include <Misra/Types.h>
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value = IntFromBinary("00101000", &alloc.base);
    
        bool result = IntBitLength(&value) == 6;
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value = IntFromBinary("0001001000110100", &alloc.base);
    
        bool result = IntByteLength(&value) == 2;
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int zero     = IntInit(&alloc.base);
        Int non_zero = IntFrom(1, &alloc.base);
    
        Int zero     = IntInit(&alloc.base);
        Int non_zero = IntFrom(1, &alloc.base);
    
        bool result = IntIsZero(&zero);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int one = IntFrom(1, &alloc.base);
        Int two = IntFrom(2, &alloc.base);
    
        Int one = IntFrom(1, &alloc.base);
        Int two = IntFrom(2, &alloc.base);
    
        bool result = IntIsOne(&one);
    
    bool test_int_parity(void) {
        WriteFmt("Testing Int parity helpers\n");
    
        DefaultAllocator alloc = DefaultAllocatorInit();
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int even = IntFrom(42, &alloc.base);
        Int odd  = IntFrom(43, &alloc.base);
    
        Int even = IntFrom(42, &alloc.base);
        Int odd  = IntFrom(43, &alloc.base);
    
        bool result = IntIsEven(&even);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int small = IntFrom(UINT64_MAX, &alloc.base);
        Int big   = IntFrom(1, &alloc.base);
    
        Int small = IntFrom(UINT64_MAX, &alloc.base);
        Int big   = IntFrom(1, &alloc.base);
    
        IntShiftLeft(&big, 64);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int  value = IntFrom(1025, &alloc.base);
        bool error = true;
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value = IntFromBinary("1010000", &alloc.base);
        Int zero  = IntInit(&alloc.base);
    
        Int value = IntFromBinary("1010000", &alloc.base);
        Int zero  = IntInit(&alloc.base);
    
        bool result = IntTrailingZeroCount(&value) == 4;
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int one   = IntFrom(1, &alloc.base);
        Int power = IntFrom(1, &alloc.base);
        Int other = IntFrom(24, &alloc.base);
    
        Int one   = IntFrom(1, &alloc.base);
        Int power = IntFrom(1, &alloc.base);
        Int other = IntFrom(24, &alloc.base);
        Int zero  = IntInit(&alloc.base);
        Int one   = IntFrom(1, &alloc.base);
        Int power = IntFrom(1, &alloc.base);
        Int other = IntFrom(24, &alloc.base);
        Int zero  = IntInit(&alloc.base);
        Int power = IntFrom(1, &alloc.base);
        Int other = IntFrom(24, &alloc.base);
        Int zero  = IntInit(&alloc.base);
    
        IntShiftLeft(&power, 20);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int  value = IntInit(&alloc.base);
        bool error = false;
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value     = IntFrom(12345, &alloc.base);
        Int root      = IntFrom(99, &alloc.base);
        Int remainder = IntFrom(77, &alloc.base);
    
        Int value     = IntFrom(12345, &alloc.base);
        Int root      = IntFrom(99, &alloc.base);
        Int remainder = IntFrom(77, &alloc.base);
        Int value     = IntFrom(12345, &alloc.base);
        Int root      = IntFrom(99, &alloc.base);
        Int remainder = IntFrom(77, &alloc.base);
    
        bool ok     = IntRootRem(&root, &remainder, &value, 1);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value = IntFrom(0, &alloc.base);
    
        u64  h      = int_hash(&value, 0);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value = IntFrom(255, &alloc.base);
    
        u64 expected  = 1469598103934665603ULL;
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value = IntFrom(5, &alloc.base);
    
        bool ok     = IntShiftRight(&value, 0);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int  value = IntFrom(7u, &alloc.base);
        bool ok    = IntShiftLeft(&value, 0);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value = IntFrom((u64)40u, &alloc.base);
    
        bool result = (IntBitLength(&value) == 6u);
    ///
    static bool test_m28_bit_length_invalid_deadend(void) {
        WriteFmt("Testing IntBitLength validation on invalid Int\n");
    
        Int invalid = {0};
        WriteFmt("Testing IntBitLength validation on invalid Int\n");
    
        Int invalid = {0};
    
        (void)IntBitLength(&invalid);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int base         = IntFrom(7, &alloc.base);
        Int mod          = IntFrom(13, &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        Int base         = IntFrom(7, &alloc.base);
        Int mod          = IntFrom(13, &alloc.base);
        Int result_value = IntInit(&alloc.base);
        Int base         = IntFrom(7, &alloc.base);
        Int mod          = IntFrom(13, &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        bool ok = IntPowMod(&result_value, &base, 20u, &mod);
    
    int main(void) {
        WriteFmt("[INFO] Starting Int.Access tests\n\n");
    
        TestFunction tests[] = {
        int total_tests         = sizeof(tests) / sizeof(tests[0]);
        int total_deadend_tests = sizeof(deadend_tests) / sizeof(deadend_tests[0]);
        return run_test_suite(tests, total_tests, deadend_tests, total_deadend_tests, "Int.Access");
    }
    #include <Misra/Std/Container/Str.h>
    #include <Misra/Std/Container/BitVec.h>
    #include <Misra/Std/Container/Int.h>
    #include <Misra/Std/Container/Float.h>
    #include <Misra/Std/Io.h>
    
    bool test_int_formatting(void) {
        WriteFmt("Testing Int formatting\n");
    
        DefaultAllocator alloc      = DefaultAllocatorInit();
        bool success = true;
    
        Int big_dec = IntFromStr("123456789012345678901234567890", alloc_base);
        Int hex_val = IntFromHexStr("deadbeefcafebabe1234", alloc_base);
        Int bin_val = IntFromBinary("10100011", alloc_base);
    
        Int big_dec = IntFromStr("123456789012345678901234567890", alloc_base);
        Int hex_val = IntFromHexStr("deadbeefcafebabe1234", alloc_base);
        Int bin_val = IntFromBinary("10100011", alloc_base);
        Int oct_val = IntFrom(493, alloc_base);
        Int big_dec = IntFromStr("123456789012345678901234567890", alloc_base);
        Int hex_val = IntFromHexStr("deadbeefcafebabe1234", alloc_base);
        Int bin_val = IntFromBinary("10100011", alloc_base);
        Int oct_val = IntFrom(493, alloc_base);
        Int hex_val = IntFromHexStr("deadbeefcafebabe1234", alloc_base);
        Int bin_val = IntFromBinary("10100011", alloc_base);
        Int oct_val = IntFrom(493, alloc_base);
    
        StrAppendFmt(&output, "{}", big_dec);
    
        Str  output  = StrInit(&alloc);
        Int  a       = IntFrom(0x41, alloc_base); // 'A'
        bool success = true;
    
        Str  output  = StrInit(&alloc);
        Int  a       = IntFrom(0x7a, alloc_base); // 'z'
        bool success = true;
    
        Str  output  = StrInit(&alloc);
        Int  seven   = IntFrom(7, alloc_base);
        bool success = true;
        Allocator       *alloc_base = ALLOCATOR_OF(&alloc);
    
        Int oct = IntInit(alloc_base);
    
        Zstr z = "78";
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int  v = IntInit(ALLOCATOR_OF(&alloc));
        Zstr z = "9z";
        StrReadFmt(z, "{}", v);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int  v = IntInit(ALLOCATOR_OF(&alloc));
        Zstr z = "5";
        StrReadFmt(z, "{}", v);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int  v = IntInit(ALLOCATOR_OF(&alloc));
        Zstr z = "+8";
        StrReadFmt(z, "{}", v);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int  v = IntFromStr("123", &alloc);
        Zstr z = "9_";
        StrReadFmt(z, "{}", v);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int  v = IntFromStr("200", &alloc);
        Zstr z = "0xFF";
        StrReadFmt(z, "{x}", v);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int  v = IntFromStr("200", &alloc);
        Zstr z = "0XFF";
        StrReadFmt(z, "{x}", v);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int  v = IntInit(ALLOCATOR_OF(&alloc));
        Zstr z = "ff";
        StrReadFmt(z, "{x}", v);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int  v = IntFromStr("5", &alloc);
        Zstr z = "0b1";
        StrReadFmt(z, "{b}", v);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int  v = IntFromStr("5", &alloc);
        Zstr z = "0B1";
        StrReadFmt(z, "{b}", v);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int  v = IntInit(ALLOCATOR_OF(&alloc));
        Zstr z = "101";
        StrReadFmt(z, "{b}", v);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int  v = IntFromStr("9", &alloc);
        Zstr z = "0o7";
        StrReadFmt(z, "{o}", v);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int  v = IntFromStr("9", &alloc);
        Zstr z = "0O7";
        StrReadFmt(z, "{o}", v);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int  v = IntInit(ALLOCATOR_OF(&alloc));
        Zstr z = "17";
        StrReadFmt(z, "{o}", v);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int  v = IntInit(ALLOCATOR_OF(&alloc));
        Zstr z = "   42";
        StrReadFmt(z, "{}", v);
    static bool test_int_write_no_leak(void) {
        DBG_BEGIN(dbg, out);
        Int v = IntFromStr("123456789012345678901234567890", &dbg.base);
        StrAppendFmt(&out, "{}", v);
        bool ok = (ZstrCompare(StrBegin(&out), "123456789012345678901234567890") == 0);
        Allocator       *ab    = ALLOCATOR_OF(&alloc);
        Str              out   = StrInit(&alloc);
        Int              v     = IntFrom(42, ab);
        StrAppendFmt(&out, "{}", v);
        bool ok = (ZstrCompare(StrBegin(&out), "42") == 0);
    bool test_leak_write_int_freed(void) {
        HeapAllocator va = HeapAllocatorInit();
        Int           v  = IntFromStr("123456789012345678901234567890", ALLOCATOR_OF(&va));
        LEAK_WRITE_PRELUDE();
        ok = ok && StrAppendFmt(&out, "{}", v) && (StrLen(&out) > 0);
    #include <Misra/Std/Container/Str.h>
    #include <Misra/Std/Container/BitVec.h>
    #include <Misra/Std/Container/Int.h>
    #include <Misra/Std/Container/Float.h>
    #include <Misra/Std/Container/Buf.h>
    
    bool test_int_reading(void) {
        WriteFmt("Testing Int reading\n");
    
        DefaultAllocator alloc      = DefaultAllocatorInit();
        bool success = true;
    
        Int dec = IntInit(alloc_base);
        Int hex = IntInit(alloc_base);
        Int bin = IntInit(alloc_base);
    
        Int dec = IntInit(alloc_base);
        Int hex = IntInit(alloc_base);
        Int bin = IntInit(alloc_base);
        Int oct = IntInit(alloc_base);
        Int dec = IntInit(alloc_base);
        Int hex = IntInit(alloc_base);
        Int bin = IntInit(alloc_base);
        Int oct = IntInit(alloc_base);
        Int hex = IntInit(alloc_base);
        Int bin = IntInit(alloc_base);
        Int oct = IntInit(alloc_base);
    
        Str dec_text = StrInit(&alloc);
    static bool test_read_int_plain(void) {
        DebugAllocator dbg = DebugAllocatorInit();
        Int            v   = IntInit(&dbg.base);
        Zstr           z   = "12345";
        StrReadFmt(z, "{}", v);
    static bool test_read_int_leading_plus(void) {
        DefaultAllocator alloc = DefaultAllocatorInit();
        Int              v     = IntInit(&alloc.base);
        Zstr             z     = "+99";
        StrReadFmt(z, "{}", v);
    static bool test_read_int_hex_plain(void) {
        DefaultAllocator alloc = DefaultAllocatorInit();
        Int              v     = IntInit(&alloc.base);
        Zstr             z     = "ff";
        StrReadFmt(z, "{x}", v);
    static bool test_read_int_underscore_rejected(void) {
        DefaultAllocator alloc = DefaultAllocatorInit();
        Int              v     = IntFrom(777, &alloc.base);
        Zstr             z     = "12_3";
        Zstr             out   = str_read_fmt(z, "{}", (TypeSpecificIO[]) {TO_TYPE_SPECIFIC_IO(Int, &v)}, 1);
        Int              v     = IntFrom(777, &alloc.base);
        Zstr             z     = "12_3";
        Zstr             out   = str_read_fmt(z, "{}", (TypeSpecificIO[]) {TO_TYPE_SPECIFIC_IO(Int, &v)}, 1);
        // Real: '_' rejected -> returns start (==z) -> str_read_fmt sees next==in ->
        // NULL; v unchanged (still 777).
        // Seed the destination with a heap-backed Int (multi-limb) so the old
        // storage is visible in dbg's live count before the reassignment.
        Int value = IntFromStr("123456789012345678901234567890", adbg);
    
        Zstr input = "42";
Last updated on