Blame


1 cfa37a7b 2004-04-10 devnull .TH MP 3
2 cfa37a7b 2004-04-10 devnull .SH NAME
3 cfa37a7b 2004-04-10 devnull
4 cfa37a7b 2004-04-10 devnull mpsetminbits, mpnew, mpfree, mpbits, mpnorm, mpcopy, mpassign, mprand, strtomp, mpfmt,mptoa, betomp, mptobe, letomp, mptole, mptoui, uitomp, mptoi, itomp, uvtomp, mptouv, vtomp, mptov, mpdigdiv, mpadd, mpsub, mpleft, mpright, mpmul, mpexp, mpmod, mpdiv, mpcmp, mpextendedgcd, mpinvert, mpsignif, mplowbits0, mpvecdigmuladd, mpvecdigmulsub, mpvecadd, mpvecsub, mpveccmp, mpvecmul, mpmagcmp, mpmagadd, mpmagsub, crtpre, crtin, crtout, crtprefree, crtresfree \- extended precision arithmetic
5 cfa37a7b 2004-04-10 devnull .SH SYNOPSIS
6 cfa37a7b 2004-04-10 devnull .B #include <u.h>
7 cfa37a7b 2004-04-10 devnull .br
8 cfa37a7b 2004-04-10 devnull .B #include <libc.h>
9 cfa37a7b 2004-04-10 devnull .br
10 cfa37a7b 2004-04-10 devnull .B #include <mp.h>
11 cfa37a7b 2004-04-10 devnull .PP
12 cfa37a7b 2004-04-10 devnull .B
13 cfa37a7b 2004-04-10 devnull mpint* mpnew(int n)
14 cfa37a7b 2004-04-10 devnull .PP
15 cfa37a7b 2004-04-10 devnull .B
16 cfa37a7b 2004-04-10 devnull void mpfree(mpint *b)
17 cfa37a7b 2004-04-10 devnull .PP
18 cfa37a7b 2004-04-10 devnull .B
19 cfa37a7b 2004-04-10 devnull void mpsetminbits(int n)
20 cfa37a7b 2004-04-10 devnull .PP
21 cfa37a7b 2004-04-10 devnull .B
22 cfa37a7b 2004-04-10 devnull void mpbits(mpint *b, int n)
23 cfa37a7b 2004-04-10 devnull .PP
24 cfa37a7b 2004-04-10 devnull .B
25 cfa37a7b 2004-04-10 devnull void mpnorm(mpint *b)
26 cfa37a7b 2004-04-10 devnull .PP
27 cfa37a7b 2004-04-10 devnull .B
28 cfa37a7b 2004-04-10 devnull mpint* mpcopy(mpint *b)
29 cfa37a7b 2004-04-10 devnull .PP
30 cfa37a7b 2004-04-10 devnull .B
31 cfa37a7b 2004-04-10 devnull void mpassign(mpint *old, mpint *new)
32 cfa37a7b 2004-04-10 devnull .PP
33 cfa37a7b 2004-04-10 devnull .B
34 cfa37a7b 2004-04-10 devnull mpint* mprand(int bits, void (*gen)(uchar*, int), mpint *b)
35 cfa37a7b 2004-04-10 devnull .PP
36 cfa37a7b 2004-04-10 devnull .B
37 cfa37a7b 2004-04-10 devnull mpint* strtomp(char *buf, char **rptr, int base, mpint *b)
38 cfa37a7b 2004-04-10 devnull .PP
39 cfa37a7b 2004-04-10 devnull .B
40 cfa37a7b 2004-04-10 devnull char* mptoa(mpint *b, int base, char *buf, int blen)
41 cfa37a7b 2004-04-10 devnull .PP
42 cfa37a7b 2004-04-10 devnull .B
43 cfa37a7b 2004-04-10 devnull int mpfmt(Fmt*)
44 cfa37a7b 2004-04-10 devnull .PP
45 cfa37a7b 2004-04-10 devnull .B
46 cfa37a7b 2004-04-10 devnull mpint* betomp(uchar *buf, uint blen, mpint *b)
47 cfa37a7b 2004-04-10 devnull .PP
48 cfa37a7b 2004-04-10 devnull .B
49 cfa37a7b 2004-04-10 devnull int mptobe(mpint *b, uchar *buf, uint blen, uchar **bufp)
50 cfa37a7b 2004-04-10 devnull .PP
51 cfa37a7b 2004-04-10 devnull .B
52 cfa37a7b 2004-04-10 devnull mpint* letomp(uchar *buf, uint blen, mpint *b)
53 cfa37a7b 2004-04-10 devnull .PP
54 cfa37a7b 2004-04-10 devnull .B
55 cfa37a7b 2004-04-10 devnull int mptole(mpint *b, uchar *buf, uint blen, uchar **bufp)
56 cfa37a7b 2004-04-10 devnull .PP
57 cfa37a7b 2004-04-10 devnull .B
58 cfa37a7b 2004-04-10 devnull uint mptoui(mpint*)
59 cfa37a7b 2004-04-10 devnull .PP
60 cfa37a7b 2004-04-10 devnull .B
61 cfa37a7b 2004-04-10 devnull mpint* uitomp(uint, mpint*)
62 cfa37a7b 2004-04-10 devnull .PP
63 cfa37a7b 2004-04-10 devnull .B
64 cfa37a7b 2004-04-10 devnull int mptoi(mpint*)
65 cfa37a7b 2004-04-10 devnull .PP
66 cfa37a7b 2004-04-10 devnull .B
67 cfa37a7b 2004-04-10 devnull mpint* itomp(int, mpint*)
68 cfa37a7b 2004-04-10 devnull .PP
69 cfa37a7b 2004-04-10 devnull .B
70 cfa37a7b 2004-04-10 devnull mpint* vtomp(vlong, mpint*)
71 cfa37a7b 2004-04-10 devnull .PP
72 cfa37a7b 2004-04-10 devnull .B
73 cfa37a7b 2004-04-10 devnull vlong mptov(mpint*)
74 cfa37a7b 2004-04-10 devnull .PP
75 cfa37a7b 2004-04-10 devnull .B
76 cfa37a7b 2004-04-10 devnull mpint* uvtomp(uvlong, mpint*)
77 cfa37a7b 2004-04-10 devnull .PP
78 cfa37a7b 2004-04-10 devnull .B
79 cfa37a7b 2004-04-10 devnull uvlong mptouv(mpint*)
80 cfa37a7b 2004-04-10 devnull .PP
81 cfa37a7b 2004-04-10 devnull .B
82 cfa37a7b 2004-04-10 devnull void mpadd(mpint *b1, mpint *b2, mpint *sum)
83 cfa37a7b 2004-04-10 devnull .PP
84 cfa37a7b 2004-04-10 devnull .B
85 cfa37a7b 2004-04-10 devnull void mpmagadd(mpint *b1, mpint *b2, mpint *sum)
86 cfa37a7b 2004-04-10 devnull .PP
87 cfa37a7b 2004-04-10 devnull .B
88 cfa37a7b 2004-04-10 devnull void mpsub(mpint *b1, mpint *b2, mpint *diff)
89 cfa37a7b 2004-04-10 devnull .PP
90 cfa37a7b 2004-04-10 devnull .B
91 cfa37a7b 2004-04-10 devnull void mpmagsub(mpint *b1, mpint *b2, mpint *diff)
92 cfa37a7b 2004-04-10 devnull .PP
93 cfa37a7b 2004-04-10 devnull .B
94 cfa37a7b 2004-04-10 devnull void mpleft(mpint *b, int shift, mpint *res)
95 cfa37a7b 2004-04-10 devnull .PP
96 cfa37a7b 2004-04-10 devnull .B
97 cfa37a7b 2004-04-10 devnull void mpright(mpint *b, int shift, mpint *res)
98 cfa37a7b 2004-04-10 devnull .PP
99 cfa37a7b 2004-04-10 devnull .B
100 cfa37a7b 2004-04-10 devnull void mpmul(mpint *b1, mpint *b2, mpint *prod)
101 cfa37a7b 2004-04-10 devnull .PP
102 cfa37a7b 2004-04-10 devnull .B
103 cfa37a7b 2004-04-10 devnull void mpexp(mpint *b, mpint *e, mpint *m, mpint *res)
104 cfa37a7b 2004-04-10 devnull .PP
105 cfa37a7b 2004-04-10 devnull .B
106 cfa37a7b 2004-04-10 devnull void mpmod(mpint *b, mpint *m, mpint *remainder)
107 cfa37a7b 2004-04-10 devnull .PP
108 cfa37a7b 2004-04-10 devnull .B
109 cfa37a7b 2004-04-10 devnull void mpdiv(mpint *dividend, mpint *divisor, mpint *quotient, mpint *remainder)
110 cfa37a7b 2004-04-10 devnull .PP
111 cfa37a7b 2004-04-10 devnull .B
112 cfa37a7b 2004-04-10 devnull int mpcmp(mpint *b1, mpint *b2)
113 cfa37a7b 2004-04-10 devnull .PP
114 cfa37a7b 2004-04-10 devnull .B
115 cfa37a7b 2004-04-10 devnull int mpmagcmp(mpint *b1, mpint *b2)
116 cfa37a7b 2004-04-10 devnull .PP
117 cfa37a7b 2004-04-10 devnull .B
118 cfa37a7b 2004-04-10 devnull void mpextendedgcd(mpint *a, mpint *b, mpint *d, mpint *x, mpint *y)
119 cfa37a7b 2004-04-10 devnull .PP
120 cfa37a7b 2004-04-10 devnull .B
121 cfa37a7b 2004-04-10 devnull void mpinvert(mpint *b, mpint *m, mpint *res)
122 cfa37a7b 2004-04-10 devnull .PP
123 cfa37a7b 2004-04-10 devnull .B
124 cfa37a7b 2004-04-10 devnull int mpsignif(mpint *b)
125 cfa37a7b 2004-04-10 devnull .PP
126 cfa37a7b 2004-04-10 devnull .B
127 cfa37a7b 2004-04-10 devnull int mplowbits0(mpint *b)
128 cfa37a7b 2004-04-10 devnull .PP
129 cfa37a7b 2004-04-10 devnull .B
130 cfa37a7b 2004-04-10 devnull void mpdigdiv(mpdigit *dividend, mpdigit divisor, mpdigit *quotient)
131 cfa37a7b 2004-04-10 devnull .PP
132 cfa37a7b 2004-04-10 devnull .B
133 cfa37a7b 2004-04-10 devnull void mpvecadd(mpdigit *a, int alen, mpdigit *b, int blen, mpdigit *sum)
134 cfa37a7b 2004-04-10 devnull .PP
135 cfa37a7b 2004-04-10 devnull .B
136 cfa37a7b 2004-04-10 devnull void mpvecsub(mpdigit *a, int alen, mpdigit *b, int blen, mpdigit *diff)
137 cfa37a7b 2004-04-10 devnull .PP
138 cfa37a7b 2004-04-10 devnull .B
139 cfa37a7b 2004-04-10 devnull void mpvecdigmuladd(mpdigit *b, int n, mpdigit m, mpdigit *p)
140 cfa37a7b 2004-04-10 devnull .PP
141 cfa37a7b 2004-04-10 devnull .B
142 cfa37a7b 2004-04-10 devnull int mpvecdigmulsub(mpdigit *b, int n, mpdigit m, mpdigit *p)
143 cfa37a7b 2004-04-10 devnull .PP
144 cfa37a7b 2004-04-10 devnull .B
145 cfa37a7b 2004-04-10 devnull void mpvecmul(mpdigit *a, int alen, mpdigit *b, int blen, mpdigit *p)
146 cfa37a7b 2004-04-10 devnull .PP
147 cfa37a7b 2004-04-10 devnull .B
148 cfa37a7b 2004-04-10 devnull int mpveccmp(mpdigit *a, int alen, mpdigit *b, int blen)
149 cfa37a7b 2004-04-10 devnull .PP
150 cfa37a7b 2004-04-10 devnull .B
151 cfa37a7b 2004-04-10 devnull CRTpre* crtpre(int nfactors, mpint **factors)
152 cfa37a7b 2004-04-10 devnull .PP
153 cfa37a7b 2004-04-10 devnull .B
154 cfa37a7b 2004-04-10 devnull CRTres* crtin(CRTpre *crt, mpint *x)
155 cfa37a7b 2004-04-10 devnull .PP
156 cfa37a7b 2004-04-10 devnull .B
157 cfa37a7b 2004-04-10 devnull void crtout(CRTpre *crt, CRTres *r, mpint *x)
158 cfa37a7b 2004-04-10 devnull .PP
159 cfa37a7b 2004-04-10 devnull .B
160 cfa37a7b 2004-04-10 devnull void crtprefree(CRTpre *cre)
161 cfa37a7b 2004-04-10 devnull .PP
162 cfa37a7b 2004-04-10 devnull .B
163 cfa37a7b 2004-04-10 devnull void crtresfree(CRTres *res)
164 cfa37a7b 2004-04-10 devnull .PP
165 cfa37a7b 2004-04-10 devnull .B
166 cfa37a7b 2004-04-10 devnull mpint *mpzero, *mpone, *mptwo
167 cfa37a7b 2004-04-10 devnull .SH DESCRIPTION
168 cfa37a7b 2004-04-10 devnull .PP
169 cfa37a7b 2004-04-10 devnull These routines perform extended precision integer arithmetic.
170 cfa37a7b 2004-04-10 devnull The basic type is
171 cfa37a7b 2004-04-10 devnull .BR mpint ,
172 cfa37a7b 2004-04-10 devnull which points to an array of
173 cfa37a7b 2004-04-10 devnull .BR mpdigit s,
174 cfa37a7b 2004-04-10 devnull stored in little-endian order:
175 cfa37a7b 2004-04-10 devnull .sp
176 cfa37a7b 2004-04-10 devnull .EX
177 cfa37a7b 2004-04-10 devnull typedef struct mpint mpint;
178 cfa37a7b 2004-04-10 devnull struct mpint
179 cfa37a7b 2004-04-10 devnull {
180 cfa37a7b 2004-04-10 devnull int sign; /* +1 or -1 */
181 cfa37a7b 2004-04-10 devnull int size; /* allocated digits */
182 cfa37a7b 2004-04-10 devnull int top; /* significant digits */
183 cfa37a7b 2004-04-10 devnull mpdigit *p;
184 cfa37a7b 2004-04-10 devnull char flags;
185 cfa37a7b 2004-04-10 devnull };
186 cfa37a7b 2004-04-10 devnull .EE
187 cfa37a7b 2004-04-10 devnull .PP
188 cfa37a7b 2004-04-10 devnull The sign of 0 is +1.
189 cfa37a7b 2004-04-10 devnull .PP
190 cfa37a7b 2004-04-10 devnull The size of
191 cfa37a7b 2004-04-10 devnull .B mpdigit
192 cfa37a7b 2004-04-10 devnull is architecture-dependent and defined in
193 cfa37a7b 2004-04-10 devnull .BR /$cputype/include/u.h .
194 cfa37a7b 2004-04-10 devnull .BR Mpint s
195 cfa37a7b 2004-04-10 devnull are dynamically allocated and must be explicitly freed. Operations
196 cfa37a7b 2004-04-10 devnull grow the array of digits as needed.
197 cfa37a7b 2004-04-10 devnull .PP
198 cfa37a7b 2004-04-10 devnull In general, the result parameters are last in the
199 cfa37a7b 2004-04-10 devnull argument list.
200 cfa37a7b 2004-04-10 devnull .PP
201 cfa37a7b 2004-04-10 devnull Routines that return an
202 cfa37a7b 2004-04-10 devnull .B mpint
203 cfa37a7b 2004-04-10 devnull will allocate the
204 cfa37a7b 2004-04-10 devnull .B mpint
205 cfa37a7b 2004-04-10 devnull if the result parameter is
206 cfa37a7b 2004-04-10 devnull .BR nil .
207 cfa37a7b 2004-04-10 devnull This includes
208 cfa37a7b 2004-04-10 devnull .IR strtomp ,
209 cfa37a7b 2004-04-10 devnull .IR itomp ,
210 cfa37a7b 2004-04-10 devnull .IR uitomp ,
211 cfa37a7b 2004-04-10 devnull and
212 cfa37a7b 2004-04-10 devnull .IR btomp .
213 cfa37a7b 2004-04-10 devnull These functions, in addition to
214 cfa37a7b 2004-04-10 devnull .I mpnew
215 cfa37a7b 2004-04-10 devnull and
216 cfa37a7b 2004-04-10 devnull .IR mpcopy ,
217 cfa37a7b 2004-04-10 devnull will return
218 cfa37a7b 2004-04-10 devnull .B nil
219 cfa37a7b 2004-04-10 devnull if the allocation fails.
220 cfa37a7b 2004-04-10 devnull .PP
221 cfa37a7b 2004-04-10 devnull Input and result parameters may point to the same
222 cfa37a7b 2004-04-10 devnull .BR mpint .
223 cfa37a7b 2004-04-10 devnull The routines check and copy where necessary.
224 cfa37a7b 2004-04-10 devnull .PP
225 cfa37a7b 2004-04-10 devnull .I Mpnew
226 cfa37a7b 2004-04-10 devnull creates an
227 cfa37a7b 2004-04-10 devnull .B mpint
228 cfa37a7b 2004-04-10 devnull with an initial allocation of
229 cfa37a7b 2004-04-10 devnull .I n
230 cfa37a7b 2004-04-10 devnull bits.
231 cfa37a7b 2004-04-10 devnull If
232 cfa37a7b 2004-04-10 devnull .I n
233 cfa37a7b 2004-04-10 devnull is zero, the allocation will be whatever was specified in the
234 cfa37a7b 2004-04-10 devnull last call to
235 cfa37a7b 2004-04-10 devnull .I mpsetminbits
236 cfa37a7b 2004-04-10 devnull or to the initial value, 1056.
237 cfa37a7b 2004-04-10 devnull .I Mpfree
238 cfa37a7b 2004-04-10 devnull frees an
239 cfa37a7b 2004-04-10 devnull .BR mpint .
240 cfa37a7b 2004-04-10 devnull .I Mpbits
241 cfa37a7b 2004-04-10 devnull grows the allocation of
242 cfa37a7b 2004-04-10 devnull .I b
243 cfa37a7b 2004-04-10 devnull to fit at least
244 cfa37a7b 2004-04-10 devnull .I n
245 cfa37a7b 2004-04-10 devnull bits. If
246 cfa37a7b 2004-04-10 devnull .B b->top
247 cfa37a7b 2004-04-10 devnull doesn't cover
248 cfa37a7b 2004-04-10 devnull .I n
249 cfa37a7b 2004-04-10 devnull bits it increases it to do so.
250 cfa37a7b 2004-04-10 devnull Unless you are writing new basic operations, you
251 cfa37a7b 2004-04-10 devnull can restrict yourself to
252 cfa37a7b 2004-04-10 devnull .B mpnew(0)
253 cfa37a7b 2004-04-10 devnull and
254 cfa37a7b 2004-04-10 devnull .BR mpfree(b) .
255 cfa37a7b 2004-04-10 devnull .PP
256 cfa37a7b 2004-04-10 devnull .I Mpnorm
257 cfa37a7b 2004-04-10 devnull normalizes the representation by trimming any high order zero
258 cfa37a7b 2004-04-10 devnull digits. All routines except
259 cfa37a7b 2004-04-10 devnull .B mpbits
260 cfa37a7b 2004-04-10 devnull return normalized results.
261 cfa37a7b 2004-04-10 devnull .PP
262 cfa37a7b 2004-04-10 devnull .I Mpcopy
263 cfa37a7b 2004-04-10 devnull creates a new
264 cfa37a7b 2004-04-10 devnull .B mpint
265 cfa37a7b 2004-04-10 devnull with the same value as
266 cfa37a7b 2004-04-10 devnull .I b
267 cfa37a7b 2004-04-10 devnull while
268 cfa37a7b 2004-04-10 devnull .I mpassign
269 cfa37a7b 2004-04-10 devnull sets the value of
270 cfa37a7b 2004-04-10 devnull .I new
271 cfa37a7b 2004-04-10 devnull to be that of
272 cfa37a7b 2004-04-10 devnull .IR old .
273 cfa37a7b 2004-04-10 devnull .PP
274 cfa37a7b 2004-04-10 devnull .I Mprand
275 cfa37a7b 2004-04-10 devnull creates an
276 cfa37a7b 2004-04-10 devnull .I n
277 cfa37a7b 2004-04-10 devnull bit random number using the generator
278 cfa37a7b 2004-04-10 devnull .IR gen .
279 cfa37a7b 2004-04-10 devnull .I Gen
280 cfa37a7b 2004-04-10 devnull takes a pointer to a string of uchar's and the number
281 cfa37a7b 2004-04-10 devnull to fill in.
282 cfa37a7b 2004-04-10 devnull .PP
283 cfa37a7b 2004-04-10 devnull .I Strtomp
284 cfa37a7b 2004-04-10 devnull and
285 cfa37a7b 2004-04-10 devnull .I mptoa
286 cfa37a7b 2004-04-10 devnull convert between
287 cfa37a7b 2004-04-10 devnull .SM ASCII
288 cfa37a7b 2004-04-10 devnull and
289 cfa37a7b 2004-04-10 devnull .B mpint
290 cfa37a7b 2004-04-10 devnull representations using the base indicated.
291 cfa37a7b 2004-04-10 devnull Only the bases 10, 16, 32, and 64 are
292 cfa37a7b 2004-04-10 devnull supported. Anything else defaults to 16.
293 cfa37a7b 2004-04-10 devnull .IR Strtomp
294 cfa37a7b 2004-04-10 devnull skips any leading spaces or tabs.
295 cfa37a7b 2004-04-10 devnull .IR Strtomp 's
296 cfa37a7b 2004-04-10 devnull scan stops when encountering a digit not valid in the
297 cfa37a7b 2004-04-10 devnull base. If
298 cfa37a7b 2004-04-10 devnull .I rptr
299 cfa37a7b 2004-04-10 devnull is not zero,
300 cfa37a7b 2004-04-10 devnull .I *rptr
301 cfa37a7b 2004-04-10 devnull is set to point to the character immediately after the
302 cfa37a7b 2004-04-10 devnull string converted.
303 cfa37a7b 2004-04-10 devnull If the parse pterminates before any digits are found,
304 cfa37a7b 2004-04-10 devnull .I strtomp
305 cfa37a7b 2004-04-10 devnull return
306 cfa37a7b 2004-04-10 devnull .BR nil .
307 cfa37a7b 2004-04-10 devnull .I Mptoa
308 cfa37a7b 2004-04-10 devnull returns a pointer to the filled buffer.
309 cfa37a7b 2004-04-10 devnull If the parameter
310 cfa37a7b 2004-04-10 devnull .I buf
311 cfa37a7b 2004-04-10 devnull is
312 cfa37a7b 2004-04-10 devnull .BR nil ,
313 cfa37a7b 2004-04-10 devnull the buffer is allocated.
314 cfa37a7b 2004-04-10 devnull .I Mpfmt
315 cfa37a7b 2004-04-10 devnull can be used with
316 bf8a59fa 2004-04-11 devnull .IR fmtinstall (3)
317 cfa37a7b 2004-04-10 devnull and
318 bf8a59fa 2004-04-11 devnull .IR print (3)
319 cfa37a7b 2004-04-10 devnull to print hexadecimal representations of
320 cfa37a7b 2004-04-10 devnull .BR mpint s.
321 cfa37a7b 2004-04-10 devnull .PP
322 cfa37a7b 2004-04-10 devnull .I Mptobe
323 cfa37a7b 2004-04-10 devnull and
324 cfa37a7b 2004-04-10 devnull .I mptole
325 cfa37a7b 2004-04-10 devnull convert an
326 cfa37a7b 2004-04-10 devnull .I mpint
327 cfa37a7b 2004-04-10 devnull to a byte array. The former creates a big endian representation,
328 cfa37a7b 2004-04-10 devnull the latter a little endian one.
329 cfa37a7b 2004-04-10 devnull If the destination
330 cfa37a7b 2004-04-10 devnull .I buf
331 cfa37a7b 2004-04-10 devnull is not
332 cfa37a7b 2004-04-10 devnull .BR nil ,
333 cfa37a7b 2004-04-10 devnull it specifies the buffer of length
334 cfa37a7b 2004-04-10 devnull .I blen
335 cfa37a7b 2004-04-10 devnull for the result. If the representation
336 cfa37a7b 2004-04-10 devnull is less than
337 cfa37a7b 2004-04-10 devnull .I blen
338 cfa37a7b 2004-04-10 devnull bytes, the rest of the buffer is zero filled.
339 cfa37a7b 2004-04-10 devnull If
340 cfa37a7b 2004-04-10 devnull .I buf
341 cfa37a7b 2004-04-10 devnull is
342 cfa37a7b 2004-04-10 devnull .BR nil ,
343 cfa37a7b 2004-04-10 devnull then a buffer is allocated and a pointer to it is
344 cfa37a7b 2004-04-10 devnull deposited in the location pointed to by
345 cfa37a7b 2004-04-10 devnull .IR bufp .
346 cfa37a7b 2004-04-10 devnull Sign is ignored in these conversions, i.e., the byte
347 cfa37a7b 2004-04-10 devnull array version is always positive.
348 cfa37a7b 2004-04-10 devnull .PP
349 cfa37a7b 2004-04-10 devnull .IR Betomp ,
350 cfa37a7b 2004-04-10 devnull and
351 cfa37a7b 2004-04-10 devnull .I letomp
352 cfa37a7b 2004-04-10 devnull convert from a big or little endian byte array at
353 cfa37a7b 2004-04-10 devnull .I buf
354 cfa37a7b 2004-04-10 devnull of length
355 cfa37a7b 2004-04-10 devnull .I blen
356 cfa37a7b 2004-04-10 devnull to an
357 cfa37a7b 2004-04-10 devnull .IR mpint .
358 cfa37a7b 2004-04-10 devnull If
359 cfa37a7b 2004-04-10 devnull .I b
360 cfa37a7b 2004-04-10 devnull is not
361 cfa37a7b 2004-04-10 devnull .IR nil ,
362 cfa37a7b 2004-04-10 devnull it refers to a preallocated
363 cfa37a7b 2004-04-10 devnull .I mpint
364 cfa37a7b 2004-04-10 devnull for the result.
365 cfa37a7b 2004-04-10 devnull If
366 cfa37a7b 2004-04-10 devnull .I b
367 cfa37a7b 2004-04-10 devnull is
368 cfa37a7b 2004-04-10 devnull .BR nil ,
369 cfa37a7b 2004-04-10 devnull a new integer is allocated and returned as the result.
370 cfa37a7b 2004-04-10 devnull .PP
371 cfa37a7b 2004-04-10 devnull The integer conversions are:
372 cfa37a7b 2004-04-10 devnull .TF Mptouv
373 cfa37a7b 2004-04-10 devnull .TP
374 cfa37a7b 2004-04-10 devnull .I mptoui
375 cfa37a7b 2004-04-10 devnull .BR mpint -> "unsigned int"
376 cfa37a7b 2004-04-10 devnull .TP
377 cfa37a7b 2004-04-10 devnull .I uitomp
378 cfa37a7b 2004-04-10 devnull .BR "unsigned int" -> mpint
379 cfa37a7b 2004-04-10 devnull .TP
380 cfa37a7b 2004-04-10 devnull .I mptoi
381 cfa37a7b 2004-04-10 devnull .BR mpint -> "int"
382 cfa37a7b 2004-04-10 devnull .TP
383 cfa37a7b 2004-04-10 devnull .I itomp
384 cfa37a7b 2004-04-10 devnull .BR "int" -> mpint
385 cfa37a7b 2004-04-10 devnull .TP
386 cfa37a7b 2004-04-10 devnull .I mptouv
387 cfa37a7b 2004-04-10 devnull .BR mpint -> "unsigned vlong"
388 cfa37a7b 2004-04-10 devnull .TP
389 cfa37a7b 2004-04-10 devnull .I uvtomp
390 cfa37a7b 2004-04-10 devnull .BR "unsigned vlong" -> mpint
391 cfa37a7b 2004-04-10 devnull .TP
392 cfa37a7b 2004-04-10 devnull .I mptov
393 cfa37a7b 2004-04-10 devnull .BR mpint -> "vlong"
394 cfa37a7b 2004-04-10 devnull .TP
395 cfa37a7b 2004-04-10 devnull .I vtomp
396 cfa37a7b 2004-04-10 devnull .BR "vlong" -> mpint
397 cfa37a7b 2004-04-10 devnull .PD
398 cfa37a7b 2004-04-10 devnull .PP
399 cfa37a7b 2004-04-10 devnull When converting to the base integer types, if the integer is too large,
400 cfa37a7b 2004-04-10 devnull the largest integer of the appropriate sign
401 cfa37a7b 2004-04-10 devnull and size is returned.
402 cfa37a7b 2004-04-10 devnull .PP
403 cfa37a7b 2004-04-10 devnull The mathematical functions are:
404 cfa37a7b 2004-04-10 devnull .TF mpmagadd
405 cfa37a7b 2004-04-10 devnull .TP
406 cfa37a7b 2004-04-10 devnull .I mpadd
407 cfa37a7b 2004-04-10 devnull .BR "sum = b1 + b2" .
408 cfa37a7b 2004-04-10 devnull .TP
409 cfa37a7b 2004-04-10 devnull .I mpmagadd
410 cfa37a7b 2004-04-10 devnull .BR "sum = abs(b1) + abs(b2)" .
411 cfa37a7b 2004-04-10 devnull .TP
412 cfa37a7b 2004-04-10 devnull .I mpsub
413 cfa37a7b 2004-04-10 devnull .BR "diff = b1 - b2" .
414 cfa37a7b 2004-04-10 devnull .TP
415 cfa37a7b 2004-04-10 devnull .I mpmagsub
416 cfa37a7b 2004-04-10 devnull .BR "diff = abs(b1) - abs(b2)" .
417 cfa37a7b 2004-04-10 devnull .TP
418 cfa37a7b 2004-04-10 devnull .I mpleft
419 cfa37a7b 2004-04-10 devnull .BR "res = b<<shift" .
420 cfa37a7b 2004-04-10 devnull .TP
421 cfa37a7b 2004-04-10 devnull .I mpright
422 cfa37a7b 2004-04-10 devnull .BR "res = b>>shift" .
423 cfa37a7b 2004-04-10 devnull .TP
424 cfa37a7b 2004-04-10 devnull .I mpmul
425 cfa37a7b 2004-04-10 devnull .BR "prod = b1*b2" .
426 cfa37a7b 2004-04-10 devnull .TP
427 cfa37a7b 2004-04-10 devnull .I mpexp
428 cfa37a7b 2004-04-10 devnull if
429 cfa37a7b 2004-04-10 devnull .I m
430 cfa37a7b 2004-04-10 devnull is nil,
431 cfa37a7b 2004-04-10 devnull .BR "res = b**e" .
432 cfa37a7b 2004-04-10 devnull Otherwise,
433 cfa37a7b 2004-04-10 devnull .BR "res = b**e mod m" .
434 cfa37a7b 2004-04-10 devnull .TP
435 cfa37a7b 2004-04-10 devnull .I mpmod
436 cfa37a7b 2004-04-10 devnull .BR "remainder = b % m" .
437 cfa37a7b 2004-04-10 devnull .TP
438 cfa37a7b 2004-04-10 devnull .I mpdiv
439 cfa37a7b 2004-04-10 devnull .BR "quotient = dividend/divisor" .
440 cfa37a7b 2004-04-10 devnull .BR "remainder = dividend % divisor" .
441 cfa37a7b 2004-04-10 devnull .TP
442 cfa37a7b 2004-04-10 devnull .I mpcmp
443 cfa37a7b 2004-04-10 devnull returns -1, 0, or +1 as
444 cfa37a7b 2004-04-10 devnull .I b1
445 cfa37a7b 2004-04-10 devnull is less than, equal to, or greater than
446 cfa37a7b 2004-04-10 devnull .IR b2 .
447 cfa37a7b 2004-04-10 devnull .TP
448 cfa37a7b 2004-04-10 devnull .I mpmagcmp
449 cfa37a7b 2004-04-10 devnull the same as
450 cfa37a7b 2004-04-10 devnull .I mpcmp
451 cfa37a7b 2004-04-10 devnull but ignores the sign and just compares magnitudes.
452 cfa37a7b 2004-04-10 devnull .PD
453 cfa37a7b 2004-04-10 devnull .PP
454 cfa37a7b 2004-04-10 devnull .I Mpextendedgcd
455 cfa37a7b 2004-04-10 devnull computes the greatest common denominator,
456 cfa37a7b 2004-04-10 devnull .IR d ,
457 cfa37a7b 2004-04-10 devnull of
458 cfa37a7b 2004-04-10 devnull .I a
459 cfa37a7b 2004-04-10 devnull and
460 cfa37a7b 2004-04-10 devnull .IR b .
461 cfa37a7b 2004-04-10 devnull It also computes
462 cfa37a7b 2004-04-10 devnull .I x
463 cfa37a7b 2004-04-10 devnull and
464 cfa37a7b 2004-04-10 devnull .I y
465 cfa37a7b 2004-04-10 devnull such that
466 cfa37a7b 2004-04-10 devnull .BR "a*x + b*y = d" .
467 cfa37a7b 2004-04-10 devnull Both
468 cfa37a7b 2004-04-10 devnull .I a
469 cfa37a7b 2004-04-10 devnull and
470 cfa37a7b 2004-04-10 devnull .I b
471 cfa37a7b 2004-04-10 devnull are required to be positive.
472 cfa37a7b 2004-04-10 devnull If called with negative arguments, it will
473 cfa37a7b 2004-04-10 devnull return a gcd of 0.
474 cfa37a7b 2004-04-10 devnull .PP
475 cfa37a7b 2004-04-10 devnull .I Mpinverse
476 cfa37a7b 2004-04-10 devnull computes the multiplicative inverse of
477 cfa37a7b 2004-04-10 devnull .I b
478 cfa37a7b 2004-04-10 devnull .B mod
479 cfa37a7b 2004-04-10 devnull .IR m .
480 cfa37a7b 2004-04-10 devnull .PP
481 cfa37a7b 2004-04-10 devnull .I Mpsignif
482 cfa37a7b 2004-04-10 devnull returns the bit offset of the left most 1 bit in
483 cfa37a7b 2004-04-10 devnull .IR b .
484 cfa37a7b 2004-04-10 devnull .I Mplowbits0
485 cfa37a7b 2004-04-10 devnull returns the bit offset of the right most 1 bit.
486 cfa37a7b 2004-04-10 devnull For example, for 0x14,
487 cfa37a7b 2004-04-10 devnull .I mpsignif
488 cfa37a7b 2004-04-10 devnull would return 4 and
489 cfa37a7b 2004-04-10 devnull .I mplowbits0
490 cfa37a7b 2004-04-10 devnull would return 2.
491 cfa37a7b 2004-04-10 devnull .PP
492 cfa37a7b 2004-04-10 devnull The remaining routines all work on arrays of
493 cfa37a7b 2004-04-10 devnull .B mpdigit
494 cfa37a7b 2004-04-10 devnull rather than
495 cfa37a7b 2004-04-10 devnull .BR mpint 's.
496 cfa37a7b 2004-04-10 devnull They are the basis of all the other routines. They are separated out
497 cfa37a7b 2004-04-10 devnull to allow them to be rewritten in assembler for each architecture. There
498 cfa37a7b 2004-04-10 devnull is also a portable C version for each one.
499 cfa37a7b 2004-04-10 devnull .TF mpvecdigmuladd
500 cfa37a7b 2004-04-10 devnull .TP
501 cfa37a7b 2004-04-10 devnull .I mpdigdiv
502 cfa37a7b 2004-04-10 devnull .BR "quotient = dividend[0:1] / divisor" .
503 cfa37a7b 2004-04-10 devnull .TP
504 cfa37a7b 2004-04-10 devnull .I mpvecadd
505 cfa37a7b 2004-04-10 devnull .BR "sum[0:alen] = a[0:alen-1] + b[0:blen-1]" .
506 cfa37a7b 2004-04-10 devnull We assume alen >= blen and that sum has room for alen+1 digits.
507 cfa37a7b 2004-04-10 devnull .TP
508 cfa37a7b 2004-04-10 devnull .I mpvecsub
509 cfa37a7b 2004-04-10 devnull .BR "diff[0:alen-1] = a[0:alen-1] - b[0:blen-1]" .
510 cfa37a7b 2004-04-10 devnull We assume that alen >= blen and that diff has room for alen digits.
511 cfa37a7b 2004-04-10 devnull .TP
512 cfa37a7b 2004-04-10 devnull .I mpvecdigmuladd
513 cfa37a7b 2004-04-10 devnull .BR "p[0:n] += m * b[0:n-1]" .
514 cfa37a7b 2004-04-10 devnull This multiplies a an array of digits times a scalar and adds it to another array.
515 cfa37a7b 2004-04-10 devnull We assume p has room for n+1 digits.
516 cfa37a7b 2004-04-10 devnull .TP
517 cfa37a7b 2004-04-10 devnull .I mpvecdigmulsub
518 cfa37a7b 2004-04-10 devnull .BR "p[0:n] -= m * b[0:n-1]" .
519 cfa37a7b 2004-04-10 devnull This multiplies a an array of digits times a scalar and subtracts it fromo another array.
520 cfa37a7b 2004-04-10 devnull We assume p has room for n+1 digits. It returns +1 is the result is positive and
521 cfa37a7b 2004-04-10 devnull -1 if negative.
522 cfa37a7b 2004-04-10 devnull .TP
523 cfa37a7b 2004-04-10 devnull .I mpvecmul
524 cfa37a7b 2004-04-10 devnull .BR "p[0:alen*blen] = a[0:alen-1] * b[0:blen-1]" .
525 cfa37a7b 2004-04-10 devnull We assume that p has room for alen*blen+1 digits.
526 cfa37a7b 2004-04-10 devnull .TP
527 cfa37a7b 2004-04-10 devnull .I mpveccmp
528 cfa37a7b 2004-04-10 devnull This returns -1, 0, or +1 as a - b is negative, 0, or positive.
529 cfa37a7b 2004-04-10 devnull .PD
530 cfa37a7b 2004-04-10 devnull .PP
531 cfa37a7b 2004-04-10 devnull .IR mptwo ,
532 cfa37a7b 2004-04-10 devnull .I mpone
533 cfa37a7b 2004-04-10 devnull and
534 cfa37a7b 2004-04-10 devnull .I mpzero
535 cfa37a7b 2004-04-10 devnull are the constants 2, 1 and 0. These cannot be freed.
536 cfa37a7b 2004-04-10 devnull .SS "Chinese remainder theorem
537 cfa37a7b 2004-04-10 devnull .PP
538 cfa37a7b 2004-04-10 devnull When computing in a non-prime modulus,
539 cfa37a7b 2004-04-10 devnull .IR n,
540 cfa37a7b 2004-04-10 devnull it is possible to perform the computations on the residues modulo the prime
541 cfa37a7b 2004-04-10 devnull factors of
542 cfa37a7b 2004-04-10 devnull .I n
543 cfa37a7b 2004-04-10 devnull instead. Since these numbers are smaller, multiplication and exponentiation
544 cfa37a7b 2004-04-10 devnull can be much faster.
545 cfa37a7b 2004-04-10 devnull .PP
546 cfa37a7b 2004-04-10 devnull .I Crtin
547 cfa37a7b 2004-04-10 devnull computes the residues of
548 cfa37a7b 2004-04-10 devnull .I x
549 cfa37a7b 2004-04-10 devnull and returns them in a newly allocated structure:
550 cfa37a7b 2004-04-10 devnull .EX
551 cfa37a7b 2004-04-10 devnull typedef struct CRTres CRTres;
552 cfa37a7b 2004-04-10 devnull {
553 cfa37a7b 2004-04-10 devnull int n; // number of residues
554 cfa37a7b 2004-04-10 devnull mpint *r[n]; // residues
555 cfa37a7b 2004-04-10 devnull };
556 cfa37a7b 2004-04-10 devnull .EE
557 cfa37a7b 2004-04-10 devnull .PP
558 cfa37a7b 2004-04-10 devnull .I Crtout
559 cfa37a7b 2004-04-10 devnull takes a residue representation of a number and converts it back into
560 cfa37a7b 2004-04-10 devnull the number. It also frees the residue structure.
561 cfa37a7b 2004-04-10 devnull .PP
562 cfa37a7b 2004-04-10 devnull .I Crepre
563 cfa37a7b 2004-04-10 devnull saves a copy of the factors and precomputes the constants necessary
564 cfa37a7b 2004-04-10 devnull for converting the residue form back into a number modulo
565 cfa37a7b 2004-04-10 devnull the product of the factors. It returns a newly allocated structure
566 cfa37a7b 2004-04-10 devnull containing values.
567 cfa37a7b 2004-04-10 devnull .PP
568 cfa37a7b 2004-04-10 devnull .I Crtprefree
569 cfa37a7b 2004-04-10 devnull and
570 cfa37a7b 2004-04-10 devnull .I crtresfree
571 cfa37a7b 2004-04-10 devnull free
572 cfa37a7b 2004-04-10 devnull .I CRTpre
573 cfa37a7b 2004-04-10 devnull and
574 cfa37a7b 2004-04-10 devnull .I CRTres
575 cfa37a7b 2004-04-10 devnull structures respectively.
576 cfa37a7b 2004-04-10 devnull .SH SOURCE
577 cfa37a7b 2004-04-10 devnull .B /sys/src/libmp