Welcome to collectivesolver - Programming & Software Q&A with code examples. A website with trusted programming answers. All programs are tested and work.

Contact: aviboots(AT)netvision.net.il

Semrush - keyword research tool

Turn ChatGPT, Claude, Gemini, And CoPilot Into Your Personal Assistant, Business Coach, Content Creator, And More

AFFILIATE MARKETING Your all-in-one performance engine Manage affiliates, creators, and customer referrals in one unified platform—turning every partnership into measurable growth
Secure & Reliable Web Hosting, Free Domain, Free SSL, 1-Click WordPress Install, Expert 24/7 Support

Boost your online presence with premium web hosting and servers

Disclosure: My content contains affiliate links.

42,752 questions

55,516 answers

573 users

How to do modulo multiplication for 64‑bit values without using BigInteger in JavaScript

1 Answer

0 votes
/*
===============================================================
    Modulo Multiplication (Slow and Fast Versions)
===============================================================

Purpose:
    Compute (a * b) % mod safely for large 64‑bit values.

Why BigInt?
    JavaScript's Number type cannot safely represent integers
    above 2^53. Your values exceed that limit, so BigInt is required.

Versions:
    1. Slow version:
        - Adds b to result a times.
        - Always correct.
        - Very slow for large numbers.
        - Useful as a correctness reference.

    2. Fast version:
        - Uses the classic "double‑and‑add" technique.
        - Runs in O(log b).
        - Avoids overflow.
        - Produces the same result as the slow version.
*/


// ---------------------------------------------------------------
// SLOW VERSION (simple, correct, but extremely slow)
// ---------------------------------------------------------------
function mulModSlow(a, b, mod) {
    /*
        Computes:
            (b + b + b + ... a times) % mod

        This avoids overflow because:
            - result stays below mod
            - b fits in BigInt
            - addition is safe

        But it is O(a), which is too slow for large inputs.
    */

    if (b < a) {
        [a, b] = [b, a]; // reduce loop count
    }

    let result = 0n;

    for (let i = 0n; i < a; i++) {
        result = (result + b) % mod;
    }

    return result;
}


// ---------------------------------------------------------------
// FAST VERSION (efficient and safe)
// ---------------------------------------------------------------
function mulModFast(a, b, mod) {
    /*
        Uses the "double‑and‑add" method:

            - If the lowest bit of b is set, add a to result.
            - Double a each step.
            - Shift b right each step.

        This avoids overflow because:
            - We never compute a * b directly.
            - Doubling a is safe because we reduce modulo each step.

        This makes the algorithm:
            - Fast
            - Safe
            - Exact
    */

    let result = 0n;
    a %= mod;

    while (b > 0n) {
        if (b & 1n) {
            result = (result + a) % mod;
        }

        a = (a << 1n) % mod;
        b >>= 1n;
    }

    return result;
}


// ---------------------------------------------------------------
// MAIN PROGRAM
// ---------------------------------------------------------------
const x   = 798345n;
const y   = 20289473612815n;
const mod = 100000000000003n;

const slowResult = mulModSlow(x, y, mod);
const fastResult = mulModFast(x, y, mod);

console.log("Slow result:", slowResult);
console.log("Fast result:", fastResult);



/*
run:

Slow result: 99811422305238n
Fast result: 99811422305238n

*/

 



answered 14 hours ago by avibootz

Related questions

...