mirror of
https://github.com/logos-storage/plonky2.git
synced 2026-01-08 00:33:06 +00:00
94 lines
4.4 KiB
Plaintext
94 lines
4.4 KiB
Plaintext
|
|
Constraints A (implemented in code):
|
||
|
|
A1. dividend ∈ {0, …, u32::MAX}
|
||
|
|
A2. divisor ∈ {0, …, u32::MAX}
|
||
|
|
A3. quotient ∈ {0, …, u32::MAX}
|
||
|
|
A4. remainder ∈ {0, …, u32::MAX}
|
||
|
|
A5. divisor_rem_diff_m1 ∈ {0, …, u32::MAX}
|
||
|
|
A6. divisor * div_inverse = div_div_inverse
|
||
|
|
A7. (div_div_inverse - 1) * (remainder - quotient - u32::MAX) = 0
|
||
|
|
A8. divisor * (div_div_inverse - 1) = 0
|
||
|
|
A9. div_inverse * dividend = quotient + remainder * div_inverse
|
||
|
|
A10. divisor * (divisor - remainder - 1 - divisor_rem_diff_m1) = 0
|
||
|
|
|
||
|
|
Constraints B (intuitive division):
|
||
|
|
B1. dividend ∈ {0, …, u32::MAX}
|
||
|
|
B2. divisor ∈ {0, …, u32::MAX}
|
||
|
|
B3. divisor = 0 => quotient = 0
|
||
|
|
B4. divisor = 0 => remainder = u32::MAX
|
||
|
|
B5. divisor ≠ 0 => dividend = quotient * divisor + remainder
|
||
|
|
B6. divisor ≠ 0 => quotient ∈ {0, …, u32::MAX}
|
||
|
|
B7. divisor ≠ 0 => remainder ∈ {0, …, divisor - 1}
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
Assume we meet constraints A for some dividend, divisor, quotient, remainder, divisor_rem_diff_m1, div_inverse, and div_div_inverse. We want to show that constrants B are met.
|
||
|
|
|
||
|
|
B1. Trivial by A1.
|
||
|
|
|
||
|
|
B2. Trivial by A2.
|
||
|
|
|
||
|
|
B3. Assume divisor = 0. Then div_div_inverse = 0 by A6. div_div_inverse - 1 ≠ 0, so remainder - quotient = u32::MAX by A7.
|
||
|
|
quotient ∈ {0, …, u32::MAX} by A3 and remainder ∈ {0, …, u32::MAX} by A4. Then remainder - quotient ∈ {-quotient, …, u32::MAX - quotient}.
|
||
|
|
If quotient ≠ 0, then quotient ∈ {1, …, u32::MAX} and remainder - quotient ∈ {-u32::MAX, …, u32::MAX - 1}, which does not include u32::MAX, contradicting A7.
|
||
|
|
|
||
|
|
B4. Assume divisor = 0. Then div_div_inverse = 0 by A6. div_div_inverse - 1 ≠ 0, so remainder - quotient = u32::MAX by A7.
|
||
|
|
quotient ∈ {0, …, u32::MAX} by A3 and remainder ∈ {0, …, u32::MAX} by A4. Then remainder - quotient ∈ {remainder - u32::MAX, …, remainder}.
|
||
|
|
If remainder ≠ u32::MAX, then remainder ∈ {0, …, u32::MAX - 1} and remainder - quotient ∈ {-u32::MAX, …, u32::MAX - 1} which does not include u32::MAX, contradicting A7.
|
||
|
|
|
||
|
|
B5. Assume divisor ≠ 0. By A8, div_div_inverse = 1. By A6, div_inverse = divisor^-1. Multiplying both sides of A9 by divisor, dividend = quotient * divisor + remainder.
|
||
|
|
|
||
|
|
B6. Follows from A3.
|
||
|
|
|
||
|
|
B7. remainder ∈ {0, …, u32::MAX} by A4. Assume divisor ≠ 0. Then divisor_rem_diff_m1 = divisor - remainder - 1 by A10. divisor ∈ {1, …, u32::MAX} by A2. If remainder ∈ {divisor, …, u32::MAX}, then divisor - remainder - 1 ∈ {-u32::MAX, …, u32::MAX - divisor} ⊆ {-u32::MAX, …, u32::MAX - 1}, contradicting A5. Hence, remainder ∈ {0, …, divisor - 1}.
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
Assume we meet constraints B for some dividend, divisor, quotient, and remainder. We want to show
|
||
|
|
that there exist divisor_rem_diff_m1, div_inverse, div_div_inverse, such that constrants A are met.
|
||
|
|
|
||
|
|
If divisor = 0, set divisor_rem_diff_m1 = 0, div_inverse = 0, div_div_inverse = 0.
|
||
|
|
Otherwise, set divisor_rem_diff_m1 = divisor - remainder - 1, div_inverse = divisor^-1, div_div_inverse = 1.
|
||
|
|
|
||
|
|
A1. Trivial by B1.
|
||
|
|
|
||
|
|
A2. Trivial by B2.
|
||
|
|
|
||
|
|
The remainder is by cases:
|
||
|
|
|
||
|
|
(divisor = 0)
|
||
|
|
|
||
|
|
A3. Follows from B3.
|
||
|
|
|
||
|
|
A4. Follows from B4.
|
||
|
|
|
||
|
|
A5. Follows from our choice of divisor_rem_diff_m1 = 0.
|
||
|
|
|
||
|
|
A6. Follows from our choice of div_div_inverse = 0.
|
||
|
|
|
||
|
|
A7. quotient = 0 by B3. remainder = u32::MAX by B4. Then remainder - quotient = u32::MAX.
|
||
|
|
|
||
|
|
A8. Trivial since divisor = 0.
|
||
|
|
|
||
|
|
A9. By our choice, div_inverse = 0. quotient = 0 by B3.
|
||
|
|
|
||
|
|
A10. Trivial since divisor = 0.
|
||
|
|
|
||
|
|
|
||
|
|
(divisor ≠ 0)
|
||
|
|
|
||
|
|
A3. Follows from B6.
|
||
|
|
|
||
|
|
A4. By B7, remainder ∈ {0, …, divisor - 1}, and by B2, divisor ∈ {0, …, u32::MAX}, implying that remainder ∈ {0, …, u32::MAX - 1}.
|
||
|
|
|
||
|
|
A5. We've set divisor_rem_diff_m1 = divisor - remainder - 1. remainder ∈ {0, …, divisor - 1}, so divisor - remainder ∈ {1, …, divisor} and divisor - remainder - 1 = divisor_rem_diff_m1 ∈ {0, …, divisor - 1}. From B2, divisor ∈ {0, …, u32::MAX}, so divisor_rem_diff_m1 ∈ {0, …, u32::MAX - 1} as desired.
|
||
|
|
|
||
|
|
A6. div_inverse = divisor^-1 by choice, so divisor * div_inverse = 1. div_div_inverse = 1 by choice.
|
||
|
|
|
||
|
|
A7. div_div_inverse = 1 by choice, so div_div_inverse - 1 = 0.
|
||
|
|
|
||
|
|
A8. div_div_inverse = 1 by choice, so div_div_inverse - 1 = 0.
|
||
|
|
|
||
|
|
A9. From B5, dividend = quotient * divisor + remainder. Since divisor ≠ 0, div_inverse = divisor^-1 by choice. Multiplying both sides by div_inverse, dividend * div_inverse = quotient * divisor * div_inverse + remainder * div_inverse = quotient + remainder * div_inverse.
|
||
|
|
|
||
|
|
A10. By our choice of divisor_rem_diff_m1 = divisor - remainder - 1.
|