Skip to content

Commit 6e34c56

Browse files
committed
full_poseidon_indexes_poly
1 parent d405568 commit 6e34c56

File tree

2 files changed

+58
-69
lines changed

2 files changed

+58
-69
lines changed

crates/lean_prover/src/prove_execution.rs

Lines changed: 25 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -518,80 +518,36 @@ pub fn prove_execution(
518518
let (p24_air_point, p24_evals_to_prove) = info_span!("Poseidon-24 AIR proof")
519519
.in_scope(|| p24_table.prove_base(&mut prover_state, UNIVARIATE_SKIPS, &p24_columns_ref));
520520

521-
let (
522-
all_poseidon_indexes,
523-
folded_memory,
524-
poseidon_pushforward,
525-
poseidon_lookup_statements,
526-
poseidon_poly_eq_point,
527-
memory_folding_challenges,
528-
poseidon_logup_star_alpha,
529-
) = {
530-
// Poseidons 16/24 memory addresses lookup
531-
let poseidon_logup_star_alpha = prover_state.sample();
532-
let memory_folding_challenges = MultilinearPoint(prover_state.sample_vec(LOG_VECTOR_LEN));
533-
534-
let poseidon_lookup_statements = get_poseidon_lookup_statements(
535-
(p16_air.width(), p24_air.width()),
536-
(log_n_p16, log_n_p24),
537-
(&p16_evals_to_prove, &p24_evals_to_prove),
538-
(&p16_air_point, &p24_air_point),
539-
&memory_folding_challenges,
540-
);
541-
542-
let max_n_poseidons = poseidons_16
543-
.len()
544-
.max(poseidons_24.len())
545-
.next_power_of_two();
546-
let mut all_poseidon_indexes = F::zero_vec(8 * max_n_poseidons);
547-
#[rustfmt::skip]
548-
let chunks = [
549-
poseidons_16.par_iter().map(|p| p.addr_input_a).collect::<Vec<_>>(),
550-
poseidons_16.par_iter().map(|p| p.addr_input_b).collect::<Vec<_>>(),
551-
poseidons_16.par_iter().map(|p| p.addr_output).collect::<Vec<_>>(),
552-
poseidons_16.par_iter().map(|p| p.addr_output + 1).collect::<Vec<_>>(),
553-
poseidons_24.par_iter().map(|p| p.addr_input_a).collect::<Vec<_>>(),
554-
poseidons_24.par_iter().map(|p| p.addr_input_a + 1).collect::<Vec<_>>(),
555-
poseidons_24.par_iter().map(|p| p.addr_input_b).collect::<Vec<_>>(),
556-
poseidons_24.par_iter().map(|p| p.addr_output).collect::<Vec<_>>()
557-
];
521+
// Poseidons 16/24 memory addresses lookup
522+
let poseidon_logup_star_alpha = prover_state.sample();
523+
let memory_folding_challenges = MultilinearPoint(prover_state.sample_vec(LOG_VECTOR_LEN));
558524

559-
for (chunk_idx, addrs) in chunks.into_iter().enumerate() {
560-
all_poseidon_indexes[chunk_idx * max_n_poseidons..]
561-
.par_iter_mut()
562-
.zip(addrs)
563-
.for_each(|(slot, addr)| {
564-
*slot = F::from_usize(addr);
565-
});
566-
}
525+
let poseidon_lookup_statements = get_poseidon_lookup_statements(
526+
(p16_air.width(), p24_air.width()),
527+
(log_n_p16, log_n_p24),
528+
(&p16_evals_to_prove, &p24_evals_to_prove),
529+
(&p16_air_point, &p24_air_point),
530+
&memory_folding_challenges,
531+
);
567532

568-
let poseidon_folded_memory = fold_multilinear(&memory, &memory_folding_challenges);
533+
let all_poseidon_indexes = full_poseidon_indexes_poly(&poseidons_16, &poseidons_24);
569534

570-
let mut poseidon_poly_eq_point = EF::zero_vec(max_n_poseidons * 8);
571-
for (i, statement) in poseidon_lookup_statements.iter().enumerate() {
572-
compute_sparse_eval_eq::<PF<EF>, EF>(
573-
&statement.point,
574-
&mut poseidon_poly_eq_point,
575-
poseidon_logup_star_alpha.exp_u64(i as u64),
576-
);
577-
}
535+
let poseidon_folded_memory = fold_multilinear(&memory, &memory_folding_challenges);
578536

579-
let poseidon_pushforward = compute_pushforward(
580-
&all_poseidon_indexes,
581-
poseidon_folded_memory.len(),
582-
&poseidon_poly_eq_point,
537+
let mut poseidon_poly_eq_point = EF::zero_vec(all_poseidon_indexes.len());
538+
for (i, statement) in poseidon_lookup_statements.iter().enumerate() {
539+
compute_sparse_eval_eq::<PF<EF>, EF>(
540+
&statement.point,
541+
&mut poseidon_poly_eq_point,
542+
poseidon_logup_star_alpha.exp_u64(i as u64),
583543
);
544+
}
584545

585-
(
586-
all_poseidon_indexes,
587-
poseidon_folded_memory,
588-
poseidon_pushforward,
589-
poseidon_lookup_statements,
590-
poseidon_poly_eq_point,
591-
memory_folding_challenges,
592-
poseidon_logup_star_alpha,
593-
)
594-
};
546+
let poseidon_pushforward = compute_pushforward(
547+
&all_poseidon_indexes,
548+
poseidon_folded_memory.len(),
549+
&poseidon_poly_eq_point,
550+
);
595551

596552
let non_used_precompiles_evals = full_trace
597553
[N_INSTRUCTION_COLUMNS_IN_AIR..N_INSTRUCTION_COLUMNS]
@@ -861,7 +817,7 @@ pub fn prove_execution(
861817

862818
let poseidon_logup_star_statements = prove_logup_star(
863819
&mut prover_state,
864-
&folded_memory,
820+
&poseidon_folded_memory,
865821
&all_poseidon_indexes,
866822
poseidon_lookup_statements
867823
.iter()

crates/lean_prover/witness_generation/src/poseidon_tables.rs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,3 +61,36 @@ pub fn all_poseidon_24_indexes(poseidons_24: &[WitnessPoseidon24]) -> [Vec<F>; 3
6161
),
6262
]
6363
}
64+
65+
pub fn full_poseidon_indexes_poly(
66+
poseidons_16: &[WitnessPoseidon16],
67+
poseidons_24: &[WitnessPoseidon24],
68+
) -> Vec<F> {
69+
let max_n_poseidons = poseidons_16
70+
.len()
71+
.max(poseidons_24.len())
72+
.next_power_of_two();
73+
let mut all_poseidon_indexes = F::zero_vec(8 * max_n_poseidons);
74+
#[rustfmt::skip]
75+
let chunks = [
76+
poseidons_16.par_iter().map(|p| p.addr_input_a).collect::<Vec<_>>(),
77+
poseidons_16.par_iter().map(|p| p.addr_input_b).collect::<Vec<_>>(),
78+
poseidons_16.par_iter().map(|p| p.addr_output).collect::<Vec<_>>(),
79+
poseidons_16.par_iter().map(|p| p.addr_output + 1).collect::<Vec<_>>(),
80+
poseidons_24.par_iter().map(|p| p.addr_input_a).collect::<Vec<_>>(),
81+
poseidons_24.par_iter().map(|p| p.addr_input_a + 1).collect::<Vec<_>>(),
82+
poseidons_24.par_iter().map(|p| p.addr_input_b).collect::<Vec<_>>(),
83+
poseidons_24.par_iter().map(|p| p.addr_output).collect::<Vec<_>>()
84+
];
85+
86+
for (chunk_idx, addrs) in chunks.into_iter().enumerate() {
87+
all_poseidon_indexes[chunk_idx * max_n_poseidons..]
88+
.par_iter_mut()
89+
.zip(addrs)
90+
.for_each(|(slot, addr)| {
91+
*slot = F::from_usize(addr);
92+
});
93+
}
94+
95+
all_poseidon_indexes
96+
}

0 commit comments

Comments
 (0)