UNPKG

1.22 kBtext/coffeescriptView Raw
1# Bignum multiplication and division
2
3
4
5
6
7mmul = (a, b) ->
8 return a.multiply b
9
10
11mdiv = (a, b) ->
12 return a.divide b
13
14# a = a + b
15
16###
17static void
18addf(unsigned int *a, unsigned int *b, int len)
19{
20 int i
21 long long t = 0; # can be signed or unsigned
22 for (i = 0; i < len; i++) {
23 t += (long long) a[i] + b[i]
24 a[i] = (unsigned int) t
25 t >>= 32
26 }
27}
28
29// a = a - b
30
31static void
32subf(unsigned int *a, unsigned int *b, int len)
33{
34 int i
35 long long t = 0; # must be signed
36 for (i = 0; i < len; i++) {
37 t += (long long) a[i] - b[i]
38 a[i] = (unsigned int) t
39 t >>= 32
40 }
41}
42
43// a = b * c
44
45// 0xffffffff + 0xffffffff * 0xffffffff == 0xffffffff00000000
46
47static void
48mulf(unsigned int *a, unsigned int *b, int len, unsigned int c)
49{
50 int i
51 unsigned long long t = 0; # must be unsigned
52 for (i = 0; i < len; i++) {
53 t += (unsigned long long) b[i] * c
54 a[i] = (unsigned int) t
55 t >>= 32
56 }
57 a[i] = (unsigned int) t
58}
59###
60
61mmod = (a,b) ->
62 return a.mod b
63
64# return both quotient and remainder of a/b
65# we'd have this method as divmod(number)
66# but obviously doesn't change the passed parameters
67
68mdivrem = (a,b) ->
69 toReturn = a.divmod b
70 return [toReturn.quotient, toReturn.remainder]
71
72#if SELFTEST
73
74# small integer tests
75