@@ -172,11 +172,9 @@ impl<L: PlonkParameters<D>, const D: usize> CircuitBuilder<L, D> {
172
172
pub fn lt < Lhs , Rhs > ( & mut self , lhs : Lhs , rhs : Rhs ) -> BoolVariable
173
173
where
174
174
Lhs : LessThanOrEqual < L , D , Lhs > ,
175
- Rhs : Sub < L , D , Rhs , Output = Lhs > + One < L , D > ,
176
175
{
177
- let one = self . one :: < Rhs > ( ) ;
178
- let upper_bound = rhs. sub ( one, self ) ;
179
- self . lte ( lhs, upper_bound)
176
+ let lte = rhs. lte ( lhs, self ) ;
177
+ self . not ( lte)
180
178
}
181
179
182
180
/// The greater than operation (>).
@@ -226,6 +224,64 @@ mod tests {
226
224
#[ allow( unused_imports) ]
227
225
use crate :: prelude:: { BoolVariable , DefaultBuilder , U32Variable } ;
228
226
227
+ #[ test]
228
+ fn test_math_lt ( ) {
229
+ let mut builder = DefaultBuilder :: new ( ) ;
230
+
231
+ let v0 = builder. read :: < U32Variable > ( ) ;
232
+ let v1 = builder. read :: < U32Variable > ( ) ;
233
+ let result = builder. read :: < BoolVariable > ( ) ;
234
+ let computed_result = builder. lt ( v0, v1) ;
235
+ builder. assert_is_equal ( result, computed_result) ;
236
+
237
+ let circuit = builder. build ( ) ;
238
+
239
+ let test_cases = [
240
+ ( 5u32 , 0u32 , false ) ,
241
+ ( 0u32 , 10u32 , true ) ,
242
+ ( 10u32 , 5u32 , false ) ,
243
+ ] ;
244
+
245
+ for test_case in test_cases. iter ( ) {
246
+ let mut input = circuit. input ( ) ;
247
+ input. write :: < U32Variable > ( test_case. 0 ) ;
248
+ input. write :: < U32Variable > ( test_case. 1 ) ;
249
+ input. write :: < BoolVariable > ( test_case. 2 ) ;
250
+
251
+ let ( proof, output) = circuit. prove ( & input) ;
252
+ circuit. verify ( & proof, & input, & output) ;
253
+ }
254
+ }
255
+
256
+ #[ test]
257
+ fn test_math_lte ( ) {
258
+ let mut builder = DefaultBuilder :: new ( ) ;
259
+
260
+ let v0 = builder. read :: < U32Variable > ( ) ;
261
+ let v1 = builder. read :: < U32Variable > ( ) ;
262
+ let result = builder. read :: < BoolVariable > ( ) ;
263
+ let computed_result = builder. lte ( v0, v1) ;
264
+ builder. assert_is_equal ( result, computed_result) ;
265
+
266
+ let circuit = builder. build ( ) ;
267
+
268
+ let test_cases = [
269
+ ( 0u32 , 0u32 , true ) ,
270
+ ( 0u32 , 100u32 , true ) ,
271
+ ( 10u32 , 0u32 , false ) ,
272
+ ] ;
273
+
274
+ for test_case in test_cases. iter ( ) {
275
+ let mut input = circuit. input ( ) ;
276
+ input. write :: < U32Variable > ( test_case. 0 ) ;
277
+ input. write :: < U32Variable > ( test_case. 1 ) ;
278
+ input. write :: < BoolVariable > ( test_case. 2 ) ;
279
+
280
+ let ( proof, output) = circuit. prove ( & input) ;
281
+ circuit. verify ( & proof, & input, & output) ;
282
+ }
283
+ }
284
+
229
285
#[ test]
230
286
fn test_math_gt ( ) {
231
287
let mut builder = DefaultBuilder :: new ( ) ;
0 commit comments