let bitwise_op_big_int op x y =
let (positive_x, op_sx) =
if Big_int.gt_big_int Big_int.zero_big_int x
then (lnot_big_int x, (fun u v -> op (lnot u) v))
else (x, op)
in let (positive_y, op_sx_sy) =
if Big_int.gt_big_int Big_int.zero_big_int y
then (lnot_big_int y, (fun u v -> op_sx u (lnot v)))
else (y, op_sx)
in let (positive_op_map, op_map) =
if 0 = (op_sx_sy 0 0)
then (op_sx_sy, (fun w -> w))
else ((fun u v -> lnot (op_sx_sy u v)), lnot_big_int)
in op_map (bitwise_op_positive_big_int positive_op_map positive_x positive_y)