let select_fft_domain n = let rec powerset = function | [] -> [[]] | x :: xs -> let ps = powerset xs in List.concat [ps; List.map (fun ss -> x :: ss) ps] in let rec multiply_by_two n target pow_two = if n >= target then pow_two else multiply_by_two (2 * n) target (2 * pow_two) in let start = powerset [3; 11; 19] |> List.map (fun l -> let prod1 = List.fold_left ( * ) 1 l in let prod2 = multiply_by_two prod1 n 1 in let factors = prod2 :: l in (factors, List.fold_left ( * ) 1 factors)) in List.fold_left (fun e acc -> if snd e < snd acc then e else acc) (List.hd start) start