# Optimized `arkworks` field implementations Specialized field implementations that outperform the generic, Montgomery arithmetic, field implementations provided in [arkworks](https://github.com/arkworks-rs/algebra). Currently only one field has been added. Please contribute an implementation! PRs are welcomed! # Prime field `p=18446744069414584321` ```rust use ark_ff_optimized::fp64::Fp; ``` An amazing prime with modulus `p=2^64−2^32+1`. This field has some nice properties (1) Multiplying two 32-bit values does not overflow the field modulus and (2) Checking whether four 16-bit values form a valid field element can be done efficiently. This field is used in [Polygon Miden and Polygon Zero](https://twitter.com/0xPolygonMiden/status/1478786573348995075). Implementation was sourced from [EcGFp5: a Specialized Elliptic Curve](https://eprint.iacr.org/2022/274.pdf) and [Facebook's Winterfell repo](https://github.com/novifinancial/winterfell/blob/c7c92620cc7661e38ad58e1a3bdfbd7bba694c5d/math/src/field/f64/mod.rs). | `Benchmark` | `Generic` | `Specialized` (this repo) | | :--------------------------------------- | :---------- | :-------------------------------- | | **`Sum of products of size 2`** | `18.04 ns` | `7.34 ns` (🚀 **2.46x faster**) | | **`Inverse`** | `556.74 ns` | `283.87 ns` (🚀 **1.96x faster**) | | **`Legendre for QR`** | `1.12 us` | `596.15 ns` (🚀 **1.88x faster**) | | **`Naive sum of products of size 2`** | `15.41 ns` | `8.68 ns` (🚀 **1.78x faster**) | | **`Deserialize Compressed`** | `8.82 ns` | `4.99 ns` (🚀 **1.77x faster**) | | **`Deserialize Compressed Unchecked`** | `8.80 ns` | `4.97 ns` (🚀 **1.77x faster**) | | **`Deserialize Uncompressed`** | `8.86 ns` | `5.16 ns` (🚀 **1.72x faster**) | | **`Deserialize Uncompressed Unchecked`** | `8.81 ns` | `5.15 ns` (🚀 **1.71x faster**) | | **`Square Root for QR`** | `4.43 us` | `2.77 us` (🚀 **1.60x faster**) | | **`Multiplication`** | `6.15 ns` | `4.03 ns` (🚀 **1.53x faster**) | | **`From BigInt`** | `5.32 ns` | `4.30 ns` (✅ **1.24x faster**) | | **`Serialize Uncompressed`** | `4.72 ns` | `3.95 ns` (✅ **1.20x faster**) | | **`Into BigInt`** | `4.72 ns` | `3.92 ns` (✅ **1.20x faster**) | | **`Serialize Compressed`** | `4.72 ns` | `3.96 ns` (✅ **1.19x faster**) | | **`Square`** | `5.60 ns` | `4.88 ns` (✅ **1.15x faster**) | | **`Subtraction`** | `4.09 ns` | `3.77 ns` (✅ **1.09x faster**) | | **`Addition`** | `4.11 ns` | `3.79 ns` (✅ **1.08x faster**) | | **`Negation`** | `4.21 ns` | `3.90 ns` (✅ **1.08x faster**) | | **`Double`** | `4.13 ns` | `4.32 ns` (❌ **1.04x slower**) | _Benchmarked on an M1 Max. Markdown generated with [criterion-table](https://github.com/nu11ptr/criterion-table). More detailed benchmark info is [here](http://andrewmilson.com/optimized-fields/criterion/report/index.html)_