aljabar/node_modules/algebrite/sources/mmul.coffee

76 lines
1.2 KiB
CoffeeScript

# Bignum multiplication and division
mmul = (a, b) ->
return a.multiply b
mdiv = (a, b) ->
return a.divide b
# a = a + b
###
static void
addf(unsigned int *a, unsigned int *b, int len)
{
int i
long long t = 0; # can be signed or unsigned
for (i = 0; i < len; i++) {
t += (long long) a[i] + b[i]
a[i] = (unsigned int) t
t >>= 32
}
}
// a = a - b
static void
subf(unsigned int *a, unsigned int *b, int len)
{
int i
long long t = 0; # must be signed
for (i = 0; i < len; i++) {
t += (long long) a[i] - b[i]
a[i] = (unsigned int) t
t >>= 32
}
}
// a = b * c
// 0xffffffff + 0xffffffff * 0xffffffff == 0xffffffff00000000
static void
mulf(unsigned int *a, unsigned int *b, int len, unsigned int c)
{
int i
unsigned long long t = 0; # must be unsigned
for (i = 0; i < len; i++) {
t += (unsigned long long) b[i] * c
a[i] = (unsigned int) t
t >>= 32
}
a[i] = (unsigned int) t
}
###
mmod = (a,b) ->
return a.mod b
# return both quotient and remainder of a/b
# we'd have this method as divmod(number)
# but obviously doesn't change the passed parameters
mdivrem = (a,b) ->
toReturn = a.divmod b
return [toReturn.quotient, toReturn.remainder]
#if SELFTEST
# small integer tests