packages icon



 Arithmetic(3)                                                 Arithmetic(3)
                                11 March 1990



 NAME
      arithmetic, Zadd, Zsub, Zminus, Zmult, Zdivalg, Zgcd, Zeq, Zlessoreq,
      Collect, Showme, Shcopy, Size, Constant, Initial - arithmetic with
      arbitrary length integers or polynomials

 SYNOPSIS
      #include integer.h
      #include polynomial.h
      #include Ztools.h
      unsigned short *Zadd(a, b)
      unsigned short *a, *b;
      unsigned short *Zsub(a, b)
      unsigned short *a, *b;
      unsigned short *Zminus(a)
      unsigned short *a;
      unsigned short *Zmult(a, b)
      unsigned short *a, *b;
      unsigned short *Zdivalg(a, b, r)
      unsigned short *a, *b, *r;
      void Zgcd(a, b, g, aa, bb)
      unsigned short *a, *b, *g;
      unsigned short *aa, *bb;
      char Zeq(a, b)
      unsigned short *a, *b;
      char Zlessoreq(a, b)
      unsigned short *a, *b;
      void Initial(m)
      unsigned short m;
      char Collect(msg, a)
      char *msg;
      unsigned short *a;
      void Showme(msg, a)
      char *msg;
      unsigned short *a;
      void Fshowme(fp, msg, a)
      FILE *fp;
      char *msg;
      unsigned short *a;
      unsigned short *Constant(a)
      long a;
      void Shcopy(a, b)
      unsigned short *a, *b;
      unsigned short Size(a)
      unsigned short *a;
      void bailout(msg)
      char *msg;

 DESCRIPTION
      These routines provide a uniform interface for computations involving
      either arbitrary precision integers or polynomials over finite fields.
      Both integers and polynomials are stored in little-endian order as an



                                    - 1 -         Formatted:  April 27, 2024






 Arithmetic(3)                                                 Arithmetic(3)
                                11 March 1990



      array of unsigned shorts. The value of the first short in the array is
      the offset of the most significant digit; in the case of polynomials,
      this is the highest degree coefficient, in the case of integers, it is
      a signbit.  These routines use the storage management package called
      "warehouse", consisting of the routines release(), capture(), and
      makeWH() to have enough storage available for their computations.
      Thus, any program which uses these routines must begin with a call to
      Initial() which makes available some prlminary scratch computation
      areas. In the case of polynomials, the parameter to Initial() is the
      modulus of the finite field over which the polynomials are to be
      computed.  Zadd(), Zsub(), and Zmult() return a pointer to a very long
      integer or polynomial which is the sum, difference, or product,
      respectively, of their arguments. Zminus() returns the negative of its
      argument.  Zdivalg() computes the quotient of the dividend a by the
      divisor b and returns it. If the value of ptr is not NULL, then the
      remainder is stored at that location. The conventions used by
      Zdivalg() are: in the case of integers, the remainder always has the
      same sign as the dividend, and in the case of polynomials, the
      quotient is always monic.  In both cases, the relation a = b q + r
      holds.  Zgcd() computes the greatest common divisor of a and b and
      stores it in the location pointed to by g. The values of a/g and b/g,
      are stored in aa and bb, respectively.  Zeq() returns a non-zero value
      if its arguments are equal, and zero otherwise.  Zlessoreq() returns a
      non-zero value if its first argument is less than or equal to its
      second argument, and zero otherwise.  Some additional utilities are
      supplied to make common treatment of integers and polynomials easier.
      Collect() is an input routine which prints its message msg on standard
      output and then reads an integer or polynomial and stores it at the
      location pointed to by a. Both integers and polynomials are entered in
      big-endian order. Different coefficients of polynomials are separated
      by whitespace (which means, in this case, any non-digit characters)
      and are reduced modulo m before being stored. Integers are entered in
      digits written to the base 2^16 = 65536 which are also separated by
      whitespace; they may be preceeded an optional sign. Note that, at this
      time, decimal input is not supported except for numbers whose size is
      less than 65536. Lines may be continued by using the ampersand
      character (&) at the end of a line.  Showme() is an output routine
      which writes its message to standard output and follows it by an
      integer or polynomial written with the same conventions as used by
      Collect(). Fshowme() is to Showme() as fprintf() is to printf().
      Constant() returns a properly formatted very long integer or
      polynomial with the value represented by its argument. The argument
      must have absolute value bounded by 2^16 = 65536. In general, the
      value of Constant() should be copied to a safe location, since it re-
      uses the same storage space.  Shcopy() copies the array of its first
      argument int the location pointed to by its second argument. It
      assumes that there is enough room at the second location; it is the
      programmer's responsibility to ensure that this is, in fact, the case.
      Note, for example, that the integer constant 1 takes up three memory
      locations: one for a description of how many digits it needs, one for
      the value, and one for the signbit.



                                    - 2 -         Formatted:  April 27, 2024






 Arithmetic(3)                                                 Arithmetic(3)
                                11 March 1990



 LIBRARIES
      These routines are implemented in one of two ways. Those which are
      fundamentally different for integers and polynomials are written as
      separate functions, and compiled as separate libraries. Those which
      could conveniently be written as one function are compiled in yet a
      third library; the interface is handled via macro definitions in the
      header files. The standard way to write a routine which will work with
      either integers or polynomials is to put
      #ifdef INTEGERS
      #include integer.h
      #elif defined POLYNOMIALS
      #include polynomial.h
      #else
      some line to make the compiler complain
      #endif
      at the top of the relevant files, and then to have two separate
      compiliations cc -DINTEGERS ... -lZ -lU cc -DPOLYNOMIALS ... -lP -lU

 DIAGNOSTICS
      Illegal operations detected by these routines result in a call to a
      routine called bailout() which prints a message and then exits.

 FILES
      integer.h
      polynomial.h
      utility.h
      Ztools.h
      libP.a
      libZ.a
      libU.a

 SEE ALSO
      warehouse(3), rational(3), quadratic(3)





















                                    - 3 -         Formatted:  April 27, 2024