#finite-fields #prime #polynomial #numbers #group #operations #gf

nightly finitelib

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

11 releases

Uses new Rust 2024

new 0.1.10 Mar 5, 2025
0.1.9 Mar 1, 2025
0.1.8 Feb 27, 2025
0.1.7 Oct 10, 2024
0.1.1 Mar 2, 2024

#275 in Math

Download history 1/week @ 2024-11-19 1/week @ 2024-12-03 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 178/week @ 2025-03-04

473 downloads per month

MIT license

200KB
4.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

~1MB
~17K SLoC