Skip to content

Commit

Permalink
feat: remove byte decomposition in compute_decomposition (#6159)
Browse files Browse the repository at this point in the history
# Description

## Problem\*

Resolves <!-- Link to GitHub Issue -->

## Summary\*

This PR replaces `compute_decomposition` with a separate implementation
which should be cheaper for the AVM to handle. Idea taken from Guillaume
in #6084 .

## Additional Context



## Documentation\*

Check one:
- [x] No documentation needed.
- [ ] Documentation included in this PR.
- [ ] **[For Experimental Features]** Documentation to be submitted in a
separate PR.

# PR Checklist\*

- [x] I have tested the changes locally.
- [x] I have formatted the changes with [Prettier](https://prettier.io/)
and/or `cargo fmt` on default settings.
  • Loading branch information
TomAFrench authored Oct 10, 2024
1 parent e4325aa commit a8bcae2
Showing 1 changed file with 10 additions and 12 deletions.
22 changes: 10 additions & 12 deletions noir_stdlib/src/field/bn254.nr
Original file line number Diff line number Diff line change
Expand Up @@ -5,20 +5,18 @@ global PLO: Field = 53438638232309528389504892708671455233;
global PHI: Field = 64323764613183177041862057485226039389;

pub(crate) global TWO_POW_128: Field = 0x100000000000000000000000000000000;
global TWO_POW_64: Field = 0x10000000000000000;

// Decomposes a single field into two 16 byte fields.
fn compute_decomposition(x: Field) -> (Field, Field) {
let x_bytes: [u8; 32] = x.to_le_bytes();

let mut low: Field = 0;
let mut high: Field = 0;

let mut offset = 1;
for i in 0..16 {
low += (x_bytes[i] as Field) * offset;
high += (x_bytes[i + 16] as Field) * offset;
offset *= 256;
}
fn compute_decomposition(mut x: Field) -> (Field, Field) {
// Here's we're taking advantage of truncating 64 bit limbs from the input field
// and then subtracting them from the input such the field division is equivalent to integer division.
let low_lower_64 = (x as u64) as Field;
x = (x - low_lower_64) / TWO_POW_64;
let low_upper_64 = (x as u64) as Field;

let high = (x - low_upper_64) / TWO_POW_64;
let low = low_upper_64 * TWO_POW_64 + low_lower_64;

(low, high)
}
Expand Down

0 comments on commit a8bcae2

Please sign in to comment.