# Grand Unified Finite Field library*
Implements GF(2x) for various "natural" sizes
such as 28, 216 and 232.
My goals for this crate are to:
1. help me learn to write good modules in Rust;
2. help interested users learn about finite fields (ie, Galois
fields);
3. provide a generic baseline implementation of basic maths
(add, multiply, divide, etc.) over finite fields;
4. explore various optimisations/adaptations (including
table-based lookups and architecture-specific SIMD code) that can
selectively override some/all of the default implementations
while remaining compatible with other implementations.
Also to:
5. provide some useful utility functions that go beyond just
`add`, `mul`, `div`, etc. (eg, determining whether a field
polynomial is primitive, or generating lookup tables for different
kinds of optimisations);
6. eat my own dog food, so to speak, by implementing various
applications that use the library;
7. benchmark particular implementations of interest.
# Basic Use: doing maths in a particular field
Steps to using this library:
* decide what "class" of field you want to use (GF(28),
GF(216), etc.);
* decide if you want to use one of the optimised adaptations or
are happy with the default generic code;
* create a new field object (we can call `f`) of that class with
your chosen field polynomial (aka "irreducible polynomial") by
calling the appropriate constructor;
* use that object to do maths in that field: eg, `result =
f.mul(a,b)`
# Crate Name
\* The crate name is deliberately hyperbolic:
> Noun *guff* - unacceptable behavior (especially ludicrously false statements)
# Copyright and Licence
This work is Copyright (c) Declan Malone, 2021.
You may freely copy and modify this work under the terms of:
* The GNU General Public License version 2 or later
If you wish to embed this work as part of another work, you may do so
under the terms of:
* The GNU Lesser General Public License version 2 or later
Disclaimer: this software comes with no warranty, express or implied.