let on p_1 p_2 =
let u1, v1 = p_1.u, p_1.v in
let u2, v2 = p_2.u, p_2.v in
let size_u3 = max (size u1) (iof p_1 (size u2)) in
let size_v3 = (lcm (nbones v1) (size v2) / (nbones v1)) * size v1 in
let rec on w1 w2 i =
if i = 0 then [], (w1, w2)
else
match w1, w2 with
| [], _ -> on v1 w2 i
| _, [] -> on w1 v2 i
| false :: w1, w2 ->
let w3, reminder = on w1 w2 (i-1) in
false :: w3, reminder
| true :: w1, b :: w2 ->
let w3, reminder = on w1 w2 (i-1) in
b :: w3, reminder
in
let u3, (w1, w2) = on u1 u2 size_u3 in
let v3, (_, _) = on w1 w2 size_v3 in
{ u = u3; v = v3; }