/*
Univariate Polynomial Mult Test.
AKS May 2007.
*/


ClearVerbose();
Z := IntegerRing();
P<x> := PolynomialRing(Z);

//for d in [Random(10^(i - 1), 10^i): i in [1 .. 5]] do
for d in [2 .. 100 by 10] cat [110 .. 1000 by 200] cat [5000, 10000] do

    if d gt 1000 then
	range := [10, 63, 65, 130];
    else
	range := [1 .. 130 by 3];
    end if;

printf "Degree up to %o, range %o\n", d, range;

time
    for b in range do
	// b, d;

	rb := Random(b div 2, b);
	rb := Max(rb, 2);

	B := 2^b;
	B1 := 2^(b + 1);
	ran := func<| P ! [Random(B1) - B: i in [0 .. Random(d div 2, d)]]>;

	f := ran();
	g := ran();
	h := ran();
	s := f * (g - h);
	t := f*g - f*h;
	assert s eq t;
    end for;
end for;
