d := 100; m := 100; d,m; p := 1125899906842597; n := 1; Z := IntegerRing(); Zx := PolynomialRing(Z); getpoly := function(d,m,p) n := p^m; /*C := [ Random(-n,n) : i in [0..d-1] ];*/ C := [ Random(1,n) : i in [0..d-1] ]; g := Zx!C; return x^d+g; end function; f := getpoly(d,m,p); g := getpoly(d,m,p); time for i in [1..10*n] do a := f*g; end for; height := function(f) C := Coefficients(f); h := 0; for c in C do if Abs(c) gt h then h := Abs(c); end if; end for; return(h); end function; FactorBound := function(a) d := Degree(a); return 2^d*height(a)*Ceiling(Sqrt(d+1)); end function; Zp := PolynomialRing(Integers(p)); fp := Zp!f; gp := Zp!g; Gcd(fp,gp); q := p; h := 2*Max(height(f),height(g)); /* assumes you know the height of the answer!! */ h := 2*FactorBound(a); k := 1; while q lt h do q := q^2; k := k+1; end while; k; Zpk := PolynomialRing(Integers(q)); time for i in [1..n] do H := HenselLift(a,[fp,gp],Zpk); end for; zero := H[1]*H[2]-a; zero;