Skip to content

Commit 11d6760

Browse files
committed
signoff: Xfe to the fourth
1 parent f40dfc7 commit 11d6760

File tree

2 files changed

+52
-56
lines changed

2 files changed

+52
-56
lines changed

tasm-lib/src/arithmetic/xfe/mod_pow_u32_generic.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ impl BasicSnippet for XfeModPowU32Generic {
144144
}
145145

146146
#[cfg(test)]
147-
mod tests {
147+
pub mod tests {
148148
use std::cell::RefCell;
149149
use std::rc::Rc;
150150

@@ -204,7 +204,7 @@ mod tests {
204204
}
205205

206206
impl XfeModPowU32Generic {
207-
fn prepare_state(&self, base: XFieldElement, exponent: u32) -> Vec<BFieldElement> {
207+
pub fn prepare_state(&self, base: XFieldElement, exponent: u32) -> Vec<BFieldElement> {
208208
let base = base.coefficients.into_iter().rev().collect();
209209
[
210210
self.init_stack_for_isolated_run(),

tasm-lib/src/arithmetic/xfe/to_the_fourth.rs

Lines changed: 50 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,28 @@
1+
use std::collections::HashMap;
12
use triton_vm::prelude::*;
23

34
use crate::data_type::DataType;
45
use crate::library::Library;
56
use crate::traits::basic_snippet::BasicSnippet;
6-
7+
use crate::traits::basic_snippet::Reviewer;
8+
use crate::traits::basic_snippet::SignOffFingerprint;
9+
10+
/// Take an [extension field element](XFieldElement) to the fourth power.
11+
///
12+
/// ### Behavior
13+
///
14+
/// ```text
15+
/// BEFORE: _ [arg; 3]
16+
/// AFTER: _ [result; 3]
17+
/// ```
18+
///
19+
/// ### Preconditions
20+
///
21+
/// None.
22+
///
23+
/// ### Postconditions
24+
///
25+
/// - the result is the argument raised to the fourth power
726
pub struct ToTheFourth;
827

928
impl BasicSnippet for ToTheFourth {
@@ -19,10 +38,9 @@ impl BasicSnippet for ToTheFourth {
1938
"tasmlib_arithmetic_xfe_to_the_fourth".to_owned()
2039
}
2140

22-
fn code(&self, _library: &mut Library) -> Vec<LabelledInstruction> {
23-
let entrypoint = self.entrypoint();
41+
fn code(&self, _: &mut Library) -> Vec<LabelledInstruction> {
2442
triton_asm!(
25-
{entrypoint}:
43+
{self.entrypoint()}:
2644
dup 2
2745
dup 2
2846
dup 2
@@ -36,68 +54,59 @@ impl BasicSnippet for ToTheFourth {
3654
return
3755
)
3856
}
57+
58+
fn sign_offs(&self) -> HashMap<Reviewer, SignOffFingerprint> {
59+
let mut sign_offs = HashMap::new();
60+
sign_offs.insert(Reviewer("ferdinand"), 0x7277edad6da06ec.into());
61+
sign_offs
62+
}
3963
}
4064

4165
#[cfg(test)]
4266
mod tests {
43-
use itertools::Itertools;
44-
use num::One;
45-
use num::Zero;
4667
use rand::prelude::*;
4768
use triton_vm::twenty_first::math::traits::ModPowU32;
48-
use triton_vm::twenty_first::math::x_field_element::EXTENSION_DEGREE;
4969

5070
use super::*;
5171
use crate::arithmetic::xfe::mod_pow_u32_generic::XfeModPowU32Generic;
72+
use crate::pop_encodable;
73+
use crate::push_encodable;
5274
use crate::snippet_bencher::BenchmarkCase;
5375
use crate::test_helpers::test_rust_equivalence_given_complete_state;
5476
use crate::traits::closure::Closure;
5577
use crate::traits::closure::ShadowedClosure;
5678
use crate::traits::rust_shadow::RustShadow;
5779

5880
impl ToTheFourth {
59-
fn setup_init_stack(&self, input_value: XFieldElement) -> Vec<BFieldElement> {
60-
[
61-
self.init_stack_for_isolated_run(),
62-
input_value.encode().into_iter().rev().collect_vec(),
63-
]
64-
.concat()
81+
fn setup_init_stack(&self, arg: XFieldElement) -> Vec<BFieldElement> {
82+
let mut stack = self.init_stack_for_isolated_run();
83+
push_encodable(&mut stack, &arg);
84+
85+
stack
6586
}
6687
}
6788

6889
impl Closure for ToTheFourth {
6990
fn rust_shadow(&self, stack: &mut Vec<BFieldElement>) {
70-
let input = XFieldElement::new([
71-
stack.pop().unwrap(),
72-
stack.pop().unwrap(),
73-
stack.pop().unwrap(),
74-
]);
75-
let result = input.mod_pow_u32(4);
76-
for word in result.encode().into_iter().rev() {
77-
stack.push(word)
78-
}
91+
let arg = pop_encodable::<XFieldElement>(stack);
92+
push_encodable(stack, &arg.mod_pow_u32(4));
7993
}
8094

8195
fn pseudorandom_initial_state(
8296
&self,
8397
seed: [u8; 32],
84-
_bench_case: Option<BenchmarkCase>,
98+
_: Option<BenchmarkCase>,
8599
) -> Vec<BFieldElement> {
86-
let mut rng = StdRng::from_seed(seed);
87-
let random_input: XFieldElement = rng.gen();
88-
89-
self.setup_init_stack(random_input)
100+
self.setup_init_stack(StdRng::from_seed(seed).gen())
90101
}
91102

92103
fn corner_case_initial_states(&self) -> Vec<Vec<BFieldElement>> {
93-
let zero = self.setup_init_stack(XFieldElement::zero());
94-
let one = self.setup_init_stack(XFieldElement::one());
95-
96-
let max_bfe = BFieldElement::new(BFieldElement::MAX);
97-
let max_max_max =
98-
self.setup_init_stack(XFieldElement::new([max_bfe; EXTENSION_DEGREE]));
104+
let bfe_max = BFieldElement::MAX;
105+
let xfe_max = xfe!([bfe_max, bfe_max, bfe_max]);
99106

100-
vec![zero, one, max_max_max]
107+
xfe_array![0, 1, xfe_max]
108+
.map(|arg| self.setup_init_stack(arg))
109+
.to_vec()
101110
}
102111
}
103112

@@ -108,42 +117,29 @@ mod tests {
108117

109118
#[test]
110119
fn compare_to_generic_pow_u32() {
111-
// Run `to_the_fourth` snippet
112-
let input: XFieldElement = random();
113-
let init_stack_to_fourth = [
114-
ToTheFourth.init_stack_for_isolated_run(),
115-
input.coefficients.into_iter().rev().collect_vec(),
116-
]
117-
.concat();
120+
let input = random();
121+
118122
let final_state_from_to_fourth = test_rust_equivalence_given_complete_state(
119123
&ShadowedClosure::new(ToTheFourth),
120-
&init_stack_to_fourth,
124+
&ToTheFourth.setup_init_stack(input),
121125
&[],
122126
&NonDeterminism::default(),
123127
&None,
124128
None,
125129
);
126130

127-
// Run snippet for generic pow
128-
let init_stack_to_generic = [
129-
XfeModPowU32Generic.init_stack_for_isolated_run(),
130-
vec![BFieldElement::new(4)],
131-
input.coefficients.into_iter().rev().collect_vec(),
132-
]
133-
.concat();
134131
let final_state_from_generic = test_rust_equivalence_given_complete_state(
135132
&ShadowedClosure::new(XfeModPowU32Generic),
136-
&init_stack_to_generic,
133+
&XfeModPowU32Generic.prepare_state(input, 4),
137134
&[],
138135
&NonDeterminism::default(),
139136
&None,
140137
None,
141138
);
142139

143-
// Assert that height agrees, and the top-3 elements agree
144140
assert_eq!(
145-
final_state_from_generic.op_stack.stack.len(),
146-
final_state_from_to_fourth.op_stack.stack.len()
141+
final_state_from_generic.op_stack.len(),
142+
final_state_from_to_fourth.op_stack.len(),
147143
);
148144
assert_eq!(
149145
final_state_from_generic.op_stack.stack[16..=18],

0 commit comments

Comments
 (0)