| 66 | } |
| 67 | |
| 68 | fn init_stack<F: Field>(n: usize, challenges_len: usize) -> Vec<(usize, F)> { |
| 69 | let mut stack = Vec::with_capacity(challenges_len); |
| 70 | |
| 71 | // generally we expect the size to be a power of two. |
| 72 | // If not, we are going to fill the stack as if the array was padded to zero up to the expected size. |
| 73 | let chunk_size = 1 << challenges_len; |
| 74 | if n % chunk_size != 0 { |
| 75 | let mut delta = chunk_size - n % chunk_size; |
| 76 | for i in (0..challenges_len).rev() { |
| 77 | if delta >= 1 << i { |
| 78 | stack.push((i, F::zero())); |
| 79 | delta -= 1 << i |
| 80 | } |
| 81 | } |
| 82 | } |
| 83 | stack |
| 84 | } |
| 85 | |
| 86 | impl<'a, F, I> FoldedPolynomialTreeIter<'a, F, I> |
| 87 | where |