@@ -197,18 +197,10 @@ impl BigBooleanFunction {
197
197
}
198
198
let num_variables = walsh_values_count. trailing_zeros ( ) as usize ;
199
199
let mut truth_table = BigUint :: zero ( ) ;
200
+ let mut inverse_walsh_transform = Vec :: from ( walsh_values) ;
201
+ crate :: utils:: fast_walsh_transform ( & mut inverse_walsh_transform) ;
200
202
for i in 0 ..( 1 << num_variables) {
201
- let value = walsh_values
202
- . iter ( )
203
- . enumerate ( )
204
- . map ( |( w, walsh_value) | {
205
- walsh_value * ( if ( w & i) . count_ones ( ) & 1 == 0 { 1 } else { -1 } )
206
- } )
207
- . sum :: < i32 > ( )
208
- < 0 ;
209
- if value {
210
- truth_table. set_bit ( i as u64 , true ) ;
211
- }
203
+ truth_table. set_bit ( i as u64 , inverse_walsh_transform[ i] < 0 ) ;
212
204
}
213
205
Ok ( Self {
214
206
variables_count : num_variables,
@@ -232,18 +224,10 @@ impl BigBooleanFunction {
232
224
}
233
225
let num_variables = walsh_values_count. trailing_zeros ( ) as usize ;
234
226
let mut truth_table = BigUint :: zero ( ) ;
227
+ let mut inverse_walsh_transform = Vec :: from ( walsh_values) ;
228
+ crate :: utils:: fast_walsh_transform ( & mut inverse_walsh_transform) ;
235
229
for i in 0 ..( 1 << num_variables) {
236
- let value = walsh_values
237
- . iter ( )
238
- . enumerate ( )
239
- . map ( |( w, walsh_value) | {
240
- walsh_value * ( if ( w & i) . count_ones ( ) & 1 == 0 { 1 } else { -1 } )
241
- } )
242
- . sum :: < i32 > ( )
243
- != 0 ;
244
- if value {
245
- truth_table. set_bit ( i as u64 , true ) ;
246
- }
230
+ truth_table. set_bit ( i as u64 , inverse_walsh_transform[ i] != 0 ) ;
247
231
}
248
232
Ok ( Self {
249
233
variables_count : num_variables,
0 commit comments