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; }