Skip to content

nmod_mpoly_gcd performanc #2581

@thofma

Description

@thofma

This came up in Nemocas/Nemo.jl#2256.

Here is a gcd call for nmod_mpoly, which takes long (have not seen it finish), but it is instant in Magma and other systems:

julia> R, (l1, l2, l3, a1, a2, a3, b1, b2, b3, g1, g2, g3) = polynomial_ring(Nemo.Native.GF(2^31 - 1), ["l1", "l2", "l3", "a1", "a2", "a3", "b1", "b2", "b3", "g1", "g2", "g3"]);

julia> g = l1^2*a2^2*b1^2*g2^2*g3^2 + 2*l1^2*a2^2*b1*b2*g1*g2*g3^2 + 2*l1^2*a2^2*b1*b3*g1*g2^2*g3 + l1^2*a2^2*b2^2*g1^2*g3^2 + 2*l1^2*a2^2*b2*b3*g1^2*g2*g3 + l1^2*a2^2*b3^2*g1^2*g2^2 + 2147483645*l1^2*a2*a3*b1^2*g2^2*g3^2 + 2147483643*l1^2*a2*a3*b1*b2*g1*g2*g3^2 + 2147483643*l1^2*a2*a3*b1*b3*g1*g2^2*g3 + 2147483645*l1^2*a2*a3*b2^2*g1^2*g3^2 + 2147483643*l1^2*a2*a3*b2*b3*g1^2*g2*g3 + 2147483645*l1^2*a2*a3*b3^2*g1^2*g2^2 + l1^2*a3^2*b1^2*g2^2*g3^2 + 2*l1^2*a3^2*b1*b2*g1*g2*g3^2 + 2*l1^2*a3^2*b1*b3*g1*g2^2*g3 + l1^2*a3^2*b2^2*g1^2*g3^2 + 2*l1^2*a3^2*b2*b3*g1^2*g2*g3 + l1^2*a3^2*b3^2*g1^2*g2^2 + 2147483645*l1*l2*a1*a2*b1^2*g2^2*g3^2 + 2147483643*l1*l2*a1*a2*b1*b2*g1*g2*g3^2 + 2147483643*l1*l2*a1*a2*b1*b3*g1*g2^2*g3 + 2147483645*l1*l2*a1*a2*b2^2*g1^2*g3^2 + 2147483643*l1*l2*a1*a2*b2*b3*g1^2*g2*g3 + 2147483645*l1*l2*a1*a2*b3^2*g1^2*g2^2 + 2*l1*l2*a1*a3*b1^2*g2^2*g3^2 + 4*l1*l2*a1*a3*b1*b2*g1*g2*g3^2 + 4*l1*l2*a1*a3*b1*b3*g1*g2^2*g3 + 2*l1*l2*a1*a3*b2^2*g1^2*g3^2 + 4*l1*l2*a1*a3*b2*b3*g1^2*g2*g3 + 2*l1*l2*a1*a3*b3^2*g1^2*g2^2 + 2*l1*l2*a2*a3*b1^2*g2^2*g3^2 + 4*l1*l2*a2*a3*b1*b2*g1*g2*g3^2 + 4*l1*l2*a2*a3*b1*b3*g1*g2^2*g3 + 2*l1*l2*a2*a3*b2^2*g1^2*g3^2 + 4*l1*l2*a2*a3*b2*b3*g1^2*g2*g3 + 2*l1*l2*a2*a3*b3^2*g1^2*g2^2 + 2147483645*l1*l2*a3^2*b1^2*g2^2*g3^2 + 2147483643*l1*l2*a3^2*b1*b2*g1*g2*g3^2 + 2147483643*l1*l2*a3^2*b1*b3*g1*g2^2*g3 + 2147483645*l1*l2*a3^2*b2^2*g1^2*g3^2 + 2147483643*l1*l2*a3^2*b2*b3*g1^2*g2*g3 + 2147483645*l1*l2*a3^2*b3^2*g1^2*g2^2 + 2*l1*l3*a1*a2*b1^2*g2^2*g3^2 + 4*l1*l3*a1*a2*b1*b2*g1*g2*g3^2 + 4*l1*l3*a1*a2*b1*b3*g1*g2^2*g3 + 2*l1*l3*a1*a2*b2^2*g1^2*g3^2 + 4*l1*l3*a1*a2*b2*b3*g1^2*g2*g3 + 2*l1*l3*a1*a2*b3^2*g1^2*g2^2 + 2147483645*l1*l3*a1*a3*b1^2*g2^2*g3^2 + 2147483643*l1*l3*a1*a3*b1*b2*g1*g2*g3^2 + 2147483643*l1*l3*a1*a3*b1*b3*g1*g2^2*g3 + 2147483645*l1*l3*a1*a3*b2^2*g1^2*g3^2 + 2147483643*l1*l3*a1*a3*b2*b3*g1^2*g2*g3 + 2147483645*l1*l3*a1*a3*b3^2*g1^2*g2^2 + 2147483645*l1*l3*a2^2*b1^2*g2^2*g3^2 + 2147483643*l1*l3*a2^2*b1*b2*g1*g2*g3^2 + 2147483643*l1*l3*a2^2*b1*b3*g1*g2^2*g3 + 2147483645*l1*l3*a2^2*b2^2*g1^2*g3^2 + 2147483643*l1*l3*a2^2*b2*b3*g1^2*g2*g3 + 2147483645*l1*l3*a2^2*b3^2*g1^2*g2^2 + 2*l1*l3*a2*a3*b1^2*g2^2*g3^2 + 4*l1*l3*a2*a3*b1*b2*g1*g2*g3^2 + 4*l1*l3*a2*a3*b1*b3*g1*g2^2*g3 + 2*l1*l3*a2*a3*b2^2*g1^2*g3^2 + 4*l1*l3*a2*a3*b2*b3*g1^2*g2*g3 + 2*l1*l3*a2*a3*b3^2*g1^2*g2^2 + l2^2*a1^2*b1^2*g2^2*g3^2 + 2*l2^2*a1^2*b1*b2*g1*g2*g3^2 + 2*l2^2*a1^2*b1*b3*g1*g2^2*g3 + l2^2*a1^2*b2^2*g1^2*g3^2 + 2*l2^2*a1^2*b2*b3*g1^2*g2*g3 + l2^2*a1^2*b3^2*g1^2*g2^2 + 2147483645*l2^2*a1*a3*b1^2*g2^2*g3^2 + 2147483643*l2^2*a1*a3*b1*b2*g1*g2*g3^2 + 2147483643*l2^2*a1*a3*b1*b3*g1*g2^2*g3 + 2147483645*l2^2*a1*a3*b2^2*g1^2*g3^2 + 2147483643*l2^2*a1*a3*b2*b3*g1^2*g2*g3 + 2147483645*l2^2*a1*a3*b3^2*g1^2*g2^2 + l2^2*a3^2*b1^2*g2^2*g3^2 + 2*l2^2*a3^2*b1*b2*g1*g2*g3^2 + 2*l2^2*a3^2*b1*b3*g1*g2^2*g3 + l2^2*a3^2*b2^2*g1^2*g3^2 + 2*l2^2*a3^2*b2*b3*g1^2*g2*g3 + l2^2*a3^2*b3^2*g1^2*g2^2 + 2147483645*l2*l3*a1^2*b1^2*g2^2*g3^2 + 2147483643*l2*l3*a1^2*b1*b2*g1*g2*g3^2 + 2147483643*l2*l3*a1^2*b1*b3*g1*g2^2*g3 + 2147483645*l2*l3*a1^2*b2^2*g1^2*g3^2 + 2147483643*l2*l3*a1^2*b2*b3*g1^2*g2*g3 + 2147483645*l2*l3*a1^2*b3^2*g1^2*g2^2 + 2*l2*l3*a1*a2*b1^2*g2^2*g3^2 + 4*l2*l3*a1*a2*b1*b2*g1*g2*g3^2 + 4*l2*l3*a1*a2*b1*b3*g1*g2^2*g3 + 2*l2*l3*a1*a2*b2^2*g1^2*g3^2 + 4*l2*l3*a1*a2*b2*b3*g1^2*g2*g3 + 2*l2*l3*a1*a2*b3^2*g1^2*g2^2 + 2*l2*l3*a1*a3*b1^2*g2^2*g3^2 + 4*l2*l3*a1*a3*b1*b2*g1*g2*g3^2 + 4*l2*l3*a1*a3*b1*b3*g1*g2^2*g3 + 2*l2*l3*a1*a3*b2^2*g1^2*g3^2 + 4*l2*l3*a1*a3*b2*b3*g1^2*g2*g3 + 2*l2*l3*a1*a3*b3^2*g1^2*g2^2 + 2147483645*l2*l3*a2*a3*b1^2*g2^2*g3^2 + 2147483643*l2*l3*a2*a3*b1*b2*g1*g2*g3^2 + 2147483643*l2*l3*a2*a3*b1*b3*g1*g2^2*g3 + 2147483645*l2*l3*a2*a3*b2^2*g1^2*g3^2 + 2147483643*l2*l3*a2*a3*b2*b3*g1^2*g2*g3 + 2147483645*l2*l3*a2*a3*b3^2*g1^2*g2^2 + l3^2*a1^2*b1^2*g2^2*g3^2 + 2*l3^2*a1^2*b1*b2*g1*g2*g3^2 + 2*l3^2*a1^2*b1*b3*g1*g2^2*g3 + l3^2*a1^2*b2^2*g1^2*g3^2 + 2*l3^2*a1^2*b2*b3*g1^2*g2*g3 + l3^2*a1^2*b3^2*g1^2*g2^2 + 2147483645*l3^2*a1*a2*b1^2*g2^2*g3^2 + 2147483643*l3^2*a1*a2*b1*b2*g1*g2*g3^2 + 2147483643*l3^2*a1*a2*b1*b3*g1*g2^2*g3 + 2147483645*l3^2*a1*a2*b2^2*g1^2*g3^2 + 2147483643*l3^2*a1*a2*b2*b3*g1^2*g2*g3 + 2147483645*l3^2*a1*a2*b3^2*g1^2*g2^2 + l3^2*a2^2*b1^2*g2^2*g3^2 + 2*l3^2*a2^2*b1*b2*g1*g2*g3^2 + 2*l3^2*a2^2*b1*b3*g1*g2^2*g3 + l3^2*a2^2*b2^2*g1^2*g3^2 + 2*l3^2*a2^2*b2*b3*g1^2*g2*g3 + l3^2*a2^2*b3^2*g1^2*g2^2;

