@@ -218,6 +218,30 @@ pub trait BooleanFunctionImpl: Debug {
218
218
. collect ( )
219
219
}
220
220
221
+ /// Computes the Walsh-Fourier values for all points using fast Fourier transform.
222
+ ///
223
+ /// # Returns
224
+ /// A vector containing the Walsh-Fourier values for all points.
225
+ fn fast_walsh_fourier_values ( & self ) -> Vec < i32 > {
226
+ let mut values = vec ! [ 0 ; ( self . get_max_input_value( ) + 1 ) as usize ] ;
227
+ for i in 0 ..=self . get_max_input_value ( ) {
228
+ values[ i as usize ] = self . compute_cellular_automata_rule ( i) as i32 ;
229
+ }
230
+ let mut h = 1usize ;
231
+ while h <= self . get_max_input_value ( ) as usize {
232
+ for i in ( 0 ..=self . get_max_input_value ( ) as usize ) . step_by ( h * 2 ) {
233
+ for j in 0 ..h {
234
+ let a = values[ i + j] ;
235
+ let b = values[ i + j + h] ;
236
+ values[ i + j] = a + b;
237
+ values[ i + j + h] = a - b;
238
+ }
239
+ }
240
+ h *= 2 ;
241
+ }
242
+ values
243
+ }
244
+
221
245
/// Computes the autocorrelation transform of the Boolean function for a given point.
222
246
/// The autocorrelation transform of a Boolean function $f$, for a given point $\omega$, is defined as:
223
247
///
@@ -2408,6 +2432,45 @@ mod tests {
2408
2432
) ;
2409
2433
}
2410
2434
2435
+ #[ test]
2436
+ fn test_fast_walsh_hadamard_values ( ) {
2437
+ let boolean_function = BooleanFunction :: from_hex_string_truth_table ( "ff" ) . unwrap ( ) ;
2438
+ assert_eq ! (
2439
+ boolean_function. fast_walsh_fourier_values( ) ,
2440
+ [ 8 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ]
2441
+ ) ;
2442
+
2443
+ let boolean_function = BooleanFunction :: from_hex_string_truth_table ( "00" ) . unwrap ( ) ;
2444
+ assert_eq ! (
2445
+ boolean_function. fast_walsh_fourier_values( ) ,
2446
+ [ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ]
2447
+ ) ;
2448
+
2449
+ let boolean_function = BooleanFunction :: from_hex_string_truth_table ( "0f" ) . unwrap ( ) ;
2450
+ assert_eq ! (
2451
+ boolean_function. fast_walsh_fourier_values( ) ,
2452
+ [ 4 , 0 , 0 , 0 , 4 , 0 , 0 , 0 ]
2453
+ ) ;
2454
+
2455
+ let boolean_function = BooleanFunction :: from_hex_string_truth_table ( "55" ) . unwrap ( ) ;
2456
+ assert_eq ! (
2457
+ boolean_function. fast_walsh_fourier_values( ) ,
2458
+ [ 4 , 4 , 0 , 0 , 0 , 0 , 0 , 0 ]
2459
+ ) ;
2460
+
2461
+ let boolean_function = BooleanFunction :: from_hex_string_truth_table ( "aa" ) . unwrap ( ) ;
2462
+ assert_eq ! (
2463
+ boolean_function. fast_walsh_fourier_values( ) ,
2464
+ [ 4 , -4 , 0 , 0 , 0 , 0 , 0 , 0 ]
2465
+ ) ;
2466
+
2467
+ let boolean_function = BooleanFunction :: from_hex_string_truth_table ( "8001" ) . unwrap ( ) ;
2468
+ assert_eq ! (
2469
+ boolean_function. fast_walsh_fourier_values( ) ,
2470
+ [ 2 , 0 , 0 , 2 , 0 , 2 , 2 , 0 , 0 , 2 , 2 , 0 , 2 , 0 , 0 , 2 ]
2471
+ ) ;
2472
+ }
2473
+
2411
2474
#[ test]
2412
2475
fn test_boolean_function_from_reverse_walsh_fourier_transform ( ) {
2413
2476
let boolean_function =
0 commit comments