#polynomial #groups #representation #operation #gf

nightly finitelib

A Rust library for advanced maths over finite groups, fields, their extensions, multi precision operations, euclidean rings, polynomials and related things

14 releases

Uses new Rust 2024

new 0.1.13 Mar 31, 2025
0.1.12 Mar 20, 2025
0.1.8 Feb 27, 2025
0.1.7 Oct 10, 2024
0.1.1 Mar 2, 2024

#211 in Math

Download history 18/week @ 2024-12-10 9/week @ 2025-02-04 6/week @ 2025-02-11 6/week @ 2025-02-18 283/week @ 2025-02-25 191/week @ 2025-03-04 12/week @ 2025-03-11 241/week @ 2025-03-18 37/week @ 2025-03-25

508 downloads per month

MIT license

215KB
5K SLoC

finitelib

finitelib is a library over advanced maths for finite groups, fields, their extensions, multi precision operations and related things.

At the moment the library supports:

  • Finite groups
  • Finite fields (prime - GF(p), splitting - GF(p^m), binary - GF(2^m), Montgomery representation)
  • Euclidean rings (including modular operations)
  • Polynomials
  • Multi precision operations over unsigned integers
    • Converting
    • Formatting
    • Basic operations: addition, subtraction, product, division, bitwise operations
    • Prime numbers: Fermat test, Miller-Rabin test, Legendre symbol, Tonelli–Shanks algorithm

Usage

Installation command:

cargo add finitelib

Basic example

use finitelib::prelude::*;
use finitelib::gf::prime::Prime as GF;

// Define 256-bit unsigned integer type
type U256 = bigi_of_bits!(256);

// Define an Euclidean ring over U256, that contains the correct basic
// math operations like addition, multiplication, Euclidean extended
// algorithm and so on.
let R256 = bigi_ring_for_bigi!(U256);

// Define a 256-bit prime number
let p = U256::from_decimal("67096435317933606252190858377894931905843553631817376158639971807689379094463");

// Define a finite field `GF(p)` with the prime characteristic `p`
let gf = GF::new(R256, p);

// Define two arbitrary numbers
let a = U256::from(3);
let b = U256::from(2);

// Perform division a / b inside the field
let c = gf.div(&a, &b).unwrap();

// Print the result as a decimal string
println!("{:?}", c.to_decimal());

// Perform multiplication
let d = gf.mul(&c, &b);

// Since multiplication is opposite to division `d` must be equal to `a`
assert_eq!(d, a);

Dependencies

~1–1.4MB
~21K SLoC