home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / vol_200 / 247_01 / bnrand.c < prev    next >
Text File  |  1989-04-19  |  2KB  |  75 lines

  1. /*
  2.  *   MIRACL random number routines 
  3.  *   bnrand.c
  4.  */
  5.  
  6. #include <stdio.h>
  7. #include "miracl.h"
  8.  
  9. /* access global variables */
  10.  
  11. extern int depth;    /* error tracing ..*/
  12. extern int trace[];  /* .. mechanism    */
  13. extern int nib;      /* length of bigs  */
  14. extern small base;   /* number base     */
  15.  
  16. extern big w1;       /* workspace variables */
  17. extern big w2;
  18. extern big w5;
  19. extern big w6;
  20.  
  21. void bigrand(w,x)
  22. big x;
  23. big w;
  24. {  /*  generate a big random number 1<x<w  */
  25.     if (ERNUM) return;
  26.     depth++;
  27.     trace[depth]=20;
  28.     if (TRACER) track();
  29.     decr(w,2,w1);
  30.     convert(brand(),x);
  31.     while (compare(x,w1)<0)
  32.     { /* create big rand piece by piece */
  33.         shift(x,1,x);
  34.         incr(x,brand(),x);
  35.     }
  36.     divide(x,w1,w1);
  37.     incr(x,2,x);
  38.     depth--;
  39. }
  40.  
  41. void bigdig(x,n,b)
  42. big x;
  43. int n;
  44. small b;
  45. { /* generate random number n digits long *
  46.    * to base b                            */
  47.     int i;
  48.     if (ERNUM) return;
  49.     depth++;
  50.     trace[depth]=19;
  51.     if (TRACER) track();
  52.     do
  53.     { /* repeat if x too small */
  54.         convert(1,w2);
  55.         for (i=1;i<=n;i++) premult(w2,b,w2);
  56.         bigrand(w2,x);
  57.         subdiv(w2,b,w2);
  58.     } while (!ERNUM && compare(x,w2)<0);
  59.     depth--;
  60. }
  61.  
  62. void frand(x)
  63. flash x;
  64. { /* generates random flash number 0<x<1 */
  65.     if (ERNUM) return;
  66.     depth++;
  67.     trace[depth]=46;
  68.     if (TRACER) track();
  69.     bigdig(w6,nib-1,base);
  70.     bigrand(w6,w5);
  71.     round(w5,w6,x);
  72.     depth--;
  73. }
  74.  
  75.