Blame


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