// rem returns r such that r = u%v. // It uses z as the storage for r. func (z nat) rem(u, v nat) (r nat) { … } // div returns q, r such that q = ⌊u/v⌋ and r = u%v = u - q·v. // It uses z and z2 as the storage for q and r. func (z nat) div(z2, u, v nat) (q, r nat) { … } // divW returns q, r such that q = ⌊x/y⌋ and r = x%y = x - q·y. // It uses z as the storage for q. // Note that y is a single digit (Word), not a big number. func (z nat) divW(x nat, y Word) (q nat, r Word) { … } // modW returns x % d. func (x nat) modW(d Word) (r Word) { … } // divWVW overwrites z with ⌊x/y⌋, returning the remainder r. // The caller must ensure that len(z) = len(x). func divWVW(z []Word, xn Word, x []Word, y Word) (r Word) { … } // div returns q, r such that q = ⌊uIn/vIn⌋ and r = uIn%vIn = uIn - q·vIn. // It uses z and u as the storage for q and r. // The caller must ensure that len(vIn) ≥ 2 (use divW otherwise) // and that len(uIn) ≥ len(vIn) (the answer is 0, uIn otherwise). func (z nat) divLarge(u, uIn, vIn nat) (q, r nat) { … } // divBasic implements long division as described above. // It overwrites q with ⌊u/v⌋ and overwrites u with the remainder r. // q must be large enough to hold ⌊u/v⌋. func (q nat) divBasic(u, v nat) { … } // greaterThan reports whether the two digit numbers x1 x2 > y1 y2. // TODO(rsc): In contradiction to most of this file, x1 is the high // digit and x2 is the low digit. This should be fixed. func greaterThan(x1, x2, y1, y2 Word) bool { … } const divRecursiveThreshold … // divRecursive implements recursive division as described above. // It overwrites z with ⌊u/v⌋ and overwrites u with the remainder r. // z must be large enough to hold ⌊u/v⌋. // This function is just for allocating and freeing temporaries // around divRecursiveStep, the real implementation. func (z nat) divRecursive(u, v nat) { … } // divRecursiveStep is the actual implementation of recursive division. // It adds ⌊u/v⌋ to z and overwrites u with the remainder r. // z must be large enough to hold ⌊u/v⌋. // It uses temps[depth] (allocating if needed) as a temporary live across // the recursive call. It also uses tmp, but not live across the recursion. func (z nat) divRecursiveStep(u, v nat, depth int, tmp *nat, temps []*nat) { … }