Z:=IntegerRing(); 
Zxy<x,y>:=PolynomialRing(Z,2);



/* ************************************************************************ */
IsAbsIrred:=function(f);
/* Prend un polynome f de Zxy<x,y>:=PolynomialRing(IntegerRing(),2) ou de PolynomialRing(RationalField(),2) et dit si ce polynome est abs irred ou non */
/* nous testons dans un premier temps si f est irreductible puis nous faisons le test sur le polytope de Newton*/
t:=Cputime();
Qxy<x,y>:=PolynomialRing(RationalField(),2)!f;
Z:=IntegerRing();
bool_irr:=IsIrreducible(f);
if (bool_irr eq false) then return bool_irr;
else 
N:=AllVertices(NewtonPolygon(f));
S:=[];
for i:=1 to #N do
S:=Append(Append(S,Z!N[i][1]),Z!N[i][2]);
end for;
bool_gcd:=GCD(S);
if (bool_gcd eq 1) then return true; else return false; end if;
end if;
end function;




/* ***************************************************************** */

IsAbsIrred_mod:=function(f);
/* Prends un polynome f de Zxy<x,y>:=PolynomialRing(IntegerRing(),2) et dit si ce polynome est abs irred ou non en utilisant la méthode polytope Newton modulaire*/


temps:=Cputime();
bool_abs:=false;

Z:=IntegerRing();
Zxy<x,y>:=PolynomialRing(Z,2);
L:={};
N:=AllVertices(NewtonPolygon(f));
for i:=1 to #N do
L1:=Factorization( Z!( Coefficient( UnivariatePolynomial(Coefficient(f,1,Z!N[i][1])),Z!N[i][2])));
for j:=1 to #L1 do
  Include(~L,L1[j][1]);
end for;
end for;

L:=IndexedSetToSequence(SetToIndexedSet(L));
Sort(~L);
long:=#L;


bool_gcd:=false;

i:=1;
p:=1;
F:=f;
while (bool_abs eq false) and (i le long) do
p:=L[i];
Fp:=FiniteField(p);
Fpxy<x,y>:=PolynomialRing(Fp,2);
F:=Fpxy!f;
if (TotalDegree(F) eq TotalDegree(f)) then

N:=AllVertices(NewtonPolygon(F));

S:=[];
for j:=1 to #N do
n1:=Z!N[j][1];
n2:=Z!N[j][2];
if (n1 ne 0) then S:=Append(S,n1); end if;
if (n2 ne 0) then S:=Append(S,n2); end if;
end for;

if (#S ne 0) then
  if (GCD(S) eq 1) then 
  
bool_abs:=IsIrreducible(F);end if;
end if;

end if;

i:=i+1;
end while;
temps:=Cputime()-temps;


return bool_abs;
end function;
/* ******************************************************************* */
