Generates a vector of TransformStep struct that encodes all the information needed to convert BigInt form one limbsize represention (source) to another (target). used as a helper function for `transform_limbsize`
(source_limb_size: u32, target_limb_size: u32)
| 395 | /// convert BigInt form one limbsize represention (source) to another (target). |
| 396 | /// used as a helper function for `transform_limbsize` |
| 397 | fn get_transform_steps(source_limb_size: u32, target_limb_size: u32) -> Vec<TransformStep> { |
| 398 | //define an empty vector to store Transform steps |
| 399 | let mut transform_steps: Vec<TransformStep> = Vec::new(); |
| 400 | |
| 401 | // compute the number of limbs for target and source |
| 402 | let target_n_limbs = N_BITS.div_ceil(target_limb_size); |
| 403 | let mut target_limb_remaining_bits = Self::N_BITS - (target_n_limbs - 1) * target_limb_size; |
| 404 | let source_n_limbs = N_BITS.div_ceil(source_limb_size); |
| 405 | let source_head = Self::N_BITS - (source_n_limbs - 1) * source_limb_size; |
| 406 | |
| 407 | // define a vector of limbsizes of source |
| 408 | let mut limb_sizes: Vec<u32> = Vec::with_capacity(source_n_limbs as usize); |
| 409 | let mut first_iter_flag = true; |
| 410 | for _ in 0..(source_n_limbs - 1) { |
| 411 | limb_sizes.push(source_limb_size); |
| 412 | } |
| 413 | limb_sizes.push(source_head); |
| 414 | |
| 415 | //iterate until all limbs of source are processed |
| 416 | while !limb_sizes.is_empty() { |
| 417 | //iterate until the target limb is filled completely |
| 418 | while target_limb_remaining_bits > 0 { |
| 419 | let source_limb_last_idx = limb_sizes.len() - 1; |
| 420 | let source_limb_remaining_bits = limb_sizes[source_limb_last_idx]; |
| 421 | |
| 422 | match source_limb_remaining_bits.cmp(&target_limb_remaining_bits) { |
| 423 | Ordering::Less => { |
| 424 | transform_steps.push(TransformStep { |
| 425 | current_limb_remaining_bits: source_limb_remaining_bits, |
| 426 | extract_window: source_limb_remaining_bits, |
| 427 | drop_currentlimb: true, |
| 428 | initiate_targetlimb: first_iter_flag, |
| 429 | }); |
| 430 | target_limb_remaining_bits -= source_limb_remaining_bits; |
| 431 | limb_sizes.pop(); |
| 432 | } |
| 433 | Ordering::Equal => { |
| 434 | transform_steps.push(TransformStep { |
| 435 | current_limb_remaining_bits: source_limb_remaining_bits, |
| 436 | extract_window: target_limb_remaining_bits, |
| 437 | drop_currentlimb: true, |
| 438 | initiate_targetlimb: first_iter_flag, |
| 439 | }); |
| 440 | target_limb_remaining_bits = 0; |
| 441 | limb_sizes.pop(); |
| 442 | } |
| 443 | Ordering::Greater => { |
| 444 | transform_steps.push(TransformStep { |
| 445 | current_limb_remaining_bits: source_limb_remaining_bits, |
| 446 | extract_window: target_limb_remaining_bits, |
| 447 | drop_currentlimb: false, |
| 448 | initiate_targetlimb: first_iter_flag, |
| 449 | }); |
| 450 | limb_sizes[source_limb_last_idx] = |
| 451 | source_limb_remaining_bits - target_limb_remaining_bits; |
| 452 | target_limb_remaining_bits = 0; |
| 453 | } |
| 454 | } |