julia> h = 2147483646*l1*a1*a2*b1^2*g2^3*g3 + 2147483646*l1*a1*a2*b1^2*g2*g3^3 + 2147483645*l1*a1*a2*b1*b2*g1*g2^2*g3 + 2147483645*l1*a1*a2*b1*b2*g1*g3^3 + 2147483645*l1*a1*a2*b1*b3*g1*g2^3 + 2147483645*l1*a1*a2*b1*b3*g1*g2*g3^2 + 2147483646*l1*a1*a2*b2^2*g1^2*g2*g3 + 2147483646*l1*a1*a2*b2^2*g2*g3^3 + 2147483646*l1*a1*a2*b2*b3*g1^2*g2^2 + 2147483646*l1*a1*a2*b2*b3*g1^2*g3^2 + 2147483645*l1*a1*a2*b2*b3*g2^2*g3^2 + 2147483646*l1*a1*a2*b3^2*g1^2*g2*g3 + 2147483646*l1*a1*a2*b3^2*g2^3*g3 + l1*a1*a3*b1^2*g2^3*g3 + l1*a1*a3*b1^2*g2*g3^3 + 2*l1*a1*a3*b1*b2*g1*g2^2*g3 + 2*l1*a1*a3*b1*b2*g1*g3^3 + 2*l1*a1*a3*b1*b3*g1*g2^3 + 2*l1*a1*a3*b1*b3*g1*g2*g3^2 + l1*a1*a3*b2^2*g1^2*g2*g3 + l1*a1*a3*b2^2*g2*g3^3 + l1*a1*a3*b2*b3*g1^2*g2^2 + l1*a1*a3*b2*b3*g1^2*g3^2 + 2*l1*a1*a3*b2*b3*g2^2*g3^2 + l1*a1*a3*b3^2*g1^2*g2*g3 + l1*a1*a3*b3^2*g2^3*g3 + l1*a2^2*b1^2*g2*g3^3 + 2*l1*a2^2*b1*b2*g1*g3^3 + 2*l1*a2^2*b1*b3*g1*g2*g3^2 + l1*a2^2*b2^2*g2*g3^3 + 2147483646*l1*a2^2*b2*b3*g1^2*g2^2 + 2*l1*a2^2*b2*b3*g1^2*g3^2 + l1*a2^2*b2*b3*g2^2*g3^2 + l1*a2^2*b3^2*g1^2*g2*g3 + l1*a2*a3*b1^2*g2^3*g3 + 2147483646*l1*a2*a3*b1^2*g2*g3^3 + 2*l1*a2*a3*b1*b2*g1*g2^2*g3 + 2147483645*l1*a2*a3*b1*b2*g1*g3^3 + 2*l1*a2*a3*b1*b3*g1*g2^3 + 2147483645*l1*a2*a3*b1*b3*g1*g2*g3^2 + l1*a2*a3*b2^2*g1^2*g2*g3 + 2147483646*l1*a2*a3*b2^2*g2*g3^3 + 3*l1*a2*a3*b2*b3*g1^2*g2^2 + 2147483644*l1*a2*a3*b2*b3*g1^2*g3^2 + 2147483646*l1*a2*a3*b3^2*g1^2*g2*g3 + l1*a2*a3*b3^2*g2^3*g3 + 2147483646*l1*a3^2*b1^2*g2^3*g3 + 2147483645*l1*a3^2*b1*b2*g1*g2^2*g3 + 2147483645*l1*a3^2*b1*b3*g1*g2^3 + 2147483646*l1*a3^2*b2^2*g1^2*g2*g3 + 2147483645*l1*a3^2*b2*b3*g1^2*g2^2 + l1*a3^2*b2*b3*g1^2*g3^2 + 2147483646*l1*a3^2*b2*b3*g2^2*g3^2 + 2147483646*l1*a3^2*b3^2*g2^3*g3 + l2*a1^2*b1^2*g2^3*g3 + l2*a1^2*b1^2*g2*g3^3 + 2*l2*a1^2*b1*b2*g1*g2^2*g3 + 2*l2*a1^2*b1*b2*g1*g3^3 + 2*l2*a1^2*b1*b3*g1*g2^3 + 2*l2*a1^2*b1*b3*g1*g2*g3^2 + l2*a1^2*b2^2*g1^2*g2*g3 + l2*a1^2*b2^2*g2*g3^3 + l2*a1^2*b2*b3*g1^2*g2^2 + l2*a1^2*b2*b3*g1^2*g3^2 + 2*l2*a1^2*b2*b3*g2^2*g3^2 + l2*a1^2*b3^2*g1^2*g2*g3 + l2*a1^2*b3^2*g2^3*g3 + 2147483646*l2*a1*a2*b1^2*g2*g3^3 + 2147483645*l2*a1*a2*b1*b2*g1*g3^3 + 2147483645*l2*a1*a2*b1*b3*g1*g2*g3^2 + 2147483646*l2*a1*a2*b2^2*g2*g3^3 + l2*a1*a2*b2*b3*g1^2*g2^2 + 2147483645*l2*a1*a2*b2*b3*g1^2*g3^2 + 2147483646*l2*a1*a2*b2*b3*g2^2*g3^2 + 2147483646*l2*a1*a2*b3^2*g1^2*g2*g3 + 2147483645*l2*a1*a3*b1^2*g2^3*g3 + 2147483646*l2*a1*a3*b1^2*g2*g3^3 + 2147483643*l2*a1*a3*b1*b2*g1*g2^2*g3 + 2147483645*l2*a1*a3*b1*b2*g1*g3^3 + 2147483643*l2*a1*a3*b1*b3*g1*g2^3 + 2147483645*l2*a1*a3*b1*b3*g1*g2*g3^2 + 2147483645*l2*a1*a3*b2^2*g1^2*g2*g3 + 2147483646*l2*a1*a3*b2^2*g2*g3^3 + 2147483644*l2*a1*a3*b2*b3*g1^2*g2^2 + 2147483644*l2*a1*a3*b2*b3*g2^2*g3^2 + 2147483646*l2*a1*a3*b3^2*g1^2*g2*g3 + 2147483645*l2*a1*a3*b3^2*g2^3*g3 + l2*a2*a3*b1^2*g2*g3^3 + 2*l2*a2*a3*b1*b2*g1*g3^3 + 2*l2*a2*a3*b1*b3*g1*g2*g3^2 + l2*a2*a3*b2^2*g2*g3^3 + 2147483646*l2*a2*a3*b2*b3*g1^2*g2^2 + 2*l2*a2*a3*b2*b3*g1^2*g3^2 + l2*a2*a3*b2*b3*g2^2*g3^2 + l2*a2*a3*b3^2*g1^2*g2*g3 + l2*a3^2*b1^2*g2^3*g3 + 2*l2*a3^2*b1*b2*g1*g2^2*g3 + 2*l2*a3^2*b1*b3*g1*g2^3 + l2*a3^2*b2^2*g1^2*g2*g3 + 2*l2*a3^2*b2*b3*g1^2*g2^2 + 2147483646*l2*a3^2*b2*b3*g1^2*g3^2 + l2*a3^2*b2*b3*g2^2*g3^2 + l2*a3^2*b3^2*g2^3*g3 + 2147483646*l3*a1^2*b1^2*g2^3*g3 + 2147483646*l3*a1^2*b1^2*g2*g3^3 + 2147483645*l3*a1^2*b1*b2*g1*g2^2*g3 + 2147483645*l3*a1^2*b1*b2*g1*g3^3 + 2147483645*l3*a1^2*b1*b3*g1*g2^3 + 2147483645*l3*a1^2*b1*b3*g1*g2*g3^2 + 2147483646*l3*a1^2*b2^2*g1^2*g2*g3 + 2147483646*l3*a1^2*b2^2*g2*g3^3 + 2147483646*l3*a1^2*b2*b3*g1^2*g2^2 + 2147483646*l3*a1^2*b2*b3*g1^2*g3^2 + 2147483645*l3*a1^2*b2*b3*g2^2*g3^2 + 2147483646*l3*a1^2*b3^2*g1^2*g2*g3 + 2147483646*l3*a1^2*b3^2*g2^3*g3 + l3*a1*a2*b1^2*g2^3*g3 + 2*l3*a1*a2*b1^2*g2*g3^3 + 2*l3*a1*a2*b1*b2*g1*g2^2*g3 + 4*l3*a1*a2*b1*b2*g1*g3^3 + 2*l3*a1*a2*b1*b3*g1*g2^3 + 4*l3*a1*a2*b1*b3*g1*g2*g3^2 + l3*a1*a2*b2^2*g1^2*g2*g3 + 2*l3*a1*a2*b2^2*g2*g3^3 + 3*l3*a1*a2*b2*b3*g1^2*g3^2 + 3*l3*a1*a2*b2*b3*g2^2*g3^2 + 2*l3*a1*a2*b3^2*g1^2*g2*g3 + l3*a1*a2*b3^2*g2^3*g3 + l3*a1*a3*b1^2*g2^3*g3 + 2*l3*a1*a3*b1*b2*g1*g2^2*g3 + 2*l3*a1*a3*b1*b3*g1*g2^3 + l3*a1*a3*b2^2*g1^2*g2*g3 + 2*l3*a1*a3*b2*b3*g1^2*g2^2 + 2147483646*l3*a1*a3*b2*b3*g1^2*g3^2 + l3*a1*a3*b2*b3*g2^2*g3^2 + l3*a1*a3*b3^2*g2^3*g3 + 2147483646*l3*a2^2*b1^2*g2*g3^3 + 2147483645*l3*a2^2*b1*b2*g1*g3^3 + 2147483645*l3*a2^2*b1*b3*g1*g2*g3^2 + 2147483646*l3*a2^2*b2^2*g2*g3^3 + l3*a2^2*b2*b3*g1^2*g2^2 + 2147483645*l3*a2^2*b2*b3*g1^2*g3^2 + 2147483646*l3*a2^2*b2*b3*g2^2*g3^2 + 2147483646*l3*a2^2*b3^2*g1^2*g2*g3 + 2147483646*l3*a2*a3*b1^2*g2^3*g3 + 2147483645*l3*a2*a3*b1*b2*g1*g2^2*g3 + 2147483645*l3*a2*a3*b1*b3*g1*g2^3 + 2147483646*l3*a2*a3*b2^2*g1^2*g2*g3 + 2147483645*l3*a2*a3*b2*b3*g1^2*g2^2 + l3*a2*a3*b2*b3*g1^2*g3^2 + 2147483646*l3*a2*a3*b2*b3*g2^2*g3^2 + 2147483646*l3*a2*a3*b3^2*g2^3*g3;

