]> pd.if.org Git - zpackage/blob - tomsfastmath/src/misc/fp_rand.c
commit files needed for zpm-fetchurl
[zpackage] / tomsfastmath / src / misc / fp_rand.c
1 /* TomsFastMath, a fast ISO C bignum library.
2  *
3  * This project is meant to fill in where LibTomMath
4  * falls short.  That is speed ;-)
5  *
6  * This project is public domain and free for all purposes.
7  *
8  * Tom St Denis, tomstdenis@gmail.com
9  */
10 #include <tfm_private.h>
11
12 #if FP_GEN_RANDOM_MAX == 0xffffffff
13   #define FP_GEN_RANDOM_SHIFT  32
14 #elif FP_GEN_RANDOM_MAX == 32767
15   /* SHRT_MAX */
16   #define FP_GEN_RANDOM_SHIFT  15
17 #elif FP_GEN_RANDOM_MAX == 2147483647
18   /* INT_MAX */
19   #define FP_GEN_RANDOM_SHIFT  31
20 #elif !defined(FP_GEN_RANDOM_SHIFT)
21 #error Thou shalt define their own valid FP_GEN_RANDOM_SHIFT
22 #endif
23
24 /* makes a pseudo-random int of a given size */
25 static fp_digit fp_gen_random(void)
26 {
27   fp_digit d = 0, msk = 0;
28   do {
29     d <<= FP_GEN_RANDOM_SHIFT;
30     d |= ((fp_digit) FP_GEN_RANDOM());
31     msk <<= FP_GEN_RANDOM_SHIFT;
32     msk |= FP_GEN_RANDOM_MAX;
33   } while ((FP_MASK & msk) != FP_MASK);
34   d &= FP_MASK;
35   return d;
36 }
37
38 void fp_rand(fp_int *a, int digits)
39 {
40    fp_digit d;
41
42    fp_zero(a);
43    if (digits <= 0) {
44      return;
45    }
46
47    /* first place a random non-zero digit */
48    do {
49      d = fp_gen_random();
50    } while (d == 0);
51
52    fp_add_d (a, d, a);
53
54    while (--digits > 0) {
55      fp_lshd (a, 1);
56      fp_add_d (a, fp_gen_random(), a);
57    }
58
59    return;
60
61 }
62
63 /* $Source$ */
64 /* $Revision$ */
65 /* $Date$ */