summaryrefslogtreecommitdiff
path: root/sys/src/libmp/port/mpmod.c
blob: 9ed17593c83822109e3e12055f4933075ea8fd4a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include "os.h"
#include <mp.h>
#include "dat.h"

void
mpmod(mpint *x, mpint *n, mpint *r)
{
	int sign;
	mpint *ns;

	sign = x->sign;
	ns = sign < 0 && n == r ? mpcopy(n) : n;
	if((n->flags & MPfield) == 0
	|| ((Mfield*)n)->reduce((Mfield*)n, x, r) != 0)
		mpdiv(x, n, nil, r);
	if(sign < 0){
		mpmagsub(ns, r, r);
		if(ns != n) mpfree(ns);
	}
}