Home Manual Reference Source

src/modN.js

import {
	_alloc as n_alloc,
	_zeros as n_zeros,
	_copy as n_copy,
	_idivmod as n_idivmod,
	_trim_positive as n_trim_positive,
	_cmp_n as n_cmp_n,
} from '@arithmetic-operations-for/naturals-big-endian';

import modR from './modR.js';

export default function modN(r, N, x) {
	const k = N.length;
	const xj = x.length;
	const xi = n_trim_positive(x, 0, xj);
	const xn = xj - xi;
	if (xn > k || (xn === k && n_cmp_n(x, xi, xj, N, 0) >= 0)) {
		const xmodN = n_alloc(xn); // TODO Use UintXArray ?
		n_copy(x, xi, xj, xmodN, 0);
		const _ = n_zeros(xn); // TODO use _imod once implemented
		n_idivmod(r, xmodN, 0, xn, N, 0, k, _, 0, xn);
		return modR(k, xmodN);
	}

	const xmodN = n_zeros(k); // TODO Use UintXArray ?
	n_copy(x, xi, xj, xmodN, k - xn);
	return xmodN;
}