--------------------------------------------
Disclaimer and License Agreement

Fermat is provided on an "AS IS" basis, without warranty of any kind, including without
limitation the warranties of merchantability, fitness for a particular purpose and
non-infringement.  The entire risk as to the quality and performance of the Software is borne
by you.  Should the Software prove defective, you assume the entire cost of any service and
repair.  This disclaimer of warranty constitutes an essential part of your use of Fermat. 

YOU MAY NOT ATTEMPT TO DECOMPILE FERMAT.  Fermat is copyrighted.

----------------------------------------------

REGISTER.  Send me your name right away through email.  If there are new versions or bug
fixes, I will inform you.

----------------------------------------------

Use Courier or Geneva to view this document.

-------------------------------------
A Word on History

Fermat began as a project in a compiler design course that I was teaching in 1986.  It was
therefore a programming language from the very beginning, and has always gone by the name
"Fermat."  It grew into a computer algebra system gradually.  It flourished under three years
of R. E. U. (Research Experiences for Undergraduates) projects when 16 undergraduates used it
to search for nilpotent topological spaces. I used it to study (with others) certain infinite 
non-Abelian almost-free groups called the Gij groups.  A large and time consuming project was 
that of my colleague A. Brumer studying elliptic curves.  It was used by five or six graduate 
students to study computer algorithms and numerical analysis.  Recently it has been used by 
undergraduate math majors studying dynamical systems, the FFT, and the RSA cryptosystem. Many 
suggestions and improvements have been made along the way, and many, many bugs found and 
corrected.  Of course I am not naive enough to think that all bugs have been found.  The 
version you are now receiving, however, contains no known bugs.

---------------------------------------
Main Themes of Fermat

Over the years of its evolution, Fermat has developed in two main directions:  computations
involving matrices, polynomials, and rational functions; and graphics.  This apparently
schizoid personality is due to the main project that motivated it, the computer search for
three-dimensional nilpotent CW complexes.  It would be nice to have the complexes
represented visually as well as via large matrices of integers.  Originally one program did 
all of this, but that became unwieldy and there are now two versions: QFermat for work over 
Q, Z, and finite fields, and FFermat, for work over the reals and complexes implemented as 
"floats."

----------------------------------------
Advantages of Fermat

In every project, Fermat has proven to be much faster (often MUCH faster), to use much less
main memory, and, often, to be more reliable than some well known expensive computer
algebra systems.  (As anyone knows who has used those systems for heavy industrial grade
computation, frequent crashes, odd error messages, and inconvenient features are a constant
problem.)  

Fermat is especially good at Smith normal form; polynomial and rational function arithmetic;
determinant, normal forms, and inverse of matrices with polynomial entries over Z, Q, Zp,
finite fields, or more complex fields;  sparse matrices; characteristic polynomials; and gcd 
of polynomials over Z, Zp, or finite fields.  In addition, I have striven to make it easy to 
use.  For example, it is very easy to edit the output of Fermat (on the screen) and make it 
the input. This is a great boon in experiments with matrices.  Extensive facilities exist for 
saving data to files and reading such data.  Fermat has the useful ability to be interrupted
and then later return to the computation, picking up where it left off.  For Macs, this is unusual.

Fermat's graphics facilities are general and powerful.  It is possible to display graphically
the numerical output of any program.  This gives enormous flexibility to the user who is
willing to write programs, and not just use the canned two- or three-dimensional function
graphing routines.  "Objects" can be created, then moved, rotated, cut up, or intersected or
merged with other objects.

The manual is full of examples of all of these uses.

-----------------------------------
Release History and Bug Fixes: 

April 1996; version 1.0.
    (1) Under some circumstances, it was possible to set an element in a sparse array to 0.
         While not exactly a bug, this could be inconvenient.
    (2) If [x] was a sparse array, [x]^n would sometimes crash.
    (3) The builtin function Iszero did not work with sparse arrays.
    (4) If x[n,m] was a sparse array, accessing it via one dimensional format, x[i], did not work
          sometimes.
    (5) Reading and Saving files would sometimes fail to interrogate the user correctly for 
    the name of the file.

November 1996:
    (1) Compiling array references was flawed.
    (2) Determinant of matrices over finite fields would sometimes crash.
    (3) Divides failed on 0 input.  (Oops!)
    (4) There was a parsing error in something like :[b] = (t^2+1)¥[b].
    (5) There was a parsing error in something like :t = t¥(:´(2)=7).
    (6) &(P = xy^2 - 181) worked but gave a funny message (variable has more than one letter).
    (7) Display of linear matrices, such as if [p] is 1 X 56 and you typed [p], it looked weird.
    (8) Colreduce would sometimes fail to swap columns correctly.
    (9) There was a problem with the diagonal statement  :×[x] = ....
    (10) Verbose mode often displayed too much stuff.  It is now more reticent.

New Features (all in QFermat only):

   (1)  New Appendix 4 in the manual. 
   (2)  Gauss-Bareiss for determinant. New commands &K, &L.
   (3)  Sqfree greatly expanded.
   (4)  New command Pseudet.  Colreduce now works on sparse arrays.
   (5)  New commands Terms, SDivide; changes to Coef ().  
   (6)  GCD even faster on polynomials of many variables. 
   (7)  If you know that z is a factor of the determinant of a matrix [x] with all polynomial    
        entries, you can type  Æ([x],z) to compute the rest of the determinant. 

   See Appendix 4 in the manual.

January 27, 1997;  version 1.04 of Qfermat (PPC and MPW).  Two minor cosmetic changes:

  (1) Fixed a small problem in the PPC version in displaying large matrices, involving the
continuation character.
  (2) It is now possible to capture a displayed "ordinary" matrix (written to the terminal
window) and set a sparse matrix equal to it.  Before, a sparse matrix could only be set equal
to a matrix displayed in sparse format.  However, there is a small weird-sounding problem: in
modularmode, the first entry in the matrix must be an integer or polynomial.  I know why this
exists but it doesn't seem worth fixing. 

More history in the other ReadMe file.
 
-----------------------------------
Give me feedback.

Report all bugs and typos to the author, Robert H. Lewis,
rlewis@fordham.edu.   If you have features you would like to see added to Fermat, let
me know!  

Robert H. Lewis
Department of Mathematics
Fordham University
Bronx NY 10458
rlewis@fordham.edu

December 27, 2000.