|
|
# simple_lt_word.rs内容和用法
|
|
|
|
|
|
## 一、内容
|
|
|
|
|
|
### 作用
|
|
|
|
|
|
用于比较U256位的lhs是否小于rhs。
|
|
|
|
|
|
### 结构体
|
|
|
|
|
|
包含了两个gadget结构体,在simple_lt的基础上进行应用
|
|
|
|
|
|
```rust
|
|
|
pub struct SimpleComparisonGadget<F, const N_BYTES: usize> {
|
|
|
lt: SimpleLtGadget<F, N_BYTES>, // lt = 1时,有lhs<rhs,即simple_lt的概念
|
|
|
eq: SimpleIsZero<F>, // eq = 1 代表 lhs == rhs, 即 simple_is_zero的概念
|
|
|
}
|
|
|
|
|
|
pub struct SimpleLtWordGadget<F> {
|
|
|
comparison_hi: SimpleComparisonGadget<F, Lt_Word_N_BYTES>, // 即SimpleComparisonGadget,可用与判断两数是否相等
|
|
|
lt_lo: SimpleLtGadget<F, Lt_Word_N_BYTES>, // lt = 1时,有lhs<rhs,即simple_lt的概念
|
|
|
}
|
|
|
```
|
|
|
|
|
|
### 核心公式
|
|
|
|
|
|
```
|
|
|
hi_lt + hi_eq * lt_lo
|
|
|
|
|
|
hi_lt: 高位比较
|
|
|
hi_eq: 高位是否相等
|
|
|
lt_lo: 低位比较
|
|
|
```
|
|
|
|
|
|
也即,可以分为以下情况:
|
|
|
|
|
|
- 当hi_lt = 1时,代表已得出高位比较结果,此时能够确定lhs < rhs,此时hi_eq为0。总结:hi_lt = 1时,公式结果为1,有lhs < rhs;
|
|
|
- 当hi_lt = 0时,hi_eq = 1时,通过lt_lo比较两数大小,此时lt_lo = 1,代表lhs<rhs,否则 lhs >= rhs。总结:hi_lt = 0 且 hi_eq = 1时,lt = 1,公式结果为1,代表lhs < rhs;
|
|
|
- 当hi_lt = 0时,hi_eq = 0时,可得出lhs > rhs。总结:hi_lt = 0 且 hi_eq = 0,公式结果为0,得出lhs > rhs;
|
|
|
|
|
|
通过上述三种结果分析可得:当公式结果输出为1时,有 lhr < rhs,当公式结果输出为0时,有lhs >= rhs的结论。由于我们的目的是为了比较lhs < rhs的情况,我们只需要关注公式输出为1时的结果,能够满足我们的需求。
|
|
|
|
|
|
### 构造约束
|
|
|
|
|
|
SimpleComparisonGadget的约束:
|
|
|
|
|
|
```
|
|
|
pub fn get_constraints(&self) -> Vec<(String, Expression<F>)> {
|
|
|
let mut res: Vec<(String, Expression<F>)> = Vec::new();
|
|
|
|
|
|
res.extend(self.lt.get_constraints());
|
|
|
res.extend(self.eq.get_constraints());
|
|
|
|
|
|
res
|
|
|
}
|
|
|
```
|
|
|
|
|
|
SimpleLtWordGadget的约束:
|
|
|
|
|
|
```rust
|
|
|
pub fn get_constraints(&self) -> Vec<(String, Expression<F>)> {
|
|
|
let mut res: Vec<(String, Expression<F>)> = Vec::new();
|
|
|
|
|
|
res.extend(self.comparison_hi.get_constraints());
|
|
|
res.extend(self.lt_lo.get_constraints());
|
|
|
|
|
|
res
|
|
|
}
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## 二、用法
|
|
|
|
|
|
在div_mod中有具体使用方法,如下:
|
|
|
|
|
|
```
|
|
|
let is_lt_lo = SimpleLtGadget::new(&c[1], &b[1], <[1], &diff[1]);
|
|
|
let comparison = SimpleComparisonGadget::new(&c[0], &b[0], <[0], is_zero, &diff[0]);
|
|
|
|
|
|
let is_lt = SimpleLtWordGadget::new(comparison, is_lt_lo);
|
|
|
```
|
|
|
|
|
|
其中c[1],b[1],lt[1],diff[1]代表c_lo,b_lo,lt_lo,diff_lo。 |
|
|
\ No newline at end of file |