Skip to content

IntMod

IntMod

Description

Generic modulo convenience macro.

Parameters

Name Direction Description
result out Destination for the remainder
dividend in Dividend
divisor in Divisor selected through generic dispatch

Usage example (from documentation)

  IntMod(&remainder, &value, 97u);

Usage example (Cross-references)

Usage examples (Cross-references)
    }
    
    void(IntMod)(Int *result, Int *dividend, Int *divisor) {
        Int quotient  = IntInit();
        Int remainder = IntInit();
            Int r = IntInit();
    
            IntMod(&r, &x, &y);
            IntDeinit(&x);
            x = y;
        int result = 1;
    
        IntMod(&aa, a, &nn);
    
        while (!IntIsZero(&aa)) {
            }
    
            IntMod(&aa, &aa, &nn);
        }
        Int sum = IntInit();
    
        IntMod(&ar, a, modulus);
        IntMod(&br, b, modulus);
        IntAdd(&sum, &ar, &br);
    
        IntMod(&ar, a, modulus);
        IntMod(&br, b, modulus);
        IntAdd(&sum, &ar, &br);
        IntMod(result, &sum, modulus);
        IntMod(&br, b, modulus);
        IntAdd(&sum, &ar, &br);
        IntMod(result, &sum, modulus);
    
        IntDeinit(&ar);
        Int br = IntInit();
    
        IntMod(&ar, a, modulus);
        IntMod(&br, b, modulus);
    
        IntMod(&ar, a, modulus);
        IntMod(&br, b, modulus);
    
        if (IntGE(&ar, &br)) {
        Int prod = IntInit();
    
        IntMod(&ar, a, modulus);
        IntMod(&br, b, modulus);
        IntMul(&prod, &ar, &br);
    
        IntMod(&ar, a, modulus);
        IntMod(&br, b, modulus);
        IntMul(&prod, &ar, &br);
        IntMod(result, &prod, modulus);
        IntMod(&br, b, modulus);
        IntMul(&prod, &ar, &br);
        IntMod(result, &prod, modulus);
    
        IntDeinit(&ar);
        Int base_mod = IntInit();
    
        IntMod(&acc, &acc, modulus);
        IntMod(&base_mod, base, modulus);
    
        IntMod(&acc, &acc, modulus);
        IntMod(&base_mod, base, modulus);
    
        while (exponent > 0) {
        Int exp      = IntClone(exponent);
    
        IntMod(&acc, &acc, modulus);
        IntMod(&base_mod, base, modulus);
    
        IntMod(&acc, &acc, modulus);
        IntMod(&base_mod, base, modulus);
    
        while (!IntIsZero(&exp)) {
        bool      ok      = false;
    
        IntMod(&reduced, value, modulus);
        new_r = IntClone(&reduced);
            Int mag_mod   = IntInit();
    
            IntMod(&mag_mod, &t.magnitude, modulus);
            if (t.negative && !IntIsZero(&mag_mod)) {
                (void)IntSub(&positive, modulus, &mag_mod);
                (void)IntSub(&positive, modulus, &mag_mod);
            } else {
                IntMod(&positive, &t.magnitude, modulus);
            }
        bool ok = false;
    
        IntMod(&a, value, modulus);
    
        if (IntIsZero(&a)) {
    
    bool test_int_mod(void) {
        WriteFmt("Testing IntMod generic dispatch\n");
    
        Int dividend = IntFrom(126);
        Int result_value = IntInit();
    
        IntMod(&result_value, &dividend, 10u);
    
        bool result = IntToU64(&result_value) == 6;
    
    bool test_int_mod_scalar(void) {
        WriteFmt("Testing IntMod scalar-divisor dispatch\n");
    
        Int value = IntFromStr("12345678901234567890");
        Int remainder = IntInit();
    
        IntMod(&remainder, &value, 97u);
    
        IntDeinit(&value);
    
    bool test_int_mod_scalar_zero_modulus(void) {
        WriteFmt("Testing IntMod scalar zero-modulus handling\n");
    
        Int value = IntFrom(10);
        Int result_value = IntInit();
    
        IntMod(&result_value, &value, 0u);
        return false;
    }
    /// TAGS: Int, Math, Modulo
    ///
    void (IntMod)(Int *result, Int *dividend, Int *divisor);
    ///
    /// Compute quotient and remainder in one call.
                (divisor),                                                                                                 \
                Int: MISRA_PRIV_IntModValue,                                                                               \
                Int *: IntMod,                                                                                             \
                const Int *: MISRA_PRIV_IntModConst,                                                                       \
                unsigned char: MISRA_PRIV_IntModU64Into,                                                                   \
Last updated on