1 | # Bignum multiplication and division
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 | mmul = (a, b) ->
|
8 | return a.multiply b
|
9 |
|
10 |
|
11 | mdiv = (a, b) ->
|
12 | return a.divide b
|
13 |
|
14 | # a = a + b
|
15 |
|
16 | ###
|
17 | static void
|
18 | addf(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 |
|
31 | static void
|
32 | subf(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 |
|
47 | static void
|
48 | mulf(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 |
|
61 | mmod = (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 |
|
68 | mdivrem = (a,b) ->
|
69 | toReturn = a.divmod b
|
70 | return [toReturn.quotient, toReturn.remainder]
|
71 |
|
72 | #if SELFTEST
|
73 |
|
74 | # small integer tests
|
75 |
|