|
|
1.1 ! root 1: /* ! 2: * Manifest constants. ! 3: */ ! 4: #ifndef NULL ! 5: #define NULL ((char *)0) ! 6: #endif ! 7: #define TRUE 1 ! 8: #define FALSE 0 ! 9: #define BASE 128 ! 10: #define L2BASE 7 ! 11: #define NEFL (BASE - 1) /* leading byte of negative numbers */ ! 12: #if _I386 ! 13: #define NORSIZ 6 /* maximum size for int value */ ! 14: #else ! 15: #define NORSIZ 4 /* maximum size for int value */ ! 16: #endif ! 17: /* ! 18: * Multi-precision integer type. ! 19: */ ! 20: ! 21: typedef struct { ! 22: unsigned len; ! 23: char *val; ! 24: } mint; ! 25: ! 26: ! 27: /* ! 28: * Minit initializes a mint so that it may be used by the other ! 29: * multi-precision routines. This simply consists of setting the ! 30: * val field to NULL so that mpfree will know that there is nothing ! 31: * to free. Note that the mint so initialized has no value and ! 32: * should not be used as an operand, but may be used as the result ! 33: * of any of the multi-precision routines. ! 34: */ ! 35: ! 36: #define minit(mp) (mp)->val = NULL ! 37: ! 38: ! 39: /* ! 40: * Mvfree frees the value associated to a pointer to a mint. ! 41: * Note that it does not re-initialize the mint. ! 42: */ ! 43: ! 44: #define mvfree(mp) mpfree((mp)->val) ! 45: ! 46: ! 47: /* ! 48: * Functions returning non-ints. ! 49: */ ! 50: ! 51: void gcd(), /* greatest common divisor of 2 mints */ ! 52: madd(), /* add 2 mints */ ! 53: mcopy(), /* copy mint */ ! 54: mdiv(), /* divide 2 mints */ ! 55: min(), /* read in mint from stdin */ ! 56: mintfr(), /* free all space used by a mint */ ! 57: mitom(), /* set a mint to the value of an int */ ! 58: mneg(), /* negate a mint */ ! 59: mout(), /* write out mint onto stdout */ ! 60: mperr(), /* print error on stdout and exit */ ! 61: mpfree(), /* free space allocated by mpalc */ ! 62: msma(), /* shift-multiply-add inplace */ ! 63: msqrt(), /* square root of mint */ ! 64: msub(), /* subtract 2 mints */ ! 65: mult(), /* multiply 2 mints */ ! 66: norm(), /* normalize a mint */ ! 67: pow(), /* raise mint to a mint power mod a mint */ ! 68: rpow(), /* raise mint to a mint power */ ! 69: sdiv(), /* divide a mint by a char */ ! 70: smult(), /* multiply a mint by a char */ ! 71: spow(), /* raise mint to an unsigned power */ ! 72: xgcd(); /* extended greatest common divisor */ ! 73: char *mpalc(), /* allocate space */ ! 74: *mtos(); /* convert mint to string */ ! 75: mint *itom(); /* allocate space for mint initialized to int */ ! 76: ! 77: ! 78: /* external variables */ ! 79: ! 80: extern mint *mzero, /* a mint which has a value of zero */ ! 81: *mone, /* a mint which has a value of one */ ! 82: *mminint, /* min value that fits in an int */ ! 83: *mmaxint; /* max value that fits in an int */ ! 84: extern int ibase, /* input base (2 <= ibase <= 16 assumed) */ ! 85: obase; /* output base (2 <= obase <= 16 assumed) */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.