Implements GF(2x) for various "natural" sizes such as 28, 216 and 232.
My goals for this crate are to:
-
help me learn to write good modules in Rust;
-
help interested users learn about finite fields (ie, Galois fields);
-
provide a generic baseline implementation of basic maths (add, multiply, divide, etc.) over finite fields;
-
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:
-
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); -
eat my own dog food, so to speak, by implementing various applications that use the library;
-
benchmark particular implementations of interest.
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)
- Decide on function suite and give better names
- Write test cases
- Write benchmarks
- Write and test x86 Rust code (using
core::arch
) - Import that code into the project
- Use CPU/feature detection to conditionally compile it
- Write and test Arm NEON code in C
- Port that code to Rust
- Implement fallback code for unsupported platforms
- Move table generation into
guff::tables
- Encapsulate inverse table code in a similar style
- New module
guff::impls
for different ways to implement field maths - Use preamble (?) for list of sensible exports
- Make some large static tables available as selectable features
- Finalise set of table generation routines
- Test whether a value is a generator for a field
- Test whether a polynomial is irreducible
- Test whether a polynomial is primitive
- Reference lists of polynomials
- Benchmark full set of optimised implementations
- Update
guff::good
with results
- Write short intro to finite fields, with bibliography
- Gather list of similar projects and write summaries/mini reviews
- Write about experience of writing this project in Rust
- Write short article about Assembly/SIMD in Rust
* The crate name is deliberately hyperbolic:
Noun guff - unacceptable behavior (especially ludicrously false statements)
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.