open Format

let deg = Array.length
type polynome = int array;;

let op_on_first_smaller _P _Q op =
        let result = Array.make (deg _Q) 0 in
        for k = 0 to (deg _P - 1) do
                result.(k) <- op _P.(k) _Q.(k)
        done;
        for k = (deg _P) to (deg _Q - 1) do
                result.(k) <- _Q.(k)
        done;
        result;;

let (+) _P _Q = if (deg _P) > (deg _Q)
        then op_on_first_smaller _Q _P (+)
        else op_on_first_smaller _P _Q (+);;

let (-) _P _Q = if (deg _P) > (deg _Q)
        then Array.map (fun x -> -x) (op_on_first_smaller _Q _P (-))
        else op_on_first_smaller _P _Q (-);;

assert (([| 3; 4; 5 |] + [| 3; 8; 10 |]) = [| 6; 12; 15 |]);
assert (([| 3; 4; 5 |] - [| 3; 8; 10 |]) = [| 0; -4; -5 |]);

let ( * ) _P _Q =
        let result = Array.make (deg _P + deg _Q - 1) 0 in
        for k = 0 to (deg _P + deg _Q - 1) do
                for i = 0 to k do
                        if i < (deg _P) && k-i < (deg _Q) then 
                                result.(k) <- result.(k) + _P.(i) * _Q.(k-i)
                done;
        done;
        result;;

Array.map (printf "%d, ") ([| 1; 1; 1; 1; 1; 1; 1; 1 |] * [| -1; 1 |]);

