Donatien Garnier / MiniTLS-GPL

Dependents:   MiniTLS-HTTPS-Example

Committer:
MiniTLS
Date:
Fri Jun 06 10:49:02 2014 +0000
Revision:
0:35aa5be3b78d
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MiniTLS 0:35aa5be3b78d 1 /* TomsFastMath, a fast ISO C bignum library.
MiniTLS 0:35aa5be3b78d 2 *
MiniTLS 0:35aa5be3b78d 3 * This project is meant to fill in where LibTomMath
MiniTLS 0:35aa5be3b78d 4 * falls short. That is speed ;-)
MiniTLS 0:35aa5be3b78d 5 *
MiniTLS 0:35aa5be3b78d 6 * This project is public domain and free for all purposes.
MiniTLS 0:35aa5be3b78d 7 *
MiniTLS 0:35aa5be3b78d 8 * Tom St Denis, tomstdenis@gmail.com
MiniTLS 0:35aa5be3b78d 9 */
MiniTLS 0:35aa5be3b78d 10 #include <tfm.h>
MiniTLS 0:35aa5be3b78d 11
MiniTLS 0:35aa5be3b78d 12 /* c = a / 2**b */
MiniTLS 0:35aa5be3b78d 13 void fp_div_2d(fp_int *a, int b, fp_int *c, fp_int *d)
MiniTLS 0:35aa5be3b78d 14 {
MiniTLS 0:35aa5be3b78d 15 fp_digit D, r, rr;
MiniTLS 0:35aa5be3b78d 16 int x;
MiniTLS 0:35aa5be3b78d 17 fp_int t;
MiniTLS 0:35aa5be3b78d 18
MiniTLS 0:35aa5be3b78d 19 /* if the shift count is <= 0 then we do no work */
MiniTLS 0:35aa5be3b78d 20 if (b <= 0) {
MiniTLS 0:35aa5be3b78d 21 fp_copy (a, c);
MiniTLS 0:35aa5be3b78d 22 if (d != NULL) {
MiniTLS 0:35aa5be3b78d 23 fp_zero (d);
MiniTLS 0:35aa5be3b78d 24 }
MiniTLS 0:35aa5be3b78d 25 return;
MiniTLS 0:35aa5be3b78d 26 }
MiniTLS 0:35aa5be3b78d 27
MiniTLS 0:35aa5be3b78d 28 fp_init(&t);
MiniTLS 0:35aa5be3b78d 29
MiniTLS 0:35aa5be3b78d 30 /* get the remainder */
MiniTLS 0:35aa5be3b78d 31 if (d != NULL) {
MiniTLS 0:35aa5be3b78d 32 fp_mod_2d (a, b, &t);
MiniTLS 0:35aa5be3b78d 33 }
MiniTLS 0:35aa5be3b78d 34
MiniTLS 0:35aa5be3b78d 35 /* copy */
MiniTLS 0:35aa5be3b78d 36 fp_copy(a, c);
MiniTLS 0:35aa5be3b78d 37
MiniTLS 0:35aa5be3b78d 38 /* shift by as many digits in the bit count */
MiniTLS 0:35aa5be3b78d 39 if (b >= (int)DIGIT_BIT) {
MiniTLS 0:35aa5be3b78d 40 fp_rshd (c, b / DIGIT_BIT);
MiniTLS 0:35aa5be3b78d 41 }
MiniTLS 0:35aa5be3b78d 42
MiniTLS 0:35aa5be3b78d 43 /* shift any bit count < DIGIT_BIT */
MiniTLS 0:35aa5be3b78d 44 D = (fp_digit) (b % DIGIT_BIT);
MiniTLS 0:35aa5be3b78d 45 if (D != 0) {
MiniTLS 0:35aa5be3b78d 46 register fp_digit *tmpc, mask, shift;
MiniTLS 0:35aa5be3b78d 47
MiniTLS 0:35aa5be3b78d 48 /* mask */
MiniTLS 0:35aa5be3b78d 49 mask = (((fp_digit)1) << D) - 1;
MiniTLS 0:35aa5be3b78d 50
MiniTLS 0:35aa5be3b78d 51 /* shift for lsb */
MiniTLS 0:35aa5be3b78d 52 shift = DIGIT_BIT - D;
MiniTLS 0:35aa5be3b78d 53
MiniTLS 0:35aa5be3b78d 54 /* alias */
MiniTLS 0:35aa5be3b78d 55 tmpc = c->dp + (c->used - 1);
MiniTLS 0:35aa5be3b78d 56
MiniTLS 0:35aa5be3b78d 57 /* carry */
MiniTLS 0:35aa5be3b78d 58 r = 0;
MiniTLS 0:35aa5be3b78d 59 for (x = c->used - 1; x >= 0; x--) {
MiniTLS 0:35aa5be3b78d 60 /* get the lower bits of this word in a temp */
MiniTLS 0:35aa5be3b78d 61 rr = *tmpc & mask;
MiniTLS 0:35aa5be3b78d 62
MiniTLS 0:35aa5be3b78d 63 /* shift the current word and mix in the carry bits from the previous word */
MiniTLS 0:35aa5be3b78d 64 *tmpc = (*tmpc >> D) | (r << shift);
MiniTLS 0:35aa5be3b78d 65 --tmpc;
MiniTLS 0:35aa5be3b78d 66
MiniTLS 0:35aa5be3b78d 67 /* set the carry to the carry bits of the current word found above */
MiniTLS 0:35aa5be3b78d 68 r = rr;
MiniTLS 0:35aa5be3b78d 69 }
MiniTLS 0:35aa5be3b78d 70 }
MiniTLS 0:35aa5be3b78d 71 fp_clamp (c);
MiniTLS 0:35aa5be3b78d 72 if (d != NULL) {
MiniTLS 0:35aa5be3b78d 73 fp_copy (&t, d);
MiniTLS 0:35aa5be3b78d 74 }
MiniTLS 0:35aa5be3b78d 75 }
MiniTLS 0:35aa5be3b78d 76
MiniTLS 0:35aa5be3b78d 77 /* $Source: /cvs/libtom/tomsfastmath/src/bit/fp_div_2d.c,v $ */
MiniTLS 0:35aa5be3b78d 78 /* $Revision: 1.1 $ */
MiniTLS 0:35aa5be3b78d 79 /* $Date: 2006/12/31 21:25:53 $ */