julia> factor(g)
(b1*g2*g3 + b2*g1*g3 + b3*g1*g2)^2 * (l1*a2 + 2147483646*l1*a3 + 2147483646*l2*a1 + l2*a3 + l3*a1 + 2147483646*l3*a2)^2

julia> factor(h)
2147483646 * (a1*b1^2*g2^3*g3 + a1*b1^2*g2*g3^3 + 2*a1*b1*b2*g1*g2^2*g3 + 2*a1*b1*b2*g1*g3^3 + 2*a1*b1*b3*g1*g2^3 + 2*a1*b1*b3*g1*g2*g3^2 + a1*b2^2*g1^2*g2*g3 + a1*b2^2*g2*g3^3 + a1*b2*b3*g1^2*g2^2 + a1*b2*b3*g1^2*g3^2 + 2*a1*b2*b3*g2^2*g3^2 + a1*b3^2*g1^2*g2*g3 + a1*b3^2*g2^3*g3 + 2147483646*a2*b1^2*g2*g3^3 + 2147483645*a2*b1*b2*g1*g3^3 + 2147483645*a2*b1*b3*g1*g2*g3^2 + 2147483646*a2*b2^2*g2*g3^3 + a2*b2*b3*g1^2*g2^2 + 2147483645*a2*b2*b3*g1^2*g3^2 + 2147483646*a2*b2*b3*g2^2*g3^2 + 2147483646*a2*b3^2*g1^2*g2*g3 + 2147483646*a3*b1^2*g2^3*g3 + 2147483645*a3*b1*b2*g1*g2^2*g3 + 2147483645*a3*b1*b3*g1*g2^3 + 2147483646*a3*b2^2*g1^2*g2*g3 + 2147483645*a3*b2*b3*g1^2*g2^2 + a3*b2*b3*g1^2*g3^2 + 2147483646*a3*b2*b3*g2^2*g3^2 + 2147483646*a3*b3^2*g2^3*g3) * (l1*a2 + 2147483646*l1*a3 + 2147483646*l2*a1 + l2*a3 + l3*a1 + 2147483646*l3*a2)

julia> gcd(g, h)
# this is hanging

This calls directly into nmod_mpoly_gcd.

For comparison, in Magma:

> time GCD(g, h);
l1*a2 + 2147483646*l1*a3 + 2147483646*l2*a1 + l2*a3 + l3*a1 + 2147483646*l3*a2
Time: 0.000

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions