prepare for the next libtommath
Karel Miko
4 years ago
6 | 6 | |
7 | 7 | Math::BigInt::LTM |
8 | 8 | _new(Class, SV *x) |
9 | CODE: | |
10 | Newz(0, RETVAL, 1, mp_int); | |
11 | mp_init(RETVAL); | |
9 | PREINIT: | |
10 | mp_err merr; | |
11 | CODE: | |
12 | Newz(0, RETVAL, 1, mp_int); | |
13 | merr = mp_init(RETVAL); | |
14 | #ifdef BN_MP_SET_INT_C | |
12 | 15 | if ((SvUOK(x) || SvIOK(x)) && (sizeof(UV) <= sizeof(unsigned long) || SvUV(x) == (unsigned long)SvUV(x))) { |
13 | 16 | mp_set_int(RETVAL, (unsigned long)SvUV(x)); |
14 | 17 | } |
15 | else { | |
16 | mp_read_radix(RETVAL, SvPV_nolen(x), 10); | |
17 | } | |
18 | #elif IVSIZE == 8 | |
19 | if (SvUOK(x)) { | |
20 | mp_set_u64(RETVAL, (unsigned long long)SvUV(x)); | |
21 | } | |
22 | else if (SvIOK(x)) { | |
23 | mp_set_i64(RETVAL, (long long)SvIV(x)); | |
24 | } | |
25 | #else | |
26 | if (SvUOK(x)) { | |
27 | mp_set_u32(RETVAL, (unsigned int)SvUV(x)); | |
28 | } | |
29 | else if (SvIOK(x)) { | |
30 | mp_set_i32(RETVAL, (int)SvIV(x)); | |
31 | } | |
32 | #endif | |
33 | else { | |
34 | /* fallback - read the decimal number from string */ | |
35 | merr = mp_read_radix(RETVAL, SvPV_nolen(x), 10); | |
36 | } | |
37 | PERL_UNUSED_VAR(merr); | |
18 | 38 | OUTPUT: |
19 | 39 | RETVAL |
20 | 40 | |
24 | 44 | Math::BigInt::LTM |
25 | 45 | _from_bin(Class, SV *x) |
26 | 46 | PREINIT: |
47 | mp_err merr; | |
27 | 48 | char *str, *start; |
28 | 49 | CODE: |
29 | 50 | Newz(0, RETVAL, 1, mp_int); |
30 | mp_init(RETVAL); | |
51 | merr = mp_init(RETVAL); | |
31 | 52 | str = SvPV_nolen(x); |
32 | 53 | start = (strlen(str)>2 && str[0] == '0' && str[1] == 'b') ? str+2 : str; |
33 | mp_read_radix(RETVAL, start, 2); | |
54 | merr = mp_read_radix(RETVAL, start, 2); | |
55 | PERL_UNUSED_VAR(merr); | |
34 | 56 | OUTPUT: |
35 | 57 | RETVAL |
36 | 58 | |
40 | 62 | Math::BigInt::LTM |
41 | 63 | _from_hex(Class, SV *x) |
42 | 64 | PREINIT: |
65 | mp_err merr; | |
43 | 66 | char *str, *start; |
44 | 67 | CODE: |
45 | 68 | Newz(0, RETVAL, 1, mp_int); |
46 | mp_init(RETVAL); | |
69 | merr = mp_init(RETVAL); | |
47 | 70 | str = SvPV_nolen(x); |
48 | 71 | start = (strlen(str)>2 && str[0] == '0' && str[1] == 'x') ? str+2 : str; |
49 | mp_read_radix(RETVAL, start, 16); | |
72 | merr = mp_read_radix(RETVAL, start, 16); | |
73 | PERL_UNUSED_VAR(merr); | |
50 | 74 | OUTPUT: |
51 | 75 | RETVAL |
52 | 76 | |
55 | 79 | |
56 | 80 | Math::BigInt::LTM |
57 | 81 | _from_oct(Class, SV *x) |
58 | CODE: | |
59 | Newz(0, RETVAL, 1, mp_int); | |
60 | mp_init(RETVAL); | |
61 | mp_read_radix(RETVAL, SvPV_nolen(x), 8); | |
82 | PREINIT: | |
83 | mp_err merr; | |
84 | CODE: | |
85 | Newz(0, RETVAL, 1, mp_int); | |
86 | merr = mp_init(RETVAL); | |
87 | merr = mp_read_radix(RETVAL, SvPV_nolen(x), 8); | |
88 | PERL_UNUSED_VAR(merr); | |
62 | 89 | OUTPUT: |
63 | 90 | RETVAL |
64 | 91 | |
67 | 94 | |
68 | 95 | Math::BigInt::LTM |
69 | 96 | _from_base(Class, SV *x, int base) |
70 | CODE: | |
71 | Newz(0, RETVAL, 1, mp_int); | |
72 | mp_init(RETVAL); | |
73 | mp_read_radix(RETVAL, SvPV_nolen(x), base); | |
97 | PREINIT: | |
98 | mp_err merr; | |
99 | CODE: | |
100 | Newz(0, RETVAL, 1, mp_int); | |
101 | merr = mp_init(RETVAL); | |
102 | merr = mp_read_radix(RETVAL, SvPV_nolen(x), base); | |
103 | PERL_UNUSED_VAR(merr); | |
74 | 104 | OUTPUT: |
75 | 105 | RETVAL |
76 | 106 | |
80 | 110 | Math::BigInt::LTM |
81 | 111 | _from_bytes(Class, SV *x) |
82 | 112 | PREINIT: |
113 | mp_err merr; | |
83 | 114 | STRLEN buf_len; |
84 | 115 | unsigned char *buf_ptr; |
85 | 116 | CODE: |
86 | 117 | Newz(0, RETVAL, 1, mp_int); |
87 | mp_init(RETVAL); | |
118 | merr = mp_init(RETVAL); | |
88 | 119 | buf_ptr = (unsigned char *)SvPVbyte(x, buf_len); |
89 | mp_read_unsigned_bin(RETVAL, buf_ptr, buf_len); | |
120 | merr = mp_read_unsigned_bin(RETVAL, buf_ptr, buf_len); | |
121 | PERL_UNUSED_VAR(merr); | |
90 | 122 | OUTPUT: |
91 | 123 | RETVAL |
92 | 124 | |
95 | 127 | |
96 | 128 | void |
97 | 129 | _set(Class, Math::BigInt::LTM n, SV *x) |
98 | CODE: | |
99 | mp_set_int(n, (unsigned long)SvIV(x)); | |
130 | PREINIT: | |
131 | mp_err merr; | |
132 | CODE: | |
133 | #ifdef BN_MP_SET_INT_C | |
134 | if ((SvUOK(x) || SvIOK(x)) && (sizeof(UV) <= sizeof(unsigned long) || SvUV(x) == (unsigned long)SvUV(x))) { | |
135 | mp_set_int(n, (unsigned long)SvIV(x)); | |
136 | } | |
137 | #elif IVSIZE == 8 | |
138 | if (SvUOK(x)) { | |
139 | mp_set_u64(n, (unsigned long long)SvUV(x)); | |
140 | } | |
141 | else if (SvIOK(x)) { | |
142 | mp_set_i64(n, (long long)SvIV(x)); | |
143 | } | |
144 | #else | |
145 | if (SvUOK(x)) { | |
146 | mp_set_u32(n, (unsigned int)SvUV(x)); | |
147 | } | |
148 | else if (SvIOK(x)) { | |
149 | mp_set_i32(n, (int)SvIV(x)); | |
150 | } | |
151 | #endif | |
152 | else { | |
153 | /* fallback - read the decimal number from string */ | |
154 | merr = mp_read_radix(n, SvPV_nolen(x), 10); | |
155 | PERL_UNUSED_VAR(merr); | |
156 | } | |
100 | 157 | |
101 | 158 | ############################################################################## |
102 | 159 | # _zero() |
103 | 160 | |
104 | 161 | Math::BigInt::LTM |
105 | 162 | _zero(Class) |
106 | CODE: | |
107 | Newz(0, RETVAL, 1, mp_int); | |
108 | mp_init(RETVAL); | |
109 | mp_set_int(RETVAL, 0); | |
163 | PREINIT: | |
164 | mp_err merr; | |
165 | CODE: | |
166 | Newz(0, RETVAL, 1, mp_int); | |
167 | merr = mp_init(RETVAL); | |
168 | mp_zero(RETVAL); | |
169 | PERL_UNUSED_VAR(merr); | |
110 | 170 | OUTPUT: |
111 | 171 | RETVAL |
112 | 172 | |
115 | 175 | |
116 | 176 | Math::BigInt::LTM |
117 | 177 | _one(Class) |
118 | CODE: | |
119 | Newz(0, RETVAL, 1, mp_int); | |
120 | mp_init(RETVAL); | |
178 | PREINIT: | |
179 | mp_err merr; | |
180 | CODE: | |
181 | Newz(0, RETVAL, 1, mp_int); | |
182 | merr = mp_init(RETVAL); | |
183 | #ifdef BN_MP_SET_INT_C | |
121 | 184 | mp_set_int(RETVAL, 1); |
185 | #else | |
186 | mp_set_u32(RETVAL, 1); | |
187 | #endif | |
188 | PERL_UNUSED_VAR(merr); | |
122 | 189 | OUTPUT: |
123 | 190 | RETVAL |
124 | 191 | |
127 | 194 | |
128 | 195 | Math::BigInt::LTM |
129 | 196 | _two(Class) |
130 | CODE: | |
131 | Newz(0, RETVAL, 1, mp_int); | |
132 | mp_init(RETVAL); | |
197 | PREINIT: | |
198 | mp_err merr; | |
199 | CODE: | |
200 | Newz(0, RETVAL, 1, mp_int); | |
201 | merr = mp_init(RETVAL); | |
202 | #ifdef BN_MP_SET_INT_C | |
133 | 203 | mp_set_int(RETVAL, 2); |
204 | #else | |
205 | mp_set_u32(RETVAL, 2); | |
206 | #endif | |
207 | PERL_UNUSED_VAR(merr); | |
134 | 208 | OUTPUT: |
135 | 209 | RETVAL |
136 | 210 | |
139 | 213 | |
140 | 214 | Math::BigInt::LTM |
141 | 215 | _ten(Class) |
142 | CODE: | |
143 | Newz(0, RETVAL, 1, mp_int); | |
144 | mp_init(RETVAL); | |
216 | PREINIT: | |
217 | mp_err merr; | |
218 | CODE: | |
219 | Newz(0, RETVAL, 1, mp_int); | |
220 | merr = mp_init(RETVAL); | |
221 | #ifdef BN_MP_SET_INT_C | |
145 | 222 | mp_set_int(RETVAL, 10); |
223 | #else | |
224 | mp_set_u32(RETVAL, 10); | |
225 | #endif | |
226 | PERL_UNUSED_VAR(merr); | |
146 | 227 | OUTPUT: |
147 | 228 | RETVAL |
148 | 229 | |
151 | 232 | |
152 | 233 | Math::BigInt::LTM |
153 | 234 | _1ex(Class, int x) |
154 | CODE: | |
155 | Newz(0, RETVAL, 1, mp_int); | |
156 | mp_init(RETVAL); | |
235 | PREINIT: | |
236 | mp_err merr; | |
237 | CODE: | |
238 | Newz(0, RETVAL, 1, mp_int); | |
239 | merr = mp_init(RETVAL); | |
240 | #ifdef BN_MP_SET_INT_C | |
157 | 241 | mp_set_int(RETVAL, 10); |
158 | mp_expt_d(RETVAL, x, RETVAL); | |
242 | #else | |
243 | mp_set_u32(RETVAL, 10); | |
244 | #endif | |
245 | merr = mp_expt_d(RETVAL, x, RETVAL); | |
246 | PERL_UNUSED_VAR(merr); | |
159 | 247 | OUTPUT: |
160 | 248 | RETVAL |
161 | 249 | |
176 | 264 | SV * |
177 | 265 | _str(Class, Math::BigInt::LTM n) |
178 | 266 | PREINIT: |
267 | mp_err merr; | |
179 | 268 | int len; |
180 | 269 | char *buf; |
181 | 270 | CODE: |
185 | 274 | else { |
186 | 275 | len = mp_count_bits(n) / 3 + 3; /* decimal_size ~ (binary_size/3 + 1) +1 for sign +1 for NUL-byte */ |
187 | 276 | Newz(0, buf, len, char); |
188 | mp_toradix_n(n, buf, 10, len); | |
277 | merr = mp_toradix_n(n, buf, 10, len); | |
189 | 278 | RETVAL = newSVpv(buf, 0); |
190 | 279 | Safefree(buf); |
191 | 280 | } |
281 | PERL_UNUSED_VAR(merr); | |
192 | 282 | OUTPUT: |
193 | 283 | RETVAL |
194 | 284 | |
198 | 288 | int |
199 | 289 | _len(Class, Math::BigInt::LTM n) |
200 | 290 | PREINIT: |
291 | mp_err merr; | |
201 | 292 | int len; |
202 | 293 | char *buf; |
203 | 294 | CODE: |
207 | 298 | else { |
208 | 299 | len = mp_count_bits(n) / 3 + 3; /* decimal_size ~ (binary_size/3 + 1) +1 for sign +1 for NUL-byte */ |
209 | 300 | Newz(0, buf, len, char); |
210 | mp_toradix_n(n, buf, 10, len); | |
301 | merr = mp_toradix_n(n, buf, 10, len); | |
211 | 302 | RETVAL = (int)strlen(buf); |
212 | 303 | Safefree(buf); |
213 | 304 | } |
305 | PERL_UNUSED_VAR(merr); | |
214 | 306 | OUTPUT: |
215 | 307 | RETVAL |
216 | 308 | |
239 | 331 | int |
240 | 332 | _zeros(Class, Math::BigInt::LTM n) |
241 | 333 | PREINIT: |
334 | mp_err merr; | |
242 | 335 | int len; |
243 | 336 | char *buf; |
244 | 337 | CODE: |
248 | 341 | else { |
249 | 342 | len = mp_count_bits(n) / 3 + 3; /* decimal_size ~ (binary_size/3 + 1) +1 for sign +1 for NUL-byte */ |
250 | 343 | Newz(0, buf, len, char); |
251 | mp_toradix_n(n, buf, 10, len); | |
344 | merr = mp_toradix_n(n, buf, 10, len); | |
252 | 345 | len = (int)strlen(buf); |
253 | 346 | RETVAL = 0; |
254 | 347 | while (len > 0) { |
258 | 351 | } |
259 | 352 | Safefree(buf); |
260 | 353 | } |
354 | PERL_UNUSED_VAR(merr); | |
261 | 355 | OUTPUT: |
262 | 356 | RETVAL |
263 | 357 | |
267 | 361 | SV * |
268 | 362 | _to_hex(Class, Math::BigInt::LTM n) |
269 | 363 | PREINIT: |
364 | mp_err merr; | |
270 | 365 | int i, len; |
271 | 366 | char *buf; |
272 | 367 | CODE: |
274 | 369 | RETVAL = newSV(len); |
275 | 370 | SvPOK_on(RETVAL); |
276 | 371 | buf = SvPVX(RETVAL); |
277 | mp_toradix(n, buf, 16); /* to hex */ | |
372 | merr = mp_toradix(n, buf, 16); /* to hex */ | |
278 | 373 | for (i=0; i<len && buf[i]>0; i++) buf[i] = toLOWER(buf[i]); |
279 | 374 | SvCUR_set(RETVAL, strlen(buf)); |
375 | PERL_UNUSED_VAR(merr); | |
280 | 376 | OUTPUT: |
281 | 377 | RETVAL |
282 | 378 | |
286 | 382 | SV * |
287 | 383 | _to_bin(Class, Math::BigInt::LTM n) |
288 | 384 | PREINIT: |
385 | mp_err merr; | |
289 | 386 | int len; |
290 | 387 | char *buf; |
291 | 388 | CODE: |
293 | 390 | RETVAL = newSV(len); |
294 | 391 | SvPOK_on(RETVAL); |
295 | 392 | buf = SvPVX(RETVAL); |
296 | mp_toradix(n, buf, 2); /* to binary */ | |
393 | merr = mp_toradix(n, buf, 2); /* to binary */ | |
297 | 394 | SvCUR_set(RETVAL, strlen(buf)); |
395 | PERL_UNUSED_VAR(merr); | |
298 | 396 | OUTPUT: |
299 | 397 | RETVAL |
300 | 398 | |
304 | 402 | SV * |
305 | 403 | _to_oct(Class, Math::BigInt::LTM n) |
306 | 404 | PREINIT: |
405 | mp_err merr; | |
307 | 406 | int len; |
308 | 407 | char *buf; |
309 | 408 | CODE: |
311 | 410 | RETVAL = newSV(len); |
312 | 411 | SvPOK_on(RETVAL); |
313 | 412 | buf = SvPVX(RETVAL); |
314 | mp_toradix(n, buf, 8); /* to octal */ | |
413 | merr = mp_toradix(n, buf, 8); /* to octal */ | |
315 | 414 | SvCUR_set(RETVAL, strlen(buf)); |
415 | PERL_UNUSED_VAR(merr); | |
316 | 416 | OUTPUT: |
317 | 417 | RETVAL |
318 | 418 | |
322 | 422 | SV * |
323 | 423 | _to_base(Class, Math::BigInt::LTM n, int base) |
324 | 424 | PREINIT: |
425 | mp_err merr; | |
325 | 426 | int len; |
326 | 427 | char *buf; |
327 | 428 | CODE: |
330 | 431 | SvPOK_on(RETVAL); |
331 | 432 | buf = SvPVX(RETVAL); |
332 | 433 | if (len > 0) { |
333 | mp_toradix_n(n, buf, base, len); | |
434 | merr = mp_toradix_n(n, buf, base, len); | |
334 | 435 | SvCUR_set(RETVAL, strlen(buf)); |
335 | 436 | } |
336 | 437 | else { |
337 | 438 | buf[0] = '0'; |
338 | 439 | SvCUR_set(RETVAL, 1); |
339 | 440 | } |
441 | PERL_UNUSED_VAR(merr); | |
340 | 442 | OUTPUT: |
341 | 443 | RETVAL |
342 | 444 | |
349 | 451 | ALIAS: |
350 | 452 | _as_bytes = 1 |
351 | 453 | PREINIT: |
454 | mp_err merr; | |
352 | 455 | int len; |
353 | 456 | unsigned char *buf; |
354 | 457 | CODE: |
358 | 461 | SvPOK_on(RETVAL); |
359 | 462 | buf = (unsigned char*)SvPVX(RETVAL); |
360 | 463 | if (len > 0) { |
361 | mp_to_unsigned_bin(n, buf); | |
464 | merr = mp_to_unsigned_bin(n, buf); | |
362 | 465 | SvCUR_set(RETVAL, len); |
363 | 466 | } |
364 | 467 | else { |
365 | 468 | buf[0] = 0; |
366 | 469 | SvCUR_set(RETVAL, 1); |
367 | 470 | } |
471 | PERL_UNUSED_VAR(merr); | |
368 | 472 | OUTPUT: |
369 | 473 | RETVAL |
370 | 474 | |
373 | 477 | |
374 | 478 | Math::BigInt::LTM |
375 | 479 | _modpow(Class, Math::BigInt::LTM n, Math::BigInt::LTM exp, Math::BigInt::LTM mod) |
376 | CODE: | |
377 | Newz(0, RETVAL, 1, mp_int); | |
378 | mp_init(RETVAL); | |
480 | PREINIT: | |
481 | mp_err merr; | |
482 | CODE: | |
483 | Newz(0, RETVAL, 1, mp_int); | |
484 | merr = mp_init(RETVAL); | |
379 | 485 | if (mp_cmp_d(mod, 1) == MP_EQ) { |
380 | mp_set_int(RETVAL, 0); | |
381 | } | |
382 | else { | |
383 | mp_exptmod(n, exp, mod, RETVAL); | |
384 | } | |
486 | mp_zero(RETVAL); | |
487 | } | |
488 | else { | |
489 | merr = mp_exptmod(n, exp, mod, RETVAL); | |
490 | } | |
491 | PERL_UNUSED_VAR(merr); | |
385 | 492 | OUTPUT: |
386 | 493 | RETVAL |
387 | 494 | |
391 | 498 | void |
392 | 499 | _modinv(Class, Math::BigInt::LTM x, Math::BigInt::LTM y) |
393 | 500 | PREINIT: |
501 | mp_err merr; | |
394 | 502 | int rc; |
395 | 503 | SV* s; |
396 | 504 | mp_int* RETVAL; |
397 | 505 | PPCODE: |
398 | 506 | Newz(0, RETVAL, 1, mp_int); |
399 | mp_init(RETVAL); | |
507 | merr = mp_init(RETVAL); | |
400 | 508 | rc = mp_invmod(x, y, RETVAL); |
401 | 509 | EXTEND(SP, 2); /* we return two values */ |
402 | 510 | if (rc != MP_OKAY) { |
412 | 520 | sv_setpvn(s, "+", 1); |
413 | 521 | PUSHs(s); |
414 | 522 | } |
523 | PERL_UNUSED_VAR(merr); | |
415 | 524 | |
416 | 525 | ############################################################################## |
417 | 526 | # _add() - add $y to $x in place |
418 | 527 | |
419 | 528 | void |
420 | 529 | _add(Class, Math::BigInt::LTM x, Math::BigInt::LTM y) |
421 | PPCODE: | |
422 | mp_add(x, y, x); | |
530 | PREINIT: | |
531 | mp_err merr; | |
532 | PPCODE: | |
533 | merr = mp_add(x, y, x); | |
534 | PERL_UNUSED_VAR(merr); | |
423 | 535 | XPUSHs(ST(1)); /* x */ |
424 | 536 | |
425 | 537 | ############################################################################## |
427 | 539 | |
428 | 540 | void |
429 | 541 | _inc(Class, Math::BigInt::LTM x) |
430 | PPCODE: | |
431 | mp_add_d(x, 1, x); | |
542 | PREINIT: | |
543 | mp_err merr; | |
544 | PPCODE: | |
545 | merr = mp_add_d(x, 1, x); | |
546 | PERL_UNUSED_VAR(merr); | |
432 | 547 | XPUSHs(ST(1)); /* x */ |
433 | 548 | |
434 | 549 | ############################################################################## |
436 | 551 | |
437 | 552 | void |
438 | 553 | _dec(Class, Math::BigInt::LTM x) |
439 | PPCODE: | |
440 | mp_sub_d(x, 1, x); | |
554 | PREINIT: | |
555 | mp_err merr; | |
556 | PPCODE: | |
557 | merr = mp_sub_d(x, 1, x); | |
558 | PERL_UNUSED_VAR(merr); | |
441 | 559 | XPUSHs(ST(1)); /* x */ |
442 | 560 | |
443 | 561 | ############################################################################## |
446 | 564 | |
447 | 565 | void |
448 | 566 | _sub(Class, Math::BigInt::LTM x, Math::BigInt::LTM y, ...) |
567 | PREINIT: | |
568 | mp_err merr; | |
449 | 569 | PPCODE: |
450 | 570 | if ( items == 4 && SvTRUE(ST(3)) ) { |
451 | 571 | /* y -= x */ |
452 | mp_sub(x, y, y); | |
572 | merr = mp_sub(x, y, y); | |
453 | 573 | XPUSHs(ST(2)); /* y */ |
454 | 574 | } |
455 | 575 | else { |
456 | 576 | /* x -= y */ |
457 | mp_sub(x, y, x); | |
577 | merr = mp_sub(x, y, x); | |
458 | 578 | XPUSHs(ST(1)); /* x */ |
459 | 579 | } |
580 | PERL_UNUSED_VAR(merr); | |
460 | 581 | |
461 | 582 | ############################################################################## |
462 | 583 | # _rsft() |
464 | 585 | void |
465 | 586 | _rsft(Class, Math::BigInt::LTM x, Math::BigInt::LTM y, unsigned long base_int) |
466 | 587 | PREINIT: |
588 | mp_err merr; | |
467 | 589 | mp_int* BASE; |
468 | 590 | PPCODE: |
469 | 591 | Newz(0, BASE, 1, mp_int); |
470 | mp_init_set_int(BASE, base_int); | |
471 | mp_expt_d(BASE, mp_get_long(y), BASE); | |
472 | mp_div(x, BASE, x, NULL); | |
592 | merr = mp_init(BASE); | |
593 | #ifdef BN_MP_SET_INT_C | |
594 | mp_set_int(BASE, base_int); | |
595 | #else | |
596 | mp_set_ul(BASE, base_int); | |
597 | #endif | |
598 | #ifdef BN_MP_GET_LONG_C | |
599 | merr = mp_expt_d(BASE, mp_get_long(y), BASE); | |
600 | #else | |
601 | merr = mp_expt_d(BASE, mp_get_ul(y), BASE); | |
602 | #endif | |
603 | merr = mp_div(x, BASE, x, NULL); | |
604 | PERL_UNUSED_VAR(merr); | |
473 | 605 | mp_clear(BASE); |
474 | 606 | Safefree(BASE); |
475 | 607 | XPUSHs(ST(1)); /* x */ |
480 | 612 | void |
481 | 613 | _lsft(Class, Math::BigInt::LTM x, Math::BigInt::LTM y, unsigned long base_int) |
482 | 614 | PREINIT: |
615 | mp_err merr; | |
483 | 616 | mp_int* BASE; |
484 | 617 | PPCODE: |
485 | 618 | Newz(0, BASE, 1, mp_int); |
486 | mp_init_set_int(BASE, base_int); | |
487 | mp_expt_d(BASE, mp_get_long(y), BASE); | |
488 | mp_mul(x, BASE, x); | |
619 | merr = mp_init(BASE); | |
620 | #ifdef BN_MP_SET_INT_C | |
621 | mp_set_int(BASE, base_int); | |
622 | #else | |
623 | mp_set_ul(BASE, base_int); | |
624 | #endif | |
625 | #ifdef BN_MP_GET_LONG_C | |
626 | merr = mp_expt_d(BASE, mp_get_long(y), BASE); | |
627 | #else | |
628 | merr = mp_expt_d(BASE, mp_get_ul(y), BASE); | |
629 | #endif | |
630 | merr = mp_mul(x, BASE, x); | |
631 | PERL_UNUSED_VAR(merr); | |
489 | 632 | mp_clear(BASE); |
490 | 633 | Safefree(BASE); |
491 | 634 | XPUSHs(ST(1)); /* x */ |
495 | 638 | |
496 | 639 | void |
497 | 640 | _mul(Class, Math::BigInt::LTM x, Math::BigInt::LTM y) |
498 | PPCODE: | |
499 | mp_mul(x, y, x); | |
641 | PREINIT: | |
642 | mp_err merr; | |
643 | PPCODE: | |
644 | merr = mp_mul(x, y, x); | |
645 | PERL_UNUSED_VAR(merr); | |
500 | 646 | XPUSHs(ST(1)); /* x */ |
501 | 647 | |
502 | 648 | ############################################################################## |
505 | 651 | void |
506 | 652 | _div(Class, Math::BigInt::LTM x, Math::BigInt::LTM y) |
507 | 653 | PREINIT: |
654 | mp_err merr; | |
508 | 655 | mp_int * rem; |
509 | 656 | PPCODE: |
510 | 657 | if (GIMME_V == G_ARRAY) { |
511 | 658 | Newz(0, rem, 1, mp_int); |
512 | mp_init(rem); | |
513 | mp_div(x, y, x, rem); | |
659 | merr = mp_init(rem); | |
660 | merr = mp_div(x, y, x, rem); | |
514 | 661 | EXTEND(SP, 2); |
515 | 662 | PUSHs(ST(1)); /* x */ |
516 | 663 | PUSHs(sv_2mortal(sv_from_mpi(rem))); |
517 | 664 | } |
518 | 665 | else { |
519 | mp_div(x, y, x, NULL); | |
666 | merr = mp_div(x, y, x, NULL); | |
520 | 667 | XPUSHs(ST(1)); /* x */ |
521 | 668 | } |
669 | PERL_UNUSED_VAR(merr); | |
522 | 670 | |
523 | 671 | ############################################################################## |
524 | 672 | # _mod() - x %= y |
525 | 673 | |
526 | 674 | void |
527 | 675 | _mod(Class, Math::BigInt::LTM x, Math::BigInt::LTM y) |
528 | PPCODE: | |
529 | mp_mod(x, y, x); | |
676 | PREINIT: | |
677 | mp_err merr; | |
678 | PPCODE: | |
679 | merr = mp_mod(x, y, x); | |
680 | PERL_UNUSED_VAR(merr); | |
530 | 681 | XPUSHs(ST(1)); /* x */ |
531 | 682 | |
532 | 683 | ############################################################################## |
586 | 737 | |
587 | 738 | void |
588 | 739 | _pow(Class, Math::BigInt::LTM x, Math::BigInt::LTM y) |
589 | PPCODE: | |
590 | mp_expt_d(x, mp_get_long(y), x); | |
740 | PREINIT: | |
741 | mp_err merr; | |
742 | PPCODE: | |
743 | #ifdef BN_MP_GET_LONG_C | |
744 | merr = mp_expt_d(x, mp_get_long(y), x); | |
745 | #else | |
746 | merr = mp_expt_d(x, mp_get_ul(y), x); | |
747 | #endif | |
748 | PERL_UNUSED_VAR(merr); | |
591 | 749 | XPUSHs(ST(1)); /* x */ |
592 | 750 | |
593 | 751 | ############################################################################## |
595 | 753 | |
596 | 754 | Math::BigInt::LTM |
597 | 755 | _gcd(Class, Math::BigInt::LTM x, Math::BigInt::LTM y) |
598 | CODE: | |
599 | Newz(0, RETVAL, 1, mp_int); | |
600 | mp_init(RETVAL); | |
601 | mp_gcd(x, y, RETVAL); | |
756 | PREINIT: | |
757 | mp_err merr; | |
758 | CODE: | |
759 | Newz(0, RETVAL, 1, mp_int); | |
760 | merr = mp_init(RETVAL); | |
761 | merr = mp_gcd(x, y, RETVAL); | |
762 | PERL_UNUSED_VAR(merr); | |
602 | 763 | OUTPUT: |
603 | 764 | RETVAL |
604 | 765 | |
607 | 768 | |
608 | 769 | void |
609 | 770 | _and(Class, Math::BigInt::LTM x, Math::BigInt::LTM y) |
610 | PPCODE: | |
611 | mp_and(x, y, x); | |
771 | PREINIT: | |
772 | mp_err merr; | |
773 | PPCODE: | |
774 | merr = mp_and(x, y, x); | |
775 | PERL_UNUSED_VAR(merr); | |
612 | 776 | XPUSHs(ST(1)); /* x */ |
613 | 777 | |
614 | 778 | ############################################################################## |
616 | 780 | |
617 | 781 | void |
618 | 782 | _xor(Class, Math::BigInt::LTM x, Math::BigInt::LTM y) |
619 | PPCODE: | |
620 | mp_xor(x, y, x); | |
783 | PREINIT: | |
784 | mp_err merr; | |
785 | PPCODE: | |
786 | merr = mp_xor(x, y, x); | |
787 | PERL_UNUSED_VAR(merr); | |
621 | 788 | XPUSHs(ST(1)); /* x */ |
622 | 789 | |
623 | 790 | ############################################################################## |
625 | 792 | |
626 | 793 | void |
627 | 794 | _or(Class, Math::BigInt::LTM x, Math::BigInt::LTM y) |
628 | PPCODE: | |
629 | mp_or(x, y, x); | |
795 | PREINIT: | |
796 | mp_err merr; | |
797 | PPCODE: | |
798 | merr = mp_or(x, y, x); | |
799 | PERL_UNUSED_VAR(merr); | |
630 | 800 | XPUSHs(ST(1)); /* x */ |
631 | 801 | |
632 | 802 | ############################################################################## |
634 | 804 | |
635 | 805 | Math::BigInt::LTM |
636 | 806 | _copy(Class, Math::BigInt::LTM m) |
637 | CODE: | |
638 | Newz(0, RETVAL, 1, mp_int); | |
639 | mp_init(RETVAL); | |
640 | mp_copy(m, RETVAL); | |
807 | PREINIT: | |
808 | mp_err merr; | |
809 | CODE: | |
810 | Newz(0, RETVAL, 1, mp_int); | |
811 | merr = mp_init(RETVAL); | |
812 | merr = mp_copy(m, RETVAL); | |
813 | PERL_UNUSED_VAR(merr); | |
641 | 814 | OUTPUT: |
642 | 815 | RETVAL |
643 | 816 | |
666 | 839 | |
667 | 840 | void |
668 | 841 | _sqrt(Class, Math::BigInt::LTM x) |
669 | PPCODE: | |
670 | mp_sqrt(x, x); | |
842 | PREINIT: | |
843 | mp_err merr; | |
844 | PPCODE: | |
845 | merr = mp_sqrt(x, x); | |
846 | PERL_UNUSED_VAR(merr); | |
671 | 847 | XPUSHs(ST(1)); /* x */ |
672 | 848 | |
673 | 849 | ############################################################################## |
675 | 851 | |
676 | 852 | void |
677 | 853 | _root(Class, Math::BigInt::LTM x, Math::BigInt::LTM y) |
678 | PPCODE: | |
679 | mp_n_root(x, mp_get_long(y), x); | |
854 | PREINIT: | |
855 | mp_err merr; | |
856 | PPCODE: | |
857 | #ifdef BN_MP_GET_LONG_C | |
858 | merr = mp_n_root(x, mp_get_long(y), x); | |
859 | #else | |
860 | merr = mp_n_root(x, mp_get_ul(y), x); | |
861 | #endif | |
862 | PERL_UNUSED_VAR(merr); | |
680 | 863 | XPUSHs(ST(1)); /* x */ |
681 | 864 | |
682 | 865 | ############################################################################## |
683 | 866 | # _lcm() - least common multiple |
684 | 867 | void |
685 | 868 | _lcm(Class, Math::BigInt::LTM x, Math::BigInt::LTM y) |
686 | PPCODE: | |
687 | mp_lcm(x, y, x) ; | |
869 | PREINIT: | |
870 | mp_err merr; | |
871 | PPCODE: | |
872 | merr = mp_lcm(x, y, x) ; | |
873 | PERL_UNUSED_VAR(merr); | |
688 | 874 | XPUSHs(ST(1)); /* x */ |
689 | 875 | |
690 | 876 | ############################################################################## |
696 | 882 | SV *cloning = NO_INIT |
697 | 883 | SV *serialized |
698 | 884 | PREINIT: |
885 | mp_err merr; | |
699 | 886 | SV *target; |
700 | 887 | mp_int *mpi; |
701 | 888 | PPCODE: |
702 | 889 | PERL_UNUSED_VAR(cloning); |
703 | 890 | if (SvROK(blank_obj) && sv_isa(blank_obj, "Math::BigInt::LTM")) { |
704 | 891 | Newz(0, mpi, 1, mp_int); |
705 | mp_init(mpi); | |
706 | mp_read_radix(mpi, SvPV_nolen(serialized), 10); | |
892 | merr = mp_init(mpi); | |
893 | merr = mp_read_radix(mpi, SvPV_nolen(serialized), 10); | |
894 | PERL_UNUSED_VAR(merr); | |
707 | 895 | target = SvRV(blank_obj); |
708 | 896 | SvIV_set(target, PTR2IV(mpi)); |
709 | 897 | SvIOK_on(target); |
718 | 906 | Math::BigInt::LTM self |
719 | 907 | SV *cloning = NO_INIT |
720 | 908 | PREINIT: |
909 | mp_err merr; | |
721 | 910 | unsigned long len; |
722 | 911 | char *buf; |
723 | 912 | CODE: |
728 | 917 | else { |
729 | 918 | len = mp_count_bits(self) / 3 + 3; /* decimal_size ~ (binary_size/3 + 1) +1 for sign +1 for NUL-byte */ |
730 | 919 | Newz(0, buf, len, char); |
731 | mp_toradix_n(self, buf, 10, len); | |
920 | merr = mp_toradix_n(self, buf, 10, len); | |
921 | PERL_UNUSED_VAR(merr); | |
732 | 922 | RETVAL = newSVpv(buf, 0); |
733 | 923 | Safefree(buf); |
734 | 924 | } |