]> www.ginac.de Git - cln.git/blob - src/integer/random/cl_I_trandom.cc
Initial revision
[cln.git] / src / integer / random / cl_I_trandom.cc
1 // testrandom_I().
2
3 // General includes.
4 #include "cl_sysdep.h"
5
6 // Specification.
7 #include "cl_integer.h"
8
9
10 // Implementation.
11
12 #include "cl_random_impl.h"
13 #include "cl_I.h"
14 #include "cl_DS.h"
15
16 const cl_I testrandom_I (cl_random_state& randomstate)
17 {
18   var uint32 ran = random32(randomstate);
19   var cl_boolean negative = (cl_boolean)(ran & 1);
20   var cl_boolean algo = (cl_boolean)((ran>>1) & 1);
21   ran = ran >> 2;
22   ran = ran & ((1<<8)-1);
23   var uintC len =
24     (ran == 0 ? 0 :
25      ran <= 80 ? 1 :
26      ran <= 128 ? 2 :
27      ran <= 158 ? 3 :
28      ran <= 172 ? 4 :
29      ran <= 200 ? (ran-153)/4 : // 5..11
30      ran-189 // 12..66
31     );
32   CL_ALLOCA_STACK;
33   var uintD* MSDptr;
34   num_stack_alloc_1(len,MSDptr=,);
35   if (algo)
36     { testrandom_UDS(randomstate,MSDptr,len); }
37   else
38     { random_UDS(randomstate,MSDptr,len); }
39   var cl_I x = UDS_to_I(MSDptr,len);
40   return (negative ? -x : x);
41 }